From: Kent Sutherland Date: Wed, 30 Jun 2004 03:27:02 +0000 (+0000) Subject: Added a play count option to track info. X-Git-Tag: v1.4~28 X-Git-Url: http://git.ithinksw.org/MenuTunes.git/commitdiff_plain/6162e11fb9ec9ca0f4add4d5838e98a31ead4a21 Added a play count option to track info. Added fast forward and rewind hotkeys. Added enabled item to EQ menu. Fixed the prefs delay bug. Added a popup menu hotkey. --- diff --git a/English.lproj/Preferences.nib/classes.nib b/English.lproj/Preferences.nib/classes.nib index ac86d7f..6405f45 100755 --- a/English.lproj/Preferences.nib/classes.nib +++ b/English.lproj/Preferences.nib/classes.nib @@ -41,6 +41,7 @@ passwordPanelTextField = NSTextField; passwordPanelTitle = NSTextField; passwordTextField = NSTextField; + playCountCheckbox = NSButton; positionMatrix = NSMatrix; ratingCheckbox = NSButton; runScriptsCheckbox = NSButton; diff --git a/English.lproj/Preferences.nib/info.nib b/English.lproj/Preferences.nib/info.nib index 21ef348..d935081 100755 --- a/English.lproj/Preferences.nib/info.nib +++ b/English.lproj/Preferences.nib/info.nib @@ -12,7 +12,7 @@ 386 450 380 122 0 0 1152 746 IBFramework Version - 349.0 + 364.0 IBLockedObjects 281 @@ -22,6 +22,6 @@ 6 IBSystem Version - 7D24 + 7H63 diff --git a/English.lproj/Preferences.nib/keyedobjects.nib b/English.lproj/Preferences.nib/keyedobjects.nib index 23dc013..d1689b0 100755 Binary files a/English.lproj/Preferences.nib/keyedobjects.nib and b/English.lproj/Preferences.nib/keyedobjects.nib differ diff --git a/ITMTRemote.h b/ITMTRemote.h index a86888e..7abcedf 100755 --- a/ITMTRemote.h +++ b/ITMTRemote.h @@ -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 */ diff --git a/ITMTRemote.m b/ITMTRemote.m index 26fe9a0..b4e2a75 100755 --- a/ITMTRemote.m +++ b/ITMTRemote.m @@ -174,6 +174,11 @@ return nil; } +- (int)currentSongPlayCount +{ + return nil; +} + - (float)currentSongRating { return nil; @@ -184,7 +189,7 @@ return NO; } -/* - (BOOL)equalizerEnabled +- (BOOL)equalizerEnabled { return NO; } @@ -192,7 +197,7 @@ - (BOOL)setEqualizerEnabled:(BOOL)enabled { return NO; -} */ +} - (NSArray *)eqPresets { diff --git a/MainController.m b/MainController.m index 65c718c..8cb2643 100755 --- a/MainController.m +++ b/MainController.m @@ -10,6 +10,30 @@ #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 diff --git a/MenuController.m b/MenuController.m index 0190406..4c548c1 100755 --- a/MenuController.m +++ b/MenuController.m @@ -312,6 +312,9 @@ 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)) { @@ -386,6 +389,8 @@ [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]; @@ -695,6 +700,16 @@ 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] ) ) { diff --git a/PreferencesController.h b/PreferencesController.h index 52e4e5d..844f4ed 100755 --- a/PreferencesController.h +++ b/PreferencesController.h @@ -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; diff --git a/PreferencesController.m b/PreferencesController.m index 4773ab8..76bbc23 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -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]; diff --git a/StatusWindowController.h b/StatusWindowController.h index 5819e78..118ca38 100755 --- a/StatusWindowController.h +++ b/StatusWindowController.h @@ -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; diff --git a/StatusWindowController.m b/StatusWindowController.m index 6ad04a1..8eaba4f 100755 --- a/StatusWindowController.m +++ b/StatusWindowController.m @@ -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]; diff --git a/iTunesRemote.m b/iTunesRemote.m index b4a745c..8bc60c0 100755 --- a/iTunesRemote.m +++ b/iTunesRemote.m @@ -487,6 +487,15 @@ } } +- (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; @@ -510,7 +519,7 @@ - (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; }