Added a play count option to track info.
authorKent Sutherland <ksuther@ithinksw.com>
Wed, 30 Jun 2004 03:27:02 +0000 (03:27 +0000)
committerKent Sutherland <ksuther@ithinksw.com>
Wed, 30 Jun 2004 03:27:02 +0000 (03:27 +0000)
Added fast forward and rewind hotkeys.
Added enabled item to EQ menu.
Fixed the prefs delay bug.
Added a popup menu hotkey.

12 files changed:
English.lproj/Preferences.nib/classes.nib
English.lproj/Preferences.nib/info.nib
English.lproj/Preferences.nib/keyedobjects.nib
ITMTRemote.h
ITMTRemote.m
MainController.m
MenuController.m
PreferencesController.h
PreferencesController.m
StatusWindowController.h
StatusWindowController.m
iTunesRemote.m

index ac86d7f..6405f45 100755 (executable)
@@ -41,6 +41,7 @@
                 passwordPanelTextField = NSTextField; 
                 passwordPanelTitle = NSTextField; 
                 passwordTextField = NSTextField; 
+                playCountCheckbox = NSButton; 
                 positionMatrix = NSMatrix; 
                 ratingCheckbox = NSButton; 
                 runScriptsCheckbox = NSButton; 
index 21ef348..d935081 100755 (executable)
@@ -12,7 +12,7 @@
                <string>386 450 380 122 0 0 1152 746 </string>
        </dict>
        <key>IBFramework Version</key>
-       <string>349.0</string>
+       <string>364.0</string>
        <key>IBLockedObjects</key>
        <array>
                <integer>281</integer>
@@ -22,6 +22,6 @@
                <integer>6</integer>
        </array>
        <key>IBSystem Version</key>
-       <string>7D24</string>
+       <string>7H63</string>
 </dict>
 </plist>
index 23dc013..d1689b0 100755 (executable)
Binary files a/English.lproj/Preferences.nib/keyedobjects.nib and b/English.lproj/Preferences.nib/keyedobjects.nib differ
index a86888e..7abcedf 100755 (executable)
@@ -299,6 +299,11 @@ er's process managment.
  */
 - (NSImage *)currentSongAlbumArt;
 
+/*!
+ * @method currentSongPlayCount
+ */
+- (int)currentSongPlayCount;
+
 /*!
  * @method currentSongRating
  */
@@ -309,6 +314,16 @@ er's process managment.
  */
 - (BOOL)setCurrentSongRating:(float)rating;
 
+/*!
+ * @method equalizerEnabled
+ */
+- (BOOL)equalizerEnabled;
+
+/*!
+ * @method setEqualizerEnabled:
+ */
+- (BOOL)setEqualizerEnabled:(BOOL)enabled;
+
 /*!
  * @method eqPresets
  */
index 26fe9a0..b4e2a75 100755 (executable)
     return nil;
 }
 
+- (int)currentSongPlayCount
+{
+    return nil;
+}
+
 - (float)currentSongRating
 {
     return nil;
     return NO;
 }
 
-/* - (BOOL)equalizerEnabled
+- (BOOL)equalizerEnabled
 {
     return NO;
 }
 - (BOOL)setEqualizerEnabled:(BOOL)enabled
 {
     return NO;
-} */
+}
 
 - (NSArray *)eqPresets
 {
index 65c718c..8cb2643 100755 (executable)
 #import "StatusWindowController.h"
 #import "StatusItemHack.h"
 
+@interface NSCarbonMenuImpl:NSObject
+{
+    NSMenu *_menu;
+}
+
++ (void)initialize;
++ (void)setupForNoMenuBar;
+- (void)dealloc;
+- (void)setMenu:fp8;
+- menu;
+- (void)itemChanged:fp8;
+- (void)itemAdded:fp8;
+- (void)itemRemoved:fp8;
+- (void)performActionWithHighlightingForItemAtIndex:(int)fp8;
+- (void)performMenuAction:(SEL)fp8 withTarget:fp12;
+- (void)setupCarbonMenuBar;
+- (void)setAsMainCarbonMenuBar;
+- (void)clearAsMainCarbonMenuBar;
+- (void)popUpMenu:fp8 atLocation:(NSPoint)fp12 width:(float)fp20 forView:fp24 withSelectedItem:(int)fp28 withFont:fp32;
+- (void)_popUpContextMenu:fp8 withEvent:fp12 forView:fp16 withFont:fp20;
+- (void)_popUpContextMenu:fp8 withEvent:fp12 forView:fp16;
+- window;
+@end
+
 @implementation NSImage (SmoothAdditions)
 
 - (NSImage *)imageScaledSmoothlyToSize:(NSSize)scaledSize
@@ -521,7 +545,11 @@ static MainController *sharedController;
 {
     ITDebugLog(@"Selecting EQ preset %i", index);
     NS_DURING
-        [[self currentRemote] switchToEQAtIndex:index];
+        if (index == -1) {
+            [[self currentRemote] setEqualizerEnabled:![[self currentRemote] equalizerEnabled]];
+        } else {
+            [[self currentRemote] switchToEQAtIndex:index];
+        }
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
@@ -663,6 +691,26 @@ static MainController *sharedController;
         [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]];
     }
     
+    if ([df objectForKey:@"FastForward"] != nil) {
+        ITDebugLog(@"Setting up fast forward hot key.");
+        hotKey = [[ITHotKey alloc] init];
+        [hotKey setName:@"FastForward"];
+        [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"FastForward"]]];
+        [hotKey setTarget:self];
+        [hotKey setAction:@selector(fastForward)];
+        [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]];
+    }
+    
+    if ([df objectForKey:@"Rewind"] != nil) {
+        ITDebugLog(@"Setting up rewind hot key.");
+        hotKey = [[ITHotKey alloc] init];
+        [hotKey setName:@"Rewind"];
+        [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"Rewind"]]];
+        [hotKey setTarget:self];
+        [hotKey setAction:@selector(rewind)];
+        [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]];
+    }
+    
     if ([df objectForKey:@"ShowPlayer"] != nil) {
         ITDebugLog(@"Setting up show player hot key.");
         hotKey = [[ITHotKey alloc] init];
@@ -752,6 +800,16 @@ static MainController *sharedController;
         [hotKey setAction:@selector(decrementRating)];
         [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]];
     }
+    
+    if ([df objectForKey:@"PopupMenu"] != nil) {
+        ITDebugLog(@"Setting up popup menu hot key.");
+        hotKey = [[ITHotKey alloc] init];
+        [hotKey setName:@"PopupMenu"];
+        [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PopupMenu"]]];
+        [hotKey setTarget:self];
+        [hotKey setAction:@selector(popupMenu)];
+        [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]];
+    }
     ITDebugLog(@"Finished setting up hot keys.");
 }
 
@@ -766,6 +824,7 @@ static MainController *sharedController;
     NSString               *track       = nil;
     NSImage                *art         = nil;
     int                     rating      = -1;
+    int                     playCount   = -1;
     
     ITDebugLog(@"Showing track info status window.");
     
@@ -855,6 +914,14 @@ static MainController *sharedController;
                 rating = ( currentRating * 5 );
             }
         }
+        
+        if ( [df boolForKey:@"showPlayCount"] ) {
+            NS_DURING
+                playCount = [[self currentRemote] currentSongPlayCount];
+            NS_HANDLER
+                [self networkError:localException];
+            NS_ENDHANDLER
+        }
     } else {
         title = NSLocalizedString(@"noSongPlaying", @"No song is playing.");
     }
@@ -867,6 +934,7 @@ static MainController *sharedController;
                                                     time:time
                                                    track:track
                                                   rating:rating
+                                               playCount:playCount
                                                    image:art];
 }
 
@@ -906,6 +974,12 @@ static MainController *sharedController;
     NS_ENDHANDLER
 }
 
+- (void)popupMenu
+{
+    NSMenu *menu = [menuController menu];
+    [(NSCarbonMenuImpl *)[menu _menuImpl] popUpMenu:menu atLocation:[NSEvent mouseLocation] width:1 forView:nil withSelectedItem:-30 withFont:[NSFont menuFontOfSize:32]];
+}
+
 - (void)incrementVolume
 {
     NS_DURING
index 0190406..4c548c1 100755 (executable)
                 
                 if (!_playingRadio) {
                     NS_DURING
+                        if ([defaults boolForKey:@"showPlayCount"]) {
+                            [menu indentItem:[menu addItemWithTitle:[NSString stringWithFormat:@"Play Count: %i", [mtr currentSongPlayCount]] action:nil keyEquivalent:@""]];
+                        }
                         if ([defaults boolForKey:@"showTrackRating"] && ( [mtr currentSongRating] != -1.0 )) {
                             NSString *string = nil;
                             switch ((int)([mtr currentSongRating] * 5)) {
                 [tempItem setState:NSOffState];
             }
             NS_DURING
+                [[_eqMenu itemAtIndex:0] setState:[mtr equalizerEnabled] ? NSOnState : NSOffState];
+                [[_eqMenu itemAtIndex:([mtr currentEQPresetIndex] + 1)] setState:NSOnState];
                 [[_eqMenu itemAtIndex:([mtr currentEQPresetIndex] - 1)] setState:NSOnState];
             NS_HANDLER
                 [[MainController sharedController] networkError:localException];
     
     ITDebugLog(@"Building \"EQ Presets\" menu.");
     
+    tempItem = [eqMenu addItemWithTitle:@"Enabled" action:@selector(performEqualizerMenuAction:) keyEquivalent:@""];
+    [tempItem setTag:-1];
+    [tempItem setTarget:self];
+    NS_DURING
+        [tempItem setState:[[[MainController sharedController] currentRemote] equalizerEnabled] ? NSOnState : NSOffState];
+    NS_HANDLER
+        [[MainController sharedController] networkError:localException];
+    NS_ENDHANDLER
+    [eqMenu addItem:[NSMenuItem separatorItem]];
+    
     for (i = 0; i < [eqPresets count]; i++) {
         NSString *name;
           if ( ( name = [eqPresets objectAtIndex:i] ) ) {
index 52e4e5d..844f4ed 100755 (executable)
@@ -44,6 +44,7 @@
     IBOutlet NSTextField *passwordPanelTextField;
     IBOutlet NSTextField *passwordPanelTitle;
     IBOutlet NSTextField *passwordTextField;
+    IBOutlet NSButton *playCountCheckbox;
     IBOutlet NSMatrix *positionMatrix;
     IBOutlet NSButton *ratingCheckbox;
     IBOutlet NSButton *runScriptsCheckbox;
index 4773ab8..76bbc23 100755 (executable)
@@ -86,6 +86,8 @@ static PreferencesController *prefs = nil;
         hotKeysArray = [[NSArray alloc] initWithObjects:@"PlayPause",
                                                        @"NextTrack",
                                                        @"PrevTrack",
+                                                       @"FastForward",
+                                                       @"Rewind",
                                                        @"ShowPlayer",
                                                        @"TrackInfo",
                                                        @"UpcomingSongs",
@@ -95,11 +97,14 @@ static PreferencesController *prefs = nil;
                                                        @"DecrementRating",
                                                        @"ToggleShuffle",
                                                        @"ToggleLoop",
+                                                       @"PopupMenu",
                                                        nil];
         
         hotKeyNamesArray = [[NSArray alloc] initWithObjects:@"Play/Pause",
                                                        @"Next Track",
                                                        @"Previous Track",
+                                                       @"Fast Forward",
+                                                       @"Rewind",
                                                        @"Show Player",
                                                        @"Track Info",
                                                        @"Upcoming Songs",
@@ -109,6 +114,7 @@ static PreferencesController *prefs = nil;
                                                        @"Decrement Rating",
                                                        @"Toggle Shuffle",
                                                        @"Toggle Loop",
+                                                       @"Pop-up status menu",
                                                        nil];
         hotKeysDictionary = [[NSMutableDictionary alloc] init];
         controller = nil;
@@ -216,7 +222,7 @@ static PreferencesController *prefs = nil;
     } else if ( [sender tag] == 1030) {
         [df setInteger:[sender intValue] forKey:@"SongsInAdvance"];
         if ([[controller currentRemote] playerRunningState] == ITMTRemotePlayerRunning) {
-            [[controller menuController] rebuildSubmenus];
+            [[controller menuController] performSelector:@selector(rebuildSubmenus) withObject:nil afterDelay:0];
         }
     } else if ( [sender tag] == 1040) {
         // This will not be executed.  Song info always shows the title of the song.
@@ -231,6 +237,8 @@ static PreferencesController *prefs = nil;
         [df setBool:SENDER_STATE forKey:@"showTime"];
     } else if ( [sender tag] == 1080) {
         [df setBool:SENDER_STATE forKey:@"showTrackNumber"];
+    } else if ( [sender tag] == 1085) {
+        [df setBool:SENDER_STATE forKey:@"showPlayCount"];
     } else if ( [sender tag] == 1090) {
         [df setBool:SENDER_STATE forKey:@"showTrackRating"];
     } else if ( [sender tag] == 1100) {
@@ -784,6 +792,7 @@ static PreferencesController *prefs = nil;
     [composerCheckbox setState:[df boolForKey:@"showComposer"] ? NSOnState : NSOffState];
     [trackTimeCheckbox setState:[df boolForKey:@"showTime"] ? NSOnState : NSOffState];
     [trackNumberCheckbox setState:[df boolForKey:@"showTrackNumber"] ? NSOnState : NSOffState];
+    [playCountCheckbox setState:[df boolForKey:@"showPlayCount"] ? NSOnState : NSOffState];
     [ratingCheckbox setState:[df boolForKey:@"showTrackRating"] ? NSOnState : NSOffState];
     [albumArtworkCheckbox setState:[df boolForKey:@"showAlbumArtwork"] ? NSOnState : NSOffState];
     
index 5819e78..118ca38 100755 (executable)
@@ -51,6 +51,7 @@ typedef enum {
                                 time:            (NSString *)time  // FLOW: Should probably be NSDate or something.
                                track:            (NSString *)track
                               rating:                   (int)rating
+                           playCount:                   (int)playCount
                                image:             (NSImage *)art;
 
 
index 6ad04a1..8eaba4f 100755 (executable)
@@ -107,6 +107,7 @@ static StatusWindowController *sharedController;
                                 time:            (NSString *)time  // FLOW: Should probably be NSDate or something.
                                track:            (NSString *)track
                               rating:                   (int)rating
+                           playCount:                   (int)playCount
                                image:             (NSImage *)art
 {
     NSImage  *image = nil;
@@ -145,6 +146,9 @@ static StatusWindowController *sharedController;
     if ( track ) {
         text = [text stringByAppendingString:[@"\n" stringByAppendingString:track]];
     }
+    if (playCount > -1) {
+        text = [text stringByAppendingString:[NSString stringWithFormat:@"\nPlay Count: %i", playCount]];
+    }
     if ( rating > -1 ) {
 
         NSString *ratingString = [NSString string];
@@ -164,7 +168,6 @@ static StatusWindowController *sharedController;
         text = [text stringByAppendingString:[@"\n" stringByAppendingString:ratingString]];
     }
     
-    
     [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
     [_window buildTextWindowWithString:text];
     [_window appear:self];
index b4a745c..8bc60c0 100755 (executable)
     }
 }
 
+- (int)currentSongPlayCount
+{
+    int count;
+    ITDebugLog(@"Getting current song play count.");
+    count = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pPlC" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN];
+    ITDebugLog(@"Getting current song play count done.");
+    return count;
+}
+
 - (float)currentSongRating
 {
     float temp1;
 - (BOOL)equalizerEnabled
 {
     ITDebugLog(@"Getting equalizer enabled status.");
-    int thingy = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:type('prop'), want:type('prop'), seld:type('pEQ '), from:() }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN];
+    int thingy = [[ITAppleEventCenter sharedCenter] sendAEWithRequestedKeyForNumber:@"pEQ " eventClass:@"core" eventID:@"getd" appPSN:savedPSN];
     ITDebugLog(@"Done getting equalizer enabled status.");
     return (thingy != 0) ? YES : NO;
 }