X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/f16e2f1f2b4778b4bc890162fa9cd31d7dd79b54..5b82496caef98719afa343cba1a708b77eeaf2c0:/MainController.m?ds=inline diff --git a/MainController.m b/MainController.m index fffd741..ec906a3 100755 --- a/MainController.m +++ b/MainController.m @@ -2,6 +2,8 @@ #import "MenuController.h" #import "PreferencesController.h" #import +#import +#import #import "StatusWindowController.h" #import "StatusItemHack.h" @@ -81,8 +83,8 @@ static MainController *sharedController; } } - [statusItem setImage:[NSImage imageNamed:@"menu"]]; - [statusItem setAlternateImage:[NSImage imageNamed:@"selected_image"]]; + [statusItem setImage:[NSImage imageNamed:@"MenuNormal"]]; + [statusItem setAlternateImage:[NSImage imageNamed:@"MenuInverted"]]; } - (ITMTRemote *)loadRemote @@ -140,7 +142,7 @@ static MainController *sharedController; - (BOOL)songIsPlaying { - return ( ! ([[currentRemote currentSongUniqueIdentifier] isEqualToString:@"0-0"]) ); + return ( ! ([[currentRemote playerStateUniqueIdentifier] isEqualToString:@"0-0"]) ); } - (BOOL)radioIsPlaying @@ -150,7 +152,7 @@ static MainController *sharedController; - (BOOL)songChanged { - return ( ! [[currentRemote currentSongUniqueIdentifier] isEqualToString:_latestSongIdentifier] ); + return ( ! [[currentRemote playerStateUniqueIdentifier] isEqualToString:_latestSongIdentifier] ); } - (NSString *)latestSongIdentifier @@ -171,13 +173,13 @@ static MainController *sharedController; ( ([self radioIsPlaying]) && (latestPlaylistClass != ITMTRemotePlayerRadioPlaylist) ) || ( (! [self radioIsPlaying]) && (latestPlaylistClass == ITMTRemotePlayerRadioPlaylist) ) )*/ - if ([self songChanged]) { - [self setLatestSongIdentifier:[currentRemote currentSongUniqueIdentifier]]; + 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]; } } } @@ -209,46 +211,64 @@ static MainController *sharedController; } else { [currentRemote play]; } + + [self timerUpdate]; } - (void)nextSong { [currentRemote goToNextSong]; + + [self timerUpdate]; } - (void)prevSong { [currentRemote goToPreviousSong]; + + [self timerUpdate]; } - (void)fastForward { [currentRemote forward]; + + [self timerUpdate]; } - (void)rewind { [currentRemote rewind]; + + [self timerUpdate]; } - (void)selectPlaylistAtIndex:(int)index { [currentRemote switchToPlaylistAtIndex:index]; + + [self timerUpdate]; } - (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 @@ -296,106 +316,139 @@ static MainController *sharedController; - (void)clearHotKeys { - [[ITHotKeyCenter sharedCenter] removeHotKey:@"PlayPause"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"NextTrack"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"PrevTrack"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"TrackInfo"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"ShowPlayer"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"UpcomingSongs"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"ToggleLoop"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"ToggleShuffle"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"IncrementVolume"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"DecrementVolume"]; - [[ITHotKeyCenter sharedCenter] removeHotKey:@"IncrementRating"]; - [[ITHotKeyCenter 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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"PlayPause" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"NextTrack" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"PrevTrack" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"ShowPlayer" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ShowPlayer"]] - target:self action:@selector(showPlayer)]; + 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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"TrackInfo" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"UpcomingSongs" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"ToggleLoop" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleLoop"]] - target:self action:@selector(toggleLoop)]; + 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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleShuffle"]] - target:self action:@selector(toggleShuffle)]; + 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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"IncrementVolume" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementVolume"]] - target:self action:@selector(incrementVolume)]; + 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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"DecrementVolume" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementVolume"]] - target:self action:@selector(decrementVolume)]; + 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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"IncrementRating" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementRating"]] - target:self action:@selector(incrementRating)]; + 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) { - [[ITHotKeyCenter sharedCenter] addHotKey:@"DecrementRating" - combo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementRating"]] - target:self action:@selector(decrementRating)]; + 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]]; } } - (void)showCurrentTrackInfo { - NSString *title = [currentRemote currentSongTitle]; - + ITMTRemotePlayerSource source = [currentRemote currentSource]; + NSString *title = [currentRemote currentSongTitle]; + NSString *album = nil; + NSString *artist = nil; + NSString *time = nil; + int trackNumber = 0; + int trackTotal = 0; + int rating = -1; + if ( title ) { - NSString *album = nil; - NSString *artist = nil; - NSString *time = nil; - int trackNumber = 0; - int trackTotal = 0; - int rating = 0; if ( [df boolForKey:@"showAlbum"] ) { album = [currentRemote currentSongAlbum]; @@ -417,24 +470,19 @@ static MainController *sharedController; if ( [df boolForKey:@"showRating"] ) { rating = ( [currentRemote currentSongRating] * 5 ); } - - [statusWindowController showSongWindowWithTitle:title - album:album - artist:artist - time:time - trackNumber:trackNumber - trackTotal:trackTotal - rating:rating]; + } else { title = NSLocalizedString(@"noSongPlaying", @"No song is playing."); - [statusWindowController showSongWindowWithTitle:title - album:nil - artist:nil - time:nil - trackNumber:0 - trackTotal:0 - rating:0]; } + + [statusWindowController showSongInfoWindowWithSource:source + title:title + album:album + artist:artist + time:time + trackNumber:trackNumber + trackTotal:trackTotal + rating:rating]; } - (void)showUpcomingSongs @@ -454,37 +502,49 @@ static MainController *sharedController; } } - [statusWindowController showUpcomingSongsWithTitles:songList]; + [statusWindowController showUpcomingSongsWindowWithTitles:songList]; } else { - [statusWindowController showUpcomingSongsWithTitles:[NSArray arrayWithObject:NSLocalizedString(@"noUpcomingSongs", @"No upcoming songs.")]]; + [statusWindowController showUpcomingSongsWindowWithTitles:[NSArray arrayWithObject:NSLocalizedString(@"noUpcomingSongs", @"No upcoming songs.")]]; } } - (void)incrementVolume { - float volume = [currentRemote volume]; - volume += 0.2; + float volume = [currentRemote volume]; + float dispVol = volume; + + volume += 0.110; + dispVol += 0.100; + if (volume > 1.0) { - volume = 1.0; + volume = 1.0; + dispVol = 1.0; } + [currentRemote setVolume:volume]; - - //Show volume status window - [statusWindowController showVolumeWindowWithLevel:volume]; + + // Show volume status window + [statusWindowController showVolumeWindowWithLevel:dispVol]; } - (void)decrementVolume { - float volume = [currentRemote volume]; - volume -= 0.2; + float volume = [currentRemote volume]; + float dispVol = volume; + + volume -= 0.090; + dispVol -= 0.100; + if (volume < 0.0) { - volume = 0.0; + volume = 0.0; + dispVol = 0.0; } + [currentRemote setVolume:volume]; //Show volume status window - [statusWindowController showVolumeWindowWithLevel:volume]; + [statusWindowController showVolumeWindowWithLevel:dispVol]; } - (void)incrementRating @@ -497,7 +557,7 @@ static MainController *sharedController; [currentRemote setCurrentSongRating:rating]; //Show rating status window - [statusWindowController showRatingWindowWithLevel:rating]; + [statusWindowController showRatingWindowWithRating:rating]; } - (void)decrementRating @@ -510,13 +570,12 @@ static MainController *sharedController; [currentRemote setCurrentSongRating:rating]; //Show rating status window - [statusWindowController showRatingWindowWithLevel:rating]; + [statusWindowController showRatingWindowWithRating:rating]; } - (void)toggleLoop { ITMTRemotePlayerRepeatMode repeatMode = [currentRemote repeatMode]; - switch (repeatMode) { case ITMTRemotePlayerRepeatOff: repeatMode = ITMTRemotePlayerRepeatAll; @@ -531,7 +590,7 @@ static MainController *sharedController; [currentRemote setRepeatMode:repeatMode]; //Show loop status window - [statusWindowController showLoopWindowWithMode:repeatMode]; + [statusWindowController showRepeatWindowWithMode:repeatMode]; } - (void)toggleShuffle @@ -539,7 +598,7 @@ static MainController *sharedController; bool newShuffleEnabled = ![currentRemote shuffleEnabled]; [currentRemote setShuffleEnabled:newShuffleEnabled]; //Show shuffle status window - [statusWindowController showLoopWindowWithMode:newShuffleEnabled]; + [statusWindowController showRepeatWindowWithMode:newShuffleEnabled]; } /*************************************************************************/