X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/88a188f0aa37a7a6402d3d71031244e88104f7a0..e40a6bb44d76a738d58a321039b6932c4688b12a:/MenuTunes.m?ds=inline diff --git a/MenuTunes.m b/MenuTunes.m index 1d8f67e..d2fdaf2 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,28 +37,26 @@ 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:@""]; - if ([currentRemote isAppRunning]) { - [self iTunesLaunched:nil]; + if ( ( [currentRemote playerRunningStatus] == ITMTRemotePlayerRunning ) ) { + [self remotePlayerLaunched:nil]; } else { - [self iTunesTerminated:nil]; + [self remotePlayerTerminated:nil]; } - statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar] - withLength:NSSquareStatusItemLength]; + statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar] withLength:NSSquareStatusItemLength]; [statusItem setImage:[NSImage imageNamed:@"menu"]]; [statusItem setAlternateImage:[NSImage imageNamed:@"selected_image"]]; [statusItem setMenu:menu]; // Below line of code is for creating builds for Beta Testers // [statusItem setToolTip:@[NSString stringWithFormat:@"This Nontransferable Beta (Built on %s) of iThink Software's MenuTunes is Registered to: Beta Tester (betatester@somedomain.com).",__DATE__]]; - [statusWindow orderFront:self]; //DEBUG } - (ITMTRemote *)loadRemote @@ -130,6 +119,7 @@ Things to do: @"", @"Upcoming Songs", @"Playlists", + @"Song Rating", @"", @"PreferencesÉ", @"Quit", @@ -210,6 +200,7 @@ Things to do: playPauseMenuItem = nil; upcomingSongsItem = nil; + songRatingMenuItem = nil; playlistItem = nil; [playlistMenu release]; playlistMenu = nil; @@ -288,6 +279,10 @@ Things to do: [menu addItemWithTitle:@"No Song" action:nil keyEquivalent:@""]; + } else if ([item isEqualToString:@"Song Rating"]) { + songRatingMenuItem = [menu addItemWithTitle:@"Song Rating" + action:nil + keyEquivalent:@""]; } else if ([item isEqualToString:@""]) { [menu addItem:[NSMenuItem separatorItem]]; } @@ -305,7 +300,7 @@ Things to do: NSMenuItem *menuItem; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - if (!isAppRunning) { + if ( ( isAppRunning == ITMTRemotePlayerNotRunning ) ) { return; } @@ -320,7 +315,6 @@ Things to do: if (eqItem) { [self rebuildEQPresetsMenu]; } - if (trackInfoIndex > -1) { NSString *curSongName, *curAlbumName = @"", *curArtistName = @""; curSongName = [currentRemote currentSongTitle]; @@ -374,6 +368,36 @@ Things to do: [menu insertItem:menuItem atIndex:trackInfoIndex + 1]; [menuItem release]; } + + if (songRatingMenuItem) { + int rating = (int)[currentRemote currentSongRating] * 10; + int i; + + for (i = 0; i < 5; i++) { + [[ratingMenu itemAtIndex:i] setState:NSOffState]; + } + + switch (rating) { + case 0: + [[ratingMenu itemAtIndex:5] setState:NSOnState]; + break; + case 2: + [[ratingMenu itemAtIndex:4] setState:NSOnState]; + break; + case 4: + [[ratingMenu itemAtIndex:3] setState:NSOnState]; + break; + case 6: + [[ratingMenu itemAtIndex:2] setState:NSOnState]; + break; + case 8: + [[ratingMenu itemAtIndex:1] setState:NSOnState]; + break; + case 10: + [[ratingMenu itemAtIndex:0] setState:NSOnState]; + break; + } + } } if ([defaults boolForKey:@"showName"]) { @@ -389,6 +413,9 @@ Things to do: [menu removeItemAtIndex:[menu indexOfItemWithTitle:@"No Song"]]; [menu insertItem:menuItem atIndex:trackInfoIndex]; [menuItem release]; + + [songRatingMenuItem setSubmenu:ratingMenu]; + [songRatingMenuItem setEnabled:YES]; } } else if ([menu indexOfItemWithTitle:@"No Song"] == -1) { [menu removeItemAtIndex:trackInfoIndex]; @@ -422,6 +449,7 @@ Things to do: didHaveAlbumName = (([curAlbumName length] > 0) ? YES : NO); } } + [menu update]; } //Rebuild the upcoming songs submenu. Can be improved a lot. @@ -496,6 +524,7 @@ Things to do: - (void)rebuildEQPresetsMenu { NSArray *eqPresets = [currentRemote eqPresets]; + NSMenuItem *enabledItem; int i; if (eqMenu && ([[currentRemote eqPresets] count] == [eqMenu numberOfItems])) @@ -504,6 +533,16 @@ Things to do: [eqMenu release]; eqMenu = [[NSMenu alloc] initWithTitle:@""]; + enabledItem = [eqMenu addItemWithTitle:@"Disabled" + action:@selector(toggleEqualizer) + keyEquivalent:@""]; + + if ([currentRemote equalizerEnabled] == NO) { + [enabledItem setState:NSOnState]; + } + + [eqMenu addItem:[NSMenuItem separatorItem]]; + for (i = 0; i < [eqPresets count]; i++) { NSString *setName = [eqPresets objectAtIndex:i]; NSMenuItem *tempItem; @@ -517,7 +556,7 @@ Things to do: } [eqItem setSubmenu:eqMenu]; - [[eqMenu itemAtIndex:[currentRemote currentEQPresetIndex] - 1] setState:NSOnState]; + [[eqMenu itemAtIndex:[currentRemote currentEQPresetIndex] + 1] setState:NSOnState]; } - (void)clearHotKeys @@ -568,9 +607,9 @@ Things to do: - (void)timerUpdate { int playlist = [currentRemote currentPlaylistIndex]; - PlayerState playerState = [currentRemote playerState]; + ITMTRemotePlayerState playerState = [currentRemote playerState]; - if ((playlist > 0) || playerState != stopped) { + if ((playlist > 0) || playerState != ITMTRemotePlayerStopped) { int trackPlayingIndex = [currentRemote currentSongIndex]; if (trackPlayingIndex != lastSongIndex) { @@ -629,30 +668,82 @@ Things to do: } //Update Play/Pause menu item if (playPauseMenuItem){ - if (playerState == playing) { + if (playerState == ITMTRemotePlayerPlaying) { [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]; + + [songRatingMenuItem setSubmenu:nil]; + [songRatingMenuItem 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.0 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; + [NSThread detachNewThreadSelector:@selector(runTimerInNewThread) toTarget:self withObject:nil]; [self rebuildMenu]; //Rebuild the menu since no songs will be playing - [self rebuildPlaylistMenu]; + if (playlistItem) { + [self rebuildPlaylistMenu]; + } + if (eqItem) { + [self rebuildEQPresetsMenu]; + } [statusItem setMenu:menu]; //Set the menu back to the main one } -- (void)iTunesTerminated:(NSNotification *)note +- (void)runTimerInNewThread +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES] retain]; + [runLoop run]; + [pool release]; +} + +- (void)remotePlayerTerminated:(NSNotification *)note { - isAppRunning = NO; + isAppRunning = ITMTRemotePlayerNotRunning; [menu release]; menu = [[NSMenu alloc] initWithTitle:@""]; @@ -664,6 +755,7 @@ Things to do: [statusItem setMenu:menu]; [refreshTimer invalidate]; + [refreshTimer release]; refreshTimer = nil; [self clearHotKeys]; } @@ -687,7 +779,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]; @@ -699,18 +793,18 @@ Things to do: int curSet = [currentRemote currentEQPresetIndex]; int item = [[sender representedObject] intValue]; [currentRemote switchToEQAtIndex:item]; - [[eqMenu itemAtIndex:curSet - 1] setState:NSOffState]; - [[eqMenu itemAtIndex:item - 1] setState:NSOnState]; + [[eqMenu itemAtIndex:curSet + 1] setState:NSOffState]; + [[eqMenu itemAtIndex:item + 2] setState:NSOnState]; } - (void)playPause:(id)sender { - PlayerState state = [currentRemote playerState]; + ITMTRemotePlayerState state = [currentRemote playerState]; - if (state == playing) { + if (state == ITMTRemotePlayerPlaying) { [currentRemote pause]; [playPauseMenuItem setTitle:@"Play"]; - } else if ((state == forwarding) || (state == rewinding)) { + } else if ((state == ITMTRemotePlayerForwarding) || (state == ITMTRemotePlayerRewinding)) { [currentRemote pause]; [currentRemote play]; } else { @@ -731,7 +825,7 @@ Things to do: - (void)fastForward:(id)sender { - [currentRemote fastForward]; + [currentRemote forward]; [playPauseMenuItem setTitle:@"Play"]; } @@ -741,6 +835,18 @@ Things to do: [playPauseMenuItem setTitle:@"Play"]; } +- (void)toggleEqualizer +{ + [currentRemote setEqualizerEnabled:![currentRemote equalizerEnabled]]; +} + +- (IBAction)setSongRating:(id)sender +{ + NSLog(@"%f", [currentRemote currentSongRating]); + NSLog(@"%f", (float)[sender tag] / 100.0); + [currentRemote setCurrentSongRating:(float)[sender tag] / 100.0]; +} + // // // Plugin independent selectors @@ -761,7 +867,7 @@ Things to do: - (void)closePreferences { - if (isAppRunning) { + if ( ( isAppRunning == ITMTRemotePlayerRunning) ) { [self setupHotKeys]; } [prefsController release]; @@ -1058,6 +1164,7 @@ Things to do: { if (refreshTimer) { [refreshTimer invalidate]; + [refreshTimer release]; refreshTimer = nil; } [currentRemote halt];