Using NSViewController presentation instead of manual NSPopup creation

This commit is contained in:
Michael Starke
2018-11-05 17:36:32 +01:00
parent d6b95118da
commit 1ed35a6eab
10 changed files with 40 additions and 95 deletions

View File

@@ -33,7 +33,6 @@
4C17F108184E6B6C00E85625 /* 31_PrintTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C17F106184E6B6C00E85625 /* 31_PrintTemplate.pdf */; }; 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 */; }; 4C17F109184E6B6C00E85625 /* 30_TerminalTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C17F107184E6B6C00E85625 /* 30_TerminalTemplate.pdf */; };
4C1BDF2B1E4392640012A3F0 /* MPPluginDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1BDF291E4392640012A3F0 /* MPPluginDataViewController.m */; }; 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 */; }; 4C1E9885185F71A800943563 /* MPContextBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1E9884185F71A800943563 /* MPContextBarViewController.m */; };
4C1F7FA21E3A12E600D6A40E /* MPModifiedKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1F7FA11E3A12E600D6A40E /* MPModifiedKey.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 */; }; 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 = "<group>"; }; 4C17F107184E6B6C00E85625 /* 30_TerminalTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 30_TerminalTemplate.pdf; sourceTree = "<group>"; };
4C1BDF281E4392640012A3F0 /* MPPluginDataViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPluginDataViewController.h; sourceTree = "<group>"; }; 4C1BDF281E4392640012A3F0 /* MPPluginDataViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPluginDataViewController.h; sourceTree = "<group>"; };
4C1BDF291E4392640012A3F0 /* MPPluginDataViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPluginDataViewController.m; sourceTree = "<group>"; }; 4C1BDF291E4392640012A3F0 /* MPPluginDataViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPluginDataViewController.m; sourceTree = "<group>"; };
4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = "<group>"; };
4C1E9883185F71A800943563 /* MPContextBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPContextBarViewController.h; sourceTree = "<group>"; }; 4C1E9883185F71A800943563 /* MPContextBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPContextBarViewController.h; sourceTree = "<group>"; };
4C1E9884185F71A800943563 /* MPContextBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPContextBarViewController.m; sourceTree = "<group>"; }; 4C1E9884185F71A800943563 /* MPContextBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPContextBarViewController.m; sourceTree = "<group>"; };
4C1F7FA01E3A12E600D6A40E /* MPModifiedKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPModifiedKey.h; sourceTree = "<group>"; }; 4C1F7FA01E3A12E600D6A40E /* MPModifiedKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPModifiedKey.h; sourceTree = "<group>"; };
@@ -1443,7 +1441,6 @@
4CE8247116E2E98200573141 /* Data Controller */, 4CE8247116E2E98200573141 /* Data Controller */,
4CE8247016E2E96500573141 /* Window Controller */, 4CE8247016E2E96500573141 /* Window Controller */,
4CA0B2F115BCAEE600654E32 /* View Controller */, 4CA0B2F115BCAEE600654E32 /* View Controller */,
4CE8247216E2E99F00573141 /* Windows */,
4C06398C15B980480004DE27 /* Views */, 4C06398C15B980480004DE27 /* Views */,
4CDB556616E29A8A00635918 /* Controls */, 4CDB556616E29A8A00635918 /* Controls */,
4C37A84215B8B495005EF8EE /* Model */, 4C37A84215B8B495005EF8EE /* Model */,
@@ -1661,14 +1658,6 @@
name = "Data Controller"; name = "Data Controller";
sourceTree = "<group>"; sourceTree = "<group>";
}; };
4CE8247216E2E99F00573141 /* Windows */ = {
isa = PBXGroup;
children = (
4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */,
);
name = Windows;
sourceTree = "<group>";
};
4CE88B9317BA64DB0042E078 /* Icons */ = { 4CE88B9317BA64DB0042E078 /* Icons */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1879,7 +1868,6 @@
4C3826BB1AD04D8E007D7D67 /* 47_PackageTemplate.pdf in Resources */, 4C3826BB1AD04D8E007D7D67 /* 47_PackageTemplate.pdf in Resources */,
6021FE8D18E1617300C3BC51 /* PasswordCreatorView.xib in Resources */, 6021FE8D18E1617300C3BC51 /* PasswordCreatorView.xib in Resources */,
4C3826AC1AD04D8E007D7D67 /* 29_SecureTerminalTemplate.pdf in Resources */, 4C3826AC1AD04D8E007D7D67 /* 29_SecureTerminalTemplate.pdf in Resources */,
4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */,
4C3826741AD04BA5007D7D67 /* infoTemplate.pdf in Resources */, 4C3826741AD04BA5007D7D67 /* infoTemplate.pdf in Resources */,
4C3826B11AD04D8E007D7D67 /* 36_ArchiveTemplate.pdf in Resources */, 4C3826B11AD04D8E007D7D67 /* 36_ArchiveTemplate.pdf in Resources */,
4C7714AA176C998F00549F2A /* 43_TrashTemplate.pdf in Resources */, 4C7714AA176C998F00549F2A /* 43_TrashTemplate.pdf in Resources */,

View File

@@ -233,13 +233,19 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
- (void)showPasswordCreator:(id)sender { - (void)showPasswordCreator:(id)sender {
if(!self.passwordCreatorWindow) { 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) { if(!self.passwordCreatorController) {
self.passwordCreatorController = [[MPPasswordCreatorViewController alloc] init]; self.passwordCreatorController = [[MPPasswordCreatorViewController alloc] init];
self.passwordCreatorWindow.contentViewController = self.passwordCreatorController; self.passwordCreatorWindow.contentViewController = self.passwordCreatorController;
} }
[self.passwordCreatorController reset]; [self.passwordCreatorController reset];
[self.passwordCreatorWindow center];
[self.passwordCreatorWindow makeKeyAndOrderFront:self.passwordCreatorWindow]; [self.passwordCreatorWindow makeKeyAndOrderFront:self.passwordCreatorWindow];
} }

View File

@@ -83,11 +83,11 @@ typedef NS_ENUM(NSUInteger, MPDatePreset) {
[self.observer willChangeModelProperty]; [self.observer willChangeModelProperty];
[self.representedObject timeInfo].expirationDate = self.datePicker.dateValue; [self.representedObject timeInfo].expirationDate = self.datePicker.dateValue;
[self.observer didChangeModelProperty]; [self.observer didChangeModelProperty];
[self.view.window performClose:sender]; [self dismissController:sender];
} }
- (IBAction)cancel:(id)sender { - (IBAction)cancel:(id)sender {
[self.view.window performClose:sender]; [self dismissController:sender];
} }
- (IBAction)setDatePreset:(id)sender { - (IBAction)setDatePreset:(id)sender {

View File

@@ -74,7 +74,6 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
@property (nonatomic, assign) BOOL showPassword; @property (nonatomic, assign) BOOL showPassword;
@property (nonatomic, assign) MPEntryTab activeTab; @property (nonatomic, assign) MPEntryTab activeTab;
@property (strong) NSPopover *activePopover;
@property (nonatomic, readonly) KPKEntry *representedEntry; @property (nonatomic, readonly) KPKEntry *representedEntry;
@property (strong) MPTemporaryFileStorage *quicklookStorage; @property (strong) MPTemporaryFileStorage *quicklookStorage;
@@ -371,24 +370,22 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
[self _showPopopver:viewController atView:sender onEdge:NSMinYEdge]; [self _showPopopver:viewController atView:sender onEdge:NSMinYEdge];
} }
- (void)_showPopopver:(NSViewController *)viewController atView:(NSView *)view onEdge:(NSRectEdge)edge { - (void)dismissViewController:(NSViewController *)viewController {
if(self.activePopover.contentViewController == viewController) { if([viewController isKindOfClass:MPAutotypeBuilderViewController.class]) {
return; // Do nothing, we already did show the controller self.showCustomAssociationSequenceAutotypeBuilderButton.enabled = YES;
self.showCustomEntrySequenceAutotypeBuilderButton.enabled = YES;
} }
[self.activePopover close]; else if([viewController isKindOfClass:MPPasswordCreatorViewController.class]) {
NSAssert(self.activePopover == nil, @"Popover hast to be niled out"); self.generatePasswordButton.enabled = YES;
self.activePopover = [[NSPopover alloc] init]; }
self.activePopover.delegate = self; [super dismissViewController:viewController];
self.activePopover.behavior = NSPopoverBehaviorTransient;
self.activePopover.contentViewController = viewController;
[self.activePopover showRelativeToRect:NSZeroRect ofView:view preferredEdge:edge];
} }
- (void)popoverDidClose:(NSNotification *)notification { - (void)_showPopopver:(NSViewController *)viewController atView:(NSView *)view onEdge:(NSRectEdge)edge {
self.generatePasswordButton.enabled = YES; if([self.presentedViewControllers containsObject:viewController]) {
self.showCustomEntrySequenceAutotypeBuilderButton.enabled = YES; return;
self.showCustomAssociationSequenceAutotypeBuilderButton.enabled = YES; }
self.activePopover = nil; [self presentViewController:viewController asPopoverRelativeToRect:NSZeroRect ofView:view preferredEdge:edge behavior:NSPopoverBehaviorTransient];
} }
#pragma mark - #pragma mark -

View File

@@ -27,8 +27,4 @@
@interface MPIconSelectViewController : MPViewController <NSCollectionViewDelegate> @interface MPIconSelectViewController : MPViewController <NSCollectionViewDelegate>
@property (weak, nullable) NSPopover *popover;
- (IBAction)didSelectCollectionViewItem:(id _Nullable)sender;
@end @end

View File

@@ -86,7 +86,7 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) {
node.iconId = [node.class defaultIcon]; node.iconId = [node.class defaultIcon];
node.iconUUID = nil; node.iconUUID = nil;
[self.observer didChangeModelProperty]; [self.observer didChangeModelProperty];
[self.view.window performClose:sender]; [self dismissController:sender];
} }
- (IBAction)downloadIcon:(id)sender { - (IBAction)downloadIcon:(id)sender {
@@ -168,7 +168,7 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) {
} }
- (IBAction)cancel:(id)sender { - (IBAction)cancel:(id)sender {
[self.view.window performClose:sender]; [self dismissController:sender];
} }
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
@@ -186,15 +186,6 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) {
return NO; 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 { - (void)_selectIcon:(KPKIcon *)icon {
KPKNode *node = self.representedObject; KPKNode *node = self.representedObject;
NSUInteger iconIndex = [self.iconCollectionView.content indexOfObject:icon]; NSUInteger iconIndex = [self.iconCollectionView.content indexOfObject:icon];
@@ -210,7 +201,7 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) {
node.iconUUID = nil; node.iconUUID = nil;
} }
[self.observer didChangeModelProperty]; [self.observer didChangeModelProperty];
[self.view.window performClose:nil]; [self dismissController:nil];
} }
- (NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id <NSDraggingInfo>)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation { - (NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id <NSDraggingInfo>)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation {
@@ -225,7 +216,7 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) {
return NO; return NO;
} }
BOOL success = NO; BOOL success = NO;
MPDocument *document = [NSDocumentController sharedDocumentController].currentDocument; MPDocument *document = NSDocumentController.sharedDocumentController.currentDocument;
for(NSURL *url in urls) { for(NSURL *url in urls) {
KPKIcon *icon = [[KPKIcon alloc] initWithImageAtURL:url]; KPKIcon *icon = [[KPKIcon alloc] initWithImageAtURL:url];
if(icon.image) { if(icon.image) {

View File

@@ -24,7 +24,7 @@
#import <HNHUi/HNHUi.h> #import <HNHUi/HNHUi.h>
@class MPIconImageView; @class MPIconImageView;
@interface MPInspectorViewController : MPViewController <NSPopoverDelegate, HNHUITextViewDelegate> @interface MPInspectorViewController : MPViewController <HNHUITextViewDelegate>
@property (weak) IBOutlet NSTextField *noSelectionInfo; @property (weak) IBOutlet NSTextField *noSelectionInfo;
@property (weak) IBOutlet MPIconImageView *itemImageView; @property (weak) IBOutlet MPIconImageView *itemImageView;

View File

@@ -47,7 +47,6 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
@property (strong) MPEntryInspectorViewController *entryViewController; @property (strong) MPEntryInspectorViewController *entryViewController;
@property (strong) MPGroupInspectorViewController *groupViewController; @property (strong) MPGroupInspectorViewController *groupViewController;
@property (strong) NSPopover *popover;
@property (copy) NSString *expiryDateText; @property (copy) NSString *expiryDateText;
@property (nonatomic, assign) NSUInteger activeTab; @property (nonatomic, assign) NSUInteger activeTab;
@@ -177,24 +176,9 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
} }
- (void)_popupViewController:(MPViewController *)vc atView:(NSView *)view { - (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.representedObject = self.representedObject;
vc.observer = self.windowController.document; vc.observer = self.windowController.document;
self.popover.contentViewController = vc; [self presentViewController:vc asPopoverRelativeToRect:NSZeroRect ofView:view preferredEdge:NSMinYEdge behavior:NSPopoverBehaviorTransient];
[self.popover showRelativeToRect:NSZeroRect ofView:view preferredEdge:NSMinYEdge];
}
#pragma mark - NSPopover Delegate
- (void)popoverDidClose:(NSNotification *)notification {
/* clear out the popover */
self.popover = nil;
} }
#pragma mark - MPDocument Notifications #pragma mark - MPDocument Notifications

View File

@@ -195,11 +195,21 @@ typedef NS_ENUM(NSUInteger, MPPasswordRating) {
entry.password = self.password; entry.password = self.password;
[self.observer didChangeModelProperty]; [self.observer didChangeModelProperty];
} }
[self.view.window performClose:sender]; if(self.presentingViewController) {
[self dismissController:sender];
}
else {
[self.view.window performClose:sender];
}
} }
- (IBAction)_cancel:(id)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 { - (IBAction)_setDefault:(id)sender {

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.18"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPAppDelegate">
<connections>
<outlet property="passwordCreatorWindow" destination="1" id="3"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Password Generator" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<rect key="contentRect" x="196" y="240" width="338" height="216"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" id="2">
<rect key="frame" x="0.0" y="0.0" width="338" height="216"/>
<autoresizingMask key="autoresizingMask"/>
</view>
<point key="canvasLocation" x="48" y="-70"/>
</window>
</objects>
</document>