#import <sys/types.h>
#import <sys/stat.h>
-#import <ITFoundation/ITFoundation.h>
+#import <ITKit/ITLoginItem.h>
#import <ITKit/ITHotKeyCenter.h>
#import <ITKit/ITKeyCombo.h>
- (void)setupCustomizationTables;
- (void)setupMenuItems;
- (void)setupUI;
+- (void)setupScreenPopup;
- (void)setStatusWindowEntryEffect:(Class)effectClass;
- (void)setStatusWindowExitEffect:(Class)effectClass;
- (void)setCustomColor:(NSColor *)color updateWell:(BOOL)update;
- (void)repopulateEffectPopupsForVerticalPosition:(ITVerticalWindowPosition)vPos horizontalPosition:(ITHorizontalWindowPosition)hPos;
- (BOOL)effect:(Class)effectClass supportsVerticalPosition:(ITVerticalWindowPosition)vPos withHorizontalPosition:(ITHorizontalWindowPosition)hPos;
- (IBAction)changeMenus:(id)sender;
-- (void)setLaunchesAtLogin:(BOOL)flag;
@end
hotKeysArray = [[NSArray alloc] initWithObjects:@"PlayPause",
@"NextTrack",
@"PrevTrack",
+ @"FastForward",
+ @"Rewind",
@"ShowPlayer",
@"TrackInfo",
@"UpcomingSongs",
@"DecrementRating",
@"ToggleShuffle",
@"ToggleLoop",
+ @"PopupMenu",
+ @"SetRating0",
+ @"SetRating1",
+ @"SetRating2",
+ @"SetRating3",
+ @"SetRating4",
+ @"SetRating5",
nil];
hotKeyNamesArray = [[NSArray alloc] initWithObjects:@"Play/Pause",
@"Next Track",
@"Previous Track",
+ @"Fast Forward",
+ @"Rewind",
@"Show Player",
@"Track Info",
@"Upcoming Songs",
@"Decrement Rating",
@"Toggle Shuffle",
@"Toggle Loop",
+ @"Pop-up status menu",
+ [NSString stringWithUTF8String:"Set Rating: ☆☆☆☆☆"],
+ [NSString stringWithUTF8String:"Set Rating: ★☆☆☆☆"],
+ [NSString stringWithUTF8String:"Set Rating: ★★☆☆☆"],
+ [NSString stringWithUTF8String:"Set Rating: ★★★☆☆"],
+ [NSString stringWithUTF8String:"Set Rating: ★★★★☆"],
+ [NSString stringWithUTF8String:"Set Rating: ★★★★★"],
nil];
hotKeysDictionary = [[NSMutableDictionary alloc] init];
controller = nil;
[self setupUI]; // Sets up additional UI
[window setDelegate:self];
[menuTableView reloadData];
+ [hotKeysTableView reloadData];
[hotKeysTableView setDoubleAction:@selector(hotKeysTableViewDoubleClicked:)];
//Change the launch player checkbox to the proper name
[self resetRemotePlayerTextFields];
[launchAtLoginCheckbox becomeFirstResponder];
[NSApp activateIgnoringOtherApps:YES];
- [window center];
+ if (![window isVisible]) {
+ [window center];
+ }
[window orderFrontRegardless];
[window makeKeyWindow];
}
{
ITDebugLog(@"Changing general setting of tag %i.", [sender tag]);
if ( [sender tag] == 1010) {
- [self setLaunchesAtLogin:SENDER_STATE];
+ ITSetApplicationLaunchOnLogin([[NSBundle mainBundle] bundlePath], SENDER_STATE);
} else if ( [sender tag] == 1020) {
[df setBool:SENDER_STATE forKey:@"LaunchPlayerWithMT"];
} else if ( [sender tag] == 1030) {
[df setInteger:[sender intValue] forKey:@"SongsInAdvance"];
- [[controller menuController] rebuildSubmenus];
+ if ([[controller currentRemote] playerRunningState] == ITMTRemotePlayerRunning) {
+ [[controller menuController] performSelector:@selector(rebuildSubmenus) withObject:nil afterDelay:0];
+ }
} else if ( [sender tag] == 1040) {
// This will not be executed. Song info always shows the title of the song.
// [df setBool:SENDER_STATE forKey:@"showName"];
[df setBool:SENDER_STATE forKey:@"showTime"];
} else if ( [sender tag] == 1080) {
[df setBool:SENDER_STATE forKey:@"showTrackNumber"];
+ } else if ( [sender tag] == 1085) {
+ [df setBool:SENDER_STATE forKey:@"showPlayCount"];
} else if ( [sender tag] == 1090) {
[df setBool:SENDER_STATE forKey:@"showTrackRating"];
} else if ( [sender tag] == 1100) {
} else if ( [sender tag] == 2020) {
// Update screen selection.
-
+ [[StatusWindow sharedWindow] setScreen:[[NSScreen screens] objectAtIndex:[sender indexOfSelectedItem]]];
+ [df setInteger:[sender indexOfSelectedItem] forKey:@"statusWindowScreenIndex"];
+ [(MainController *)controller showCurrentTrackInfo];
+
} else if ( [sender tag] == 2030) {
[self setStatusWindowEntryEffect:[[sender selectedItem] representedObject]];
- (void)registerDefaults
{
- BOOL found = NO;
- NSMutableDictionary *loginWindow;
- NSMutableArray *loginArray;
- NSEnumerator *loginEnum;
- id anItem;
ITDebugLog(@"Registering defaults.");
[df setObject:[NSArray arrayWithObjects:
@"trackInfo",
@"upcomingSongs",
@"separator",
@"preferences",
+ @"about",
@"quit",
nil] forKey:@"menu"];
[df setFloat:4.0 forKey:@"statusWindowVanishDelay"];
[df setInteger:(int)ITWindowPositionBottom forKey:@"statusWindowVerticalPosition"];
[df setInteger:(int)ITWindowPositionLeft forKey:@"statusWindowHorizontalPosition"];
+ [df setInteger:0 forKey:@"statusWindowScreenIndex"];
[[StatusWindow sharedWindow] setVerticalPosition:(int)ITWindowPositionBottom];
[[StatusWindow sharedWindow] setHorizontalPosition:(int)ITWindowPositionLeft];
[df setBool:YES forKey:@"showSongInfoOnChange"];
[df synchronize];
- loginWindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy];
- loginArray = [loginWindow objectForKey:@"AutoLaunchedApplicationDictionary"];
- loginEnum = [loginArray objectEnumerator];
-
- while ( (anItem = [loginEnum nextObject]) ) {
- if ( [[[anItem objectForKey:@"Path"] lastPathComponent] isEqualToString:[[[NSBundle mainBundle] bundlePath] lastPathComponent]] ) {
- found = YES;
- }
- }
- [loginWindow release];
-
- if (!found) {
+ if (ITDoesApplicationLaunchOnLogin([[NSBundle mainBundle] bundlePath])) {
[[StatusWindowController sharedController] showSetupQueryWindow];
}
}
[[StatusWindow sharedWindow] vanish:self];
[[StatusWindow sharedWindow] setIgnoresMouseEvents:YES];
- [self setLaunchesAtLogin:YES];
+ ITSetApplicationLaunchOnLogin([[NSBundle mainBundle] bundlePath], YES);
}
- (void)autoLaunchCancel
@"trackInfo",
@"upcomingSongs",
@"playlists",
+ @"artists",
+ @"albums",
@"eqPresets",
@"songRating",
@"playPause",
@"fastForward",
@"rewind",
@"showPlayer",
+ @"about",
@"quit",
nil];
submenuItems = [[NSArray alloc] initWithObjects:
@"upcomingSongs",
@"playlists",
+ @"artists",
+ @"albums",
@"eqPresets",
@"songRating",
nil];
- (void)setupUI
{
- NSMutableDictionary *loginwindow;
- NSMutableArray *loginarray;
- NSEnumerator *loginEnum;
NSEnumerator *keyArrayEnum;
NSString *serverName;
NSData *colorData;
int selectedBGStyle;
id anItem;
-
+
[df setInteger:MT_CURRENT_VERSION forKey:@"appVersion"];
ITDebugLog(@"Setting up preferences UI.");
}
}
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setupScreenPopup) name:NSApplicationDidChangeScreenParametersNotification object:nil];
+ [self setupScreenPopup];
+
ITDebugLog(@"Setting up track info checkboxes.");
// Check current track info buttons
[albumCheckbox setState:[df boolForKey:@"showAlbum"] ? NSOnState : NSOffState];
[composerCheckbox setState:[df boolForKey:@"showComposer"] ? NSOnState : NSOffState];
[trackTimeCheckbox setState:[df boolForKey:@"showTime"] ? NSOnState : NSOffState];
[trackNumberCheckbox setState:[df boolForKey:@"showTrackNumber"] ? NSOnState : NSOffState];
+ [playCountCheckbox setState:[df boolForKey:@"showPlayCount"] ? NSOnState : NSOffState];
[ratingCheckbox setState:[df boolForKey:@"showTrackRating"] ? NSOnState : NSOffState];
[albumArtworkCheckbox setState:[df boolForKey:@"showAlbumArtwork"] ? NSOnState : NSOffState];
// Set the launch at login checkbox state
ITDebugLog(@"Setting launch at login state.");
- [df synchronize];
- loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy];
- loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"];
-
- loginEnum = [loginarray objectEnumerator];
- while ( (anItem = [loginEnum nextObject]) ) {
- if ([[[anItem objectForKey:@"Path"] lastPathComponent] isEqualToString:[[[NSBundle mainBundle] bundlePath] lastPathComponent]]) {
- [launchAtLoginCheckbox setState:NSOnState];
- }
+ if (ITDoesApplicationLaunchOnLogin([[NSBundle mainBundle] bundlePath])) {
+ [launchAtLoginCheckbox setState:NSOnState];
}
// Set the launch player checkbox state
}
}
+- (void)setupScreenPopup
+{
+ ITDebugLog(@"Setting up screen popup");
+ NSArray *screens = [NSScreen screens];
+ if ([screens count] > 1) {
+ int i, index = [df integerForKey:@"statusWindowScreenIndex"];
+ [screenPopup setEnabled:YES];
+ for (i = 0; i < [screens count]; i++) {
+ NSScreen *screen = [screens objectAtIndex:i];
+ if (![screen isEqual:[NSScreen mainScreen]]) {
+ [screenPopup addItemWithTitle:[NSString stringWithFormat:@"Screen %i", i + 1]];
+ }
+ }
+ [screenPopup selectItemAtIndex:index];
+ [[StatusWindow sharedWindow] setScreen:[[NSScreen screens] objectAtIndex:index]];
+ } else {
+ while ([screenPopup numberOfItems] > 1) {
+ [screenPopup removeItemAtIndex:1];
+ }
+ [screenPopup setEnabled:NO];
+ [[StatusWindow sharedWindow] setScreen:[NSScreen mainScreen]];
+ }
+}
+
- (void)setStatusWindowEntryEffect:(Class)effectClass
{
StatusWindow *sw = [StatusWindow sharedWindow];
[df setObject:myItems forKey:@"menu"];
[df synchronize];
+ [[controller menuController] performSelector:@selector(rebuildSubmenus) withObject:nil afterDelay:0.0];
+
//If we're connected over a network, refresh the menu immediately
if ([[NetworkController sharedController] isConnectedToServer]) {
[controller timerUpdate];
}
}
-- (void)setLaunchesAtLogin:(BOOL)flag
-{
- NSMutableDictionary *loginwindow;
- NSMutableArray *loginarray;
- ITDebugLog(@"Setting launches at login: %i", flag);
- [df synchronize];
- loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy];
- loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"];
-
- if (flag) {
- NSDictionary *itemDict = [NSDictionary dictionaryWithObjectsAndKeys:
- [[NSBundle mainBundle] bundlePath], @"Path",
- [NSNumber numberWithInt:0], @"Hide", nil];
- [loginarray addObject:itemDict];
- } else {
- int i;
- for (i = 0; i < [loginarray count]; i++) {
- NSDictionary *tempDict = [loginarray objectAtIndex:i];
- if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:[[[NSBundle mainBundle] bundlePath] lastPathComponent]]) {
- [loginarray removeObjectAtIndex:i];
- break;
- }
- }
- }
- [df setPersistentDomain:loginwindow forName:@"loginwindow"];
- [df synchronize];
- [loginwindow release];
- ITDebugLog(@"Finished setting launches at login.");
-}
-
/*************************************************************************/
#pragma mark -
- (void)dealloc
{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
[hotKeysArray release];
[hotKeysDictionary release];
[effectClasses release];
[submenuItems release];
[myItems release];
[df release];
+ [super dealloc];
}
@end