X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/0e96faf46397725b657c4947d13cd31fa75aa170..6f3e95b38759c72706e83ff140ae17667cdfad22:/MainController.m diff --git a/MainController.m b/MainController.m index 2a3d6b3..cfc9518 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]; @@ -103,8 +107,12 @@ static MainController *sharedController; float iTunesVersion; //Turn on debug mode if needed - if ([df boolForKey:@"ITDebugMode"]) { + /*if ((GetCurrentKeyModifiers() & (controlKey | rightControlKey)) != 0) + if ((GetCurrentKeyModifiers() & (optionKey | rightOptionKey)) != 0) + if ((GetCurrentKeyModifiers() & (shiftKey | rightShiftKey)) != 0)*/ + if ([df boolForKey:@"ITDebugMode"] || ((GetCurrentKeyModifiers() & (controlKey | rightControlKey)) != 0)) { SetITDebugMode(YES); + [[StatusWindowController sharedController] showDebugModeEnabledWindow]; } //Check if iTunes 4.7 or later is installed @@ -764,7 +772,7 @@ static MainController *sharedController; { ITDebugLog(@"Show preferences."); [[PreferencesController sharedPrefs] showPrefsWindow:self]; - [[StatusWindow sharedWindow] setLocked:NO]; + [(StatusWindow *)[StatusWindow sharedWindow] setLocked:NO]; [[StatusWindow sharedWindow] vanish:self]; [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; } @@ -971,6 +979,16 @@ static MainController *sharedController; [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } + if ([df objectForKey:@"ToggleShufflability"] != nil) { + ITDebugLog(@"Setting up toggle song shufflability hot key."); + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"ToggleShufflability"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleShufflability"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(toggleSongShufflable)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; + } + if ([df objectForKey:@"PopupMenu"] != nil) { ITDebugLog(@"Setting up popup menu hot key."); hotKey = [[ITHotKey alloc] init]; @@ -1066,6 +1084,9 @@ static MainController *sharedController; NS_HANDLER [self networkError:localException]; NS_ENDHANDLER + _timeUpdateCount = 0; + [self invalidateStatusWindowUpdateTimer]; + _statusWindowUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]; } if ( [df boolForKey:@"showTrackNumber"] ) { @@ -1122,6 +1143,37 @@ static MainController *sharedController; image:art]; } +- (void)updateTime:(NSTimer *)timer +{ + StatusWindow *sw = [StatusWindow sharedWindow]; + _timeUpdateCount++; + if (_timeUpdateCount < (int)[sw exitDelay] + (int)[[sw exitEffect] effectTime] + (int)[[sw entryEffect] effectTime]) { + NSString *time = nil, *length; + NS_DURING + 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; + } +} + - (void)showUpcomingSongs { int numSongs = 0; @@ -1131,6 +1183,8 @@ static MainController *sharedController; [self networkError:localException]; NS_ENDHANDLER + [self invalidateStatusWindowUpdateTimer]; + ITDebugLog(@"Showing upcoming songs status window."); NS_DURING if (numSongs > 0) { @@ -1139,10 +1193,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) { @@ -1187,6 +1243,7 @@ static MainController *sharedController; [[self currentRemote] setVolume:volume]; // Show volume status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showVolumeWindowWithLevel:dispVol]; NS_HANDLER [self networkError:localException]; @@ -1211,6 +1268,7 @@ static MainController *sharedController; [[self currentRemote] setVolume:volume]; //Show volume status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showVolumeWindowWithLevel:dispVol]; NS_HANDLER [self networkError:localException]; @@ -1236,6 +1294,7 @@ static MainController *sharedController; [[self currentRemote] setCurrentSongRating:rating]; //Show rating status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showRatingWindowWithRating:rating]; NS_HANDLER [self networkError:localException]; @@ -1261,6 +1320,7 @@ static MainController *sharedController; [[self currentRemote] setCurrentSongRating:rating]; //Show rating status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showRatingWindowWithRating:rating]; NS_HANDLER [self networkError:localException]; @@ -1294,6 +1354,7 @@ static MainController *sharedController; [[self currentRemote] setRepeatMode:repeatMode]; //Show loop status window + [self invalidateStatusWindowUpdateTimer]; [statusWindowController showRepeatWindowWithMode:repeatMode]; NS_HANDLER [self networkError:localException]; @@ -1308,15 +1369,32 @@ 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]; NS_ENDHANDLER } +- (void)toggleSongShufflable +{ + if ([self songIsPlaying]) { + NS_DURING + BOOL flag = ![[self currentRemote] currentSongShufflable]; + ITDebugLog(@"Toggling shufflability."); + [[self currentRemote] setCurrentSongShufflable:flag]; + //Show song shufflability status window + [self invalidateStatusWindowUpdateTimer]; + [statusWindowController showSongShufflabilityWindow:flag]; + NS_HANDLER + [self networkError:localException]; + NS_ENDHANDLER + } +} + - (void)registerNowOK { - [[StatusWindow sharedWindow] setLocked:NO]; + [(StatusWindow *)[StatusWindow sharedWindow] setLocked:NO]; [[StatusWindow sharedWindow] vanish:self]; [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; @@ -1325,7 +1403,7 @@ static MainController *sharedController; - (void)registerNowCancel { - [[StatusWindow sharedWindow] setLocked:NO]; + [(StatusWindow *)[StatusWindow sharedWindow] setLocked:NO]; [[StatusWindow sharedWindow] vanish:self]; [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; @@ -1448,6 +1526,7 @@ static MainController *sharedController; - (void)remoteServerFound:(id)sender { if (![networkController isServerOn] && ![networkController isConnectedToServer]) { + [self invalidateStatusWindowUpdateTimer]; [[StatusWindowController sharedController] showReconnectQueryWindow]; } } @@ -1464,6 +1543,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]; @@ -1480,14 +1560,14 @@ static MainController *sharedController; [NSTimer scheduledTimerWithTimeInterval:90.0 target:self selector:@selector(checkForRemoteServer) userInfo:nil repeats:NO]; }*/ [self checkForRemoteServerAndConnectImmediately:YES]; - [[StatusWindow sharedWindow] setLocked:NO]; + [(StatusWindow *)[StatusWindow sharedWindow] setLocked:NO]; [[StatusWindow sharedWindow] vanish:self]; [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; } - (void)cancelReconnect { - [[StatusWindow sharedWindow] setLocked:NO]; + [(StatusWindow *)[StatusWindow sharedWindow] setLocked:NO]; [[StatusWindow sharedWindow] vanish:self]; [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; } @@ -1572,7 +1652,8 @@ static MainController *sharedController; - (void)applicationDidBecomeActive:(NSNotification *)note { - if (_open && !blinged && ![NSApp mainWindow] && ([[StatusWindow sharedWindow] exitMode] == ITTransientStatusWindowExitAfterDelay)) { + //This appears to not work in 10.4 + if (_open && !blinged && ![[ITAboutWindowController sharedController] isVisible] && ![NSApp mainWindow] && ([[StatusWindow sharedWindow] exitMode] == ITTransientStatusWindowExitAfterDelay)) { [[MainController sharedController] showPreferences]; } }