X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/7349b6046bba42f3972b76f13fcb82d1b1be3c4d..c92930f48a560adbc8f80ef106a3128cf9c176bf:/MainController.m diff --git a/MainController.m b/MainController.m index dae6f41..7a0c29a 100755 --- a/MainController.m +++ b/MainController.m @@ -1,18 +1,30 @@ -#import "NewMainController.h" +#import "MainController.h" +#import "MenuController.h" #import "PreferencesController.h" -#import "HotKeyCenter.h" +#import +#import +#import #import "StatusWindowController.h" +#import "StatusItemHack.h" @interface MainController(Private) - (ITMTRemote *)loadRemote; -- (void)setupHotKeys; - (void)timerUpdate; -- (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers - onItem:(NSMenuItem *)item; +- (void)setLatestSongIdentifier:(NSString *)newIdentifier; +- (void)showCurrentTrackInfo; +- (void)applicationLaunched:(NSNotification *)note; +- (void)applicationTerminated:(NSNotification *)note; @end +static MainController *sharedController; + @implementation MainController ++ (MainController *)sharedController +{ + return sharedController; +} + /*************************************************************************/ #pragma mark - #pragma mark INITIALIZATION/DEALLOCATION METHODS @@ -21,10 +33,12 @@ - (id)init { if ( ( self = [super init] ) ) { + sharedController = self; + remoteArray = [[NSMutableArray alloc] initWithCapacity:1]; statusWindowController = [[StatusWindowController alloc] init]; + menuController = [[MenuController alloc] init]; df = [[NSUserDefaults standardUserDefaults] retain]; - [self setLatestSongIdentifier:@"0-0"]; } return self; } @@ -46,17 +60,31 @@ selector:@selector(applicationLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; - + if ( ! [df objectForKey:@"menu"] ) { // If this is nil, defaults have never been registered. [[PreferencesController sharedPrefs] registerDefaults]; } + [StatusItemHack install]; statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar] withLength:NSSquareStatusItemLength]; - [statusItem setImage:[NSImage imageNamed:@"menu"]]; - [statusItem setAlternateImage:[NSImage imageNamed:@"selected_image"]]; + if ([currentRemote playerRunningState] == ITMTRemotePlayerRunning) { + [self applicationLaunched:nil]; + } else { + if ([df boolForKey:@"LaunchPlayerWithMT"]) + { + [self showPlayer]; + } + else + { + [self applicationTerminated:nil]; + } + } + + [statusItem setImage:[NSImage imageNamed:@"MenuNormal"]]; + [statusItem setAlternateImage:[NSImage imageNamed:@"MenuInverted"]]; } - (ITMTRemote *)loadRemote @@ -112,162 +140,9 @@ [pool release]; } - -/*************************************************************************/ -#pragma mark - -#pragma mark MENU BUILDING METHODS -/*************************************************************************/ - -- (NSMenu *)menu -{ - NSMenu *theMenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - [theMenu addItem:[self playlistMenuItem]]; - [theMenu addItem:[self upcomingSongsMenuItem]]; - [theMenu addItem:[self ratingMenuItem]]; - - return theMenu; -} - -- (NSMenu *)menuForNoPlayer -{ - return nil; -} - -- (NSMenuItem *)playlistMenuItem -{ - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Playlists" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *submenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - int currentPlaylist = [currentRemote currentPlaylistIndex]; - NSArray *playlists = [currentRemote playlists]; - NSEnumerator *playlistEnum = [playlists objectEnumerator]; - int playlistTag = 1; - id aPlaylist; - - [item setSubmenu:submenu]; - [submenu setAutoenablesItems:NO]; - - while ( (aPlaylist = [playlistEnum nextObject]) ) { - NSMenuItem *playlistItem = [[[NSMenuItem alloc] initWithTitle:aPlaylist - action:@selector(selectPlaylist:) - keyEquivalent:@""] autorelease]; - [playlistItem setTag:playlistTag]; - [playlistItem setTarget:self]; - playlistTag++; - [submenu addItem:playlistItem]; - } - - if ( (! [self radioIsPlaying]) && currentPlaylist) { - [[submenu itemAtIndex:(currentPlaylist - 1)] setState:NSOnState]; - } - - return item; -} - -- (NSMenuItem *)upcomingSongsMenuItem -{ - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Upcoming Songs" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *submenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - int curIndex = [currentRemote currentPlaylistIndex]; - int numSongs = [currentRemote numberOfSongsInPlaylistAtIndex:curIndex]; - int numSongsInAdvance = [df integerForKey:@"SongsInAdvance"]; - - [item setSubmenu:submenu]; - - if ( [self radioIsPlaying] ) { - [submenu addItemWithTitle:@"No Upcoming Songs..." action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:@"Playing Radio Stream" action:nil keyEquivalent:@""]; - } else { - if ( ! (numSongs > 0) ) { - [submenu addItemWithTitle:@"No Songs in Playlist" action:nil keyEquivalent:@""]; - } else { - int curTrack = [currentRemote currentSongIndex]; - int i; - - for (i = curTrack + 1; ( (i <= curTrack + numSongsInAdvance) && (i <= numSongs) ); i++) { - - NSString *curSong = [currentRemote songTitleAtIndex:i]; - NSMenuItem *songItem = [[[NSMenuItem alloc] initWithTitle:curSong - action:@selector(selectSong:) - keyEquivalent:@""] autorelease]; - [songItem setRepresentedObject:[NSNumber numberWithInt:i]]; - [submenu addItem:songItem]; - } - } - } - - return item; -} - -- (NSMenuItem *)ratingMenuItem -{ - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Rating" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *submenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - [item setSubmenu:submenu]; - - [submenu addItemWithTitle:[NSString stringWithUTF8String:"☆☆☆☆☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★☆☆☆☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★★☆☆☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★★★☆☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★★"] action:nil keyEquivalent:@""]; - - if ( ! ( [self radioIsPlaying] || [self songIsPlaying] ) ) { - - NSEnumerator *itemEnum; - id anItem; - int itemTag = 0; - SEL itemSelector = @selector(selectSongRating:); - - itemEnum = [[submenu itemArray] objectEnumerator]; - while ( (anItem = [itemEnum nextObject]) ) { - [anItem setAction:itemSelector]; - [anItem setTag:itemTag]; - itemTag += 20; - } - } - - return item; -} - -- (NSMenuItem *)eqMenuItem -{ - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Equalizer" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *submenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - NSArray *eqPresets = [currentRemote eqPresets]; - NSEnumerator *eqEnum = [eqPresets objectEnumerator]; - int eqTag = 0; - id anEq; - - [item setSubmenu:submenu]; - - while ( ( anEq = [eqEnum nextObject]) ) { - NSMenuItem *eqItem = [[[NSMenuItem alloc] initWithTitle:anEq - action:@selector(selectEQPreset:) - keyEquivalent:@""] autorelease]; - [eqItem setTag:eqTag]; - eqTag++; - [submenu addItem:eqItem]; - } - - [[submenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState]; -} - - (BOOL)songIsPlaying { - return ( ! ([[currentRemote currentSongUniqueIdentifier] isEqualToString:@"0-0"]) ); + return ( ! ([[currentRemote playerStateUniqueIdentifier] isEqualToString:@"0-0"]) ); } - (BOOL)radioIsPlaying @@ -277,7 +152,7 @@ - (BOOL)songChanged { - return ( ! [[currentRemote currentSongUniqueIdentifier] isEqualToString:_latestSongIdentifier] ); + return ( ! [[currentRemote playerStateUniqueIdentifier] isEqualToString:_latestSongIdentifier] ); } - (NSString *)latestSongIdentifier @@ -291,374 +166,136 @@ _latestSongIdentifier = [newIdentifier copy]; } -/* -//Recreate the status item menu -- (void)rebuildMenu -{ - NSArray *myMenu = [df arrayForKey:@"menu"]; - int playlist = [currentRemote currentPlaylistIndex]; - int i; - - if ([currentRemote playerRunningState] == ITMTRemotePlayerNotRunning) { - return; - } - - trackInfoIndex = -1; - lastPlaylistIndex = -1; - - [menu release]; - menu = [[NSMenu alloc] initWithTitle:@""]; - - playPauseItem = nil; - - upcomingSongsItem = nil; - [upcomingSongsMenu release]; - upcomingSongsMenu = nil; - - if (ratingItem) { - [ratingItem setSubmenu:nil]; - } - - playlistItem = nil; - [playlistMenu release]; - playlistMenu = nil; - - eqItem = nil; - [eqMenu release]; - eqMenu = nil; - - //Build the custom menu - for (i = 0; i < [myMenu count]; i++) { - NSString *item = [myMenu objectAtIndex:i]; - if ([item isEqualToString:@"Play/Pause"]) { - KeyCombo *tempCombo = [df keyComboForKey:@"PlayPause"]; - playPauseItem = [menu addItemWithTitle:@"Play" - action:@selector(playPause:) - keyEquivalent:@""]; - - if (tempCombo) { - [self setKeyEquivalentForCode:[tempCombo keyCode] - andModifiers:[tempCombo modifiers] onItem:playPauseItem]; - [tempCombo release]; - } - } else if ([item isEqualToString:@"Next Track"]) { - KeyCombo *tempCombo = [df keyComboForKey:@"NextTrack"]; - NSMenuItem *nextTrack = [menu addItemWithTitle:@"Next Track" - action:@selector(nextSong:) - keyEquivalent:@""]; - - if (tempCombo) { - [self setKeyEquivalentForCode:[tempCombo keyCode] - andModifiers:[tempCombo modifiers] onItem:nextTrack]; - [tempCombo release]; - } - } else if ([item isEqualToString:@"Previous Track"]) { - KeyCombo *tempCombo = [df keyComboForKey:@"PrevTrack"]; - NSMenuItem *prevTrack = [menu addItemWithTitle:@"Previous Track" - action:@selector(prevSong:) - keyEquivalent:@""]; - - 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:@""]; - } else if ([item isEqualToString:@"Rewind"]) { - [menu addItemWithTitle:@"Rewind" - action:@selector(rewind:) - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Show Player"]) { - [menu addItemWithTitle:[NSString stringWithFormat:@"Show %@", [currentRemote playerSimpleName]] - action:@selector(showPlayer:) - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Upcoming Songs"]) { - upcomingSongsItem = [menu addItemWithTitle:@"Upcoming Songs" - action:nil - keyEquivalent:@""]; - upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""]; - [upcomingSongsItem setSubmenu:upcomingSongsMenu]; - [upcomingSongsItem setEnabled:NO]; - } 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:@""]; - } else if ([item isEqualToString:@"Quit"]) { - [menu addItemWithTitle:@"Quit" - action:@selector(quitMenuTunes:) - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Current Track Info"]) { - trackInfoIndex = [menu numberOfItems]; - [menu addItemWithTitle:@"No Song" - action:nil - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Song Rating"]) { - ratingItem = [menu addItemWithTitle:@"Song Rating" - action:nil - keyEquivalent:@""]; - [ratingItem setSubmenu:ratingMenu]; - } else if ([item isEqualToString:@""]) { - [menu addItem:[NSMenuItem separatorItem]]; - } - } - - if (playlistItem) { - [self rebuildPlaylistMenu]; - } - - if (eqItem) { - [self rebuildEQPresetsMenu]; - } - - isPlayingRadio = ([currentRemote classOfPlaylistAtIndex:playlist] == ITMTRemotePlayerRadioPlaylist); - - if (upcomingSongsItem) { - [self rebuildUpcomingSongsMenu]; - } - - if (ratingItem) { - if (isPlayingRadio || !playlist) { - [ratingItem setEnabled:NO]; - } else { - int currentSongRating = ([currentRemote currentSongRating] * 5); - [[ratingMenu itemAtIndex:lastSongRating] setState:NSOffState]; - lastSongRating = currentSongRating; - [[ratingMenu itemAtIndex:lastSongRating] setState:NSOnState]; - [ratingItem setEnabled:YES]; - } - } - - //Set the new unique song identifier - lastSongIdentifier = [[currentRemote currentSongUniqueIdentifier] retain]; - - //If we're in a playlist or radio mode - if ( ![lastSongIdentifier isEqualToString:@"0-0"] && (trackInfoIndex > -1) ) { - NSString *title; - - if ( (i = [menu indexOfItemWithTitle:@"No Song"]) ) { - if ( (i > -1) ) { - [menu removeItemAtIndex:i]; - [menu insertItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@"" atIndex:i]; - } - } - - title = [currentRemote currentSongTitle]; - - if (!isPlayingRadio) { - if ([df boolForKey:@"showTime"]) { - NSString *length = [currentRemote currentSongLength]; - char character = [length characterAtIndex:0]; - if ( (character > '0') && (character < '9') ) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongLength]] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - if ([df boolForKey:@"showRating"]) { - if (title) { //Check to see if there's a song playing - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", [[ratingMenu itemAtIndex:[currentRemote currentSongRating] * 5] title]] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - if ([df boolForKey:@"showArtist"]) { - NSString *artist = [currentRemote currentSongArtist]; - if ([artist length] > 0) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", artist] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - if ([df boolForKey:@"showNumber"]) { - int track = [currentRemote currentSongTrack]; - int total = [currentRemote currentAlbumTrackCount]; - if (total > 0) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" Track %i of %i", track, total] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - if ([df boolForKey:@"showAlbum"]) { - NSString *album = [currentRemote currentSongAlbum]; - if ([album length] > 0) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", album] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - } - - if ([title length] > 0) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", title] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - [statusItem setMenu:menu]; - - [self clearHotKeys]; - [self setupHotKeys]; -} - - -//Build a menu with the list of all available EQ presets -- (void)rebuildEQPresetsMenu -{ - NSArray *eqPresets = [currentRemote eqPresets]; - int i; - - [eqMenu autorelease]; - eqMenu = [[NSMenu alloc] initWithTitle:@""]; - - for (i = 0; i < [eqPresets count]; i++) { - NSString *name; - NSMenuItem *tempItem; - if ( ( name = [eqPresets objectAtIndex:i] ) ) { - tempItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(selectEQPreset:) keyEquivalent:@""]; - [tempItem setTag:i]; - [eqMenu addItem:tempItem]; - [tempItem autorelease]; - } - } - - [eqItem setSubmenu:eqMenu]; - [eqItem setEnabled:YES]; - [[eqMenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState]; -} - -*/ - - (void)timerUpdate { - if ( ( [self songChanged] ) || + //This huge if statement is being nasty + /*if ( ( [self songChanged] ) || ( ([self radioIsPlaying]) && (latestPlaylistClass != ITMTRemotePlayerRadioPlaylist) ) || - ( (! [self radioIsPlaying]) && (latestPlaylistClass == ITMTRemotePlayerRadioPlaylist) ) ) { - [statusItem setMenu:[self menu]]; - [self setLatestSongIdentifier:[currentRemote currentSongUniqueIdentifier]]; + ( (! [self radioIsPlaying]) && (latestPlaylistClass == ITMTRemotePlayerRadioPlaylist) ) )*/ + + if ( [self songChanged] ) { + [self setLatestSongIdentifier:[currentRemote playerStateUniqueIdentifier]]; latestPlaylistClass = [currentRemote currentPlaylistClass]; - + [menuController rebuildSubmenus]; + if ( [df boolForKey:@"showSongInfoOnChange"] ) { - [self showCurrentTrackInfo]; +// [self performSelector:@selector(showCurrentTrackInfo) withObject:nil afterDelay:0.0]; } } -/* - //Update Play/Pause menu item - if (playPauseItem){ - if ([currentRemote playerPlayingState] == ITMTRemotePlayerPlaying) { - [playPauseItem setTitle:@"Pause"]; - } else { - [playPauseItem setTitle:@"Play"]; - } +} + +- (void)menuClicked +{ + if ([currentRemote playerRunningState] == ITMTRemotePlayerRunning) { + [statusItem setMenu:[menuController menu]]; + } else { + [statusItem setMenu:[menuController menuForNoPlayer]]; } -*/ } -/* // // // Menu Selectors // // -- (void)selectSong:(id)sender -{ - [currentRemote switchToSongAtIndex:[[sender representedObject] intValue]]; -} -*/ -- (void)selectPlaylist:(id)sender -{ - int playlist = [sender tag]; - [currentRemote switchToPlaylistAtIndex:playlist]; -} -/* -- (void)selectEQPreset:(id)sender -{ - int curSet = [currentRemote currentEQPresetIndex]; - int item = [sender tag]; - - [currentRemote switchToEQAtIndex:item]; - [[eqMenu itemAtIndex:curSet - 1] setState:NSOffState]; - [[eqMenu itemAtIndex:item] setState:NSOnState]; -} -*/ -/* -- (void)selectSongRating:(id)sender -{ - 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 +- (void)playPause { ITMTRemotePlayerPlayingState state = [currentRemote playerPlayingState]; if (state == ITMTRemotePlayerPlaying) { [currentRemote pause]; - [playPauseItem setTitle:@"Play"]; } else if ((state == ITMTRemotePlayerForwarding) || (state == ITMTRemotePlayerRewinding)) { [currentRemote pause]; [currentRemote play]; } else { [currentRemote play]; - [playPauseItem setTitle:@"Pause"]; } + + [self timerUpdate]; } -- (void)nextSong:(id)sender +- (void)nextSong { [currentRemote goToNextSong]; + + [self timerUpdate]; } -- (void)prevSong:(id)sender +- (void)prevSong { [currentRemote goToPreviousSong]; + + [self timerUpdate]; } -- (void)fastForward:(id)sender +- (void)fastForward { [currentRemote forward]; - [playPauseItem setTitle:@"Play"]; + + [self timerUpdate]; } -- (void)rewind:(id)sender +- (void)rewind { [currentRemote rewind]; - [playPauseItem setTitle:@"Play"]; + + [self timerUpdate]; } -*/ -// -// -- (void)quitMenuTunes:(id)sender +- (void)selectPlaylistAtIndex:(int)index { - [NSApp terminate:self]; + [currentRemote switchToPlaylistAtIndex:index]; + + [self timerUpdate]; } -- (void)showPlayer:(id)sender +- (void)selectSongAtIndex:(int)index +{ + [currentRemote switchToSongAtIndex:index]; + + [self timerUpdate]; +} + +- (void)selectSongRating:(int)rating +{ + [currentRemote setCurrentSongRating:(float)rating / 100.0]; + + [self timerUpdate]; +} + +- (void)selectEQPresetAtIndex:(int)index +{ + [currentRemote switchToEQAtIndex:index]; + + [self timerUpdate]; +} + +- (void)showPlayer { if ( ( playerRunningState == ITMTRemotePlayerRunning) ) { [currentRemote showPrimaryInterface]; } else { if (![[NSWorkspace sharedWorkspace] launchApplication:[currentRemote playerFullName]]) { - NSLog(@"Error Launching Player"); + NSLog(@"MenuTunes: Error Launching Player"); } } } -- (void)showPreferences:(id)sender +- (void)showPreferences { [[PreferencesController sharedPrefs] setController:self]; [[PreferencesController sharedPrefs] showPrefsWindow:self]; } +- (void)quitMenuTunes +{ + [NSApp terminate:self]; +} + +// +// + - (void)closePreferences { if ( ( playerRunningState == ITMTRemotePlayerRunning) ) { @@ -679,85 +316,124 @@ - (void)clearHotKeys { - [[HotKeyCenter sharedCenter] removeHotKey:@"PlayPause"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"NextTrack"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"PrevTrack"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"TrackInfo"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"UpcomingSongs"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"ToggleLoop"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"ToggleShuffle"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"IncrementVolume"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"DecrementVolume"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"IncrementRating"]; - [[HotKeyCenter sharedCenter] removeHotKey:@"DecrementRating"]; + NSEnumerator *hotKeyEnumerator = [[[ITHotKeyCenter sharedCenter] allHotKeys] objectEnumerator]; + ITHotKey *nextHotKey; + + while ( (nextHotKey = [hotKeyEnumerator nextObject]) ) { + [[ITHotKeyCenter sharedCenter] unregisterHotKey:nextHotKey]; + } } - (void)setupHotKeys { + ITHotKey *hotKey; + if ([df objectForKey:@"PlayPause"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"PlayPause" - combo:[df keyComboForKey:@"PlayPause"] - target:self action:@selector(playPause:)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"PlayPause"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PlayPause"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(playPause)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"NextTrack"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"NextTrack" - combo:[df keyComboForKey:@"NextTrack"] - target:self action:@selector(nextSong:)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"NextTrack"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"NextTrack"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(nextSong)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"PrevTrack"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"PrevTrack" - combo:[df keyComboForKey:@"PrevTrack"] - target:self action:@selector(prevSong:)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"PrevTrack"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PrevTrack"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(prevSong)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; + } + + if ([df objectForKey:@"ShowPlayer"] != nil) { + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"ShowPlayer"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ShowPlayer"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(showPlayer)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"TrackInfo"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"TrackInfo" - combo:[df keyComboForKey:@"TrackInfo"] - target:self action:@selector(showCurrentTrackInfo)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"TrackInfo"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"TrackInfo"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(showCurrentTrackInfo)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"UpcomingSongs"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"UpcomingSongs" - combo:[df keyComboForKey:@"UpcomingSongs"] - target:self action:@selector(showUpcomingSongs)]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"UpcomingSongs"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"UpcomingSongs"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(showUpcomingSongs)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"ToggleLoop"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"ToggleLoop" - combo:[df keyComboForKey:@"ToggleLoop"] - target:self action:NULL/*Set this to something*/]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"ToggleLoop"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleLoop"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(toggleLoop)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"ToggleShuffle"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle" - combo:[df keyComboForKey:@"ToggleShuffle"] - target:self action:NULL/*Set this to something*/]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"ToggleShuffle"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleShuffle"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(toggleShuffle)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"IncrementVolume"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"IncrementVolume" - combo:[df keyComboForKey:@"IncrementVolume"] - target:self action:NULL/*Set this to something*/]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"IncrementVolume"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementVolume"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(incrementVolume)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"DecrementVolume"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"DecrementVolume" - combo:[df keyComboForKey:@"DecrementVolume"] - target:self action:NULL/*Set this to something*/]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"DecrementVolume"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementVolume"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(decrementVolume)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"IncrementRating"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"IncrementRating" - combo:[df keyComboForKey:@"IncrementRating"] - target:self action:NULL/*Set this to something*/]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"IncrementRating"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementRating"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(incrementRating)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } if ([df objectForKey:@"DecrementRating"] != nil) { - [[HotKeyCenter sharedCenter] addHotKey:@"DecrementRating" - combo:[df keyComboForKey:@"DecrementRating"] - target:self action:NULL/*Set this to something*/]; + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"DecrementRating"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementRating"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(decrementRating)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } } @@ -766,12 +442,13 @@ NSString *title = [currentRemote currentSongTitle]; if ( title ) { - NSString *album = nil; - NSString *artist = nil; - NSString *time = nil; - int trackNumber = 0; - int trackTotal = 0; - int rating = 0; + NSString *album = nil; + NSString *artist = nil; + NSString *time = nil; + int trackNumber = 0; + int trackTotal = 0; + int rating = 0; + ITMTRemotePlayerSource source = [currentRemote currentSource]; if ( [df boolForKey:@"showAlbum"] ) { album = [currentRemote currentSongAlbum]; @@ -800,16 +477,18 @@ time:time trackNumber:trackNumber trackTotal:trackTotal - rating:rating]; + rating:rating + source:source]; } else { - title = @"No song is playing."; + title = NSLocalizedString(@"noSongPlaying", @"No song is playing."); [statusWindowController showSongWindowWithTitle:title album:nil artist:nil time:nil trackNumber:0 trackTotal:0 - rating:0]; + rating:0 + source:[currentRemote currentSource]]; } } @@ -833,189 +512,101 @@ [statusWindowController showUpcomingSongsWithTitles:songList]; } else { - [statusWindowController showUpcomingSongsWithTitles:[NSArray arrayWithObject:@"No upcoming songs."]]; + [statusWindowController showUpcomingSongsWithTitles:[NSArray arrayWithObject:NSLocalizedString(@"noUpcomingSongs", @"No upcoming songs.")]]; } } -- (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers - onItem:(NSMenuItem *)item +- (void)incrementVolume { - unichar charcode = 'a'; - int i; - long cocoaModifiers = 0; - static long carbonToCocoa[6][2] = - { - { cmdKey, NSCommandKeyMask }, - { optionKey, NSAlternateKeyMask }, - { controlKey, NSControlKeyMask }, - { shiftKey, NSShiftKeyMask }, - }; + float volume = [currentRemote volume]; + float dispVol = volume; - for (i = 0; i < 6; i++) { - if (modifiers & carbonToCocoa[i][0]) { - cocoaModifiers += carbonToCocoa[i][1]; - } + volume += 0.110; + dispVol += 0.100; + + if (volume > 1.0) { + volume = 1.0; + dispVol = 1.0; } - [item setKeyEquivalentModifierMask:cocoaModifiers]; + + [currentRemote setVolume:volume]; + + // Show volume status window + [statusWindowController showVolumeWindowWithLevel:dispVol]; +} + +- (void)decrementVolume +{ + float volume = [currentRemote volume]; + float dispVol = volume; - //Missing key combos for some keys. Must find them later. - switch (code) - { - case 36: - charcode = '\r'; - break; - - case 48: - charcode = '\t'; - break; - - //Space -- ARGH! - case 49: - { - // Haven't tested this, though it should work. - unichar buffer; - [[NSString stringWithString:@"Space"] getCharacters:&buffer]; - charcode = buffer; - /*MenuRef menuRef = _NSGetCarbonMenu([item menu]); - NSLog(@"%@", menuRef); - SetMenuItemCommandKey(menuRef, 0, NO, 49); - SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier); - SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph); - charcode = 'b';*/ - - } - break; - - case 51: - charcode = NSDeleteFunctionKey; - break; - - case 53: - charcode = '\e'; - break; - - case 71: - charcode = '\e'; - break; - - case 76: - charcode = '\r'; - break; - - case 96: - charcode = NSF5FunctionKey; - break; - - case 97: - charcode = NSF6FunctionKey; - break; - - case 98: - charcode = NSF7FunctionKey; - break; - - case 99: - charcode = NSF3FunctionKey; - break; - - case 100: - charcode = NSF8FunctionKey; - break; - - case 101: - charcode = NSF9FunctionKey; - break; - - case 103: - charcode = NSF11FunctionKey; - break; - - case 105: - charcode = NSF3FunctionKey; - break; - - case 107: - charcode = NSF14FunctionKey; - break; - - case 109: - charcode = NSF10FunctionKey; - break; - - case 111: - charcode = NSF12FunctionKey; - break; - - case 113: - charcode = NSF13FunctionKey; - break; - - case 114: - charcode = NSInsertFunctionKey; - break; - - case 115: - charcode = NSHomeFunctionKey; - break; - - case 116: - charcode = NSPageUpFunctionKey; - break; - - case 117: - charcode = NSDeleteFunctionKey; - break; - - case 118: - charcode = NSF4FunctionKey; - break; - - case 119: - charcode = NSEndFunctionKey; - break; - - case 120: - charcode = NSF2FunctionKey; - break; - - case 121: - charcode = NSPageDownFunctionKey; - break; - - case 122: - charcode = NSF1FunctionKey; - break; - - case 123: - charcode = NSLeftArrowFunctionKey; - break; - - case 124: - charcode = NSRightArrowFunctionKey; + volume -= 0.090; + dispVol -= 0.100; + + if (volume < 0.0) { + volume = 0.0; + dispVol = 0.0; + } + + [currentRemote setVolume:volume]; + + //Show volume status window + [statusWindowController showVolumeWindowWithLevel:dispVol]; +} + +- (void)incrementRating +{ + float rating = [currentRemote currentSongRating]; + rating += 0.2; + if (rating > 1.0) { + rating = 1.0; + } + [currentRemote setCurrentSongRating:rating]; + + //Show rating status window + [statusWindowController showRatingWindowWithLevel:rating]; +} + +- (void)decrementRating +{ + float rating = [currentRemote currentSongRating]; + rating -= 0.2; + if (rating < 0.0) { + rating = 0.0; + } + [currentRemote setCurrentSongRating:rating]; + + //Show rating status window + [statusWindowController showRatingWindowWithLevel:rating]; +} + +- (void)toggleLoop +{ + ITMTRemotePlayerRepeatMode repeatMode = [currentRemote repeatMode]; + + switch (repeatMode) { + case ITMTRemotePlayerRepeatOff: + repeatMode = ITMTRemotePlayerRepeatAll; break; - - case 125: - charcode = NSDownArrowFunctionKey; + case ITMTRemotePlayerRepeatAll: + repeatMode = ITMTRemotePlayerRepeatOne; break; - - case 126: - charcode = NSUpArrowFunctionKey; + case ITMTRemotePlayerRepeatOne: + repeatMode = ITMTRemotePlayerRepeatOff; break; } + [currentRemote setRepeatMode:repeatMode]; - if (charcode == 'a') { - unsigned long state; - long keyTrans; - char charCode; - Ptr kchr; - state = 0; - kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache); - keyTrans = KeyTranslate(kchr, code, &state); - charCode = keyTrans; - [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]]; - } else if (charcode != 'b') { - [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]]; - } + //Show loop status window + [statusWindowController showLoopWindowWithMode:repeatMode]; +} + +- (void)toggleShuffle +{ + bool newShuffleEnabled = ![currentRemote shuffleEnabled]; + [currentRemote setShuffleEnabled:newShuffleEnabled]; + //Show shuffle status window + [statusWindowController showLoopWindowWithMode:newShuffleEnabled]; } /*************************************************************************/ @@ -1026,7 +617,15 @@ - (void)applicationLaunched:(NSNotification *)note { if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) { - [NSThread detachNewThreadSelector:@selector(startTimerInNewThread) toTarget:self withObject:nil]; + [currentRemote begin]; + [self setLatestSongIdentifier:@""]; + [self timerUpdate]; + refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:0.5 + target:self + selector:@selector(timerUpdate) + userInfo:nil + repeats:YES] retain]; + //[NSThread detachNewThreadSelector:@selector(startTimerInNewThread) toTarget:self withObject:nil]; [self setupHotKeys]; playerRunningState = ITMTRemotePlayerRunning; } @@ -1035,20 +634,12 @@ - (void)applicationTerminated:(NSNotification *)note { if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) { -/* - NSMenu *notRunningMenu = [[NSMenu alloc] initWithTitle:@""]; - [notRunningMenu addItemWithTitle:[NSString stringWithFormat:@"Open %@", [currentRemote playerSimpleName]] action:@selector(showPlayer:) keyEquivalent:@""]; - [notRunningMenu addItem:[NSMenuItem separatorItem]]; - [notRunningMenu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""]; - [notRunningMenu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""]; -*/ - [refreshTimer invalidate]; - [refreshTimer release]; - refreshTimer = nil; - [self clearHotKeys]; - playerRunningState = ITMTRemotePlayerNotRunning; - - [statusItem setMenu:[self menuForNoPlayer]]; + [currentRemote halt]; + [refreshTimer invalidate]; + [refreshTimer release]; + refreshTimer = nil; + [self clearHotKeys]; + playerRunningState = ITMTRemotePlayerNotRunning; } } @@ -1072,17 +663,12 @@ - (void)dealloc { - if (refreshTimer) { - [refreshTimer invalidate]; - [refreshTimer release]; - refreshTimer = nil; - } - - [currentRemote halt]; + [self applicationTerminated:nil]; [statusItem release]; [statusWindowController release]; + [menuController release]; [super dealloc]; } -@end +@end \ No newline at end of file