#import "NewMainController.h"
+#import "MenuController.h"
#import "PreferencesController.h"
#import "HotKeyCenter.h"
#import "StatusWindowController.h"
+#import "StatusItemHack.h"
@interface MainController(Private)
- (ITMTRemote *)loadRemote;
- (void)setupHotKeys;
- (void)timerUpdate;
+- (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
- (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;
}
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];
+ if ([currentRemote playerRunningState] == ITMTRemotePlayerRunning) {
+ [self applicationLaunched:nil];
+ } else {
+ [self applicationTerminated:nil];
+ }
+
[statusItem setImage:[NSImage imageNamed:@"menu"]];
[statusItem setAlternateImage:[NSImage imageNamed:@"selected_image"]];
}
- (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 radioIsPlaying]) && (latestPlaylistClass == ITMTRemotePlayerRadioPlaylist) ) )*/
+
+ if ([self songChanged]) {
[self setLatestSongIdentifier:[currentRemote currentSongUniqueIdentifier]];
latestPlaylistClass = [currentRemote currentPlaylistClass];
+ [menuController rebuildSubmenus];
if ( [df boolForKey:@"showSongInfoOnChange"] ) {
[self showCurrentTrackInfo];
}
}
-/*
- //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"];
}
}
-- (void)nextSong:(id)sender
+- (void)nextSong
{
[currentRemote goToNextSong];
}
-- (void)prevSong:(id)sender
+- (void)prevSong
{
[currentRemote goToPreviousSong];
}
-- (void)fastForward:(id)sender
+- (void)fastForward
{
[currentRemote forward];
- [playPauseItem setTitle:@"Play"];
}
-- (void)rewind:(id)sender
+- (void)rewind
{
[currentRemote rewind];
- [playPauseItem setTitle:@"Play"];
}
-*/
-//
-//
-- (void)quitMenuTunes:(id)sender
+- (void)selectPlaylistAtIndex:(int)index
{
- [NSApp terminate:self];
+ [currentRemote switchToPlaylistAtIndex:index];
+}
+
+- (void)selectSongAtIndex:(int)index
+{
+ [currentRemote switchToSongAtIndex:index];
+}
+
+- (void)selectSongRating:(int)rating
+{
+ [currentRemote setCurrentSongRating:(float)rating / 100.0];
+}
+
+- (void)selectEQPresetAtIndex:(int)index
+{
+ [currentRemote switchToEQAtIndex:index];
}
-- (void)showPlayer:(id)sender
+- (void)showPlayer
{
if ( ( playerRunningState == ITMTRemotePlayerRunning) ) {
[currentRemote showPrimaryInterface];
}
}
-- (void)showPreferences:(id)sender
+- (void)showPreferences
{
[[PreferencesController sharedPrefs] setController:self];
[[PreferencesController sharedPrefs] showPrefsWindow:self];
}
+- (void)quitMenuTunes
+{
+ [NSApp terminate:self];
+}
+
+//
+//
+
- (void)closePreferences
{
if ( ( playerRunningState == ITMTRemotePlayerRunning) ) {
[[HotKeyCenter sharedCenter] removeHotKey:@"NextTrack"];
[[HotKeyCenter sharedCenter] removeHotKey:@"PrevTrack"];
[[HotKeyCenter sharedCenter] removeHotKey:@"TrackInfo"];
+ [[HotKeyCenter sharedCenter] removeHotKey:@"ShowPlayer"];
[[HotKeyCenter sharedCenter] removeHotKey:@"UpcomingSongs"];
[[HotKeyCenter sharedCenter] removeHotKey:@"ToggleLoop"];
[[HotKeyCenter sharedCenter] removeHotKey:@"ToggleShuffle"];
if ([df objectForKey:@"PlayPause"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"PlayPause"
combo:[df keyComboForKey:@"PlayPause"]
- target:self action:@selector(playPause:)];
+ target:self action:@selector(playPause)];
}
if ([df objectForKey:@"NextTrack"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"NextTrack"
combo:[df keyComboForKey:@"NextTrack"]
- target:self action:@selector(nextSong:)];
+ target:self action:@selector(nextSong)];
}
if ([df objectForKey:@"PrevTrack"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"PrevTrack"
combo:[df keyComboForKey:@"PrevTrack"]
- target:self action:@selector(prevSong:)];
+ target:self action:@selector(prevSong)];
+ }
+
+ if ([df objectForKey:@"ShowPlayer"] != nil) {
+ [[HotKeyCenter sharedCenter] addHotKey:@"ShowPlayer"
+ combo:[df keyComboForKey:@"ShowPlayer"]
+ target:self action:@selector(showPlayer)];
}
if ([df objectForKey:@"TrackInfo"] != nil) {
if ([df objectForKey:@"ToggleLoop"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"ToggleLoop"
combo:[df keyComboForKey:@"ToggleLoop"]
- target:self action:NULL/*Set this to something*/];
+ target:self action:@selector(toggleLoop)];
}
if ([df objectForKey:@"ToggleShuffle"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle"
combo:[df keyComboForKey:@"ToggleShuffle"]
- target:self action:NULL/*Set this to something*/];
+ target:self action:@selector(toggleShuffle)];
}
if ([df objectForKey:@"IncrementVolume"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"IncrementVolume"
combo:[df keyComboForKey:@"IncrementVolume"]
- target:self action:NULL/*Set this to something*/];
+ target:self action:@selector(incrementVolume)];
}
if ([df objectForKey:@"DecrementVolume"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"DecrementVolume"
combo:[df keyComboForKey:@"DecrementVolume"]
- target:self action:NULL/*Set this to something*/];
+ target:self action:@selector(decrementVolume)];
}
if ([df objectForKey:@"IncrementRating"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"IncrementRating"
combo:[df keyComboForKey:@"IncrementRating"]
- target:self action:NULL/*Set this to something*/];
+ target:self action:@selector(incrementRating)];
}
if ([df objectForKey:@"DecrementRating"] != nil) {
[[HotKeyCenter sharedCenter] addHotKey:@"DecrementRating"
combo:[df keyComboForKey:@"DecrementRating"]
- target:self action:NULL/*Set this to something*/];
+ target:self action:@selector(decrementRating)];
}
}
}
}
+- (void)incrementVolume
+{
+ float volume = [currentRemote volume];
+ volume += 0.2;
+ if (volume > 1.0) {
+ volume = 1.0;
+ }
+ [currentRemote setVolume:volume];
+
+ //Show volume status window
+ [statusWindowController showVolumeWindowWithLevel:volume];
+}
+
+- (void)decrementVolume
+{
+ float volume = [currentRemote volume];
+ volume -= 0.2;
+ if (volume < 0.0) {
+ volume = 0.0;
+ }
+ [currentRemote setVolume:volume];
+
+ //Show volume status window
+ [statusWindowController showVolumeWindowWithLevel:volume];
+}
+
+- (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 ITMTRemotePlayerRepeatAll:
+ repeatMode = ITMTRemotePlayerRepeatOne;
+ break;
+ case ITMTRemotePlayerRepeatOne:
+ repeatMode = ITMTRemotePlayerRepeatOff;
+ break;
+ }
+ [currentRemote setRepeatMode:repeatMode];
+
+ //Show loop status window
+ [statusWindowController showLoopWindowWithMode:repeatMode];
+}
+
+- (void)toggleShuffle
+{
+ bool newShuffleEnabled = ![currentRemote shuffleEnabled];
+ [currentRemote setShuffleEnabled:newShuffleEnabled];
+ //Show shuffle status window
+ [statusWindowController showLoopWindowWithMode:newShuffleEnabled];
+}
+
/*************************************************************************/
#pragma mark -
#pragma mark WORKSPACE NOTIFICATION HANDLERS
- (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;
}
- (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;
}
}
- (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