aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Shpakovski2012-09-19 01:44:49 +0300
committerVadim Shpakovski2012-09-19 01:44:49 +0300
commitda2e1af5741cff902ee4c06408316a92695450b8 (patch)
tree220c30d666790cf3566c6e402cceb8af0dc2f2b1
parentdddb527bfbe8de58fb2d6aeb780a25ff15a02ea4 (diff)
downloadMASShortcut-da2e1af5741cff902ee4c06408316a92695450b8.tar.bz2
Adds a new appearance and fixes bugs related to key equivalents.
-rw-r--r--MASShortcut.m45
-rw-r--r--MASShortcutView+UserDefaults.m6
-rw-r--r--MASShortcutView.h5
-rw-r--r--MASShortcutView.m16
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;
}