X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/8c8ad0b57aee475a9b03939aa932d96610587c25..616ff6ad61cfc198ff23200bdb450c24d9436073:/MenuTunes.m diff --git a/MenuTunes.m b/MenuTunes.m index d03da70..9115c10 100755 --- a/MenuTunes.m +++ b/MenuTunes.m @@ -1,12 +1,3 @@ -/* -Things to do: -¥ Make preferences window pretty -¥ Optimize -¥ Apple Events! Apple Events! Apple Events! -¥ Manual and webpage -¥ Finish up registration frontend -*/ - #import "MenuTunes.h" #import "PreferencesController.h" #import "HotKeyCenter.h" @@ -46,29 +37,19 @@ Things to do: 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]; + if ( ( [currentRemote remotePlayerStatus] == ITMTRemotePlayerRunning ) ) { + [self remotePlayerLaunched:nil]; } 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; + [self remotePlayerTerminated:nil]; } - + statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar] withLength:NSSquareStatusItemLength]; @@ -82,7 +63,7 @@ Things to do: - (ITMTRemote *)loadRemote { NSString *folderPath = [[NSBundle mainBundle] builtInPlugInsPath]; - + if (folderPath) { NSArray *bundlePathList = [NSBundle pathsForResourcesOfType:@"remote" inDirectory:folderPath]; NSEnumerator *enumerator = [bundlePathList objectEnumerator]; @@ -103,14 +84,14 @@ Things to do: } } -// 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]; } @@ -139,6 +120,7 @@ Things to do: @"", @"Upcoming Songs", @"Playlists", + @"Song Rating", @"", @"PreferencesÉ", @"Quit", @@ -209,6 +191,7 @@ Things to do: trackInfoIndex = -1; lastSongIndex = -1; + lastPlaylistIndex = -1; didHaveAlbumName = ([[currentRemote currentSongAlbum] length] > 0); didHaveArtistName = ([[currentRemote currentSongArtist] length] > 0); @@ -265,37 +248,63 @@ Things to do: } } 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:@""]) { [menu addItem:[NSMenuItem separatorItem]]; } @@ -313,7 +322,7 @@ Things to do: NSMenuItem *menuItem; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - if (!isAppRunning) { + if ( ( isAppRunning = ITMTRemotePlayerNotRunning ) ) { return; } @@ -361,24 +370,24 @@ Things to do: 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]; } @@ -386,8 +395,8 @@ Things to do: 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]; } @@ -455,7 +464,7 @@ Things to do: 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 { @@ -493,6 +502,7 @@ Things to do: [tempItem release]; } [playlistItem setSubmenu:playlistMenu]; + [playlistItem setEnabled:YES]; if (curPlaylist) { [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOnState]; @@ -503,6 +513,7 @@ Things to do: - (void)rebuildEQPresetsMenu { NSArray *eqPresets = [currentRemote eqPresets]; + NSMenuItem *enabledItem; int i; if (eqMenu && ([[currentRemote eqPresets] count] == [eqMenu numberOfItems])) @@ -511,6 +522,11 @@ Things to do: [eqMenu release]; eqMenu = [[NSMenu alloc] initWithTitle:@""]; + enabledItem = [eqMenu addItemWithTitle:@"EQ Enabled" + action:NULL + keyEquivalent:@""]; + [eqMenu addItem:[NSMenuItem separatorItem]]; + for (i = 0; i < [eqPresets count]; i++) { NSString *setName = [eqPresets objectAtIndex:i]; NSMenuItem *tempItem; @@ -524,7 +540,7 @@ Things to do: } [eqItem setSubmenu:eqMenu]; - [[eqMenu itemAtIndex:[currentRemote currentEQPresetIndex] - 1] setState:NSOnState]; + [[eqMenu itemAtIndex:[currentRemote currentEQPresetIndex] + 1] setState:NSOnState]; } - (void)clearHotKeys @@ -574,21 +590,26 @@ Things to do: //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]; @@ -598,53 +619,109 @@ Things to do: [self updateMenu]; lastSongIndex = trackPlayingIndex; } else { - if (playlist != [currentRemote currentPlaylistIndex]) { + 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++) { [[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"]; } } + } else if ((lastPlaylistIndex > 0) && (playlist == 0)) { + NSMenuItem *menuItem; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + //Remote the now playing item and add no song item + [menu removeItemAtIndex:trackInfoIndex]; + + if ([defaults boolForKey:@"showName"] == YES) { + [menu removeItemAtIndex:trackInfoIndex]; + } + + if ([defaults boolForKey:@"showTime"] == YES) { + [menu removeItemAtIndex:trackInfoIndex]; + } + + if (didHaveArtistName && [defaults boolForKey:@"showArtist"]) { + [menu removeItemAtIndex:trackInfoIndex]; + } + + if (didHaveAlbumName && [defaults boolForKey:@"showAlbum"]) { + [menu removeItemAtIndex:trackInfoIndex]; + } + + [playPauseMenuItem setTitle:@"Play"]; + + didHaveArtistName = NO; + didHaveAlbumName = NO; + lastPlaylistIndex = -1; + lastSongIndex = -1; + + [upcomingSongsItem setSubmenu:nil]; + [upcomingSongsItem setEnabled:NO]; + + menuItem = [[NSMenuItem alloc] initWithTitle:@"No Song" action:nil keyEquivalent:@""]; + [menu insertItem:menuItem atIndex:trackInfoIndex]; + [menuItem release]; } } -- (void)iTunesLaunched:(NSNotification *)note +- (void)remotePlayerLaunched:(NSNotification *)note { - isAppRunning = YES; + isAppRunning = ITMTRemotePlayerRunning; //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 + if (playlistItem) { + [self rebuildPlaylistMenu]; + } + if (eqItem) { + [self rebuildEQPresetsMenu]; + } [statusItem setMenu:menu]; //Set the menu back to the main one } -- (void)iTunesTerminated:(NSNotification *)note +- (void)remotePlayerTerminated:(NSNotification *)note { - isAppRunning = NO; + isAppRunning = ITMTRemotePlayerNotRunning; [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]; @@ -673,7 +750,9 @@ Things to do: int playlist = [[sender representedObject] intValue]; if (!isPlayingRadio) { int curPlaylist = [currentRemote currentPlaylistIndex]; - [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOffState]; + if (curPlaylist > 0) { + [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOffState]; + } } [currentRemote switchToPlaylistAtIndex:playlist]; [[playlistMenu itemAtIndex:playlist - 1] setState:NSOnState]; @@ -691,7 +770,8 @@ Things to do: - (void)playPause:(id)sender { - PlayerState state = [currentRemote playerState]; + ITMTRemotePlayerState state = [currentRemote playerState]; + if (state == playing) { [currentRemote pause]; [playPauseMenuItem setTitle:@"Play"]; @@ -726,6 +806,12 @@ Things to do: [playPauseMenuItem setTitle:@"Play"]; } +- (void)setSongRating:(id)sender +{ + NSLog(@"%f", (float)[sender tag] / 100.0); + [currentRemote setCurrentSongRating:(float)[sender tag] / 100.0]; +} + // // // Plugin independent selectors @@ -736,12 +822,6 @@ Things to do: [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) { @@ -750,10 +830,9 @@ Things to do: } } - - (void)closePreferences { - if (isAppRunning) { + if ( ( isAppRunning == ITMTRemotePlayerRunning) ) { [self setupHotKeys]; } [prefsController release]; @@ -811,10 +890,10 @@ Things to do: [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]; } }