From 6a84de24eb2e905de206250ee5b3a95041930713 Mon Sep 17 00:00:00 2001 From: Kent Sutherland Date: Thu, 4 Sep 2003 21:10:08 +0000 Subject: [PATCH] All the hotkeys now use the ITHotKey/ITKeyCombo classes now, which makes us all happy, right? --- English.lproj/Preferences.nib/info.nib | 2 +- .../Preferences.nib/keyedobjects.nib | Bin 40128 -> 40148 bytes MainController.m | 130 +++++++++++------- PreferencesController.m | 39 +++--- 4 files changed, 99 insertions(+), 72 deletions(-) diff --git a/English.lproj/Preferences.nib/info.nib b/English.lproj/Preferences.nib/info.nib index dce4984..4b7fcb4 100755 --- a/English.lproj/Preferences.nib/info.nib +++ b/English.lproj/Preferences.nib/info.nib @@ -3,7 +3,7 @@ IBDocumentLocation - 3 45 356 240 0 0 1024 746 + 4 45 356 240 0 0 1152 746 IBFramework Version 291.0 IBGroupedObjects diff --git a/English.lproj/Preferences.nib/keyedobjects.nib b/English.lproj/Preferences.nib/keyedobjects.nib index ec86e79a37cdd79c0caf674077292016435cc5f1..5d1895ef5f8eadb4949ccf0715a6d41ae44d95f3 100755 GIT binary patch delta 15788 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 delta 15767 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 Q06p)b_dV~QUb~k6KTM2L$^ZZW diff --git a/MainController.m b/MainController.m index fffd741..f91975f 100755 --- a/MainController.m +++ b/MainController.m @@ -2,6 +2,8 @@ #import "MenuController.h" #import "PreferencesController.h" #import +#import +#import #import "StatusWindowController.h" #import "StatusItemHack.h" @@ -296,92 +298,124 @@ static MainController *sharedController; - (void)clearHotKeys { - [[ITHotKeyCenter sharedCenter] removeHotKey:@"PlayPause"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"NextTrack"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"PrevTrack"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"TrackInfo"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"ShowPlayer"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"UpcomingSongs"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"ToggleLoop"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"ToggleShuffle"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"IncrementVolume"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"DecrementVolume"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"IncrementRating"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"DecrementRating"]; + NSEnumerator *hotKeyEnumerator = [[[ITHotKeyCenter sharedCenter] allHotKeys] objectEnumerator]; + ITHotKey *nextHotKey; + + while ( (nextHotKey = [hotKeyEnumerator nextObject]) ) { + [[ITHotKeyCenter sharedCenter] unregisterHotKey:nextHotKey]; + } } - (void)setupHotKeys { + ITHotKey *hotKey; + if ([df objectForKey:@"PlayPause"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"PlayPause" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PlayPause"]] - target:self action:@selector(playPause)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"PlayPause"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PlayPause"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(playPause)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"NextTrack"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"NextTrack" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"NextTrack"]] - target:self action:@selector(nextSong)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"NextTrack"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"NextTrack"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(nextSong)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"PrevTrack"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"PrevTrack" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PrevTrack"]] - target:self action:@selector(prevSong)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"PrevTrack"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PrevTrack"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(prevSong)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"ShowPlayer"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"ShowPlayer" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ShowPlayer"]] - target:self action:@selector(showPlayer)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"ShowPlayer"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ShowPlayer"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(showPlayer)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"TrackInfo"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"TrackInfo" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"TrackInfo"]] - target:self action:@selector(showCurrentTrackInfo)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"TrackInfo"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"TrackInfo"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(showCurrentTrackInfo)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"UpcomingSongs"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"UpcomingSongs" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"UpcomingSongs"]] - target:self action:@selector(showUpcomingSongs)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"UpcomingSongs"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"UpcomingSongs"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(showUpcomingSongs)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"ToggleLoop"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"ToggleLoop" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleLoop"]] - target:self action:@selector(toggleLoop)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"ToggleLoop"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleLoop"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(toggleLoop)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"ToggleShuffle"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleShuffle"]] - target:self action:@selector(toggleShuffle)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"ToggleShuffle"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleShuffle"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(toggleShuffle)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"IncrementVolume"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"IncrementVolume" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementVolume"]] - target:self action:@selector(incrementVolume)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"IncrementVolume"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementVolume"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(incrementVolume)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"DecrementVolume"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"DecrementVolume" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementVolume"]] - target:self action:@selector(decrementVolume)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"DecrementVolume"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementVolume"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(decrementVolume)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"IncrementRating"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"IncrementRating" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementRating"]] - target:self action:@selector(incrementRating)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"IncrementRating"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementRating"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(incrementRating)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"DecrementRating"] != nil) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"DecrementRating" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementRating"]] - target:self action:@selector(decrementRating)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"DecrementRating"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementRating"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(decrementRating)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } } diff --git a/PreferencesController.m b/PreferencesController.m index 1580fb6..086e2ec 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -1,7 +1,9 @@ #import "PreferencesController.h" #import "MainController.h" #import +#import #import +#import #define SENDER_STATE (([sender state] == NSOnState) ? YES : NO) @@ -339,40 +341,28 @@ static PreferencesController *prefs = nil; if ([currentHotKey isEqualToString:@"PlayPause"]) { [playPauseButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"PlayPause" combo:combo target:[MainController sharedController] action:@selector(playPause)]; } else if ([currentHotKey isEqualToString:@"NextTrack"]) { [nextTrackButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"NextTrack" combo:combo target:[MainController sharedController] action:@selector(nextSong)]; } else if ([currentHotKey isEqualToString:@"PrevTrack"]) { [previousTrackButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"PrevTrack" combo:combo target:[MainController sharedController] action:@selector(prevSong)]; } else if ([currentHotKey isEqualToString:@"ShowPlayer"]) { [showPlayerButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"ShowPlayer" combo:combo target:[MainController sharedController] action:@selector(showPlayer)]; } else if ([currentHotKey isEqualToString:@"TrackInfo"]) { [trackInfoButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"TrackInfo" combo:combo target:[MainController sharedController] action:@selector(showCurrentTrackInfo)]; } else if ([currentHotKey isEqualToString:@"UpcomingSongs"]) { [upcomingSongsButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"UpcomingSongs" combo:combo target:[MainController sharedController] action:@selector(showUpcomingSongs)]; } else if ([currentHotKey isEqualToString:@"IncrementVolume"]) { [volumeIncrementButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"IncrementVolume" combo:combo target:[MainController sharedController] action:@selector(incrementVolume)]; } else if ([currentHotKey isEqualToString:@"DecrementVolume"]) { [volumeDecrementButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"DecrementVolume" combo:combo target:[MainController sharedController] action:@selector(decrementVolume)]; } else if ([currentHotKey isEqualToString:@"IncrementRating"]) { [ratingIncrementButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"IncrementRating" combo:combo target:[MainController sharedController] action:@selector(incrementRating)]; } else if ([currentHotKey isEqualToString:@"DecrementRating"]) { [ratingDecrementButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"DecrementRating" combo:combo target:[MainController sharedController] action:@selector(decrementRating)]; } else if ([currentHotKey isEqualToString:@"ToggleShuffle"]) { [toggleShuffleButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle" combo:combo target:[MainController sharedController] action:@selector(toggleShuffle)]; } else if ([currentHotKey isEqualToString:@"ToggleLoop"]) { [toggleLoopButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"ToggleLoop" combo:combo target:[MainController sharedController] action:@selector(toggleLoop)]; } [controller setupHotKeys]; [self cancelHotKey:sender]; @@ -389,22 +379,13 @@ static PreferencesController *prefs = nil; { [currentHotKey autorelease]; currentHotKey = [key copy]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyEvent:) name:@"KeyBroadcasterEvent" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyEvent:) name:ITKeyBroadcasterKeyEvent object:nil]; [NSApp beginSheet:keyComboPanel modalForWindow:window modalDelegate:self didEndSelector:nil contextInfo:nil]; } - (void)keyEvent:(NSNotification *)note { - NSDictionary *info = [note userInfo]; - short keyCode; - long modifiers; - ITKeyCombo *newCombo; - - keyCode = [[info objectForKey:@"KeyCode"] shortValue]; - modifiers = [[info objectForKey:@"Modifiers"] longValue]; - - newCombo = [[ITKeyCombo alloc] initWithKeyCode:keyCode modifiers:modifiers]; - [self setKeyCombo:newCombo]; + [self setKeyCombo:[[[note userInfo] objectForKey:@"keyCombo"] copy]]; } - (void)setKeyCombo:(ITKeyCombo *)newCombo @@ -512,6 +493,7 @@ static PreferencesController *prefs = nil; [playPauseButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"PlayPause"]; + [playPauseButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"NextTrack"]) { @@ -520,6 +502,7 @@ static PreferencesController *prefs = nil; [nextTrackButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"NextTrack"]; + [nextTrackButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"PrevTrack"]) { @@ -528,6 +511,7 @@ static PreferencesController *prefs = nil; [previousTrackButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"PrevTrack"]; + [previousTrackButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"ShowPlayer"]) { @@ -536,6 +520,7 @@ static PreferencesController *prefs = nil; [showPlayerButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ShowPlayer"]; + [showPlayerButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"TrackInfo"]) { @@ -544,6 +529,7 @@ static PreferencesController *prefs = nil; [trackInfoButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"TrackInfo"]; + [trackInfoButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"UpcomingSongs"]) { @@ -552,6 +538,7 @@ static PreferencesController *prefs = nil; [upcomingSongsButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"UpcomingSongs"]; + [upcomingSongsButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"IncrementVolume"]) { @@ -560,6 +547,7 @@ static PreferencesController *prefs = nil; [volumeIncrementButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"IncrementVolume"]; + [volumeIncrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"DecrementVolume"]) { @@ -568,6 +556,7 @@ static PreferencesController *prefs = nil; [volumeDecrementButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"DecrementVolume"]; + [volumeDecrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"IncrementRating"]) { @@ -576,6 +565,7 @@ static PreferencesController *prefs = nil; [ratingIncrementButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"IncrementRating"]; + [ratingIncrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"DecrementRating"]) { @@ -584,6 +574,7 @@ static PreferencesController *prefs = nil; [ratingDecrementButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"DecrementRating"]; + [ratingDecrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"ToggleLoop"]) { @@ -592,6 +583,7 @@ static PreferencesController *prefs = nil; [toggleLoopButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ToggleLoop"]; + [toggleLoopButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"ToggleShuffle"]) { @@ -600,6 +592,7 @@ static PreferencesController *prefs = nil; [toggleShuffleButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ToggleShuffle"]; + [toggleShuffleButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } // Check current track info buttons -- 2.20.1