#import "MenuTunes.h"
#import "PreferencesController.h"
#import "HotKeyCenter.h"
+#import "StatusWindow.h"
@interface MenuTunes(Private)
- (ITMTRemote *)loadRemote;
{
if ( ( self = [super init] ) ) {
remoteArray = [[NSMutableArray alloc] initWithCapacity:1];
- statusWindow = [ITTransientStatusWindow sharedWindow];
+ statusWindow = [StatusWindow sharedWindow];
}
return self;
}
currentRemote = [self loadRemote];
[currentRemote begin];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iTunesTerminated:) name:@"ITMTRemoteAppDidTerminateNotification" object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iTunesLaunched:) name:@"ITMTRemoteAppDidLaunchNotification" object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(remotePlayerTerminated:) name:@"ITMTRemoteAppDidTerminateNotification" object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(remotePlayerLaunched:) name:@"ITMTRemoteAppDidLaunchNotification" object:nil];
[self registerDefaultsIfNeeded];
menu = [[NSMenu alloc] initWithTitle:@""];
- isAppRunning = [currentRemote isAppRunning];
- if (isAppRunning)
- {
- [self rebuildMenu];
- refreshTimer = [NSTimer scheduledTimerWithTimeInterval:3.5
- target:self
- selector:@selector(timerUpdate)
- userInfo:nil
- repeats:YES];
- }
- else
- {
- menu = [[NSMenu alloc] initWithTitle:@""];
- [[menu addItemWithTitle:@"Open iTunes" action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self];
- [[menu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self];
- [[menu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self];
- refreshTimer = nil;
+ if ([currentRemote isAppRunning]) {
+ [self remotePlayerLaunched:nil];
+ } else {
+ [self remotePlayerTerminated:nil];
}
-
+
statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar]
withLength:NSSquareStatusItemLength];
- (ITMTRemote *)loadRemote
{
NSString *folderPath = [[NSBundle mainBundle] builtInPlugInsPath];
-
+
if (folderPath) {
NSArray *bundlePathList = [NSBundle pathsForResourcesOfType:@"remote" inDirectory:folderPath];
NSEnumerator *enumerator = [bundlePathList objectEnumerator];
}
}
-// if ( [remoteArray count] > 0 ) {
+// if ( [remoteArray count] > 0 ) { // UNCOMMENT WHEN WE HAVE > 1 PLUGIN
// if ( [remoteArray count] > 1 ) {
// [remoteArray sortUsingSelector:@selector(sortAlpha:)];
// }
// [self loadModuleAccessUI]; //Comment out this line to disable remote visibility
// }
}
- NSLog(@"%@", [remoteArray objectAtIndex:0]);
+// NSLog(@"%@", [remoteArray objectAtIndex:0]); //DEBUG
return [remoteArray objectAtIndex:0];
}
@"<separator>",
@"Upcoming Songs",
@"Playlists",
+ @"Song Rating",
@"<separator>",
@"PreferencesÉ",
@"Quit",
trackInfoIndex = -1;
lastSongIndex = -1;
+ lastPlaylistIndex = -1;
didHaveAlbumName = ([[currentRemote currentSongAlbum] length] > 0);
didHaveArtistName = ([[currentRemote currentSongArtist] length] > 0);
keyEquivalent:@""];
[playPauseMenuItem setTarget:self];
- if (tempCombo)
- {
+ if (tempCombo) {
[self setKeyEquivalentForCode:[tempCombo keyCode]
andModifiers:[tempCombo modifiers] onItem:playPauseMenuItem];
[tempCombo release];
keyEquivalent:@""];
[nextTrack setTarget:self];
- if (tempCombo)
- {
+ if (tempCombo) {
[self setKeyEquivalentForCode:[tempCombo keyCode]
andModifiers:[tempCombo modifiers] onItem:nextTrack];
[tempCombo release];
keyEquivalent:@""];
[prevTrack setTarget:self];
- if (tempCombo)
- {
+ if (tempCombo) {
[self setKeyEquivalentForCode:[tempCombo keyCode]
andModifiers:[tempCombo modifiers] onItem:prevTrack];
[tempCombo release];
}
} else if ([item isEqualToString:@"Fast Forward"]) {
[[menu addItemWithTitle:@"Fast Forward"
- action:@selector(fastForward:)
- keyEquivalent:@""] setTarget:self];
+ action:@selector(fastForward:)
+ keyEquivalent:@""] setTarget:self];
} else if ([item isEqualToString:@"Rewind"]) {
[[menu addItemWithTitle:@"Rewind"
- action:@selector(rewind:)
- keyEquivalent:@""] setTarget:self];
+ action:@selector(rewind:)
+ keyEquivalent:@""] setTarget:self];
} else if ([item isEqualToString:@"Upcoming Songs"]) {
upcomingSongsItem = [menu addItemWithTitle:@"Upcoming Songs"
- action:nil
- keyEquivalent:@""];
+ action:nil
+ keyEquivalent:@""];
} else if ([item isEqualToString:@"Playlists"]) {
playlistItem = [menu addItemWithTitle:@"Playlists"
- action:nil
- keyEquivalent:@""];
+ action:nil
+ keyEquivalent:@""];
} else if ([item isEqualToString:@"EQ Presets"]) {
eqItem = [menu addItemWithTitle:@"EQ Presets"
- action:nil
- keyEquivalent:@""];
+ action:nil
+ keyEquivalent:@""];
} else if ([item isEqualToString:@"PreferencesÉ"]) {
[[menu addItemWithTitle:@"PreferencesÉ"
- action:@selector(showPreferences:)
- keyEquivalent:@""] setTarget:self];
+ action:@selector(showPreferences:)
+ keyEquivalent:@""] setTarget:self];
} else if ([item isEqualToString:@"Quit"]) {
[[menu addItemWithTitle:@"Quit"
- action:@selector(quitMenuTunes:)
- keyEquivalent:@""] setTarget:self];
+ action:@selector(quitMenuTunes:)
+ keyEquivalent:@""] setTarget:self];
} else if ([item isEqualToString:@"Current Track Info"]) {
trackInfoIndex = [menu numberOfItems];
[menu addItemWithTitle:@"No Song"
- action:nil
- keyEquivalent:@""];
+ action:nil
+ keyEquivalent:@""];
+ } else if ([item isEqualToString:@"Song Rating"]) {
+ NSMenu *ratingSubmenu = [[NSMenu alloc] initWithTitle:@""];
+ unichar whiteStar = 'o';//2606;
+ unichar blackStar = 'x';//2605;
+ NSString *whiteStarString = [NSString stringWithCharacters:&whiteStar
+ length:1];
+ NSString *blackStarString = [NSString stringWithCharacters:&blackStar
+ length:1];
+ NSString *string = @"";
+ int i;
+
+ for (i = 0; i < 5; i++) {
+ string = [string stringByAppendingString:whiteStarString];
+ }
+ for (i = 0; i < 6; i++) {
+ NSMenuItem *ratingItem;
+ ratingItem = [ratingSubmenu addItemWithTitle:string action:@selector(setSongRating:) keyEquivalent:@""];
+ [ratingItem setTarget:self];
+ [ratingItem setTag:i * 20];
+ string = [string substringToIndex:4];
+ string = [blackStarString stringByAppendingString:string];
+ }
+ [[menu addItemWithTitle:@"Song Rating"
+ action:nil
+ keyEquivalent:@""] setSubmenu:ratingSubmenu];
+ [ratingSubmenu autorelease];
} else if ([item isEqualToString:@"<separator>"]) {
[menu addItem:[NSMenuItem separatorItem]];
}
[self rebuildEQPresetsMenu];
}
- if (trackInfoIndex > -1)
- {
+ if (trackInfoIndex > -1) {
NSString *curSongName, *curAlbumName = @"", *curArtistName = @"";
curSongName = [currentRemote currentSongTitle];
if (!isPlayingRadio) {
if ([defaults boolForKey:@"showTime"]) {
menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongLength]]
- action:nil
- keyEquivalent:@""];
+ action:nil
+ keyEquivalent:@""];
[menu insertItem:menuItem atIndex:trackInfoIndex + 1];
[menuItem release];
}
if ([curArtistName length] > 0) {
menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@" %@", curArtistName]
- action:nil
- keyEquivalent:@""];
+ action:nil
+ keyEquivalent:@""];
[menu insertItem:menuItem atIndex:trackInfoIndex + 1];
[menuItem release];
}
if ([curAlbumName length] > 0) {
menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@" %@", curAlbumName]
- action:nil
- keyEquivalent:@""];
+ action:nil
+ keyEquivalent:@""];
[menu insertItem:menuItem atIndex:trackInfoIndex + 1];
[menuItem release];
}
if ([defaults boolForKey:@"showName"]) {
menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@" %@", curSongName]
- action:nil
- keyEquivalent:@""];
+ action:nil
+ keyEquivalent:@""];
[menu insertItem:menuItem atIndex:trackInfoIndex + 1];
[menuItem release];
}
NSMenuItem *songItem;
songItem = [[NSMenuItem alloc] initWithTitle:curSong action:@selector(playTrack:) keyEquivalent:@""];
[songItem setTarget:self];
- [songItem setRepresentedObject:[NSNumber numberWithInt:i + 1]];
+ [songItem setRepresentedObject:[NSNumber numberWithInt:i]];
[upcomingSongsMenu addItem:songItem];
[songItem release];
} else {
NSArray *playlists = [currentRemote playlists];
int i, curPlaylist = [currentRemote currentPlaylistIndex];
- if (isPlayingRadio)
- {
+ if (isPlayingRadio) {
curPlaylist = 0;
}
if (playlistMenu && ([playlists count] == [playlistMenu numberOfItems]))
[tempItem release];
}
[playlistItem setSubmenu:playlistMenu];
+ [playlistItem setEnabled:YES];
if (curPlaylist) {
[[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOnState];
for (i = 0; i < [eqPresets count]; i++) {
NSString *setName = [eqPresets objectAtIndex:i];
NSMenuItem *tempItem;
+ if (setName) {
tempItem = [[NSMenuItem alloc] initWithTitle:setName action:@selector(selectEQPreset:) keyEquivalent:@""];
[tempItem setTarget:self];
[tempItem setRepresentedObject:[NSNumber numberWithInt:i]];
[eqMenu addItem:tempItem];
[tempItem release];
+ }
}
[eqItem setSubmenu:eqMenu];
//Called when the timer fires.
- (void)timerUpdate
{
- NSLog(@"%i", [currentRemote playerState]);
- if ([currentRemote playerState] != stopped) {
+ int playlist = [currentRemote currentPlaylistIndex];
+ ITMTRemotePlayerState playerState = [currentRemote playerState];
+
+ if ((playlist > 0) || playerState != stopped) {
int trackPlayingIndex = [currentRemote currentSongIndex];
- int playlist = [currentRemote currentPlaylistIndex];
if (trackPlayingIndex != lastSongIndex) {
BOOL wasPlayingRadio = isPlayingRadio;
isPlayingRadio = [[currentRemote classOfPlaylistAtIndex:playlist] isEqualToString:@"radio tuner playlist"];
+
if (isPlayingRadio && !wasPlayingRadio) {
int i;
for (i = 0; i < [playlistMenu numberOfItems]; i++)
{
[[playlistMenu itemAtIndex:i] setState:NSOffState];
}
+ } else {
+ [[playlistMenu itemAtIndex:playlist - 1] setState:NSOnState];
}
+
if (wasPlayingRadio) {
NSMenuItem *temp = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""];
[menu insertItem:temp atIndex:trackInfoIndex + 1];
[self updateMenu];
lastSongIndex = trackPlayingIndex;
- }
- else
- {
- if (playlist != [currentRemote currentPlaylistIndex]) {
+ } else {
+ if (playlist != lastPlaylistIndex) {
BOOL wasPlayingRadio = isPlayingRadio;
isPlayingRadio = [[currentRemote classOfPlaylistAtIndex:playlist] isEqualToString:@"radio tuner playlist"];
+
if (isPlayingRadio && !wasPlayingRadio) {
int i;
- for (i = 0; i < [playlistMenu numberOfItems]; i++)
- {
+ for (i = 0; i < [playlistMenu numberOfItems]; i++) {
[[playlistMenu itemAtIndex:i] setState:NSOffState];
}
}
+
if (wasPlayingRadio) {
NSMenuItem *temp = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""];
[menu insertItem:temp atIndex:trackInfoIndex + 1];
[temp release];
}
+
+ if (!isPlayingRadio) {
+ int i;
+ for (i = 0; i < [playlistMenu numberOfItems]; i++)
+ {
+ [[playlistMenu itemAtIndex:i] setState:NSOffState];
+ }
+ [[playlistMenu itemAtIndex:playlist - 1] setState:NSOnState];
+ }
+
[self updateMenu];
lastSongIndex = trackPlayingIndex;
+ lastPlaylistIndex = playlist;
}
}
//Update Play/Pause menu item
if (playPauseMenuItem){
- if ([currentRemote playerState] == playing) {
+ if (playerState == playing) {
[playPauseMenuItem setTitle:@"Pause"];
} else {
[playPauseMenuItem setTitle:@"Play"];
}
}
-- (void)iTunesLaunched:(NSNotification *)note
+- (void)remotePlayerLaunched:(NSNotification *)note
{
isAppRunning = YES;
//Restart the timer
- refreshTimer = [NSTimer scheduledTimerWithTimeInterval:3.5 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
+ refreshTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
[self rebuildMenu]; //Rebuild the menu since no songs will be playing
+ [self rebuildPlaylistMenu];
[statusItem setMenu:menu]; //Set the menu back to the main one
}
-- (void)iTunesTerminated:(NSNotification *)note
+- (void)remotePlayerTerminated:(NSNotification *)note
{
isAppRunning = NO;
[menu release];
menu = [[NSMenu alloc] initWithTitle:@""];
- [[menu addItemWithTitle:@"Open iTunes" action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self];
+ [menu addItemWithTitle:@"Audio Player" action:NULL keyEquivalent:@""];
+ [menu addItemWithTitle:@"Not Running" action:NULL keyEquivalent:@""];
+ [menu addItem:[NSMenuItem separatorItem]];
[[menu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self];
[[menu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self];
[statusItem setMenu:menu];
- (void)playPause:(id)sender
{
- PlayerState state = [currentRemote playerState];
+ ITMTRemotePlayerState state = [currentRemote playerState];
+
if (state == playing) {
[currentRemote pause];
[playPauseMenuItem setTitle:@"Play"];
[playPauseMenuItem setTitle:@"Play"];
}
+- (void)setSongRating:(id)sender
+{
+ //[currentRemote setCurrentSongRating:[sender tag]];
+}
+
//
//
// Plugin independent selectors
[NSApp terminate:self];
}
-//How is this going to work, now that we're pluginized?
-- (void)openiTunes:(id)sender
-{
- [[NSWorkspace sharedWorkspace] launchApplication:@"iTunes"];
-}
-
- (void)showPreferences:(id)sender
{
if (!prefsController) {
}
}
-
- (void)closePreferences
{
if (isAppRunning) {
}
}
- [statusWindow setTrackInfo:stringToShow];
+ [statusWindow setText:stringToShow];
[NSTimer scheduledTimerWithTimeInterval:3.0
- target:self
- selector:@selector(fadeAndCloseStatusWindow)
- userInfo:nil
- repeats:NO];
+ target:self
+ selector:@selector(fadeAndCloseStatusWindow)
+ userInfo:nil
+ repeats:NO];
}
}
songs = [songs stringByAppendingString:@"\n"];
}
}
- [statusWindow setUpcomingSongs:songs];
+ [statusWindow setText:songs];
[NSTimer scheduledTimerWithTimeInterval:3.0
target:self
selector:@selector(fadeAndCloseStatusWindow)
{ shiftKey, NSShiftKeyMask },
};
- for (i = 0; i < 6; i++)
- {
- if (modifiers & carbonToCocoa[i][0])
- {
+ for (i = 0; i < 6; i++) {
+ if (modifiers & carbonToCocoa[i][0]) {
cocoaModifiers += carbonToCocoa[i][1];
}
}
[super dealloc];
}
-@end
\ No newline at end of file
+@end