From a822d608c6739b4c2cd2c39187a78ca461d4d6d4 Mon Sep 17 00:00:00 2001 From: Kent Sutherland Date: Fri, 28 Mar 2003 03:19:57 +0000 Subject: [PATCH] Lots of rewritten code. Not yet working because the status item doesn't drop down after calling methods from the remote sometimes. --- English.lproj/Preferences.nib/info.nib | 2 +- .../Preferences.nib/keyedobjects.nib | Bin 30766 -> 30778 bytes ITMTRemote.m | 2 +- OldMainController.h | 35 +- OldMainController.m | 968 ++++++------------ PreferencesController.m | 27 +- 6 files changed, 321 insertions(+), 713 deletions(-) diff --git a/English.lproj/Preferences.nib/info.nib b/English.lproj/Preferences.nib/info.nib index ec63d35..3d6dc3c 100755 --- a/English.lproj/Preferences.nib/info.nib +++ b/English.lproj/Preferences.nib/info.nib @@ -3,7 +3,7 @@ IBDocumentLocation - 343 32 356 240 0 0 1056 770 + 390 31 356 240 0 0 1152 746 IBFramework Version 291.0 IBGroupedObjects diff --git a/English.lproj/Preferences.nib/keyedobjects.nib b/English.lproj/Preferences.nib/keyedobjects.nib index 07ac3864f50b823faabb02ba816e235122502300..4e23c97051a6febe0e4b768af95a6fc06d50cf43 100755 GIT binary patch delta 12446 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 diff --git a/ITMTRemote.m b/ITMTRemote.m index 36b82eb..5cd7733 100755 --- a/ITMTRemote.m +++ b/ITMTRemote.m @@ -1,4 +1,4 @@ -pen#import "ITMTRemote.h" +#import "ITMTRemote.h" @implementation ITMTRemote diff --git a/OldMainController.h b/OldMainController.h index 252ae3a..449eb4d 100755 --- a/OldMainController.h +++ b/OldMainController.h @@ -19,13 +19,11 @@ #import #import -//@class MenuTunesView; @class PreferencesController, StatusWindow; @interface MainController : NSObject { ITStatusItem *statusItem; - NSMenu *menu; ITMTRemote *currentRemote; NSMutableArray *remoteArray; @@ -37,44 +35,21 @@ BOOL isPlayingRadio; ITMTRemotePlayerRunningState isAppRunning; - BOOL didHaveAlbumName; - BOOL didHaveArtistName; //Helper variable for creating the menu - - //For upcoming songs - NSMenuItem *upcomingSongsItem; - NSMenu *upcomingSongsMenu; - - //For playlist selection - NSMenuItem *playlistItem; - NSMenu *playlistMenu; - - //For EQ sets - NSMenuItem *eqItem; - NSMenu *eqMenu; - - //For song ratings - NSMenuItem *songRatingMenuItem; - NSMenu *ratingMenu; - - NSMenuItem *playPauseMenuItem; //Toggle between 'Play' and 'Pause' PreferencesController *prefsController; StatusWindow *statusWindow; //Shows track info and upcoming songs. } -- (void)remotePlayerLaunched:(NSNotification *)note; -- (void)remotePlayerTerminated:(NSNotification *)note; - -- (void)registerDefaultsIfNeeded; -- (void)rebuildMenu; +- (void)applicationLaunched:(NSNotification *)note; +- (void)applicationTerminated:(NSNotification *)note; -- (void)runTimerInNewThread; +- (void)registerDefaults; -- (void)setSongRating:(id)sender; +- (void)startTimerInNewThread; - (void)clearHotKeys; - (void)closePreferences; -- (void)showPlayer; +- (void)showPlayer:(id)sender; @end diff --git a/OldMainController.m b/OldMainController.m index 23a4be4..b3419c7 100755 --- a/OldMainController.m +++ b/OldMainController.m @@ -5,24 +5,18 @@ @interface MainController(Private) - (ITMTRemote *)loadRemote; -- (void)updateMenu; -- (void)rebuildUpcomingSongsMenu; -- (void)rebuildPlaylistMenu; -- (void)rebuildEQPresetsMenu; - (void)setupHotKeys; -- (void)timerUpdate; - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers onItem:(NSMenuItem *)item; - +- (NSMenu *)mainMenu; +- (NSMenu *)songRatingMenu; +- (NSMenu *)playlistsMenu; +- (NSMenu *)upcomingSongsMenu; +- (NSMenu *)eqPresetsMenu; @end @implementation MainController -/*************************************************************************/ -#pragma mark - -#pragma mark INITIALIZATION METHODS -/*************************************************************************/ - - (id)init { if ( ( self = [super init] ) ) { @@ -32,33 +26,52 @@ return self; } +- (void)dealloc +{ + if (refreshTimer) { + [refreshTimer invalidate]; + [refreshTimer release]; + refreshTimer = nil; + } + [currentRemote halt]; + [statusItem release]; + [super dealloc]; +} + - (void)applicationDidFinishLaunching:(NSNotification *)note { currentRemote = [self loadRemote]; [currentRemote begin]; - [[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:@""]; + //Setup for notification of the remote player launching or quitting + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(applicationTerminated:) name:NSWorkspaceDidTerminateApplicationNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; - if ( ( [currentRemote playerRunningState] == ITMTRemotePlayerRunning ) ) { - [self remotePlayerLaunched:nil]; - } else { - [self remotePlayerTerminated:nil]; - } + [self registerDefaults]; 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__]]; + + if ( ( [currentRemote playerRunningState] == ITMTRemotePlayerRunning ) ) { + [self applicationLaunched:nil]; + } else { + [self applicationTerminated:nil]; + } } +- (void)applicationWillTerminate:(NSNotification *)note +{ + [self clearHotKeys]; + [[NSStatusBar systemStatusBar] removeStatusItem:statusItem]; + [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self]; +} + +// +// + - (ITMTRemote *)loadRemote { NSString *folderPath = [[NSBundle mainBundle] builtInPlugInsPath]; @@ -94,13 +107,7 @@ return [remoteArray objectAtIndex:0]; } - -/*************************************************************************/ -#pragma mark - -#pragma mark INSTANCE METHODS -/*************************************************************************/ - -- (void)registerDefaultsIfNeeded +- (void)registerDefaults { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if (![defaults objectForKey:@"menu"]) { @@ -182,39 +189,89 @@ } } -//Recreate the status item menu -- (void)rebuildMenu +// +// + +- (void)applicationLaunched:(NSNotification *)note { - NSArray *myMenu = [[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"]; - int i; - - trackInfoIndex = -1; - lastSongIndex = -1; - lastPlaylistIndex = -1; - didHaveAlbumName = ([[currentRemote currentSongAlbum] length] > 0); - didHaveArtistName = ([[currentRemote currentSongArtist] length] > 0); + if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) { + [NSThread detachNewThreadSelector:@selector(startTimerInNewThread) toTarget:self withObject:nil]; + [statusItem setMenu:[self mainMenu]]; + [self setupHotKeys]; + isAppRunning = ITMTRemotePlayerRunning; + return; + } - while ([menu numberOfItems] > 0) { - [menu removeItemAtIndex:0]; + isAppRunning = ITMTRemotePlayerRunning; +} + +- (void)applicationTerminated:(NSNotification *)note +{ + if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) { + NSMenu *menu = [[NSMenu alloc] initWithTitle:@""]; + [[menu addItemWithTitle:[NSString stringWithFormat:@"Open %@", [currentRemote playerSimpleName]] action:@selector(showPlayer:) keyEquivalent:@""] setTarget:self]; + [menu addItem:[NSMenuItem separatorItem]]; + [[menu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; + [statusItem setMenu:[menu autorelease]]; + + [refreshTimer invalidate]; + [refreshTimer release]; + refreshTimer = nil; + [self clearHotKeys]; + isAppRunning = NO; + return; + } +} + +- (void)startTimerInNewThread +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES] retain]; + [runLoop run]; + [pool release]; +} + +- (void)timerUpdate +{ + ITMTRemotePlayerPlayingState playerPlayingState = [currentRemote playerPlayingState]; + NSMenu *statusMenu = [statusItem menu]; + int index; + + //Update play/pause menu item + if (playerPlayingState == ITMTRemotePlayerPlaying) { + index = [statusMenu indexOfItemWithTitle:@"Play"]; + if (index > -1) { + [[statusMenu itemAtIndex:index] setTitle:@"Pause"]; + } + } else { + index = [statusMenu indexOfItemWithTitle:@"Pause"]; + if (index > -1) { + [[statusMenu itemAtIndex:index] setTitle:@"Play"]; + } } - playPauseMenuItem = nil; - upcomingSongsItem = nil; - songRatingMenuItem = nil; - playlistItem = nil; - [playlistMenu release]; - playlistMenu = nil; - eqItem = nil; - [eqMenu release]; - eqMenu = nil; + if (0 == 1/*Maybe set this to something better sometime*/) { + [statusItem setMenu:[self mainMenu]]; + } +} + +// +// + +- (NSMenu *)mainMenu +{ + NSMenu *mainMenu = [[NSMenu alloc] initWithTitle:@""]; + NSArray *myMenu = [[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"]; + int i; for (i = 0; i < [myMenu count]; i++) { - NSString *item = [myMenu objectAtIndex:i]; - if ([item isEqualToString:@"Play/Pause"]) { + NSString *currentItem = [myMenu objectAtIndex:i]; + + if ([currentItem isEqualToString:@"Play/Pause"]) { KeyCombo *tempCombo = [[NSUserDefaults standardUserDefaults] keyComboForKey:@"PlayPause"]; - playPauseMenuItem = [menu addItemWithTitle:@"Play" - action:@selector(playPause:) - keyEquivalent:@""]; + NSMenuItem *playPauseMenuItem = [mainMenu addItemWithTitle:@"Play" action:@selector(playPause:) keyEquivalent:@""]; [playPauseMenuItem setTarget:self]; if (tempCombo) { @@ -222,349 +279,235 @@ andModifiers:[tempCombo modifiers] onItem:playPauseMenuItem]; [tempCombo release]; } - } else if ([item isEqualToString:@"Next Track"]) { + } else if ([currentItem isEqualToString:@"Next Track"]) { KeyCombo *tempCombo = [[NSUserDefaults standardUserDefaults] keyComboForKey:@"NextTrack"]; - NSMenuItem *nextTrack = [menu addItemWithTitle:@"Next Track" - action:@selector(nextSong:) - keyEquivalent:@""]; - + NSMenuItem *nextTrack = [mainMenu addItemWithTitle:@"Next Track" action:@selector(nextSong:) keyEquivalent:@""]; [nextTrack setTarget:self]; if (tempCombo) { [self setKeyEquivalentForCode:[tempCombo keyCode] andModifiers:[tempCombo modifiers] onItem:nextTrack]; [tempCombo release]; } - } else if ([item isEqualToString:@"Previous Track"]) { + } else if ([currentItem isEqualToString:@"Previous Track"]) { KeyCombo *tempCombo = [[NSUserDefaults standardUserDefaults] keyComboForKey:@"PrevTrack"]; - NSMenuItem *prevTrack = [menu addItemWithTitle:@"Previous Track" - action:@selector(prevSong:) - keyEquivalent:@""]; - + NSMenuItem *prevTrack = [mainMenu addItemWithTitle:@"Previous Track" action:@selector(prevSong:) keyEquivalent:@""]; [prevTrack setTarget:self]; if (tempCombo) { [self setKeyEquivalentForCode:[tempCombo keyCode] andModifiers:[tempCombo modifiers] onItem:prevTrack]; [tempCombo release]; } - } else if ([item isEqualToString:@"Fast Forward"]) { - [[menu addItemWithTitle:@"Fast Forward" - action:@selector(fastForward:) - keyEquivalent:@""] setTarget:self]; - } else if ([item isEqualToString:@"Rewind"]) { - [[menu addItemWithTitle:@"Rewind" - action:@selector(rewind:) - keyEquivalent:@""] setTarget:self]; - } else if ([item isEqualToString:@"Upcoming Songs"]) { - upcomingSongsItem = [menu addItemWithTitle:@"Upcoming Songs" - action:nil - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Playlists"]) { - playlistItem = [menu addItemWithTitle:@"Playlists" - action:nil - keyEquivalent:@""]; - } else if ([item isEqualToString:@"EQ Presets"]) { - eqItem = [menu addItemWithTitle:@"EQ Presets" - action:nil - keyEquivalent:@""]; - } else if ([item isEqualToString:@"PreferencesÉ"]) { - [[menu addItemWithTitle:@"PreferencesÉ" - action:@selector(showPreferences:) - keyEquivalent:@""] setTarget:self]; - } else if ([item isEqualToString:@"Quit"]) { - [[menu addItemWithTitle:@"Quit" - action:@selector(quitMenuTunes:) - keyEquivalent:@""] setTarget:self]; - } else if ([item isEqualToString:@"Current Track Info"]) { - trackInfoIndex = [menu numberOfItems]; - [menu addItemWithTitle:@"No Song" - action:nil - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Song Rating"]) { - unichar fullstar = 0x2605; - unichar emptystar = 0x2606; - NSString *fullStarChar = [NSString stringWithCharacters:&fullstar length:1]; - NSString *emptyStarChar = [NSString stringWithCharacters:&emptystar length:1]; - NSMenuItem *item; - int i; - NSString *curTitle = [NSString stringWithFormat:@"%@%@%@%@%@", emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar]; - - songRatingMenuItem = [menu addItemWithTitle:@"Song Rating" - action:nil - keyEquivalent:@""]; - - ratingMenu = [[NSMenu alloc] initWithTitle:@""]; - - item = [ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar] - action:@selector(setSongRating:) - keyEquivalent:@""]; - [item setTarget:self]; - [item setTag:0]; - - for (i = 1; i < 6; i++) { - curTitle = [curTitle substringToIndex:4]; - curTitle = [fullStarChar stringByAppendingString:curTitle]; - item = [ratingMenu addItemWithTitle:curTitle - action:@selector(setSongRating:) - keyEquivalent:@""]; - [item setTarget:self]; - [item setTag:(i * 20)]; + } else if ([currentItem isEqualToString:@"Fast Forward"]) { + [[mainMenu addItemWithTitle:@"Fast Forward"action:@selector(fastForward:) keyEquivalent:@""] setTarget:self]; + } else if ([currentItem isEqualToString:@"Rewind"]) { + [[mainMenu addItemWithTitle:@"Rewind" action:@selector(rewind:) keyEquivalent:@""] setTarget:self]; + } else if ([currentItem isEqualToString:@"EQ Presets"]) { + [[mainMenu addItemWithTitle:@"EQ Presets" action:NULL keyEquivalent:@""] setSubmenu:[self eqPresetsMenu]]; + } else if ([currentItem isEqualToString:@"Playlists"]) { + [[mainMenu addItemWithTitle:@"Playlists" action:NULL keyEquivalent:@""] setSubmenu:[self playlistsMenu]]; + } else if ([currentItem isEqualToString:@"Song Rating"]) { + [[mainMenu addItemWithTitle:@"Song Rating"action:NULL keyEquivalent:@""] setSubmenu:[self songRatingMenu]]; + } else if ([currentItem isEqualToString:@"Upcoming Songs"]) { + [[mainMenu addItemWithTitle:@"Upcoming Songs"action:NULL keyEquivalent:@""] setSubmenu:[self upcomingSongsMenu]]; + } else if ([currentItem isEqualToString:@"PreferencesÉ"]) { + [[mainMenu addItemWithTitle:@"Preferences..." action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; + } else if ([currentItem isEqualToString:@"Quit"]) { + [[mainMenu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; + } else if ([currentItem isEqualToString:@"Current Song Info"]) { + //Current Song Info + { + int currentSongIndex = [currentRemote currentSongIndex]; + + if (currentSongIndex == 0) { + [mainMenu addItemWithTitle:@"No Song" action:NULL keyEquivalent:@""]; + } else { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [mainMenu addItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@""]; + + if ([defaults objectForKey:@"showName"]) { + [mainMenu addItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongTitle]] action:NULL keyEquivalent:@""]; + } + + if ([defaults objectForKey:@"showAlbum"]) { + [mainMenu addItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongAlbum]] action:NULL keyEquivalent:@""]; + } + + if ([defaults objectForKey:@"showArtist"]) { + [mainMenu addItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongArtist]] action:NULL keyEquivalent:@""]; + } + + if ([defaults objectForKey:@"showTime"]) { + [mainMenu addItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongLength]] action:NULL keyEquivalent:@""]; + } + } } - } else if ([item isEqualToString:@""]) { - [menu addItem:[NSMenuItem separatorItem]]; + } else if ([currentItem isEqualToString:@""]) { + [mainMenu addItem:[NSMenuItem separatorItem]]; } } - [self timerUpdate]; //Updates dynamic info in the menu - - [self clearHotKeys]; - [self setupHotKeys]; + NSLog(@"%@", mainMenu); + return [mainMenu autorelease]; } -//Updates the menu with current player state, song, and upcoming songs -- (void)updateMenu +- (NSMenu *)songRatingMenu { - NSMenuItem *menuItem; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSMenu *songRatingMenu = [[NSMenu alloc] initWithTitle:@""]; + unichar fullstar = 0x2605; + unichar emptystar = 0x2606; + NSString *fullStarChar = [NSString stringWithCharacters:&fullstar length:1]; + NSString *emptyStarChar = [NSString stringWithCharacters:&emptystar length:1]; + NSMenuItem *item; + int currentSongRating = ([currentRemote currentSongRating] * 5); - if ( ( isAppRunning == ITMTRemotePlayerNotRunning ) ) { - return; - } + item = [songRatingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:0]; - if (upcomingSongsItem) { - [self rebuildUpcomingSongsMenu]; - } + item = [songRatingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:20]; - if (playlistItem) { - [self rebuildPlaylistMenu]; - } + item = [songRatingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:40]; + + item = [songRatingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:60]; + + item = [songRatingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, fullStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:80]; - if (eqItem) { - [self rebuildEQPresetsMenu]; + item = [songRatingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, fullStarChar, fullStarChar] action:@selector(selectSongRating:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:100]; + + [[songRatingMenu itemAtIndex:(currentSongRating / 20)] setState:NSOnState]; + + return [songRatingMenu autorelease]; +} + +- (void)selectSongRating:(id)sender +{ + [currentRemote setCurrentSongRating:(float)[sender tag] / 100.0]; +} + +- (NSMenu *)playlistsMenu +{ + NSMenu *playlistsMenu = [[NSMenu alloc] initWithTitle:@""]; + NSArray *playlists = [currentRemote playlists]; + int i, currentPlaylistIndex = [currentRemote currentPlaylistIndex]; + + if ([currentRemote classOfPlaylistAtIndex:currentPlaylistIndex] == ITMTRemotePlayerRadioPlaylist) { + currentPlaylistIndex = 0; } - if (trackInfoIndex > -1) { - NSString *curSongName, *curAlbumName = @"", *curArtistName = @""; - curSongName = [currentRemote currentSongTitle]; - - if ([defaults boolForKey:@"showAlbum"]) { - curAlbumName = [currentRemote currentSongAlbum]; - } - - if ([defaults boolForKey:@"showArtist"]) { - curArtistName = [currentRemote currentSongArtist]; - } - - 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]; - } - } else if ([menu indexOfItemWithTitle:@"No Song"] == -1) { - [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]; - } - - 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); + + for (i = 0; i < [playlists count]; i++) { + NSString *name = [playlists objectAtIndex:i]; + NSMenuItem *item; + item = [playlistsMenu addItemWithTitle:name action:@selector(selectPlaylist:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:i + 1]; + + if (i + 1 == currentPlaylistIndex) { + [item setState:NSOnState]; } } - [menu update]; + return [playlistsMenu autorelease]; } -//Rebuild the upcoming songs submenu. Can be improved a lot. -- (void)rebuildUpcomingSongsMenu +- (void)selectPlaylist:(id)sender { - int curIndex = [currentRemote currentPlaylistIndex]; - int numSongs = [currentRemote numberOfSongsInPlaylistAtIndex:curIndex]; - int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"]; - - if (!isPlayingRadio) { - if (numSongs > 0) { - int curTrack = [currentRemote currentSongIndex]; - int i; - - [upcomingSongsMenu release]; - upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""]; - [upcomingSongsItem setSubmenu:upcomingSongsMenu]; - [upcomingSongsItem setEnabled:YES]; - - for (i = curTrack + 1; i <= curTrack + numSongsInAdvance; i++) { - if (i <= numSongs) { - NSString *curSong = [currentRemote songTitleAtIndex:i]; - NSMenuItem *songItem; - songItem = [[NSMenuItem alloc] initWithTitle:curSong action:@selector(playTrack:) keyEquivalent:@""]; - [songItem setTarget:self]; - [songItem setRepresentedObject:[NSNumber numberWithInt:i]]; - [upcomingSongsMenu addItem:songItem]; - [songItem release]; - } else { - break; - } - } - } - } else { - [upcomingSongsItem setSubmenu:nil]; - [upcomingSongsItem setEnabled:NO]; + int newPlaylistIndex = [sender tag]; + if ([currentRemote currentPlaylistIndex] + 1 != newPlaylistIndex) { + [currentRemote switchToPlaylistAtIndex:newPlaylistIndex]; } } -- (void)rebuildPlaylistMenu +- (NSMenu *)upcomingSongsMenu { - NSArray *playlists = [currentRemote playlists]; - int i, curPlaylist = [currentRemote currentPlaylistIndex]; + NSMenu *upcomingSongsMenu; + int i, currentPlaylistIndex, currentPlaylistLength, currentSongIndex, songsInAdvance; - if (isPlayingRadio) { - curPlaylist = 0; + if ([currentRemote classOfPlaylistAtIndex:currentPlaylistIndex] == ITMTRemotePlayerRadioPlaylist) + { + return nil; } - if (playlistMenu && ([playlists count] == [playlistMenu numberOfItems])) - return; - [playlistMenu release]; - playlistMenu = [[NSMenu alloc] initWithTitle:@""]; + upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""]; + currentPlaylistIndex = [currentRemote currentPlaylistIndex]; + currentPlaylistLength = [currentRemote numberOfSongsInPlaylistAtIndex:currentPlaylistIndex]; + currentSongIndex = [currentRemote currentSongIndex]; + songsInAdvance = 8; //Change according to the preferences - for (i = 0; i < [playlists count]; i++) { - NSString *playlistName = [playlists objectAtIndex:i]; - NSMenuItem *tempItem; - tempItem = [[NSMenuItem alloc] initWithTitle:playlistName action:@selector(selectPlaylist:) keyEquivalent:@""]; - [tempItem setTarget:self]; - [tempItem setRepresentedObject:[NSNumber numberWithInt:i + 1]]; - [playlistMenu addItem:tempItem]; - [tempItem release]; - } - [playlistItem setSubmenu:playlistMenu]; - [playlistItem setEnabled:YES]; - - if (curPlaylist) { - [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOnState]; + for (i = currentSongIndex + 1; i <= currentSongIndex + songsInAdvance; i++) { + if (i <= currentPlaylistLength) { + NSString *name = [currentRemote songTitleAtIndex:i]; + NSMenuItem *item; + + item = [upcomingSongsMenu addItemWithTitle:name action:@selector(selectUpcomingSong:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:i]; + } } + return [upcomingSongsMenu autorelease]; } -//Build a menu with the list of all available EQ presets -- (void)rebuildEQPresetsMenu +- (void)selectUpcomingSong:(id)sender { + [currentRemote switchToSongAtIndex:[sender tag]]; +} + +- (NSMenu *)eqPresetsMenu +{ + NSMenu *eqPresetsMenu = [[NSMenu alloc] initWithTitle:@""]; NSArray *eqPresets = [currentRemote eqPresets]; - NSMenuItem *enabledItem; - int i; + int i, currentPresetIndex = [currentRemote currentEQPresetIndex]; - if (eqMenu && ([[currentRemote eqPresets] count] == [eqMenu numberOfItems])) - return; - - [eqMenu release]; - eqMenu = [[NSMenu alloc] initWithTitle:@""]; - - enabledItem = [eqMenu addItemWithTitle:@"Disabled" - action:@selector(toggleEqualizer) - keyEquivalent:@""]; + NSMenuItem *eqEnabledMenuItem; - if ([currentRemote equalizerEnabled] == NO) { - [enabledItem setState:NSOnState]; + eqEnabledMenuItem = [eqPresetsMenu addItemWithTitle:@"Enabled" action:@selector(selectEQPreset:) keyEquivalent:@""]; + [eqEnabledMenuItem setTarget:self]; + [eqEnabledMenuItem setTag:-1]; + if ([currentRemote equalizerEnabled] == YES) { + [eqEnabledMenuItem setState:NSOnState]; } - [eqMenu addItem:[NSMenuItem separatorItem]]; + [eqPresetsMenu addItem:[NSMenuItem separatorItem]]; for (i = 0; i < [eqPresets count]; i++) { - NSString *setName = [eqPresets objectAtIndex:i]; - NSMenuItem *tempItem; - if (setName) { - tempItem = [[NSMenuItem alloc] initWithTitle:setName action:@selector(selectEQPreset:) keyEquivalent:@""]; - [tempItem setTarget:self]; - [tempItem setRepresentedObject:[NSNumber numberWithInt:i]]; - [eqMenu addItem:tempItem]; - [tempItem release]; - } + NSString *name = [eqPresets objectAtIndex:i]; + NSMenuItem *item; + + item = [eqPresetsMenu addItemWithTitle:name action:@selector(selectEQPreset:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:i]; + + if (currentPresetIndex == i) { + [item setState:NSOnState]; + } + } + return [eqPresetsMenu autorelease]; +} + +- (void)selectEQPreset:(id)sender +{ + int newEQPresetIndex = [sender tag]; + + if (newEQPresetIndex == -1) { + [currentRemote setEqualizerEnabled:![currentRemote equalizerEnabled]]; } - [eqItem setSubmenu:eqMenu]; - [[eqMenu itemAtIndex:[currentRemote currentEQPresetIndex] + 1] setState:NSOnState]; + if ([currentRemote currentEQPresetIndex] + 1 != newEQPresetIndex) { + [currentRemote switchToEQAtIndex:newEQPresetIndex]; + } } +// +// + - (void)clearHotKeys { [[HotKeyCenter sharedCenter] removeHotKey:@"PlayPause"]; @@ -609,211 +552,23 @@ } } -//Called when the timer fires. -- (void)timerUpdate -{ - int playlist = [currentRemote currentPlaylistIndex]; - ITMTRemotePlayerPlayingState playerPlayingState = [currentRemote playerPlayingState]; - - if ((playlist > 0) || playerPlayingState != 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; - } 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 (playerPlayingState == 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)remotePlayerLaunched:(NSNotification *)note -{ - isAppRunning = ITMTRemotePlayerRunning; - - //Restart the timer - [NSThread detachNewThreadSelector:@selector(runTimerInNewThread) toTarget:self withObject:nil]; - - [self rebuildMenu]; //Rebuild the menu since no songs will be playing - if (playlistItem) { - [self rebuildPlaylistMenu]; - } - if (eqItem) { - [self rebuildEQPresetsMenu]; - } - [statusItem setMenu:menu]; //Set the menu back to the main one -} - -- (void)runTimerInNewThread -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; - refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES] retain]; - [runLoop run]; - [pool release]; -} - -- (void)remotePlayerTerminated:(NSNotification *)note -{ - isAppRunning = ITMTRemotePlayerNotRunning; - - [menu release]; - menu = [[NSMenu alloc] initWithTitle:@""]; - [[menu addItemWithTitle:[NSString stringWithFormat:@"Open %@", [currentRemote playerSimpleName]] action:@selector(showPlayer:) keyEquivalent:@""] setTarget:self]; - [menu addItem:[NSMenuItem separatorItem]]; - [[menu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; - [[menu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; - [statusItem setMenu:menu]; - - [refreshTimer invalidate]; - [refreshTimer release]; - refreshTimer = nil; - [self clearHotKeys]; -} - -// // -// Selectors - called from status item menu // -// - -// Plugin dependent selectors - -- (void)playTrack:(id)sender -{ - [currentRemote switchToSongAtIndex:[[sender representedObject] intValue]]; -} - -- (void)selectPlaylist:(id)sender -{ - int playlist = [[sender representedObject] intValue]; - if (!isPlayingRadio) { - int curPlaylist = [currentRemote currentPlaylistIndex]; - if (curPlaylist > 0) { - [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOffState]; - } - } - [currentRemote switchToPlaylistAtIndex:playlist]; - [[playlistMenu itemAtIndex:playlist - 1] setState:NSOnState]; - [self updateMenu]; -} - -- (void)selectEQPreset:(id)sender -{ - int curSet = [currentRemote currentEQPresetIndex]; - int item = [[sender representedObject] intValue]; - [currentRemote switchToEQAtIndex:item]; - [[eqMenu itemAtIndex:curSet + 1] setState:NSOffState]; - [[eqMenu itemAtIndex:item + 2] setState:NSOnState]; -} - (void)playPause:(id)sender { ITMTRemotePlayerPlayingState state = [currentRemote playerPlayingState]; + NSMenu *statusMenu = [statusItem menu]; if (state == ITMTRemotePlayerPlaying) { [currentRemote pause]; - [playPauseMenuItem setTitle:@"Play"]; + [[statusMenu itemAtIndex:[statusMenu indexOfItemWithTitle:@"Pause"]] setTitle:@"Play"]; } else if ((state == ITMTRemotePlayerForwarding) || (state == ITMTRemotePlayerRewinding)) { [currentRemote pause]; [currentRemote play]; } else { [currentRemote play]; - [playPauseMenuItem setTitle:@"Pause"]; + [[statusMenu itemAtIndex:[statusMenu indexOfItemWithTitle:@"Play"]] setTitle:@"Pause"]; } } @@ -830,13 +585,11 @@ - (void)fastForward:(id)sender { [currentRemote forward]; - [playPauseMenuItem setTitle:@"Play"]; } - (void)rewind:(id)sender { [currentRemote rewind]; - [playPauseMenuItem setTitle:@"Play"]; } - (void)toggleEqualizer @@ -844,18 +597,6 @@ [currentRemote setEqualizerEnabled:![currentRemote equalizerEnabled]]; } -- (void)setSongRating:(id)sender -{ - NSLog(@"%f", [currentRemote currentSongRating]); - NSLog(@"%f", (float)[sender tag] / 100.0); - [currentRemote setCurrentSongRating:(float)[sender tag] / 100.0]; -} - -// -// -// Plugin independent selectors -// -// - (void)quitMenuTunes:(id)sender { [NSApp terminate:self]; @@ -888,100 +629,14 @@ } } } - // // -// Show Current Track Info And Show Upcoming Songs Floaters -// -// - -- (void)showCurrentTrackInfo -{ - NSString *trackName = [currentRemote currentSongTitle]; - if (!statusWindow && [trackName length]) { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *stringToShow = @""; - - if ([defaults boolForKey:@"showName"]) { - if ([defaults boolForKey:@"showArtist"]) { - NSString *trackArtist = [currentRemote currentSongArtist]; - trackName = [NSString stringWithFormat:@"%@ - %@", trackArtist, trackName]; - } - stringToShow = [stringToShow stringByAppendingString:trackName]; - stringToShow = [stringToShow stringByAppendingString:@"\n"]; - } - - if ([defaults boolForKey:@"showAlbum"]) { - NSString *trackAlbum = [currentRemote currentSongAlbum]; - if ([trackAlbum length]) { - stringToShow = [stringToShow stringByAppendingString:trackAlbum]; - stringToShow = [stringToShow stringByAppendingString:@"\n"]; - } - } - - if ([defaults boolForKey:@"showTime"]) { - NSString *trackTime = [currentRemote currentSongLength]; - if ([trackTime length]) { - stringToShow = [NSString stringWithFormat:@"%@Total Time: %@\n", stringToShow, trackTime]; - } - } - - { - int trackTimeLeft = [[currentRemote currentSongRemaining] intValue]; - int minutes = trackTimeLeft / 60, seconds = trackTimeLeft % 60; - if (seconds < 10) { - stringToShow = [stringToShow stringByAppendingString: - [NSString stringWithFormat:@"Time Remaining: %i:0%i", minutes, seconds]]; - } else { - stringToShow = [stringToShow stringByAppendingString: - [NSString stringWithFormat:@"Time Remaining: %i:%i", minutes, seconds]]; - } - } - - [statusWindow setText:stringToShow]; - [NSTimer scheduledTimerWithTimeInterval:3.0 - target:self - selector:@selector(fadeAndCloseStatusWindow) - userInfo:nil - repeats:NO]; - } -} -- (void)showUpcomingSongs -{ - int curPlaylist = [currentRemote currentPlaylistIndex]; - if (!statusWindow) { - int numSongs = [currentRemote numberOfSongsInPlaylistAtIndex:curPlaylist]; - - if (numSongs > 0) { - int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"]; - int curTrack = [currentRemote currentSongIndex]; - int i; - NSString *songs = @""; - - statusWindow = [ITTransientStatusWindow sharedWindow]; - for (i = curTrack + 1; i <= curTrack + numSongsInAdvance; i++) { - if (i <= numSongs) { - NSString *curSong = [currentRemote songTitleAtIndex:i]; - songs = [songs stringByAppendingString:curSong]; - songs = [songs stringByAppendingString:@"\n"]; - } - } - [statusWindow setText:songs]; - [NSTimer scheduledTimerWithTimeInterval:3.0 - target:self - selector:@selector(fadeAndCloseStatusWindow) - userInfo:nil - repeats:NO]; - } - } -} +//The status window methods go here! -- (void)fadeAndCloseStatusWindow -{ - [statusWindow orderOut:self]; -} +// +// - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers onItem:(NSMenuItem *)item @@ -1159,35 +814,4 @@ } } -/*************************************************************************/ -#pragma mark - -#pragma mark NSApplication DELEGATE METHODS -/*************************************************************************/ - -- (void)applicationWillTerminate:(NSNotification *)note -{ - [self clearHotKeys]; - [[NSStatusBar systemStatusBar] removeStatusItem:statusItem]; -} - - -/*************************************************************************/ -#pragma mark - -#pragma mark DEALLOCATION METHODS -/*************************************************************************/ - -- (void)dealloc -{ - if (refreshTimer) { - [refreshTimer invalidate]; - [refreshTimer release]; - refreshTimer = nil; - } - [currentRemote halt]; - [statusItem release]; - [menu release]; -// [view release]; - [super dealloc]; -} - -@end +@end \ No newline at end of file diff --git a/PreferencesController.m b/PreferencesController.m index 0df78f7..82b7f82 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -12,16 +12,11 @@ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; mt = [tunes retain]; - [mt registerDefaultsIfNeeded]; - + [mt registerDefaults]; + //Load the nib [NSBundle loadNibNamed:@"Preferences" owner:self]; - //Show our window - [window setLevel:NSStatusWindowLevel]; - [window center]; - [window makeKeyAndOrderFront:nil]; - //Set the table view cells up [imgCell setImageScaling:NSScaleNone]; [[menuTableView tableColumnWithIdentifier:@"submenu"] setDataCell:imgCell]; @@ -111,6 +106,12 @@ } } } + + //Show our window + [window setLevel:NSStatusWindowLevel]; + [window center]; + [window makeKeyAndOrderFront:nil]; + [window setDelegate:self]; } return self; } @@ -209,7 +210,7 @@ [defaults setInteger:5 forKey:@"SongsInAdvance"]; } - { + /*{ NSArray *apps = [[NSWorkspace sharedWorkspace] launchedApplications]; int i; @@ -219,7 +220,7 @@ [mt rebuildMenu]; } } - } + }*/ [mt clearHotKeys]; } @@ -391,6 +392,14 @@ [keyComboField setStringValue:string]; } +// +// + +- (void)windowWillClose:(NSNotification *)note +{ + [mt closePreferences]; +} + // // // Table View Datasource Methods -- 2.20.1