diff options
| author | Vadim Shpakovski | 2012-09-19 01:49:24 +0300 | 
|---|---|---|
| committer | Vadim Shpakovski | 2012-09-19 01:49:24 +0300 | 
| commit | 08717ff81efc9e868e0af7fdb8b6807508c6b0fb (patch) | |
| tree | e825105ebcbcdaf365e38f8430c34b2e405a949a | |
| parent | e01e9075e5f94abc1428a4799c691836599d7e5b (diff) | |
| parent | da2e1af5741cff902ee4c06408316a92695450b8 (diff) | |
| download | MASShortcut-08717ff81efc9e868e0af7fdb8b6807508c6b0fb.tar.bz2 | |
Merge remote-tracking branch 'origin/master'
| -rw-r--r-- | MASShortcut.m | 45 | ||||
| -rw-r--r-- | MASShortcutView+UserDefaults.m | 10 | ||||
| -rw-r--r-- | MASShortcutView.h | 5 | ||||
| -rw-r--r-- | MASShortcutView.m | 8 | 
4 files changed, 61 insertions, 7 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 1b1b8e5..42a2379 100644 --- a/MASShortcutView+UserDefaults.m +++ b/MASShortcutView+UserDefaults.m @@ -25,6 +25,10 @@ void *kDefaultsObserver = &kDefaultsObserver;  - (void)setAssociatedUserDefaultsKey:(NSString *)associatedUserDefaultsKey  { +    // First, stop observing previous shortcut view +    objc_setAssociatedObject(self, kDefaultsObserver, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + +    // Next, start observing current shortcut view      MASShortcutDefaultsObserver *defaultsObserver = [[MASShortcutDefaultsObserver alloc] initWithShortcutView:self userDefaultsKey:associatedUserDefaultsKey];      objc_setAssociatedObject(self, kDefaultsObserver, defaultsObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  } @@ -109,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 4bfae8e..47254fe 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; +        }      }  } | 
