Set rating hot key ignored if no song is playing. Track info status window toggle...
[MenuTunes.git] / MainController.m
index b9f856a..927a278 100755 (executable)
@@ -64,6 +64,8 @@
 - (void)setLatestSongIdentifier:(NSString *)newIdentifier;
 - (void)applicationLaunched:(NSNotification *)note;
 - (void)applicationTerminated:(NSNotification *)note;
+
+- (void)invalidateStatusWindowUpdateTimer;
 @end
 
 static MainController *sharedController;
@@ -85,6 +87,8 @@ static MainController *sharedController;
     if ( ( self = [super init] ) ) {
         sharedController = self;
         
+               _statusWindowUpdateTimer = nil;
+               
         remoteArray = [[NSMutableArray alloc] initWithCapacity:1];
         [[PreferencesController sharedPrefs] setController:self];
         statusWindowController = [StatusWindowController sharedController];
@@ -1024,6 +1028,14 @@ static MainController *sharedController;
     int                     rating      = -1;
     int                     playCount   = -1;
        
+       //If we're already visible and the setting says so, vanish instead of displaying again.
+       if ([df boolForKey:@"ToggleTrackInfoWithHotKey"] && [statusWindowController currentStatusWindowType] == StatusWindowTrackInfoType && [[StatusWindow sharedWindow] visibilityState] == ITWindowVisibleState) {
+               ITDebugLog(@"Track window is already visible, hiding track window.");
+               [self invalidateStatusWindowUpdateTimer];
+               [[StatusWindow sharedWindow] vanish:nil];
+               return;
+       }
+       
     ITDebugLog(@"Showing track info status window.");
     
     NS_DURING
@@ -1035,16 +1047,18 @@ static MainController *sharedController;
     
     if ( title ) {
         if ( [df boolForKey:@"showAlbumArtwork"] ) {
-           NSSize oldSize, newSize;
-             NS_DURING
-                art = [[self currentRemote] currentSongAlbumArt];
-                oldSize = [art size];
-                if (oldSize.width > oldSize.height) newSize = NSMakeSize(110,oldSize.height * (110.0f / oldSize.width));
-                else newSize = NSMakeSize(oldSize.width * (110.0f / oldSize.height),110);
-                art = [[[[NSImage alloc] initWithData:[art TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize];
-            NS_HANDLER
-                [self networkError:localException];
-            NS_ENDHANDLER
+                       NSSize oldSize, newSize;
+                       NS_DURING
+                               art = [[self currentRemote] currentSongAlbumArt];
+                               oldSize = [art size];
+                               if (oldSize.width > oldSize.height) {
+                                       newSize = NSMakeSize(110,oldSize.height * (110.0f / oldSize.width));
+                               }
+                               else newSize = NSMakeSize(oldSize.width * (110.0f / oldSize.height),110);
+                               art = [[[[NSImage alloc] initWithData:[art TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize];
+                       NS_HANDLER
+                               [self networkError:localException];
+                       NS_ENDHANDLER
         }
         
         if ( [df boolForKey:@"showAlbum"] ) {
@@ -1081,7 +1095,8 @@ static MainController *sharedController;
                 [self networkError:localException];
             NS_ENDHANDLER
                        _timeUpdateCount = 0;
-                       [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
+                       [self invalidateStatusWindowUpdateTimer];
+                       _statusWindowUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
         }
 
         if ( [df boolForKey:@"showTrackNumber"] ) {
@@ -1140,18 +1155,32 @@ static MainController *sharedController;
 
 - (void)updateTime:(NSTimer *)timer
 {
+       StatusWindow *sw = [StatusWindow sharedWindow];
        _timeUpdateCount++;
-       if (_timeUpdateCount > (int)[df floatForKey:@"statusWindowVanishDelay"] - 1) {
-               NSString *time = nil;
+       if (_timeUpdateCount < (int)[sw exitDelay] + (int)[[sw exitEffect] effectTime] + (int)[[sw entryEffect] effectTime]) {
+               NSString *time = nil, *length;
                NS_DURING
-                       time = [NSString stringWithFormat:@"%@: %@ / %@",
-                                               NSLocalizedString(@"time", @"Time"),
-                                               [[self currentRemote] currentSongElapsed],
-                                               [[self currentRemote] currentSongLength]];
-                       [[StatusWindowController sharedController] updateTime:time];
+                       length = [[self currentRemote] currentSongLength];
+                       if (length) {
+                               time = [NSString stringWithFormat:@"%@: %@ / %@",
+                                                       NSLocalizedString(@"time", @"Time"),
+                                                       [[self currentRemote] currentSongElapsed],
+                                                       length];
+                               [[StatusWindowController sharedController] updateTime:time];
+                       }
                NS_HANDLER
                        [self networkError:localException];
                NS_ENDHANDLER
+       } else {
+               [self invalidateStatusWindowUpdateTimer];
+       }
+}
+
+- (void)invalidateStatusWindowUpdateTimer
+{
+       if (_statusWindowUpdateTimer) {
+               [_statusWindowUpdateTimer invalidate];
+               _statusWindowUpdateTimer = nil;
        }
 }
 
@@ -1164,6 +1193,8 @@ static MainController *sharedController;
         [self networkError:localException];
     NS_ENDHANDLER
     
+       [self invalidateStatusWindowUpdateTimer];
+       
     ITDebugLog(@"Showing upcoming songs status window.");
     NS_DURING
         if (numSongs > 0) {
@@ -1172,10 +1203,12 @@ static MainController *sharedController;
             int curTrack = [[self currentRemote] currentSongIndex];
             int i;
     
-            for (i = curTrack + 1; i <= curTrack + numSongsInAdvance; i++) {
-                if (i <= numSongs) {
+            for (i = curTrack + 1; i <= curTrack + numSongsInAdvance && i <= numSongs; i++) {
+                if ([[self currentRemote] songEnabledAtIndex:i]) {
                     [songList addObject:[[self currentRemote] songTitleAtIndex:i]];
-                }
+                } else {
+                                       numSongsInAdvance++;
+                               }
             }
             
             if ([songList count] == 0) {
@@ -1220,6 +1253,7 @@ static MainController *sharedController;
         [[self currentRemote] setVolume:volume];
     
         // Show volume status window
+               [self invalidateStatusWindowUpdateTimer];
         [statusWindowController showVolumeWindowWithLevel:dispVol];
     NS_HANDLER
         [self networkError:localException];
@@ -1244,6 +1278,7 @@ static MainController *sharedController;
         [[self currentRemote] setVolume:volume];
         
         //Show volume status window
+               [self invalidateStatusWindowUpdateTimer];
         [statusWindowController showVolumeWindowWithLevel:dispVol];
     NS_HANDLER
         [self networkError:localException];
@@ -1269,6 +1304,7 @@ static MainController *sharedController;
         [[self currentRemote] setCurrentSongRating:rating];
         
         //Show rating status window
+               [self invalidateStatusWindowUpdateTimer];
         [statusWindowController showRatingWindowWithRating:rating];
     NS_HANDLER
         [self networkError:localException];
@@ -1294,6 +1330,7 @@ static MainController *sharedController;
         [[self currentRemote] setCurrentSongRating:rating];
         
         //Show rating status window
+               [self invalidateStatusWindowUpdateTimer];
         [statusWindowController showRatingWindowWithRating:rating];
     NS_HANDLER
         [self networkError:localException];
@@ -1302,9 +1339,11 @@ static MainController *sharedController;
 
 - (void)setRating:(ITHotKey *)sender
 {
-    int stars = [[sender name] characterAtIndex:9] - 48;
-    [self selectSongRating:stars * 20];
-    [statusWindowController showRatingWindowWithRating:(float)stars / 5.0];
+       if ([self songIsPlaying]) {
+               int stars = [[sender name] characterAtIndex:9] - 48;
+               [self selectSongRating:stars * 20];
+               [statusWindowController showRatingWindowWithRating:(float)stars / 5.0];
+       }
 }
 
 - (void)toggleLoop
@@ -1327,6 +1366,7 @@ static MainController *sharedController;
         [[self currentRemote] setRepeatMode:repeatMode];
         
         //Show loop status window
+               [self invalidateStatusWindowUpdateTimer];
         [statusWindowController showRepeatWindowWithMode:repeatMode];
     NS_HANDLER
         [self networkError:localException];
@@ -1341,6 +1381,7 @@ static MainController *sharedController;
         [[self currentRemote] setShuffleEnabled:newShuffleEnabled];
         //Show shuffle status window
         ITDebugLog(@"Setting shuffle mode to %i", newShuffleEnabled);
+               [self invalidateStatusWindowUpdateTimer];
         [statusWindowController showShuffleWindow:newShuffleEnabled];
     NS_HANDLER
         [self networkError:localException];
@@ -1355,6 +1396,7 @@ static MainController *sharedController;
                        ITDebugLog(@"Toggling shufflability.");
                        [[self currentRemote] setCurrentSongShufflable:flag];
                        //Show song shufflability status window
+                       [self invalidateStatusWindowUpdateTimer];
                        [statusWindowController showSongShufflabilityWindow:flag];
                NS_HANDLER
                        [self networkError:localException];
@@ -1496,6 +1538,7 @@ static MainController *sharedController;
 - (void)remoteServerFound:(id)sender
 {
     if (![networkController isServerOn] && ![networkController isConnectedToServer]) {
+               [self invalidateStatusWindowUpdateTimer];
         [[StatusWindowController sharedController] showReconnectQueryWindow];
     }
 }
@@ -1512,6 +1555,7 @@ static MainController *sharedController;
     ITDebugLog(@"Remote exception thrown: %@: %@", [exception name], [exception reason]);
     if ( ((exception == nil) || [[exception name] isEqualToString:NSPortTimeoutException]) && [networkController isConnectedToServer]) {
         //NSRunCriticalAlertPanel(@"Remote MenuTunes Disconnected", @"The MenuTunes server you were connected to stopped responding or quit. MenuTunes will revert back to the local player.", @"OK", nil, nil);
+               [self invalidateStatusWindowUpdateTimer];
         [[StatusWindowController sharedController] showNetworkErrorQueryWindow];
         if ([self disconnectFromServer]) {
             [[PreferencesController sharedPrefs] resetRemotePlayerTextFields];