From: Kent Sutherland Date: Fri, 28 Mar 2003 03:19:57 +0000 (+0000) Subject: Lots of rewritten code. Not yet working because the status item doesn't X-Git-Tag: v1.0~171 X-Git-Url: http://git.ithinksw.org/MenuTunes.git/commitdiff_plain/a822d608c6739b4c2cd2c39187a78ca461d4d6d4 Lots of rewritten code. Not yet working because the status item doesn't drop down after calling methods from the remote sometimes. --- 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 07ac386..4e23c97 100755 Binary files a/English.lproj/Preferences.nib/keyedobjects.nib and b/English.lproj/Preferences.nib/keyedobjects.nib differ 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