diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index 69478c2f..3efe0c2e 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -235,7 +235,7 @@ 4CE298EB1795FC2A00DF7BDB /* MPEntryContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE298EA1795FC2A00DF7BDB /* MPEntryContextMenuDelegate.m */; }; 4CE30ACC1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE30ACB1A312B7F0063FCC6 /* MPReferenceBuilderViewController.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 */; }; 4CE501341BBC47F500FB819D /* MPTagsTokenFieldDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE501331BBC47F500FB819D /* MPTagsTokenFieldDelegate.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 = ""; }; 4CE39ABD16ECE34A000FE29D /* MPIconSelectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIconSelectViewController.h; sourceTree = ""; }; 4CE39ABE16ECE34A000FE29D /* MPIconSelectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIconSelectViewController.m; sourceTree = ""; }; - 4CE39AC216ECE4F7000FE29D /* MPPopupImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopupImageView.h; sourceTree = ""; }; - 4CE39AC316ECE4F7000FE29D /* MPPopupImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPopupImageView.m; sourceTree = ""; }; + 4CE39AC216ECE4F7000FE29D /* MPIconImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIconImageView.h; sourceTree = ""; }; + 4CE39AC316ECE4F7000FE29D /* MPIconImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIconImageView.m; sourceTree = ""; }; 4CE3E62417AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAttachmentTableDataSource.h; sourceTree = ""; }; 4CE3E62517AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAttachmentTableDataSource.m; sourceTree = ""; }; 4CE501321BBC47F500FB819D /* MPTagsTokenFieldDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTagsTokenFieldDelegate.h; sourceTree = ""; }; @@ -886,8 +886,8 @@ 4CE8247416E2F2B900573141 /* MPOverlayView.m */, 4CFC53BD16E94729007396BE /* MPShadowBox.h */, 4CFC53BE16E94729007396BE /* MPShadowBox.m */, - 4CE39AC216ECE4F7000FE29D /* MPPopupImageView.h */, - 4CE39AC316ECE4F7000FE29D /* MPPopupImageView.m */, + 4CE39AC216ECE4F7000FE29D /* MPIconImageView.h */, + 4CE39AC316ECE4F7000FE29D /* MPIconImageView.m */, 4C4A100D176286FD00BBF2CA /* MPTableView.h */, 4C4A100E176286FD00BBF2CA /* MPTableView.m */, 4C4FCE13177CFE6B00BBF7AE /* MPCustomFieldTableCellView.h */, @@ -1772,7 +1772,7 @@ 4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */, 4CDA35751EBA0CF2003CD59F /* NSString+MPComposedCharacterAdditions.m in Sources */, 4CE39ABF16ECE34A000FE29D /* MPIconSelectViewController.m in Sources */, - 4CE39AC416ECE4F7000FE29D /* MPPopupImageView.m in Sources */, + 4CE39AC416ECE4F7000FE29D /* MPIconImageView.m in Sources */, 4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */, 4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */, 4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */, diff --git a/MacPass/Base.lproj/IconSelection.xib b/MacPass/Base.lproj/IconSelection.xib index 849175fb..f4d855c9 100644 --- a/MacPass/Base.lproj/IconSelection.xib +++ b/MacPass/Base.lproj/IconSelection.xib @@ -29,7 +29,6 @@ - @@ -158,20 +157,6 @@ - - - - - - - - - - - - - - diff --git a/MacPass/Base.lproj/InspectorView.xib b/MacPass/Base.lproj/InspectorView.xib index 576f876b..d328800b 100644 --- a/MacPass/Base.lproj/InspectorView.xib +++ b/MacPass/Base.lproj/InspectorView.xib @@ -1,8 +1,7 @@ - + - - + @@ -22,7 +21,7 @@ - + @@ -31,16 +30,16 @@ - - - NSNegateBoolean - - + + + NSNegateBoolean + + diff --git a/MacPass/MPActionHelper.m b/MacPass/MPActionHelper.m index 88e8258c..e3ead086 100644 --- a/MacPass/MPActionHelper.m +++ b/MacPass/MPActionHelper.m @@ -25,6 +25,7 @@ #import "MPEntryInspectorViewController.h" #import "MPEntryViewController.h" #import "MPDocumentWindowController.h" +#import "MPIconSelectViewController.h" @implementation MPActionHelper diff --git a/MacPass/MPPopupImageView.h b/MacPass/MPIconImageView.h similarity index 80% rename from MacPass/MPPopupImageView.h rename to MacPass/MPIconImageView.h index bfa40998..a0608785 100644 --- a/MacPass/MPPopupImageView.h +++ b/MacPass/MPIconImageView.h @@ -22,6 +22,12 @@ #import -@interface MPPopupImageView : NSImageView +@protocol MPModelChangeObserving; +@class KPKNode; + +@interface MPIconImageView : NSImageView + +@property (weak, nullable) id modelChangeObserver; +@property (weak, nullable) KPKNode *node; @end diff --git a/MacPass/MPPopupImageView.m b/MacPass/MPIconImageView.m similarity index 72% rename from MacPass/MPPopupImageView.m rename to MacPass/MPIconImageView.m index 5585b2ae..03100a8c 100644 --- a/MacPass/MPPopupImageView.m +++ b/MacPass/MPIconImageView.m @@ -20,13 +20,15 @@ // along with this program. If not, see . // -#import "MPPopupImageView.h" +#import "MPIconImageView.h" +#import "MPModelChangeObserving.h" +#import "MPDocument.h" #define MPTRIANGLE_HEIGHT 8 #define MPTRIANGLE_WIDTH 10 #define MPTRIANGLE_OFFSET 2 -@interface MPPopupImageView () +@interface MPIconImageView () @property (assign) BOOL showOverlay; @@ -34,7 +36,7 @@ @end -@implementation MPPopupImageView +@implementation MPIconImageView - (id)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:frameRect]; @@ -57,7 +59,7 @@ if(self.showOverlay && self.enabled) { [[NSGraphicsContext currentContext] saveGraphicsState]; - + NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:4 yRadius:4]; NSShadow *shadow = [[NSShadow alloc] init]; @@ -65,7 +67,7 @@ shadow.shadowOffset = NSMakeSize(0, 0); shadow.shadowColor = [NSColor colorWithCalibratedWhite:0.2 alpha:1]; [shadow set]; - + [path addClip]; [[NSColor colorWithCalibratedWhite:1 alpha:0.2] setFill]; [path fill]; @@ -96,6 +98,7 @@ } - (void)_setupView { + [self registerForDraggedTypes:@[(NSString *)kUTTypeURL, (NSString *)kUTTypeFileURL]]; /* Add tracking area for mouse events */ NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow) @@ -104,4 +107,32 @@ [self addTrackingArea:trackingArea]; } +- (NSDragOperation)draggingEntered:(id)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)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 diff --git a/MacPass/MPIconSelectViewController.m b/MacPass/MPIconSelectViewController.m index e647f0e7..a55c1f59 100644 --- a/MacPass/MPIconSelectViewController.m +++ b/MacPass/MPIconSelectViewController.m @@ -94,6 +94,11 @@ [task resume]; } +- (void)deleteIcon:(id)sender { + +} + + - (void)_deleteIcon:(KPKIcon *)icon { NSUInteger iconIndex = [self.iconCollectionView.content indexOfObject:icon]; diff --git a/MacPass/MPInspectorViewController.h b/MacPass/MPInspectorViewController.h index df703178..bafd1254 100644 --- a/MacPass/MPInspectorViewController.h +++ b/MacPass/MPInspectorViewController.h @@ -23,7 +23,7 @@ #import "MPViewController.h" @class HNHUIGradientView; -@class MPPopupImageView; +@class MPIconImageView; @interface MPInspectorViewController : MPViewController @@ -31,7 +31,7 @@ @property (weak) IBOutlet NSTextField *createdTextField; @property (weak) IBOutlet NSTextField *modifiedTextField; @property (weak) IBOutlet NSTextField *noSelectionInfo; -@property (weak) IBOutlet MPPopupImageView *itemImageView; +@property (weak) IBOutlet MPIconImageView *itemImageView; @property (weak) IBOutlet NSTextField *itemNameTextField; @property (weak) IBOutlet NSButton *saveChangesButton; @property (weak) IBOutlet NSButton *discardChangesButton; diff --git a/MacPass/MPInspectorViewController.m b/MacPass/MPInspectorViewController.m index 0cd20b31..ae3bb2c8 100644 --- a/MacPass/MPInspectorViewController.m +++ b/MacPass/MPInspectorViewController.m @@ -27,8 +27,8 @@ #import "MPGroupInspectorViewController.h" #import "MPIconHelper.h" #import "MPIconSelectViewController.h" +#import "MPIconImageView.h" #import "MPNotifications.h" -#import "MPPopupImageView.h" #import "MPPluginDataViewController.h" #import "KeePassKit/KeePassKit.h" @@ -135,6 +135,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) { object:document]; self.entryViewController.observer = document; + self.itemImageView.modelChangeObserver = document; self.observer = document; [self.entryViewController registerNotificationsForDocument:document]; @@ -249,6 +250,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) { [self.groupViewController commitEditing]; self.representedObject = node; + self.itemImageView.node = node; self.entryViewController.representedObject = node.asEntry; self.groupViewController.representedObject = node.asGroup;