Store loading and locking modal alerts.
[ADDED] Waiting until the store is loaded. [UPDATED] Hide or lock password window when locked.
This commit is contained in:
parent
0df322f648
commit
d7f369350b
@ -25,7 +25,7 @@
|
|||||||
@property(nonatomic, weak) IBOutlet NSMenuItem *dialogStyleRegular;
|
@property(nonatomic, weak) IBOutlet NSMenuItem *dialogStyleRegular;
|
||||||
@property(nonatomic, weak) IBOutlet NSMenuItem *dialogStyleHUD;
|
@property(nonatomic, weak) IBOutlet NSMenuItem *dialogStyleHUD;
|
||||||
|
|
||||||
- (IBAction)showPasswordWindow;
|
- (IBAction)showPasswordWindow:(id)sender;
|
||||||
- (IBAction)togglePreference:(NSMenuItem *)sender;
|
- (IBAction)togglePreference:(NSMenuItem *)sender;
|
||||||
- (IBAction)newUser:(NSMenuItem *)sender;
|
- (IBAction)newUser:(NSMenuItem *)sender;
|
||||||
- (IBAction)lock:(id)sender;
|
- (IBAction)lock:(id)sender;
|
||||||
|
@ -40,7 +40,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
|
|
||||||
// Check which hotkey this was.
|
// Check which hotkey this was.
|
||||||
if (hotKeyID.signature == MPShowHotKey.signature && hotKeyID.id == MPShowHotKey.id) {
|
if (hotKeyID.signature == MPShowHotKey.signature && hotKeyID.id == MPShowHotKey.id) {
|
||||||
[((__bridge MPMacAppDelegate *)userData) showPasswordWindow];
|
[((__bridge MPMacAppDelegate *)userData) showPasswordWindow:nil];
|
||||||
return noErr;
|
return noErr;
|
||||||
}
|
}
|
||||||
if (hotKeyID.signature == MPLockHotKey.signature && hotKeyID.id == MPLockHotKey.id) {
|
if (hotKeyID.signature == MPLockHotKey.signature && hotKeyID.id == MPLockHotKey.id) {
|
||||||
@ -168,7 +168,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
|
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
|
||||||
[self updateUsers];
|
[self updateUsers];
|
||||||
[self setActiveUser:newUser];
|
[self setActiveUser:newUser];
|
||||||
[self showPasswordWindow];
|
[self showPasswordWindow:nil];
|
||||||
}];
|
}];
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
@ -238,7 +238,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
else {
|
else {
|
||||||
[self.passwordWindow close];
|
[self.passwordWindow close];
|
||||||
self.passwordWindow = nil;
|
self.passwordWindow = nil;
|
||||||
[self showPasswordWindow];
|
[self showPasswordWindow:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
@ -280,24 +280,24 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
[MPMacConfig get].usedUserName = activeUser.name;
|
[MPMacConfig get].usedUserName = activeUser.name;
|
||||||
|
|
||||||
if (reopenPasswordWindow)
|
if (reopenPasswordWindow)
|
||||||
[self showPasswordWindow];
|
[self showPasswordWindow:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateMenuItems {
|
- (void)updateMenuItems {
|
||||||
|
|
||||||
MPUserEntity *activeUser = [self activeUserForThread];
|
MPUserEntity *activeUser = [self activeUserForThread];
|
||||||
if (!(self.showItem.enabled = ![self.passwordWindow.window isVisible])) {
|
// if (!(self.showItem.enabled = ![self.passwordWindow.window isVisible])) {
|
||||||
self.showItem.title = @"Show (Showing)";
|
// self.showItem.title = @"Show (Showing)";
|
||||||
self.showItem.toolTip = @"Master Password is already showing.";
|
// self.showItem.toolTip = @"Master Password is already showing.";
|
||||||
}
|
// }
|
||||||
else if (!(self.showItem.enabled = (activeUser != nil))) {
|
// else if (!(self.showItem.enabled = (activeUser != nil))) {
|
||||||
self.showItem.title = @"Show (No user)";
|
// self.showItem.title = @"Show (No user)";
|
||||||
self.showItem.toolTip = @"First select the user to show passwords for.";
|
// self.showItem.toolTip = @"First select the user to show passwords for.";
|
||||||
}
|
// }
|
||||||
else {
|
// else {
|
||||||
self.showItem.title = @"Show";
|
// self.showItem.title = @"Show";
|
||||||
self.showItem.toolTip = nil;
|
// self.showItem.toolTip = nil;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (self.key) {
|
if (self.key) {
|
||||||
self.lockItem.title = @"Lock";
|
self.lockItem.title = @"Lock";
|
||||||
@ -346,7 +346,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
// [self showPasswordWindow];
|
// [self showPasswordWindow];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)showPasswordWindow {
|
- (IBAction)showPasswordWindow:(id)sender {
|
||||||
|
|
||||||
// If no user, can't activate.
|
// If no user, can't activate.
|
||||||
if (![self activeUserForThread])
|
if (![self activeUserForThread])
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#define MPAlertUnlockMP @"MPAlertUnlockMP"
|
#define MPAlertUnlockMP @"MPAlertUnlockMP"
|
||||||
#define MPAlertIncorrectMP @"MPAlertIncorrectMP"
|
#define MPAlertIncorrectMP @"MPAlertIncorrectMP"
|
||||||
#define MPAlertCreateSite @"MPAlertCreateSite"
|
#define MPAlertCreateSite @"MPAlertCreateSite"
|
||||||
|
#define MPAlertLoadingData @"MPAlertLoadingData"
|
||||||
|
|
||||||
@interface MPPasswordWindowController()
|
@interface MPPasswordWindowController()
|
||||||
|
|
||||||
@ -21,6 +22,7 @@
|
|||||||
@property(nonatomic) BOOL siteFieldPreventCompletion;
|
@property(nonatomic) BOOL siteFieldPreventCompletion;
|
||||||
|
|
||||||
@property(nonatomic, strong) NSOperationQueue *backgroundQueue;
|
@property(nonatomic, strong) NSOperationQueue *backgroundQueue;
|
||||||
|
@property(nonatomic, strong) NSConditionLock *loadingLock;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation MPPasswordWindowController {
|
@implementation MPPasswordWindowController {
|
||||||
@ -41,7 +43,7 @@
|
|||||||
[self.tipField setStringValue:@""];
|
[self.tipField setStringValue:@""];
|
||||||
|
|
||||||
[self.userLabel setStringValue:PearlString( @"%@'s password for:", [[MPMacAppDelegate get] activeUserForThread].name )];
|
[self.userLabel setStringValue:PearlString( @"%@'s password for:", [[MPMacAppDelegate get] activeUserForThread].name )];
|
||||||
// [[MPMacAppDelegate get] addObserverBlock:^(NSString *keyPath, id object, NSDictionary *change, void *context) {
|
[[MPMacAppDelegate get] addObserverBlock:^(NSString *keyPath, id object, NSDictionary *change, void *context) {
|
||||||
// [MPMacAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *moc) {
|
// [MPMacAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *moc) {
|
||||||
// if (![MPAlgorithmDefault migrateUser:[[MPMacAppDelegate get] activeUserInContext:moc]])
|
// if (![MPAlgorithmDefault migrateUser:[[MPMacAppDelegate get] activeUserInContext:moc]])
|
||||||
// [NSAlert alertWithMessageText:@"Migration Needed" defaultButton:@"OK" alternateButton:nil otherButton:nil
|
// [NSAlert alertWithMessageText:@"Migration Needed" defaultButton:@"OK" alternateButton:nil otherButton:nil
|
||||||
@ -50,18 +52,23 @@
|
|||||||
// @"their passwords to change. You'll need to update your profile for that site with the new password."];
|
// @"their passwords to change. You'll need to update your profile for that site with the new password."];
|
||||||
// [moc saveToStore];
|
// [moc saveToStore];
|
||||||
// }];
|
// }];
|
||||||
// } forKeyPath:@"key" options:NSKeyValueObservingOptionInitial context:nil];
|
if (!self.inProgress && ![MPMacAppDelegate get].key) {
|
||||||
|
if (![MPMacAppDelegate get].activeUserForThread.saveKey)
|
||||||
|
[self unlock];
|
||||||
|
else
|
||||||
|
[self.window close];
|
||||||
|
}
|
||||||
|
} forKeyPath:@"key" options:NSKeyValueObservingOptionInitial context:nil];
|
||||||
[[NSNotificationCenter defaultCenter]
|
[[NSNotificationCenter defaultCenter]
|
||||||
addObserverForName:NSWindowDidBecomeKeyNotification object:self.window queue:nil usingBlock:^(NSNotification *note) {
|
addObserverForName:NSWindowDidBecomeKeyNotification object:self.window queue:nil usingBlock:^(NSNotification *note) {
|
||||||
if (![MPMacAppDelegate managedObjectContextForThreadIfReady])
|
|
||||||
[self waitUntilStoreLoaded];
|
[self waitUntilStoreLoaded];
|
||||||
if (!self.inProgress)
|
if (!self.inProgress)
|
||||||
[self unlock];
|
[self unlock];
|
||||||
[self.siteField selectText:self];
|
[self.siteField selectText:nil];
|
||||||
}];
|
}];
|
||||||
[[NSNotificationCenter defaultCenter]
|
[[NSNotificationCenter defaultCenter]
|
||||||
addObserverForName:NSWindowWillCloseNotification object:self.window queue:nil usingBlock:^(NSNotification *note) {
|
addObserverForName:NSWindowWillCloseNotification object:self.window queue:nil usingBlock:^(NSNotification *note) {
|
||||||
[[NSApplication sharedApplication] hide:self];
|
[[NSApplication sharedApplication] hide:nil];
|
||||||
}];
|
}];
|
||||||
[[NSNotificationCenter defaultCenter]
|
[[NSNotificationCenter defaultCenter]
|
||||||
addObserverForName:MPSignedOutNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
|
addObserverForName:MPSignedOutNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
|
||||||
@ -77,6 +84,18 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)waitUntilStoreLoaded {
|
- (void)waitUntilStoreLoaded {
|
||||||
|
|
||||||
|
if ([MPMacAppDelegate managedObjectContextForThreadIfReady]) {
|
||||||
|
[self.loadingLock unlockWithCondition:1];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[NSAlert alertWithMessageText:@"Loading Your Data" defaultButton:nil alternateButton:nil otherButton:nil
|
||||||
|
informativeTextWithFormat:nil]
|
||||||
|
beginSheetModalForWindow:self.window modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
|
||||||
|
contextInfo:MPAlertLoadingData];
|
||||||
|
[self.loadingLock = [[NSConditionLock alloc] initWithCondition:0] lockWhenCondition:1];
|
||||||
|
self.loadingLock = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)unlock {
|
- (void)unlock {
|
||||||
@ -123,6 +142,11 @@
|
|||||||
[self.window close];
|
[self.window close];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (contextInfo == MPAlertLoadingData) {
|
||||||
|
[alert.window orderOut:nil];
|
||||||
|
[self waitUntilStoreLoaded];
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (contextInfo == MPAlertUnlockMP) {
|
if (contextInfo == MPAlertUnlockMP) {
|
||||||
switch (returnCode) {
|
switch (returnCode) {
|
||||||
case NSAlertAlternateReturn: {
|
case NSAlertAlternateReturn: {
|
||||||
|
@ -272,7 +272,8 @@
|
|||||||
<object class="NSMenuItem" id="291035877">
|
<object class="NSMenuItem" id="291035877">
|
||||||
<reference key="NSMenu" ref="764588027"/>
|
<reference key="NSMenu" ref="764588027"/>
|
||||||
<string key="NSTitle">Quit</string>
|
<string key="NSTitle">Quit</string>
|
||||||
<string key="NSKeyEquiv"/>
|
<string key="NSKeyEquiv">q</string>
|
||||||
|
<int key="NSKeyEquivModMask">1048576</int>
|
||||||
<int key="NSMnemonicLoc">2147483647</int>
|
<int key="NSMnemonicLoc">2147483647</int>
|
||||||
<reference key="NSOnImage" ref="269450960"/>
|
<reference key="NSOnImage" ref="269450960"/>
|
||||||
<reference key="NSMixedImage" ref="977440657"/>
|
<reference key="NSMixedImage" ref="977440657"/>
|
||||||
@ -307,14 +308,6 @@
|
|||||||
</object>
|
</object>
|
||||||
<int key="connectionID">726</int>
|
<int key="connectionID">726</int>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBConnectionRecord">
|
|
||||||
<object class="IBOutletConnection" key="connection">
|
|
||||||
<string key="label">showItem</string>
|
|
||||||
<reference key="source" ref="976324537"/>
|
|
||||||
<reference key="destination" ref="846612332"/>
|
|
||||||
</object>
|
|
||||||
<int key="connectionID">730</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBConnectionRecord">
|
<object class="IBConnectionRecord">
|
||||||
<object class="IBOutletConnection" key="connection">
|
<object class="IBOutletConnection" key="connection">
|
||||||
<string key="label">statusMenu</string>
|
<string key="label">statusMenu</string>
|
||||||
@ -445,11 +438,19 @@
|
|||||||
</object>
|
</object>
|
||||||
<object class="IBConnectionRecord">
|
<object class="IBConnectionRecord">
|
||||||
<object class="IBActionConnection" key="connection">
|
<object class="IBActionConnection" key="connection">
|
||||||
<string key="label">showPasswordWindow</string>
|
<string key="label">showPasswordWindow:</string>
|
||||||
<reference key="source" ref="976324537"/>
|
<reference key="source" ref="976324537"/>
|
||||||
<reference key="destination" ref="846612332"/>
|
<reference key="destination" ref="846612332"/>
|
||||||
</object>
|
</object>
|
||||||
<int key="connectionID">781</int>
|
<int key="connectionID">782</int>
|
||||||
|
</object>
|
||||||
|
<object class="IBConnectionRecord">
|
||||||
|
<object class="IBOutletConnection" key="connection">
|
||||||
|
<string key="label">showItem</string>
|
||||||
|
<reference key="source" ref="976324537"/>
|
||||||
|
<reference key="destination" ref="846612332"/>
|
||||||
|
</object>
|
||||||
|
<int key="connectionID">783</int>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||||
@ -708,13 +709,13 @@
|
|||||||
<nil key="activeLocalization"/>
|
<nil key="activeLocalization"/>
|
||||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||||
<nil key="sourceID"/>
|
<nil key="sourceID"/>
|
||||||
<int key="maxID">781</int>
|
<int key="maxID">783</int>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||||
<object class="IBPartialClassDescription">
|
<object class="IBPartialClassDescription">
|
||||||
<string key="className">MPAppDelegate_Shared</string>
|
<string key="className">MPAppDelegate_Shared</string>
|
||||||
<string key="superclassName">PearlAppDelegate</string>
|
<string key="superclassName">NSObject</string>
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
<string key="majorKey">IBProjectSource</string>
|
<string key="majorKey">IBProjectSource</string>
|
||||||
<string key="minorKey">./Classes/MPAppDelegate_Shared.h</string>
|
<string key="minorKey">./Classes/MPAppDelegate_Shared.h</string>
|
||||||
@ -724,17 +725,13 @@
|
|||||||
<string key="className">MPMacAppDelegate</string>
|
<string key="className">MPMacAppDelegate</string>
|
||||||
<string key="superclassName">MPAppDelegate_Shared</string>
|
<string key="superclassName">MPAppDelegate_Shared</string>
|
||||||
<dictionary class="NSMutableDictionary" key="actions">
|
<dictionary class="NSMutableDictionary" key="actions">
|
||||||
<string key="activate:">id</string>
|
|
||||||
<string key="lock:">id</string>
|
<string key="lock:">id</string>
|
||||||
<string key="newUser:">NSMenuItem</string>
|
<string key="newUser:">NSMenuItem</string>
|
||||||
<string key="rebuildCloud:">id</string>
|
<string key="rebuildCloud:">id</string>
|
||||||
|
<string key="showPasswordWindow:">id</string>
|
||||||
<string key="togglePreference:">NSMenuItem</string>
|
<string key="togglePreference:">NSMenuItem</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||||
<object class="IBActionInfo" key="activate:">
|
|
||||||
<string key="name">activate:</string>
|
|
||||||
<string key="candidateClassName">id</string>
|
|
||||||
</object>
|
|
||||||
<object class="IBActionInfo" key="lock:">
|
<object class="IBActionInfo" key="lock:">
|
||||||
<string key="name">lock:</string>
|
<string key="name">lock:</string>
|
||||||
<string key="candidateClassName">id</string>
|
<string key="candidateClassName">id</string>
|
||||||
@ -747,6 +744,10 @@
|
|||||||
<string key="name">rebuildCloud:</string>
|
<string key="name">rebuildCloud:</string>
|
||||||
<string key="candidateClassName">id</string>
|
<string key="candidateClassName">id</string>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="IBActionInfo" key="showPasswordWindow:">
|
||||||
|
<string key="name">showPasswordWindow:</string>
|
||||||
|
<string key="candidateClassName">id</string>
|
||||||
|
</object>
|
||||||
<object class="IBActionInfo" key="togglePreference:">
|
<object class="IBActionInfo" key="togglePreference:">
|
||||||
<string key="name">togglePreference:</string>
|
<string key="name">togglePreference:</string>
|
||||||
<string key="candidateClassName">NSMenuItem</string>
|
<string key="candidateClassName">NSMenuItem</string>
|
||||||
@ -811,44 +812,6 @@
|
|||||||
<string key="minorKey">./Classes/MPMacAppDelegate.h</string>
|
<string key="minorKey">./Classes/MPMacAppDelegate.h</string>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBPartialClassDescription">
|
|
||||||
<string key="className">PearlAppDelegate</string>
|
|
||||||
<string key="superclassName">UIResponder</string>
|
|
||||||
<dictionary class="NSMutableDictionary" key="outlets">
|
|
||||||
<string key="navigationController">UINavigationController</string>
|
|
||||||
<string key="window">UIWindow</string>
|
|
||||||
</dictionary>
|
|
||||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
|
||||||
<object class="IBToOneOutletInfo" key="navigationController">
|
|
||||||
<string key="name">navigationController</string>
|
|
||||||
<string key="candidateClassName">UINavigationController</string>
|
|
||||||
</object>
|
|
||||||
<object class="IBToOneOutletInfo" key="window">
|
|
||||||
<string key="name">window</string>
|
|
||||||
<string key="candidateClassName">UIWindow</string>
|
|
||||||
</object>
|
|
||||||
</dictionary>
|
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
|
||||||
<string key="majorKey">IBProjectSource</string>
|
|
||||||
<string key="minorKey">./Classes/PearlAppDelegate.h</string>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="IBPartialClassDescription">
|
|
||||||
<string key="className">UINavigationController</string>
|
|
||||||
<string key="superclassName">UIViewController</string>
|
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
|
||||||
<string key="majorKey">IBProjectSource</string>
|
|
||||||
<string key="minorKey">./Classes/UINavigationController.h</string>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="IBPartialClassDescription">
|
|
||||||
<string key="className">UIWindow</string>
|
|
||||||
<string key="superclassName">UIView</string>
|
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
|
||||||
<string key="majorKey">IBProjectSource</string>
|
|
||||||
<string key="minorKey">./Classes/UIWindow.h</string>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</array>
|
</array>
|
||||||
</object>
|
</object>
|
||||||
<int key="IBDocument.localizationMode">0</int>
|
<int key="IBDocument.localizationMode">0</int>
|
||||||
|
Loading…
Reference in New Issue
Block a user