Lots of fun changes. Reworked the hotkeys in prefs. Fixed bugs in
authorKent Sutherland <ksuther@ithinksw.com>
Sat, 17 May 2003 20:17:56 +0000 (20:17 +0000)
committerKent Sutherland <ksuther@ithinksw.com>
Sat, 17 May 2003 20:17:56 +0000 (20:17 +0000)
MenuController. Added hotkey support for rating and song and shuffle and
loop. Shuffle and loop don't work in iTunesRemote yet though. Made hotkey
text field in prefs unselectable, because it looks better like that.

English.lproj/Preferences.nib/info.nib
English.lproj/Preferences.nib/keyedobjects.nib
MainController.m
MenuController.m
PreferencesController.m
iTunesRemote.m

index 783d23f..8ed99ef 100755 (executable)
@@ -25,6 +25,6 @@
                <integer>6</integer>
        </array>
        <key>IBSystem Version</key>
-       <string>6L29</string>
+       <string>6L60</string>
 </dict>
 </plist>
index 8de35c3..fc202f9 100755 (executable)
Binary files a/English.lproj/Preferences.nib/keyedobjects.nib and b/English.lproj/Preferences.nib/keyedobjects.nib differ
index f501b69..600d8df 100755 (executable)
@@ -39,7 +39,6 @@ static MainController *sharedController;
         statusWindowController = [[StatusWindowController alloc] init];
         menuController = [[MenuController alloc] init];
         df = [[NSUserDefaults standardUserDefaults] retain];
-        [self setLatestSongIdentifier:@"0-0"];
     }
     return self;
 }
@@ -334,41 +333,41 @@ static MainController *sharedController;
                target:self action:@selector(showUpcomingSongs)];
     }
     
-/*    if ([df objectForKey:@"ToggleLoop"] != nil) {
+    if ([df objectForKey:@"ToggleLoop"] != nil) {
         [[HotKeyCenter sharedCenter] addHotKey:@"ToggleLoop"
                combo:[df keyComboForKey:@"ToggleLoop"]
-               target:self action:NULL];
+               target:self action:@selector(toggleLoop)];
     }
     
     if ([df objectForKey:@"ToggleShuffle"] != nil) {
         [[HotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle"
                combo:[df keyComboForKey:@"ToggleShuffle"]
-               target:self action:NULL];
+               target:self action:@selector(toggleShuffle)];
     }
     
     if ([df objectForKey:@"IncrementVolume"] != nil) {
         [[HotKeyCenter sharedCenter] addHotKey:@"IncrementVolume"
                combo:[df keyComboForKey:@"IncrementVolume"]
-               target:self action:NULL];
+               target:self action:@selector(incrementVolume)];
     }
     
     if ([df objectForKey:@"DecrementVolume"] != nil) {
         [[HotKeyCenter sharedCenter] addHotKey:@"DecrementVolume"
                combo:[df keyComboForKey:@"DecrementVolume"]
-               target:self action:NULL];
+               target:self action:@selector(decrementVolume)];
     }
     
     if ([df objectForKey:@"IncrementRating"] != nil) {
         [[HotKeyCenter sharedCenter] addHotKey:@"IncrementRating"
                combo:[df keyComboForKey:@"IncrementRating"]
-               target:self action:NULL];
+               target:self action:@selector(incrementRating)];
     }
     
     if ([df objectForKey:@"DecrementRating"] != nil) {
         [[HotKeyCenter sharedCenter] addHotKey:@"DecrementRating"
                combo:[df keyComboForKey:@"DecrementRating"]
-               target:self action:NULL];
-    }*/
+               target:self action:@selector(decrementRating)];
+    }
 }
 
 - (void)showCurrentTrackInfo
@@ -447,6 +446,80 @@ static MainController *sharedController;
     }
 }
 
+- (void)incrementVolume
+{
+    float volume = [currentRemote volume];
+    volume += 0.2;
+    if (volume > 1.0) {
+        volume = 1.0;
+    }
+    [currentRemote setVolume:volume];
+    
+    //Show volume status window
+}
+
+- (void)decrementVolume
+{
+    float volume = [currentRemote volume];
+    volume -= 0.2;
+    if (volume < 0.0) {
+        volume = 0.0;
+    }
+    [currentRemote setVolume:volume];
+    
+    //Show volume status window
+}
+
+- (void)incrementRating
+{
+    float rating = [currentRemote currentSongRating];
+    rating += 0.2;
+    if (rating > 1.0) {
+        rating = 1.0;
+    }
+    [currentRemote setCurrentSongRating:rating];
+    
+    //Show rating status window
+}
+
+- (void)decrementRating
+{
+    float rating = [currentRemote currentSongRating];
+    rating -= 0.2;
+    if (rating < 0.0) {
+        rating = 0.0;
+    }
+    [currentRemote setCurrentSongRating:rating];
+    
+    //Show rating status window
+}
+
+- (void)toggleLoop
+{
+    ITMTRemotePlayerRepeatMode repeatMode = [currentRemote repeatMode];
+    
+    switch (repeatMode) {
+        case ITMTRemotePlayerRepeatOff:
+            repeatMode = ITMTRemotePlayerRepeatAll;
+        break;
+        case ITMTRemotePlayerRepeatAll:
+            repeatMode = ITMTRemotePlayerRepeatOne;
+        break;
+        case ITMTRemotePlayerRepeatOne:
+            repeatMode = ITMTRemotePlayerRepeatOff;
+        break;
+    }
+    [currentRemote setRepeatMode:repeatMode];
+    
+    //Show loop status window
+}
+
+- (void)toggleShuffle
+{
+    [currentRemote setShuffleEnabled:![currentRemote shuffleEnabled]];
+    //Show shuffle status window
+}
+
 /*************************************************************************/
 #pragma mark -
 #pragma mark WORKSPACE NOTIFICATION HANDLERS
@@ -455,6 +528,7 @@ static MainController *sharedController;
 - (void)applicationLaunched:(NSNotification *)note
 {
     if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) {
+        [self setLatestSongIdentifier:@""];
         [self timerUpdate];
         [NSThread detachNewThreadSelector:@selector(startTimerInNewThread) toTarget:self withObject:nil];
         [self setupHotKeys];
index b1ed0db..0344308 100755 (executable)
@@ -8,12 +8,16 @@
 
 #import "MenuController.h"
 #import "NewMainController.h"
+#import "HotKeyCenter.h"
+#import "KeyCombo.h"
 
 @interface MenuController (SubmenuMethods)
 - (NSMenu *)ratingMenu;
 - (NSMenu *)upcomingSongsMenu;
 - (NSMenu *)playlistsMenu;
 - (NSMenu *)eqMenu;
+- (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers
+        onItem:(NSMenuItem *)item;
 @end
 
 @implementation MenuController
@@ -33,6 +37,8 @@
     NSEnumerator *enumerator = [menuArray objectEnumerator];
     NSString *nextObject;
     NSMenuItem *tempItem;
+    NSEnumerator *itemEnum;
+    KeyCombo *keyCombo;
     
     //Get the information
     _currentPlaylist = [currentRemote currentPlaylistIndex];
             [tempItem setTag:MTMenuPlayPauseItem];
             [tempItem setTarget:self];
             
+            if ( (keyCombo = [[HotKeyCenter sharedCenter] keyComboForName:@"PlayPause"]) ) {
+                [self setKeyEquivalentForCode:[keyCombo keyCode]
+                        andModifiers:[keyCombo modifiers]
+                        onItem:tempItem];
+            }
+            
             switch ([currentRemote playerPlayingState]) {
                 case ITMTRemotePlayerPlaying:
                     [tempItem setTitle:@"Pause"];
             tempItem = [menu addItemWithTitle:@"Next Track"
                     action:@selector(performMainMenuAction:)
                     keyEquivalent:@""];
+            
+            if ( (keyCombo = [[HotKeyCenter sharedCenter] keyComboForName:@"NextTrack"]) ) {
+                [self setKeyEquivalentForCode:[keyCombo keyCode]
+                        andModifiers:[keyCombo modifiers]
+                        onItem:tempItem];
+            }
+            
             if (_currentPlaylist) {
                 [tempItem setTag:MTMenuNextTrackItem];
                 [tempItem setTarget:self];
             tempItem = [menu addItemWithTitle:@"Previous Track"
                     action:@selector(performMainMenuAction:)
                     keyEquivalent:@""];
+            
+            if ( (keyCombo = [[HotKeyCenter sharedCenter] keyComboForName:@"PrevTrack"]) ) {
+                [self setKeyEquivalentForCode:[keyCombo keyCode]
+                        andModifiers:[keyCombo modifiers]
+                        onItem:tempItem];
+            }
+            
             if (_currentPlaylist) {
                 [tempItem setTag:MTMenuPreviousTrackItem];
                 [tempItem setTarget:self];
                     keyEquivalent:@""];
             [tempItem setSubmenu:_ratingMenu];
             [tempItem setTag:1];
+            
+            itemEnum = [[_ratingMenu itemArray] objectEnumerator];
+            while ( (tempItem = [itemEnum nextObject]) ) {
+                [tempItem setState:NSOffState];
+            }
+            
+            [[_ratingMenu itemAtIndex:([currentRemote currentSongRating] * 5)] setState:NSOnState];
             if (_playingRadio || !_currentPlaylist) {
                 [tempItem setEnabled:NO];
             }
                     keyEquivalent:@""];
             [tempItem setSubmenu:_eqMenu];
             [tempItem setTag:4];
+            
+            itemEnum = [[_eqMenu itemArray] objectEnumerator];
+            while ( (tempItem = [itemEnum nextObject]) ) {
+                [tempItem setState:NSOffState];
+            }
+            [[_eqMenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState];
         }
     }
     [_currentMenu release];
         [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★☆"] action:nil keyEquivalent:@""];
         [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★★"] action:nil keyEquivalent:@""];
         
-        [[ratingMenu itemAtIndex:([currentRemote currentSongRating] * 5)] setState:NSOnState];
-        
         itemEnum = [[ratingMenu itemArray] objectEnumerator];
         while ( (anItem = [itemEnum nextObject]) ) {
             [anItem setAction:itemSelector];
             [tempItem setTarget:self];
        }
     }
-    [[eqMenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState];
     return eqMenu;
 }
 
         case MTMenuPlayPauseItem:
             NSLog(@"MenuController: Play/Pause");
             [[MainController sharedController] playPause];
-            //We're gonna have to change the Play menu item to Pause here too.
             break;
         case MTMenuFastForwardItem:
             NSLog(@"MenuController: Fast Forward");
             [[MainController sharedController] fastForward];
-            //make sure play/pause item says sane through this
             break;
         case MTMenuRewindItem:
             NSLog(@"MenuController: Rewind");
             [[MainController sharedController] rewind];
-            //make sure play/pause item says sane through this
             break;
         case MTMenuPreviousTrackItem:
             NSLog(@"MenuController: Previous Track");
index 63e7101..802fdcb 100755 (executable)
@@ -1,5 +1,5 @@
 #import "PreferencesController.h"
-#import "MainController.h"
+#import "NewMainController.h"
 #import "HotKeyCenter.h"
 #import <ITKit/ITWindowPositioning.h>
 
@@ -296,7 +296,6 @@ static PreferencesController *prefs = nil;
     NSString *string = [combo userDisplayRep];
     NSEnumerator *enumerator = [hotKeysDictionary keyEnumerator];
     NSString *enumKey;
-    BOOL duplicateCombo = NO;
     
     if (string == nil) {
         string = @"";
@@ -343,35 +342,45 @@ static PreferencesController *prefs = nil;
         }
     }
     
-    if (!duplicateCombo) {
-        [hotKeysDictionary setObject:combo forKey:currentHotKey];
-        [df setKeyCombo:combo forKey:currentHotKey];
-        
-        if ([currentHotKey isEqualToString:@"PlayPause"]) {
-            [playPauseButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"NextTrack"]) {
-            [nextTrackButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"PrevTrack"]) {
-            [previousTrackButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"ToggleVisualizer"]) {
-            [visualizerButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"TrackInfo"]) {
-            [trackInfoButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"UpcomingSongs"]) {
-            [upcomingSongsButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"IncrementVolume"]) {
-            [volumeIncrementButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"DecrementVolume"]) {
-            [volumeDecrementButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"IncrementRating"]) {
-            [ratingIncrementButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"DecrementRating"]) {
-            [ratingDecrementButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"ToggleShuffle"]) {
-            [toggleShuffleButton setTitle:string];
-        } else if ([currentHotKey isEqualToString:@"ToggleLoop"]) {
-            [toggleLoopButton setTitle:string];
-        }
+    [hotKeysDictionary setObject:combo forKey:currentHotKey];
+    [df setKeyCombo:combo forKey:currentHotKey];
+    
+    if ([currentHotKey isEqualToString:@"PlayPause"]) {
+        [playPauseButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"PlayPause" combo:combo target:[MainController sharedController] action:@selector(playPause)];
+    } else if ([currentHotKey isEqualToString:@"NextTrack"]) {
+        [nextTrackButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"NextTrack" combo:combo target:[MainController sharedController] action:@selector(nextSong)];
+    } else if ([currentHotKey isEqualToString:@"PrevTrack"]) {
+        [previousTrackButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"PrevTrack" combo:combo target:[MainController sharedController] action:@selector(prevSong)];
+    } else if ([currentHotKey isEqualToString:@"ToggleVisualizer"]) {
+        [visualizerButton setTitle:string];
+        //[[HotKeyCenter sharedCenter] addHotKey:@"ToggleVisualizer" combo:combo target:[MainController sharedController] selector:@selector(NULL)];
+    } else if ([currentHotKey isEqualToString:@"TrackInfo"]) {
+        [trackInfoButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"TrackInfo" combo:combo target:[MainController sharedController] action:@selector(showCurrentTrackInfo)];
+    } else if ([currentHotKey isEqualToString:@"UpcomingSongs"]) {
+        [upcomingSongsButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"UpcomingSongs" combo:combo target:[MainController sharedController] action:@selector(showUpcomingSongs)];
+    } else if ([currentHotKey isEqualToString:@"IncrementVolume"]) {
+        [volumeIncrementButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"IncrementVolume" combo:combo target:[MainController sharedController] action:@selector(incrementVolume)];
+    } else if ([currentHotKey isEqualToString:@"DecrementVolume"]) {
+        [volumeDecrementButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"DecrementVolume" combo:combo target:[MainController sharedController] action:@selector(decrementVolume)];
+    } else if ([currentHotKey isEqualToString:@"IncrementRating"]) {
+        [ratingIncrementButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"IncrementRating" combo:combo target:[MainController sharedController] action:@selector(incrementRating)];
+    } else if ([currentHotKey isEqualToString:@"DecrementRating"]) {
+        [ratingDecrementButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"DecrementRating" combo:combo target:[MainController sharedController] action:@selector(decrementRating)];
+    } else if ([currentHotKey isEqualToString:@"ToggleShuffle"]) {
+        [toggleShuffleButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle" combo:combo target:[MainController sharedController] action:@selector(toggleShuffle)];
+    } else if ([currentHotKey isEqualToString:@"ToggleLoop"]) {
+        [toggleLoopButton setTitle:string];
+        [[HotKeyCenter sharedCenter] addHotKey:@"ToggleLoop" combo:combo target:[MainController sharedController] action:@selector(toggleLoop)];
     }
     [self cancelHotKey:sender];
 }
index babfb96..529cd67 100755 (executable)
 
 - (float)currentSongRating
 {
-    return [[ITAppleEventCenter sharedCenter]
+    return (float)[[ITAppleEventCenter sharedCenter]
                 sendTwoTierAEWithRequestedKeyForNumber:@"pRte" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]] / 100.0;
 }
 
 
 - (float)volume
 {
-    long vol = [[ITAppleEventCenter sharedCenter] sendAEWithRequestedKeyForNumber:@"pVol" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]];
-    return vol / 100;
+    return (float)[[ITAppleEventCenter sharedCenter] sendAEWithRequestedKeyForNumber:@"pVol" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]] / 100;
 }
 
 - (BOOL)setVolume:(float)volume