From 1ed35a6eabae6c57294e6703330eaf40079f641a Mon Sep 17 00:00:00 2001 From: Michael Starke Date: Mon, 5 Nov 2018 17:36:32 +0100 Subject: [PATCH] Using NSViewController presentation instead of manual NSPopup creation --- MacPass.xcodeproj/project.pbxproj | 12 ---------- MacPass/MPAppDelegate.m | 8 ++++++- MacPass/MPDatePickingViewController.m | 4 ++-- MacPass/MPEntryInspectorViewController.m | 29 ++++++++++------------- MacPass/MPIconSelectViewController.h | 4 ---- MacPass/MPIconSelectViewController.m | 17 ++++--------- MacPass/MPInspectorViewController.h | 2 +- MacPass/MPInspectorViewController.m | 18 +------------- MacPass/MPPasswordCreatorViewController.m | 14 +++++++++-- MacPass/PasswordCreatorWindow.xib | 27 --------------------- 10 files changed, 40 insertions(+), 95 deletions(-) delete mode 100644 MacPass/PasswordCreatorWindow.xib diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index 6aa7db50..0ba57f72 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -33,7 +33,6 @@ 4C17F108184E6B6C00E85625 /* 31_PrintTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C17F106184E6B6C00E85625 /* 31_PrintTemplate.pdf */; }; 4C17F109184E6B6C00E85625 /* 30_TerminalTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C17F107184E6B6C00E85625 /* 30_TerminalTemplate.pdf */; }; 4C1BDF2B1E4392640012A3F0 /* MPPluginDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1BDF291E4392640012A3F0 /* MPPluginDataViewController.m */; }; - 4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; }; 4C1E9885185F71A800943563 /* MPContextBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1E9884185F71A800943563 /* MPContextBarViewController.m */; }; 4C1F7FA21E3A12E600D6A40E /* MPModifiedKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1F7FA11E3A12E600D6A40E /* MPModifiedKey.m */; }; 4C1FA07B18231900003A3F8C /* MPDocument+Autotype.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1FA07A18231900003A3F8C /* MPDocument+Autotype.m */; }; @@ -373,7 +372,6 @@ 4C17F107184E6B6C00E85625 /* 30_TerminalTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 30_TerminalTemplate.pdf; sourceTree = ""; }; 4C1BDF281E4392640012A3F0 /* MPPluginDataViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPluginDataViewController.h; sourceTree = ""; }; 4C1BDF291E4392640012A3F0 /* MPPluginDataViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPluginDataViewController.m; sourceTree = ""; }; - 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = ""; }; 4C1E9883185F71A800943563 /* MPContextBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPContextBarViewController.h; sourceTree = ""; }; 4C1E9884185F71A800943563 /* MPContextBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPContextBarViewController.m; sourceTree = ""; }; 4C1F7FA01E3A12E600D6A40E /* MPModifiedKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPModifiedKey.h; sourceTree = ""; }; @@ -1443,7 +1441,6 @@ 4CE8247116E2E98200573141 /* Data Controller */, 4CE8247016E2E96500573141 /* Window Controller */, 4CA0B2F115BCAEE600654E32 /* View Controller */, - 4CE8247216E2E99F00573141 /* Windows */, 4C06398C15B980480004DE27 /* Views */, 4CDB556616E29A8A00635918 /* Controls */, 4C37A84215B8B495005EF8EE /* Model */, @@ -1661,14 +1658,6 @@ name = "Data Controller"; sourceTree = ""; }; - 4CE8247216E2E99F00573141 /* Windows */ = { - isa = PBXGroup; - children = ( - 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */, - ); - name = Windows; - sourceTree = ""; - }; 4CE88B9317BA64DB0042E078 /* Icons */ = { isa = PBXGroup; children = ( @@ -1879,7 +1868,6 @@ 4C3826BB1AD04D8E007D7D67 /* 47_PackageTemplate.pdf in Resources */, 6021FE8D18E1617300C3BC51 /* PasswordCreatorView.xib in Resources */, 4C3826AC1AD04D8E007D7D67 /* 29_SecureTerminalTemplate.pdf in Resources */, - 4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */, 4C3826741AD04BA5007D7D67 /* infoTemplate.pdf in Resources */, 4C3826B11AD04D8E007D7D67 /* 36_ArchiveTemplate.pdf in Resources */, 4C7714AA176C998F00549F2A /* 43_TrashTemplate.pdf in Resources */, diff --git a/MacPass/MPAppDelegate.m b/MacPass/MPAppDelegate.m index ce8ba892..943b234c 100644 --- a/MacPass/MPAppDelegate.m +++ b/MacPass/MPAppDelegate.m @@ -233,13 +233,19 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi - (void)showPasswordCreator:(id)sender { if(!self.passwordCreatorWindow) { - [NSBundle.mainBundle loadNibNamed:@"PasswordCreatorWindow"owner:self topLevelObjects:nil]; + self.passwordCreatorWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100) + styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable + backing:NSBackingStoreBuffered + defer:NO]; + self.passwordCreatorWindow.releasedWhenClosed = NO; + self.passwordCreatorWindow.title = NSLocalizedString(@"PASSWORD_CREATOR_WINDOW_TITLE", @"Window title for the stand-alone password creator window"); } if(!self.passwordCreatorController) { self.passwordCreatorController = [[MPPasswordCreatorViewController alloc] init]; self.passwordCreatorWindow.contentViewController = self.passwordCreatorController; } [self.passwordCreatorController reset]; + [self.passwordCreatorWindow center]; [self.passwordCreatorWindow makeKeyAndOrderFront:self.passwordCreatorWindow]; } diff --git a/MacPass/MPDatePickingViewController.m b/MacPass/MPDatePickingViewController.m index f8493708..ef74ba45 100644 --- a/MacPass/MPDatePickingViewController.m +++ b/MacPass/MPDatePickingViewController.m @@ -83,11 +83,11 @@ typedef NS_ENUM(NSUInteger, MPDatePreset) { [self.observer willChangeModelProperty]; [self.representedObject timeInfo].expirationDate = self.datePicker.dateValue; [self.observer didChangeModelProperty]; - [self.view.window performClose:sender]; + [self dismissController:sender]; } - (IBAction)cancel:(id)sender { - [self.view.window performClose:sender]; + [self dismissController:sender]; } - (IBAction)setDatePreset:(id)sender { diff --git a/MacPass/MPEntryInspectorViewController.m b/MacPass/MPEntryInspectorViewController.m index 6f49f69f..bba14163 100644 --- a/MacPass/MPEntryInspectorViewController.m +++ b/MacPass/MPEntryInspectorViewController.m @@ -74,7 +74,6 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) { @property (nonatomic, assign) BOOL showPassword; @property (nonatomic, assign) MPEntryTab activeTab; -@property (strong) NSPopover *activePopover; @property (nonatomic, readonly) KPKEntry *representedEntry; @property (strong) MPTemporaryFileStorage *quicklookStorage; @@ -371,24 +370,22 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) { [self _showPopopver:viewController atView:sender onEdge:NSMinYEdge]; } -- (void)_showPopopver:(NSViewController *)viewController atView:(NSView *)view onEdge:(NSRectEdge)edge { - if(self.activePopover.contentViewController == viewController) { - return; // Do nothing, we already did show the controller +- (void)dismissViewController:(NSViewController *)viewController { + if([viewController isKindOfClass:MPAutotypeBuilderViewController.class]) { + self.showCustomAssociationSequenceAutotypeBuilderButton.enabled = YES; + self.showCustomEntrySequenceAutotypeBuilderButton.enabled = YES; } - [self.activePopover close]; - NSAssert(self.activePopover == nil, @"Popover hast to be niled out"); - self.activePopover = [[NSPopover alloc] init]; - self.activePopover.delegate = self; - self.activePopover.behavior = NSPopoverBehaviorTransient; - self.activePopover.contentViewController = viewController; - [self.activePopover showRelativeToRect:NSZeroRect ofView:view preferredEdge:edge]; + else if([viewController isKindOfClass:MPPasswordCreatorViewController.class]) { + self.generatePasswordButton.enabled = YES; + } + [super dismissViewController:viewController]; } -- (void)popoverDidClose:(NSNotification *)notification { - self.generatePasswordButton.enabled = YES; - self.showCustomEntrySequenceAutotypeBuilderButton.enabled = YES; - self.showCustomAssociationSequenceAutotypeBuilderButton.enabled = YES; - self.activePopover = nil; +- (void)_showPopopver:(NSViewController *)viewController atView:(NSView *)view onEdge:(NSRectEdge)edge { + if([self.presentedViewControllers containsObject:viewController]) { + return; + } + [self presentViewController:viewController asPopoverRelativeToRect:NSZeroRect ofView:view preferredEdge:edge behavior:NSPopoverBehaviorTransient]; } #pragma mark - diff --git a/MacPass/MPIconSelectViewController.h b/MacPass/MPIconSelectViewController.h index a22cb81d..a4f5638d 100644 --- a/MacPass/MPIconSelectViewController.h +++ b/MacPass/MPIconSelectViewController.h @@ -27,8 +27,4 @@ @interface MPIconSelectViewController : MPViewController -@property (weak, nullable) NSPopover *popover; - -- (IBAction)didSelectCollectionViewItem:(id _Nullable)sender; - @end diff --git a/MacPass/MPIconSelectViewController.m b/MacPass/MPIconSelectViewController.m index 940f8952..f32c7a71 100644 --- a/MacPass/MPIconSelectViewController.m +++ b/MacPass/MPIconSelectViewController.m @@ -86,7 +86,7 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) { node.iconId = [node.class defaultIcon]; node.iconUUID = nil; [self.observer didChangeModelProperty]; - [self.view.window performClose:sender]; + [self dismissController:sender]; } - (IBAction)downloadIcon:(id)sender { @@ -168,7 +168,7 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) { } - (IBAction)cancel:(id)sender { - [self.view.window performClose:sender]; + [self dismissController:sender]; } - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { @@ -186,15 +186,6 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) { return NO; } -- (void)didSelectCollectionViewItem:(id)sender { - if(![sender isKindOfClass:[NSCollectionViewItem class]]) { - return; - } - NSCollectionViewItem *item = sender; - NSLog(@"selected item.frame: %@", NSStringFromRect(item.view.frame)); - //[self _selectIcon:item.representedObject]; -} - - (void)_selectIcon:(KPKIcon *)icon { KPKNode *node = self.representedObject; NSUInteger iconIndex = [self.iconCollectionView.content indexOfObject:icon]; @@ -210,7 +201,7 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) { node.iconUUID = nil; } [self.observer didChangeModelProperty]; - [self.view.window performClose:nil]; + [self dismissController:nil]; } - (NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id )draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation { @@ -225,7 +216,7 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) { return NO; } BOOL success = NO; - MPDocument *document = [NSDocumentController sharedDocumentController].currentDocument; + MPDocument *document = NSDocumentController.sharedDocumentController.currentDocument; for(NSURL *url in urls) { KPKIcon *icon = [[KPKIcon alloc] initWithImageAtURL:url]; if(icon.image) { diff --git a/MacPass/MPInspectorViewController.h b/MacPass/MPInspectorViewController.h index 42a2097c..ae2dca52 100644 --- a/MacPass/MPInspectorViewController.h +++ b/MacPass/MPInspectorViewController.h @@ -24,7 +24,7 @@ #import @class MPIconImageView; -@interface MPInspectorViewController : MPViewController +@interface MPInspectorViewController : MPViewController @property (weak) IBOutlet NSTextField *noSelectionInfo; @property (weak) IBOutlet MPIconImageView *itemImageView; diff --git a/MacPass/MPInspectorViewController.m b/MacPass/MPInspectorViewController.m index ef1aff1f..d7d62b8f 100644 --- a/MacPass/MPInspectorViewController.m +++ b/MacPass/MPInspectorViewController.m @@ -47,7 +47,6 @@ typedef NS_ENUM(NSUInteger, MPContentTab) { @property (strong) MPEntryInspectorViewController *entryViewController; @property (strong) MPGroupInspectorViewController *groupViewController; -@property (strong) NSPopover *popover; @property (copy) NSString *expiryDateText; @property (nonatomic, assign) NSUInteger activeTab; @@ -177,24 +176,9 @@ typedef NS_ENUM(NSUInteger, MPContentTab) { } - (void)_popupViewController:(MPViewController *)vc atView:(NSView *)view { - if(self.popover) { - return; // Popover still active, abort - } - self.popover = [[NSPopover alloc] init]; - self.popover.delegate = self; - self.popover.behavior = NSPopoverBehaviorTransient; vc.representedObject = self.representedObject; vc.observer = self.windowController.document; - self.popover.contentViewController = vc; - [self.popover showRelativeToRect:NSZeroRect ofView:view preferredEdge:NSMinYEdge]; -} - - -#pragma mark - NSPopover Delegate - -- (void)popoverDidClose:(NSNotification *)notification { - /* clear out the popover */ - self.popover = nil; + [self presentViewController:vc asPopoverRelativeToRect:NSZeroRect ofView:view preferredEdge:NSMinYEdge behavior:NSPopoverBehaviorTransient]; } #pragma mark - MPDocument Notifications diff --git a/MacPass/MPPasswordCreatorViewController.m b/MacPass/MPPasswordCreatorViewController.m index e6acb14f..2c895788 100644 --- a/MacPass/MPPasswordCreatorViewController.m +++ b/MacPass/MPPasswordCreatorViewController.m @@ -195,11 +195,21 @@ typedef NS_ENUM(NSUInteger, MPPasswordRating) { entry.password = self.password; [self.observer didChangeModelProperty]; } - [self.view.window performClose:sender]; + if(self.presentingViewController) { + [self dismissController:sender]; + } + else { + [self.view.window performClose:sender]; + } } - (IBAction)_cancel:(id)sender { - [self.view.window performClose:sender]; + if(self.presentingViewController) { + [self dismissController:sender]; + } + else { + [self.view.window performClose:sender]; + } } - (IBAction)_setDefault:(id)sender { diff --git a/MacPass/PasswordCreatorWindow.xib b/MacPass/PasswordCreatorWindow.xib deleted file mode 100644 index c2c3d712..00000000 --- a/MacPass/PasswordCreatorWindow.xib +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -