diff options
| author | Vadim Shpakovski | 2012-09-19 01:44:49 +0300 |
|---|---|---|
| committer | Vadim Shpakovski | 2012-09-19 01:44:49 +0300 |
| commit | da2e1af5741cff902ee4c06408316a92695450b8 (patch) | |
| tree | 220c30d666790cf3566c6e402cceb8af0dc2f2b1 | |
| parent | dddb527bfbe8de58fb2d6aeb780a25ff15a02ea4 (diff) | |
| download | MASShortcut-da2e1af5741cff902ee4c06408316a92695450b8.tar.bz2 | |
Adds a new appearance and fixes bugs related to key equivalents.
| -rw-r--r-- | MASShortcut.m | 45 | ||||
| -rw-r--r-- | MASShortcutView+UserDefaults.m | 6 | ||||
| -rw-r--r-- | MASShortcutView.h | 5 | ||||
| -rw-r--r-- | MASShortcutView.m | 16 |
4 files changed, 64 insertions, 8 deletions
diff --git a/MASShortcut.m b/MASShortcut.m index 49fece4..ca5a1ae 100644 --- a/MASShortcut.m +++ b/MASShortcut.m @@ -52,7 +52,8 @@ NSString *const kMASShortcutModifierFlags = @"ModifierFlags"; + (MASShortcut *)shortcutWithData:(NSData *)data { - return (data ? (MASShortcut *)[NSKeyedUnarchiver unarchiveObjectWithData:data] : nil); + id shortcut = (data ? [NSKeyedUnarchiver unarchiveObjectWithData:data] : nil); + return shortcut; } #pragma mark - Shortcut accessors @@ -82,6 +83,35 @@ NSString *const kMASShortcutModifierFlags = @"ModifierFlags"; return [NSString stringWithFormat:@"%@%@", self.modifierFlagsString, self.keyCodeString]; } +- (NSString *)keyCodeStringForKeyEquivalent +{ + NSString *keyCodeString = self.keyCodeString; + if (keyCodeString.length > 1) { + switch (self.keyCode) { + case kVK_F1: return MASShortcutChar(0xF704); + case kVK_F2: return MASShortcutChar(0xF705); + case kVK_F3: return MASShortcutChar(0xF706); + case kVK_F4: return MASShortcutChar(0xF707); + case kVK_F5: return MASShortcutChar(0xF708); + case kVK_F6: return MASShortcutChar(0xF709); + case kVK_F7: return MASShortcutChar(0xF70a); + case kVK_F8: return MASShortcutChar(0xF70b); + case kVK_F9: return MASShortcutChar(0xF70c); + case kVK_F10: return MASShortcutChar(0xF70d); + case kVK_F11: return MASShortcutChar(0xF70e); + case kVK_F12: return MASShortcutChar(0xF70f); + // From this point down I am guessing F13 etc come sequentially, I don't have a keyboard to test. + case kVK_F13: return MASShortcutChar(0xF710); + case kVK_F14: return MASShortcutChar(0xF711); + case kVK_F15: return MASShortcutChar(0xF712); + case kVK_F16: return MASShortcutChar(0xF713); + case kVK_Space: return MASShortcutChar(0x20); + default: return @""; + } + } + return keyCodeString.lowercaseString; +} + - (NSString *)keyCodeString { // Some key codes don't have an equivalent @@ -223,8 +253,15 @@ NSString *const kMASShortcutModifierFlags = @"ModifierFlags"; if (menuItem.hasSubmenu && [self isKeyEquivalent:keyEquivalent flags:flags takenInMenu:menuItem.submenu error:outError]) return YES; BOOL equalFlags = (MASShortcutClear(menuItem.keyEquivalentModifierMask) == flags); - BOOL equalHotkey = [menuItem.keyEquivalent.uppercaseString isEqualToString:keyEquivalent]; - if (equalFlags && equalHotkey) { + BOOL equalHotkeyLowercase = [menuItem.keyEquivalent.lowercaseString isEqualToString:keyEquivalent]; + + // Check if the cases are different, we know ours is lower and that shift is included in our modifiers + // If theirs is capitol, we need to add shift to their modifiers + if (equalHotkeyLowercase && ![menuItem.keyEquivalent isEqualToString:keyEquivalent]) { + equalFlags = (MASShortcutClear(menuItem.keyEquivalentModifierMask | NSShiftKeyMask) == flags); + } + + if (equalFlags && equalHotkeyLowercase) { if (outError) { NSString *format = NSLocalizedString(@"This shortcut cannot be used used because it is already used by the menu item ‘%@’.", @"Message for alert when shortcut is already used"); @@ -265,7 +302,7 @@ NSString *const kMASShortcutModifierFlags = @"ModifierFlags"; } CFRelease(globalHotKeys); } - return [self isKeyEquivalent:self.keyCodeString flags:self.modifierFlags takenInMenu:[NSApp mainMenu] error:outError]; + return [self isKeyEquivalent:self.keyCodeStringForKeyEquivalent flags:self.modifierFlags takenInMenu:[NSApp mainMenu] error:outError]; } @end diff --git a/MASShortcutView+UserDefaults.m b/MASShortcutView+UserDefaults.m index 2c4e285..42a2379 100644 --- a/MASShortcutView+UserDefaults.m +++ b/MASShortcutView+UserDefaults.m @@ -113,7 +113,11 @@ void *kShortcutValueObserver = &kShortcutValueObserver; if (_internalShortcutChange) return; MASShortcut *shortcut = [object valueForKey:keyPath]; _internalPreferenceChange = YES; - [[NSUserDefaults standardUserDefaults] setObject:shortcut.data forKey:_userDefaultsKey]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:(shortcut.data ?: [NSKeyedArchiver archivedDataWithRootObject:nil]) forKey:_userDefaultsKey]; + [defaults synchronize]; + _internalPreferenceChange = NO; } else { diff --git a/MASShortcutView.h b/MASShortcutView.h index 707a1e9..5259123 100644 --- a/MASShortcutView.h +++ b/MASShortcutView.h @@ -1,8 +1,9 @@ @class MASShortcut; typedef enum { - MASShortcutViewAppearanceDefault = 0, - MASShortcutViewAppearanceTexturedRect + MASShortcutViewAppearanceDefault = 0, // Height = 19 px + MASShortcutViewAppearanceTexturedRect, // Height = 25 px + MASShortcutViewAppearanceRounded // Height = 43 px } MASShortcutViewAppearance; @interface MASShortcutView : NSView diff --git a/MASShortcutView.m b/MASShortcutView.m index a454ce1..27e6ae7 100644 --- a/MASShortcutView.m +++ b/MASShortcutView.m @@ -83,6 +83,10 @@ _shortcutCell.bezelStyle = NSTexturedRoundedBezelStyle; break; } + case MASShortcutViewAppearanceRounded: { + _shortcutCell.bezelStyle = NSRoundedBezelStyle; + break; + } } } @@ -148,6 +152,10 @@ [_shortcutCell drawWithFrame:CGRectOffset(frame, 0.0, 1.0) inView:self]; break; } + case MASShortcutViewAppearanceRounded: { + [_shortcutCell drawWithFrame:CGRectOffset(frame, 0.0, 1.0) inView:self]; + break; + } } } @@ -195,7 +203,13 @@ - (void)getShortcutRect:(CGRect *)shortcutRectRef hintRect:(CGRect *)hintRectRef { CGRect shortcutRect, hintRect; - CGRectDivide(self.bounds, &hintRect, &shortcutRect, HINT_BUTTON_WIDTH, CGRectMaxXEdge); + CGFloat hintButtonWidth = HINT_BUTTON_WIDTH; + switch (self.appearance) { + case MASShortcutViewAppearanceTexturedRect: hintButtonWidth += 2.0; break; + case MASShortcutViewAppearanceRounded: hintButtonWidth += 3.0; break; + default: break; + } + CGRectDivide(self.bounds, &hintRect, &shortcutRect, hintButtonWidth, CGRectMaxXEdge); if (shortcutRectRef) *shortcutRectRef = shortcutRect; if (hintRectRef) *hintRectRef = hintRect; } |
