diff options
Diffstat (limited to 'Framework/MASShortcut+UserDefaults.m')
| -rw-r--r-- | Framework/MASShortcut+UserDefaults.m | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Framework/MASShortcut+UserDefaults.m b/Framework/MASShortcut+UserDefaults.m new file mode 100644 index 0000000..94b035d --- /dev/null +++ b/Framework/MASShortcut+UserDefaults.m @@ -0,0 +1,98 @@ +#import "MASShortcut+UserDefaults.h" +#import "MASShortcut+Monitoring.h" + +@interface MASShortcutUserDefaultsHotKey : NSObject + +@property (nonatomic, readonly) NSString *userDefaultsKey; +@property (nonatomic, copy) void (^handler)(); +@property (nonatomic, weak) id monitor; + +- (id)initWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler; + +@end + +#pragma mark - + +@implementation MASShortcut (UserDefaults) + ++ (NSMutableDictionary *)registeredUserDefaultsHotKeys +{ + static NSMutableDictionary *shared = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + shared = [NSMutableDictionary dictionary]; + }); + return shared; +} + ++ (void)registerGlobalShortcutWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler +{ + MASShortcutUserDefaultsHotKey *hotKey = [[MASShortcutUserDefaultsHotKey alloc] initWithUserDefaultsKey:userDefaultsKey handler:handler]; + [[self registeredUserDefaultsHotKeys] setObject:hotKey forKey:userDefaultsKey]; +} + ++ (void)unregisterGlobalShortcutWithUserDefaultsKey:(NSString *)userDefaultsKey +{ + NSMutableDictionary *registeredHotKeys = [self registeredUserDefaultsHotKeys]; + [registeredHotKeys removeObjectForKey:userDefaultsKey]; +} + ++ (void)setGlobalShortcut:(MASShortcut *)shortcut forUserDefaultsKey:(NSString *)userDefaultsKey +{ + NSData *shortcutData = shortcut.data; + if (shortcutData) + [[NSUserDefaults standardUserDefaults] setObject:shortcutData forKey:userDefaultsKey]; + else + [[NSUserDefaults standardUserDefaults] removeObjectForKey:userDefaultsKey]; +} + +@end + +#pragma mark - + +@implementation MASShortcutUserDefaultsHotKey { + NSString *_observableKeyPath; +} + +void *MASShortcutUserDefaultsContext = &MASShortcutUserDefaultsContext; + +- (id)initWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler +{ + self = [super init]; + if (self) { + _userDefaultsKey = userDefaultsKey.copy; + _handler = [handler copy]; + _observableKeyPath = [@"values." stringByAppendingString:_userDefaultsKey]; + [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:_observableKeyPath options:NSKeyValueObservingOptionInitial context:MASShortcutUserDefaultsContext]; + } + return self; +} + +- (void)dealloc +{ + [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:_observableKeyPath context:MASShortcutUserDefaultsContext]; + [MASShortcut removeGlobalHotkeyMonitor:self.monitor]; +} + +#pragma mark - + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if (context == MASShortcutUserDefaultsContext) { + [MASShortcut removeGlobalHotkeyMonitor:self.monitor]; + [self installHotKeyFromUserDefaults]; + } + else { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} + +- (void)installHotKeyFromUserDefaults +{ + NSData *data = [[NSUserDefaults standardUserDefaults] dataForKey:_userDefaultsKey]; + MASShortcut *shortcut = [MASShortcut shortcutWithData:data]; + if (shortcut == nil) return; + self.monitor = [MASShortcut addGlobalHotkeyMonitorWithShortcut:shortcut handler:self.handler]; +} + +@end |
