allow for drag and drop on iconImageView to update custom icons

This commit is contained in:
michael starke
2017-09-18 11:21:32 +02:00
parent 9ac3caa5b5
commit c444c27a98
9 changed files with 68 additions and 39 deletions

View File

@@ -235,7 +235,7 @@
4CE298EB1795FC2A00DF7BDB /* MPEntryContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE298EA1795FC2A00DF7BDB /* MPEntryContextMenuDelegate.m */; }; 4CE298EB1795FC2A00DF7BDB /* MPEntryContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE298EA1795FC2A00DF7BDB /* MPEntryContextMenuDelegate.m */; };
4CE30ACC1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE30ACB1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m */; }; 4CE30ACC1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE30ACB1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m */; };
4CE39ABF16ECE34A000FE29D /* MPIconSelectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE39ABE16ECE34A000FE29D /* MPIconSelectViewController.m */; }; 4CE39ABF16ECE34A000FE29D /* MPIconSelectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE39ABE16ECE34A000FE29D /* MPIconSelectViewController.m */; };
4CE39AC416ECE4F7000FE29D /* MPPopupImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE39AC316ECE4F7000FE29D /* MPPopupImageView.m */; }; 4CE39AC416ECE4F7000FE29D /* MPIconImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE39AC316ECE4F7000FE29D /* MPIconImageView.m */; };
4CE3E62617AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE3E62517AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m */; }; 4CE3E62617AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE3E62517AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m */; };
4CE501341BBC47F500FB819D /* MPTagsTokenFieldDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE501331BBC47F500FB819D /* MPTagsTokenFieldDelegate.m */; }; 4CE501341BBC47F500FB819D /* MPTagsTokenFieldDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE501331BBC47F500FB819D /* MPTagsTokenFieldDelegate.m */; };
4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE5B549173AFBA700207B39 /* MPDocument.m */; }; 4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE5B549173AFBA700207B39 /* MPDocument.m */; };
@@ -705,8 +705,8 @@
4CE30ACB1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPReferenceBuilderViewController.m; sourceTree = "<group>"; }; 4CE30ACB1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPReferenceBuilderViewController.m; sourceTree = "<group>"; };
4CE39ABD16ECE34A000FE29D /* MPIconSelectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIconSelectViewController.h; sourceTree = "<group>"; }; 4CE39ABD16ECE34A000FE29D /* MPIconSelectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIconSelectViewController.h; sourceTree = "<group>"; };
4CE39ABE16ECE34A000FE29D /* MPIconSelectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIconSelectViewController.m; sourceTree = "<group>"; }; 4CE39ABE16ECE34A000FE29D /* MPIconSelectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIconSelectViewController.m; sourceTree = "<group>"; };
4CE39AC216ECE4F7000FE29D /* MPPopupImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopupImageView.h; sourceTree = "<group>"; }; 4CE39AC216ECE4F7000FE29D /* MPIconImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIconImageView.h; sourceTree = "<group>"; };
4CE39AC316ECE4F7000FE29D /* MPPopupImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPopupImageView.m; sourceTree = "<group>"; }; 4CE39AC316ECE4F7000FE29D /* MPIconImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIconImageView.m; sourceTree = "<group>"; };
4CE3E62417AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAttachmentTableDataSource.h; sourceTree = "<group>"; }; 4CE3E62417AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAttachmentTableDataSource.h; sourceTree = "<group>"; };
4CE3E62517AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAttachmentTableDataSource.m; sourceTree = "<group>"; }; 4CE3E62517AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAttachmentTableDataSource.m; sourceTree = "<group>"; };
4CE501321BBC47F500FB819D /* MPTagsTokenFieldDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTagsTokenFieldDelegate.h; sourceTree = "<group>"; }; 4CE501321BBC47F500FB819D /* MPTagsTokenFieldDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTagsTokenFieldDelegate.h; sourceTree = "<group>"; };
@@ -886,8 +886,8 @@
4CE8247416E2F2B900573141 /* MPOverlayView.m */, 4CE8247416E2F2B900573141 /* MPOverlayView.m */,
4CFC53BD16E94729007396BE /* MPShadowBox.h */, 4CFC53BD16E94729007396BE /* MPShadowBox.h */,
4CFC53BE16E94729007396BE /* MPShadowBox.m */, 4CFC53BE16E94729007396BE /* MPShadowBox.m */,
4CE39AC216ECE4F7000FE29D /* MPPopupImageView.h */, 4CE39AC216ECE4F7000FE29D /* MPIconImageView.h */,
4CE39AC316ECE4F7000FE29D /* MPPopupImageView.m */, 4CE39AC316ECE4F7000FE29D /* MPIconImageView.m */,
4C4A100D176286FD00BBF2CA /* MPTableView.h */, 4C4A100D176286FD00BBF2CA /* MPTableView.h */,
4C4A100E176286FD00BBF2CA /* MPTableView.m */, 4C4A100E176286FD00BBF2CA /* MPTableView.m */,
4C4FCE13177CFE6B00BBF7AE /* MPCustomFieldTableCellView.h */, 4C4FCE13177CFE6B00BBF7AE /* MPCustomFieldTableCellView.h */,
@@ -1772,7 +1772,7 @@
4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */, 4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */,
4CDA35751EBA0CF2003CD59F /* NSString+MPComposedCharacterAdditions.m in Sources */, 4CDA35751EBA0CF2003CD59F /* NSString+MPComposedCharacterAdditions.m in Sources */,
4CE39ABF16ECE34A000FE29D /* MPIconSelectViewController.m in Sources */, 4CE39ABF16ECE34A000FE29D /* MPIconSelectViewController.m in Sources */,
4CE39AC416ECE4F7000FE29D /* MPPopupImageView.m in Sources */, 4CE39AC416ECE4F7000FE29D /* MPIconImageView.m in Sources */,
4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */, 4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */,
4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */, 4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */,
4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */, 4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */,

View File

@@ -29,7 +29,6 @@
<color key="primaryBackgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="primaryBackgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
<connections> <connections>
<outlet property="itemPrototype" destination="61" id="63"/> <outlet property="itemPrototype" destination="61" id="63"/>
<outlet property="menu" destination="vS0-bP-ZyJ" id="nAW-cJ-Vzp"/>
</connections> </connections>
</collectionView> </collectionView>
</subviews> </subviews>
@@ -158,20 +157,6 @@
<constraint firstItem="MEC-x9-zrX" firstAttribute="top" secondItem="113" secondAttribute="top" id="uEr-Jk-Jfa"/> <constraint firstItem="MEC-x9-zrX" firstAttribute="top" secondItem="113" secondAttribute="top" id="uEr-Jk-Jfa"/>
</constraints> </constraints>
</customView> </customView>
<menu id="vS0-bP-ZyJ">
<items>
<menuItem title="Item 1" id="M2B-II-30N">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Item 2" id="Vc1-gW-L1b">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Item 3" id="cUN-GX-EWu">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
</items>
<point key="canvasLocation" x="298" y="163"/>
</menu>
</objects> </objects>
<resources> <resources>
<image name="NSAddTemplate" width="11" height="11"/> <image name="NSAddTemplate" width="11" height="11"/>

View File

@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12120" systemVersion="16E195" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12121"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12120"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<objects> <objects>
@@ -22,7 +21,7 @@
<customView translatesAutoresizingMaskIntoConstraints="NO" id="2894"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="2894">
<rect key="frame" x="0.0" y="0.0" width="278" height="662"/> <rect key="frame" x="0.0" y="0.0" width="278" height="662"/>
<subviews> <subviews>
<imageView translatesAutoresizingMaskIntoConstraints="NO" id="2998" customClass="MPPopupImageView"> <imageView translatesAutoresizingMaskIntoConstraints="NO" id="2998" customClass="MPIconImageView">
<rect key="frame" x="20" y="620" width="32" height="32"/> <rect key="frame" x="20" y="620" width="32" height="32"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="32" id="3027"/> <constraint firstAttribute="width" constant="32" id="3027"/>
@@ -31,16 +30,16 @@
<imageCell key="cell" alignment="left" imageScaling="proportionallyUpOrDown" image="NSActionTemplate" id="2999"/> <imageCell key="cell" alignment="left" imageScaling="proportionallyUpOrDown" image="NSActionTemplate" id="2999"/>
<connections> <connections>
<action selector="pickIcon:" target="-2" id="6wh-Ka-Thl"/> <action selector="pickIcon:" target="-2" id="6wh-Ka-Thl"/>
<binding destination="-2" name="enabled" keyPath="representedObject.isHistory" id="7Z5-A7-aqg">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="-2" name="value" keyPath="representedObject.iconImage" id="agf-eg-okr"> <binding destination="-2" name="value" keyPath="representedObject.iconImage" id="agf-eg-okr">
<dictionary key="options"> <dictionary key="options">
<bool key="NSConditionallySetsEnabled" value="NO"/> <bool key="NSConditionallySetsEnabled" value="NO"/>
</dictionary> </dictionary>
</binding> </binding>
<binding destination="-2" name="enabled" keyPath="representedObject.isHistory" id="7Z5-A7-aqg">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections> </connections>
</imageView> </imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3013"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3013">

View File

@@ -25,6 +25,7 @@
#import "MPEntryInspectorViewController.h" #import "MPEntryInspectorViewController.h"
#import "MPEntryViewController.h" #import "MPEntryViewController.h"
#import "MPDocumentWindowController.h" #import "MPDocumentWindowController.h"
#import "MPIconSelectViewController.h"
@implementation MPActionHelper @implementation MPActionHelper

View File

@@ -22,6 +22,12 @@
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
@interface MPPopupImageView : NSImageView @protocol MPModelChangeObserving;
@class KPKNode;
@interface MPIconImageView : NSImageView
@property (weak, nullable) id<MPModelChangeObserving> modelChangeObserver;
@property (weak, nullable) KPKNode *node;
@end @end

View File

@@ -20,13 +20,15 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
// //
#import "MPPopupImageView.h" #import "MPIconImageView.h"
#import "MPModelChangeObserving.h"
#import "MPDocument.h"
#define MPTRIANGLE_HEIGHT 8 #define MPTRIANGLE_HEIGHT 8
#define MPTRIANGLE_WIDTH 10 #define MPTRIANGLE_WIDTH 10
#define MPTRIANGLE_OFFSET 2 #define MPTRIANGLE_OFFSET 2
@interface MPPopupImageView () @interface MPIconImageView ()
@property (assign) BOOL showOverlay; @property (assign) BOOL showOverlay;
@@ -34,7 +36,7 @@
@end @end
@implementation MPPopupImageView @implementation MPIconImageView
- (id)initWithFrame:(NSRect)frameRect { - (id)initWithFrame:(NSRect)frameRect {
self = [super initWithFrame:frameRect]; self = [super initWithFrame:frameRect];
@@ -57,7 +59,7 @@
if(self.showOverlay && self.enabled) { if(self.showOverlay && self.enabled) {
[[NSGraphicsContext currentContext] saveGraphicsState]; [[NSGraphicsContext currentContext] saveGraphicsState];
NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:4 yRadius:4]; NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:4 yRadius:4];
NSShadow *shadow = [[NSShadow alloc] init]; NSShadow *shadow = [[NSShadow alloc] init];
@@ -65,7 +67,7 @@
shadow.shadowOffset = NSMakeSize(0, 0); shadow.shadowOffset = NSMakeSize(0, 0);
shadow.shadowColor = [NSColor colorWithCalibratedWhite:0.2 alpha:1]; shadow.shadowColor = [NSColor colorWithCalibratedWhite:0.2 alpha:1];
[shadow set]; [shadow set];
[path addClip]; [path addClip];
[[NSColor colorWithCalibratedWhite:1 alpha:0.2] setFill]; [[NSColor colorWithCalibratedWhite:1 alpha:0.2] setFill];
[path fill]; [path fill];
@@ -96,6 +98,7 @@
} }
- (void)_setupView { - (void)_setupView {
[self registerForDraggedTypes:@[(NSString *)kUTTypeURL, (NSString *)kUTTypeFileURL]];
/* Add tracking area for mouse events */ /* Add tracking area for mouse events */
NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow) options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow)
@@ -104,4 +107,32 @@
[self addTrackingArea:trackingArea]; [self addTrackingArea:trackingArea];
} }
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
return NSDragOperationCopy;
}
- (void)setImage:(NSImage *)image {
/*
setImage is only called via drag'n'drop. We are bound so we ignore this.
*/
}
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
NSPasteboard *pBoard = [sender draggingPasteboard];
NSArray *urls = [pBoard readObjectsForClasses:@[NSURL.class] options:@{ NSPasteboardURLReadingFileURLsOnlyKey : @YES }];
if(urls.count != 1) {
return NO;
}
KPKIcon *icon = [[KPKIcon alloc] initWithImageAtURL:urls.firstObject];
if(icon.image) {
MPDocument *document = [NSDocumentController sharedDocumentController].currentDocument;
[document.tree.metaData addCustomIcon:icon];
}
[self.modelChangeObserver willChangeModelProperty];
self.node.iconUUID = icon.uuid;
[self.modelChangeObserver didChangeModelProperty];
return YES;
}
@end @end

View File

@@ -94,6 +94,11 @@
[task resume]; [task resume];
} }
- (void)deleteIcon:(id)sender {
}
- (void)_deleteIcon:(KPKIcon *)icon { - (void)_deleteIcon:(KPKIcon *)icon {
NSUInteger iconIndex = [self.iconCollectionView.content indexOfObject:icon]; NSUInteger iconIndex = [self.iconCollectionView.content indexOfObject:icon];

View File

@@ -23,7 +23,7 @@
#import "MPViewController.h" #import "MPViewController.h"
@class HNHUIGradientView; @class HNHUIGradientView;
@class MPPopupImageView; @class MPIconImageView;
@interface MPInspectorViewController : MPViewController <NSPopoverDelegate> @interface MPInspectorViewController : MPViewController <NSPopoverDelegate>
@@ -31,7 +31,7 @@
@property (weak) IBOutlet NSTextField *createdTextField; @property (weak) IBOutlet NSTextField *createdTextField;
@property (weak) IBOutlet NSTextField *modifiedTextField; @property (weak) IBOutlet NSTextField *modifiedTextField;
@property (weak) IBOutlet NSTextField *noSelectionInfo; @property (weak) IBOutlet NSTextField *noSelectionInfo;
@property (weak) IBOutlet MPPopupImageView *itemImageView; @property (weak) IBOutlet MPIconImageView *itemImageView;
@property (weak) IBOutlet NSTextField *itemNameTextField; @property (weak) IBOutlet NSTextField *itemNameTextField;
@property (weak) IBOutlet NSButton *saveChangesButton; @property (weak) IBOutlet NSButton *saveChangesButton;
@property (weak) IBOutlet NSButton *discardChangesButton; @property (weak) IBOutlet NSButton *discardChangesButton;

View File

@@ -27,8 +27,8 @@
#import "MPGroupInspectorViewController.h" #import "MPGroupInspectorViewController.h"
#import "MPIconHelper.h" #import "MPIconHelper.h"
#import "MPIconSelectViewController.h" #import "MPIconSelectViewController.h"
#import "MPIconImageView.h"
#import "MPNotifications.h" #import "MPNotifications.h"
#import "MPPopupImageView.h"
#import "MPPluginDataViewController.h" #import "MPPluginDataViewController.h"
#import "KeePassKit/KeePassKit.h" #import "KeePassKit/KeePassKit.h"
@@ -135,6 +135,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
object:document]; object:document];
self.entryViewController.observer = document; self.entryViewController.observer = document;
self.itemImageView.modelChangeObserver = document;
self.observer = document; self.observer = document;
[self.entryViewController registerNotificationsForDocument:document]; [self.entryViewController registerNotificationsForDocument:document];
@@ -249,6 +250,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
[self.groupViewController commitEditing]; [self.groupViewController commitEditing];
self.representedObject = node; self.representedObject = node;
self.itemImageView.node = node;
self.entryViewController.representedObject = node.asEntry; self.entryViewController.representedObject = node.asEntry;
self.groupViewController.representedObject = node.asGroup; self.groupViewController.representedObject = node.asGroup;