X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/8fe29f5b163e9acbda7b317b406a5835bac8a95d..6b8a2b55809e875bb0aadc3ab9cbab181014d1a9:/OldMainController.m diff --git a/OldMainController.m b/OldMainController.m index ff98908..7ce374c 100755 --- a/OldMainController.m +++ b/OldMainController.m @@ -5,12 +5,13 @@ @interface MainController(Private) - (ITMTRemote *)loadRemote; -- (void)updateMenu; - (void)rebuildUpcomingSongsMenu; - (void)rebuildPlaylistMenu; - (void)rebuildEQPresetsMenu; +- (void)updateRatingMenu; - (void)setupHotKeys; - (void)timerUpdate; +- (void)updateMenu; - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers onItem:(NSMenuItem *)item; @@ -47,6 +48,7 @@ - (void)applicationDidFinishLaunching:(NSNotification *)note { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; currentRemote = [self loadRemote]; [currentRemote begin]; @@ -62,8 +64,10 @@ selector:@selector(applicationLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; - - [self registerDefaults]; + + if ( ! [defaults objectForKey:@"menu"] ) { // If this is nil, defaults have never been registered. + [[PreferencesController sharedPrefs] registerDefaults]; + } statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar] @@ -165,89 +169,6 @@ #pragma mark INSTANCE METHODS /*************************************************************************/ -- (void)registerDefaults -{ - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - if (![defaults objectForKey:@"menu"]) { - BOOL found = NO; - NSMutableDictionary *loginwindow; - NSMutableArray *loginarray; - int i; - - [defaults setObject: - [NSArray arrayWithObjects: - @"Play/Pause", - @"Next Track", - @"Previous Track", - @"Fast Forward", - @"Rewind", - @"", - @"Upcoming Songs", - @"Playlists", - @"Song Rating", - @"", - @"PreferencesÉ", - @"Quit", - @"", - @"Current Track Info", - nil] forKey:@"menu"]; - - [defaults synchronize]; - loginwindow = [[defaults persistentDomainForName:@"loginwindow"] mutableCopy]; - loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; - - for (i = 0; i < [loginarray count]; i++) { - NSDictionary *tempDict = [loginarray objectAtIndex:i]; - if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString: - [[[NSBundle mainBundle] bundlePath] lastPathComponent]]) { - found = YES; - } - } - - // - //This is teh sux - //We must fix it so it is no longer suxy - if (!found) { - if (NSRunInformationalAlertPanel(@"Auto-launch MenuTunes", @"Would you like MenuTunes to automatically launch at login?", @"Yes", @"No", nil) == NSOKButton) { - AEDesc scriptDesc, resultDesc; - NSString *script = [NSString stringWithFormat:@"tell application \"System Events\"\nmake new login item at end of login items with properties {path:\"%@\", kind:\"APPLICATION\"}\nend tell", [[NSBundle mainBundle] bundlePath]]; - ComponentInstance asComponent = OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype); - - AECreateDesc(typeChar, [script cString], [script cStringLength], - &scriptDesc); - - OSADoScript(asComponent, &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc); - - AEDisposeDesc(&scriptDesc); - AEDisposeDesc(&resultDesc); - - CloseComponent(asComponent); - } - } - } - - if (![defaults integerForKey:@"SongsInAdvance"]) - { - [defaults setInteger:5 forKey:@"SongsInAdvance"]; - } - - if (![defaults objectForKey:@"showName"]) { - [defaults setBool:YES forKey:@"showName"]; - } - - if (![defaults objectForKey:@"showArtist"]) { - [defaults setBool:YES forKey:@"showArtist"]; - } - - if (![defaults objectForKey:@"showAlbum"]) { - [defaults setBool:NO forKey:@"showAlbum"]; - } - - if (![defaults objectForKey:@"showTime"]) { - [defaults setBool:NO forKey:@"showTime"]; - } -} - - (void)startTimerInNewThread { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; @@ -268,21 +189,32 @@ int i; trackInfoIndex = -1; - lastSongIndex = -1; lastPlaylistIndex = -1; didHaveAlbumName = ([[currentRemote currentSongAlbum] length] > 0); didHaveArtistName = ([[currentRemote currentSongArtist] length] > 0); - while ([menu numberOfItems] > 0) { + [menu autorelease]; + menu = [[NSMenu alloc] initWithTitle:@""]; + + /*while ([menu numberOfItems] > 0) { [menu removeItemAtIndex:0]; - } + }*/ + + playPauseItem = nil; + lastSongIdentifier = @"0-0"; - playPauseMenuItem = nil; upcomingSongsItem = nil; - songRatingMenuItem = nil; + [upcomingSongsMenu release]; + upcomingSongsMenu = nil; + + ratingItem = nil; + [ratingMenu release]; + ratingMenu = nil; + playlistItem = nil; [playlistMenu release]; playlistMenu = nil; + eqItem = nil; [eqMenu release]; eqMenu = nil; @@ -291,13 +223,13 @@ NSString *item = [myMenu objectAtIndex:i]; if ([item isEqualToString:@"Play/Pause"]) { KeyCombo *tempCombo = [[NSUserDefaults standardUserDefaults] keyComboForKey:@"PlayPause"]; - playPauseMenuItem = [menu addItemWithTitle:@"Play" + playPauseItem = [menu addItemWithTitle:@"Play" action:@selector(playPause:) keyEquivalent:@""]; if (tempCombo) { [self setKeyEquivalentForCode:[tempCombo keyCode] - andModifiers:[tempCombo modifiers] onItem:playPauseMenuItem]; + andModifiers:[tempCombo modifiers] onItem:playPauseItem]; [tempCombo release]; } } else if ([item isEqualToString:@"Next Track"]) { @@ -362,7 +294,7 @@ NSString *emptyStarChar = [NSString stringWithCharacters:&emptystar length:1]; NSMenuItem *item; - songRatingMenuItem = [menu addItemWithTitle:@"Song Rating" + ratingItem = [menu addItemWithTitle:@"Song Rating" action:nil keyEquivalent:@""]; @@ -390,8 +322,9 @@ } } + [statusItem setMenu:menu]; + [self updateMenu]; - //[self timerUpdate]; //Updates dynamic info in the menu [self clearHotKeys]; [self setupHotKeys]; @@ -436,13 +369,7 @@ - (void)rebuildPlaylistMenu { NSArray *playlists = [currentRemote playlists]; - int i, curPlaylist = [currentRemote currentPlaylistIndex]; - - if (isPlayingRadio) { - curPlaylist = 0; - } - if (playlistMenu && ([playlists count] == [playlistMenu numberOfItems])) - return; + int i, currentPlaylist = [currentRemote currentPlaylistIndex]; [playlistMenu release]; playlistMenu = [[NSMenu alloc] initWithTitle:@""]; @@ -451,15 +378,15 @@ NSString *playlistName = [playlists objectAtIndex:i]; NSMenuItem *tempItem; tempItem = [[NSMenuItem alloc] initWithTitle:playlistName action:@selector(selectPlaylist:) keyEquivalent:@""]; - [tempItem setRepresentedObject:[NSNumber numberWithInt:i + 1]]; + [tempItem setTag:i + 1]; [playlistMenu addItem:tempItem]; [tempItem release]; } [playlistItem setSubmenu:playlistMenu]; [playlistItem setEnabled:YES]; - if (curPlaylist) { - [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOnState]; + if (!isPlayingRadio && currentPlaylist) { + [[playlistMenu itemAtIndex:currentPlaylist - 1] setState:NSOnState]; } } @@ -470,9 +397,6 @@ NSMenuItem *enabledItem; int i; - if (eqMenu && ([[currentRemote eqPresets] count] == [eqMenu numberOfItems])) - return; - [eqMenu release]; eqMenu = [[NSMenu alloc] initWithTitle:@""]; @@ -488,140 +412,67 @@ [eqMenu addItem:[NSMenuItem separatorItem]]; for (i = 0; i < [eqPresets count]; i++) { - NSString *setName = [eqPresets objectAtIndex:i]; + NSString *name = [eqPresets objectAtIndex:i]; NSMenuItem *tempItem; - if (setName) { - tempItem = [[NSMenuItem alloc] initWithTitle:setName action:@selector(selectEQPreset:) keyEquivalent:@""]; - [tempItem setTag:i]; - [eqMenu addItem:tempItem]; - [tempItem release]; + if (name) { + tempItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(selectEQPreset:) keyEquivalent:@""]; + [tempItem setTag:i]; + [eqMenu addItem:tempItem]; + [tempItem release]; } } [eqItem setSubmenu:eqMenu]; + [eqItem setEnabled:YES]; [[eqMenu itemAtIndex:[currentRemote currentEQPresetIndex] + 1] setState:NSOnState]; } -//Called when the timer fires. +- (void)updateRatingMenu +{ + int currentSongRating = ([currentRemote currentSongRating] * 5); + if ([currentRemote currentPlaylistIndex] && (currentSongRating != lastSongRating)) { + if ([currentRemote classOfPlaylistAtIndex:[currentRemote currentPlaylistIndex]] == ITMTRemotePlayerRadioPlaylist) { + return; + } + [[ratingMenu itemAtIndex:lastSongRating] setState:NSOffState]; + lastSongRating = currentSongRating; + [[ratingMenu itemAtIndex:lastSongRating] setState:NSOnState]; + } +} + - (void)timerUpdate { - int playlist = [currentRemote currentPlaylistIndex]; - ITMTRemotePlayerPlayingState playerState = [currentRemote playerPlayingState]; + NSString *currentIdentifier = [currentRemote currentSongUniqueIdentifier]; + if (![lastSongIdentifier isEqualToString:currentIdentifier] || + (!isPlayingRadio && ([currentRemote classOfPlaylistAtIndex:[currentRemote currentPlaylistIndex]] == ITMTRemotePlayerRadioPlaylist))) { + [self rebuildMenu]; + } - if ((playlist > 0) || playerState != ITMTRemotePlayerStopped) { - int trackPlayingIndex = [currentRemote currentSongIndex]; - - if (trackPlayingIndex != lastSongIndex) { - BOOL wasPlayingRadio = isPlayingRadio; - isPlayingRadio = ([currentRemote classOfPlaylistAtIndex:playlist] == ITMTRemotePlayerRadioPlaylist); - - 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]; - [temp release]; - } - [self updateMenu]; - lastSongIndex = trackPlayingIndex; + [self updateRatingMenu]; + + //Update Play/Pause menu item + if (playPauseItem){ + if ([currentRemote playerPlayingState] == ITMTRemotePlayerPlaying) { + [playPauseItem setTitle:@"Pause"]; } else { - if (playlist != lastPlaylistIndex) { - BOOL wasPlayingRadio = isPlayingRadio; - isPlayingRadio = ([currentRemote classOfPlaylistAtIndex:playlist] == ITMTRemotePlayerRadioPlaylist); - - 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 (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]; + [playPauseItem setTitle:@"Play"]; } - - [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]; } } -//Updates the menu with current player state, song, and upcoming songs - (void)updateMenu { - NSMenuItem *menuItem; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *defaults; + int playlist = [currentRemote currentPlaylistIndex]; + int temp; - if ( ( isAppRunning == ITMTRemotePlayerNotRunning ) ) { + if ( (isAppRunning == ITMTRemotePlayerNotRunning) ) { return; } + defaults = [NSUserDefaults standardUserDefaults]; + isPlayingRadio = ([currentRemote classOfPlaylistAtIndex:playlist] == ITMTRemotePlayerRadioPlaylist); + if (upcomingSongsItem) { [self rebuildUpcomingSongsMenu]; } @@ -633,123 +484,71 @@ if (eqItem) { [self rebuildEQPresetsMenu]; } - if (trackInfoIndex > -1) { - NSString *curSongName, *curAlbumName = @"", *curArtistName = @""; - curSongName = [currentRemote currentSongTitle]; - - if ([defaults boolForKey:@"showAlbum"]) { - curAlbumName = [currentRemote currentSongAlbum]; + + if (ratingItem) { + if (isPlayingRadio || !playlist) { + [ratingItem setEnabled:NO]; + if ([ratingItem submenu]) { + [ratingItem setSubmenu:nil]; + } + } else { + int currentSongRating = ([currentRemote currentSongRating] * 5); + [[ratingMenu itemAtIndex:lastSongRating] setState:NSOffState]; + lastSongRating = currentSongRating; + [[ratingMenu itemAtIndex:lastSongRating] setState:NSOnState]; + [ratingItem setEnabled:YES]; + [ratingItem setSubmenu:ratingMenu]; } + } + + //Set the new unique song identifier + lastSongIdentifier = [[currentRemote currentSongUniqueIdentifier] retain]; + + //If we're in a playlist or radio mode + if ( (trackInfoIndex > -1) && (playlist || isPlayingRadio) ) { + NSString *title, *album, *artist; - if ([defaults boolForKey:@"showArtist"]) { - curArtistName = [currentRemote currentSongArtist]; + if ( (temp = [menu indexOfItemWithTitle:@"No Song"]) && (temp > -1) ) { + [menu removeItemAtIndex:temp]; + [menu insertItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@"" atIndex:temp]; } - if ([curSongName length] > 0) { - int index = [menu indexOfItemWithTitle:@"Now Playing"]; - if (index > -1) { - if ([defaults boolForKey:@"showName"]) { - [menu removeItemAtIndex:index + 1]; - } - if (didHaveAlbumName && [defaults boolForKey:@"showAlbum"]) { - [menu removeItemAtIndex:index + 1]; - } - if (didHaveArtistName && [defaults boolForKey:@"showArtist"]) { - [menu removeItemAtIndex:index + 1]; - } - if ([defaults boolForKey:@"showTime"]) { - [menu removeItemAtIndex:index + 1]; - } - } - - if (!isPlayingRadio) { - if ([defaults boolForKey:@"showTime"]) { - menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongLength]] - 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:@""]; - [menu insertItem:menuItem atIndex:trackInfoIndex + 1]; - [menuItem release]; - } - - if ([curAlbumName length] > 0) { - menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@" %@", curAlbumName] - action:nil - keyEquivalent:@""]; - [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]; - [[ratingMenu itemAtIndex:i] setTarget:self]; - } - [[ratingMenu itemAtIndex:rating / 2] setState:NSOnState]; - } - } - - if ([defaults boolForKey:@"showName"]) { - menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@" %@", curSongName] - action:nil - keyEquivalent:@""]; - [menu insertItem:menuItem atIndex:trackInfoIndex + 1]; - [menuItem release]; - } - - if (index == -1) { - menuItem = [[NSMenuItem alloc] initWithTitle:@"Now Playing" action:nil keyEquivalent:@""]; - [menu removeItemAtIndex:[menu indexOfItemWithTitle:@"No Song"]]; - [menu insertItem:menuItem atIndex:trackInfoIndex]; - [menuItem release]; - - [songRatingMenuItem setSubmenu:ratingMenu]; - [songRatingMenuItem setEnabled:YES]; + title = [currentRemote currentSongTitle]; + + if (!isPlayingRadio) { + ([defaults boolForKey:@"showAlbum"]) ? (album = [currentRemote currentSongAlbum]) : + (album = @""); + ([defaults boolForKey:@"showArtist"]) ? (artist = [currentRemote currentSongArtist]) : + (artist = @""); + if ([defaults boolForKey:@"showTime"]) { + [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongLength]] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; } - } else if ([menu indexOfItemWithTitle:@"No Song"] == -1) { - [menu removeItemAtIndex:trackInfoIndex]; - if ([defaults boolForKey:@"showName"] == YES) { - [menu removeItemAtIndex:trackInfoIndex]; + if ([artist length] > 0) { + [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", artist] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; } - if ([defaults boolForKey:@"showTime"] == YES) { - [menu removeItemAtIndex:trackInfoIndex]; + if ([album length] > 0) { + [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", album] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; } - if (didHaveArtistName && [defaults boolForKey:@"showArtist"]) { - [menu removeItemAtIndex:trackInfoIndex]; + if ([defaults boolForKey:@"showArtist"]) { + didHaveArtistName = (([artist length] > 0) ? YES : NO); } - if (didHaveAlbumName && [defaults boolForKey:@"showAlbum"]) { - [menu removeItemAtIndex:trackInfoIndex]; + if ([defaults boolForKey:@"showAlbum"]) { + didHaveAlbumName = (([album length] > 0) ? YES : NO); } - - menuItem = [[NSMenuItem alloc] initWithTitle:@"No Song" action:nil keyEquivalent:@""]; - [menu insertItem:menuItem atIndex:trackInfoIndex]; - [menuItem release]; } - if ([defaults boolForKey:@"showArtist"]) { - didHaveArtistName = (([curArtistName length] > 0) ? YES : NO); - } - - if ([defaults boolForKey:@"showAlbum"]) { - didHaveAlbumName = (([curAlbumName length] > 0) ? YES : NO); + if ([title length] > 0) { + [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", title] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; } } [menu update]; } + // // // Menu Selectors @@ -763,16 +562,8 @@ - (void)selectPlaylist:(id)sender { - int playlist = [[sender representedObject] intValue]; - if (!isPlayingRadio) { - int curPlaylist = [currentRemote currentPlaylistIndex]; - if (curPlaylist > 0) { - [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOffState]; - } - } + int playlist = [sender tag]; [currentRemote switchToPlaylistAtIndex:playlist]; - [[playlistMenu itemAtIndex:playlist - 1] setState:NSOnState]; - [self updateMenu]; } - (void)selectEQPreset:(id)sender @@ -792,9 +583,11 @@ - (void)selectSongRating:(id)sender { - [[ratingMenu itemAtIndex:([currentRemote currentSongRating] / 20)] setState:NSOffState]; - [currentRemote setCurrentSongRating:(float)[sender tag] / 100.0]; + int newRating = [sender tag]; + [[ratingMenu itemAtIndex:lastSongRating] setState:NSOffState]; [sender setState:NSOnState]; + [currentRemote setCurrentSongRating:(float)newRating / 100.0]; + lastSongRating = newRating / 20; } - (void)playPause:(id)sender @@ -803,13 +596,13 @@ if (state == ITMTRemotePlayerPlaying) { [currentRemote pause]; - [playPauseMenuItem setTitle:@"Play"]; + [playPauseItem setTitle:@"Play"]; } else if ((state == ITMTRemotePlayerForwarding) || (state == ITMTRemotePlayerRewinding)) { [currentRemote pause]; [currentRemote play]; } else { [currentRemote play]; - [playPauseMenuItem setTitle:@"Pause"]; + [playPauseItem setTitle:@"Pause"]; } } @@ -826,13 +619,13 @@ - (void)fastForward:(id)sender { [currentRemote forward]; - [playPauseMenuItem setTitle:@"Play"]; + [playPauseItem setTitle:@"Play"]; } - (void)rewind:(id)sender { [currentRemote rewind]; - [playPauseMenuItem setTitle:@"Play"]; + [playPauseItem setTitle:@"Play"]; } // @@ -855,10 +648,8 @@ - (void)showPreferences:(id)sender { - if (!prefsController) { - prefsController = [[PreferencesController alloc] initWithMenuTunes:self]; - [self clearHotKeys]; - } + [[PreferencesController sharedPrefs] setController:self]; + [[PreferencesController sharedPrefs] showPrefsWindow:self]; } - (void)closePreferences @@ -866,8 +657,6 @@ if ( ( isAppRunning == ITMTRemotePlayerRunning) ) { [self setupHotKeys]; } - [prefsController release]; - prefsController = nil; }