X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/93a60b6d98f84d592631266e1ee0caabe3642551..20af5f03f5ceee5561784d17bd1456ae56fee6e3:/MainController.m diff --git a/MainController.m b/MainController.m index b9f856a..c0bec8e 100755 --- a/MainController.m +++ b/MainController.m @@ -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,13 @@ 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 ([[StatusWindowController sharedController] currentStatusWindowType] == StatusWindowTrackInfoType && [[StatusWindow sharedWindow] visibilityState] == ITWindowVisibleState) { + [self invalidateStatusWindowUpdateTimer]; + [[StatusWindow sharedWindow] vanish:nil]; + return; + } + ITDebugLog(@"Showing track info status window."); NS_DURING @@ -1081,7 +1092,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 +1152,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 +1190,8 @@ static MainController *sharedController; [self networkError:localException]; NS_ENDHANDLER + [self invalidateStatusWindowUpdateTimer]; + ITDebugLog(@"Showing upcoming songs status window."); NS_DURING if (numSongs > 0) { @@ -1172,10 +1200,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 +1250,7 @@ static MainController *sharedController; [[self currentRemote] setVolume:volume]; // Show volume status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showVolumeWindowWithLevel:dispVol]; NS_HANDLER [self networkError:localException]; @@ -1244,6 +1275,7 @@ static MainController *sharedController; [[self currentRemote] setVolume:volume]; //Show volume status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showVolumeWindowWithLevel:dispVol]; NS_HANDLER [self networkError:localException]; @@ -1269,6 +1301,7 @@ static MainController *sharedController; [[self currentRemote] setCurrentSongRating:rating]; //Show rating status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showRatingWindowWithRating:rating]; NS_HANDLER [self networkError:localException]; @@ -1294,6 +1327,7 @@ static MainController *sharedController; [[self currentRemote] setCurrentSongRating:rating]; //Show rating status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showRatingWindowWithRating:rating]; NS_HANDLER [self networkError:localException]; @@ -1327,6 +1361,7 @@ static MainController *sharedController; [[self currentRemote] setRepeatMode:repeatMode]; //Show loop status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showRepeatWindowWithMode:repeatMode]; NS_HANDLER [self networkError:localException]; @@ -1341,6 +1376,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 +1391,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 +1533,7 @@ static MainController *sharedController; - (void)remoteServerFound:(id)sender { if (![networkController isServerOn] && ![networkController isConnectedToServer]) { + [self invalidateStatusWindowUpdateTimer]; [[StatusWindowController sharedController] showReconnectQueryWindow]; } } @@ -1512,6 +1550,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];