X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/68dfd7431d482d1958c5d8371c4fd494b1356d84..0948b4b6166bbee8caefca1278b6551d264068a8:/PreferencesController.m diff --git a/PreferencesController.m b/PreferencesController.m index c962b52..8ad7630 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -1,5 +1,6 @@ #import "PreferencesController.h" #import "MainController.h" +#import "MenuController.h" #import "NetworkController.h" #import "NetworkObject.h" #import "StatusWindow.h" @@ -12,7 +13,7 @@ #import #import -#import +#import #import #import @@ -41,13 +42,13 @@ - (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 @@ -86,6 +87,8 @@ static PreferencesController *prefs = nil; hotKeysArray = [[NSArray alloc] initWithObjects:@"PlayPause", @"NextTrack", @"PrevTrack", + @"FastForward", + @"Rewind", @"ShowPlayer", @"TrackInfo", @"UpcomingSongs", @@ -95,11 +98,20 @@ static PreferencesController *prefs = nil; @"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", @@ -109,6 +121,13 @@ static PreferencesController *prefs = nil; @"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; @@ -188,6 +207,7 @@ static PreferencesController *prefs = 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 @@ -201,43 +221,44 @@ static PreferencesController *prefs = nil; [self resetRemotePlayerTextFields]; [launchAtLoginCheckbox becomeFirstResponder]; [NSApp activateIgnoringOtherApps:YES]; - [window center]; + if (![window isVisible]) { + [window center]; + } [window orderFrontRegardless]; [window makeKeyWindow]; } -- (IBAction)showTestWindow:(id)sender -{ - [controller showTestWindow]; -} - - (IBAction)changeGeneralSetting:(id)sender { 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"]; - + 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"]; } else if ( [sender tag] == 1050) { [df setBool:SENDER_STATE forKey:@"showArtist"]; + } else if ( [sender tag] == 1055) { + [df setBool:SENDER_STATE forKey:@"showComposer"]; } else if ( [sender tag] == 1060) { [df setBool:SENDER_STATE forKey:@"showAlbum"]; } else if ( [sender tag] == 1070) { [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) { [df setBool:SENDER_STATE forKey:@"showAlbumArtwork"]; - } else if ( [sender tag] == 1105) { - [df setBool:SENDER_STATE forKey:@"showToolTip"]; } else if ( [sender tag] == 1110) { [df setBool:SENDER_STATE forKey:@"runScripts"]; if (SENDER_STATE) { @@ -446,14 +467,19 @@ static PreferencesController *prefs = nil; } 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]]; + [(MainController *)controller showCurrentTrackInfo]; } else if ( [sender tag] == 2040) { [self setStatusWindowExitEffect:[[sender selectedItem] representedObject]]; + [(MainController *)controller showCurrentTrackInfo]; } else if ( [sender tag] == 2050) { float newTime = ( -([sender floatValue]) ); @@ -487,9 +513,11 @@ static PreferencesController *prefs = nil; } [df setInteger:setting forKey:@"statusWindowBackgroundMode"]; + [(MainController *)controller showCurrentTrackInfo]; } else if ( [sender tag] == 2091) { [self setCustomColor:[sender color] updateWell:NO]; + [(MainController *)controller showCurrentTrackInfo]; } else if ( [sender tag] == 2092) { int selectedItem = [sender indexOfSelectedItem]; @@ -507,6 +535,7 @@ static PreferencesController *prefs = nil; } else { [self setCustomColor:[NSColor colorWithCalibratedWhite:0.15 alpha:0.70] updateWell:YES]; } + [(MainController *)controller showCurrentTrackInfo]; } else if ( [sender tag] == 2095) { [df setInteger:[sender indexOfSelectedItem] forKey:@"statusWindowSizing"]; @@ -518,11 +547,6 @@ static PreferencesController *prefs = nil; - (void)registerDefaults { - BOOL found = NO; - NSMutableDictionary *loginWindow; - NSMutableArray *loginArray; - NSEnumerator *loginEnum; - id anItem; ITDebugLog(@"Registering defaults."); [df setObject:[NSArray arrayWithObjects: @"trackInfo", @@ -544,7 +568,9 @@ static PreferencesController *prefs = nil; [df setBool:YES forKey:@"showArtist"]; [df setBool:YES forKey:@"showAlbumArtwork"]; [df setBool:NO forKey:@"showAlbum"]; + [df setBool:NO forKey:@"showComposer"]; [df setBool:NO forKey:@"showTime"]; + [df setBool:NO forKey:@"showToolTip"]; [df setObject:@"ITCutWindowEffect" forKey:@"statusWindowAppearanceEffect"]; [df setObject:@"ITDissolveWindowEffect" forKey:@"statusWindowVanishEffect"]; @@ -553,6 +579,7 @@ static PreferencesController *prefs = nil; [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"]; @@ -561,18 +588,7 @@ static PreferencesController *prefs = nil; [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]; } } @@ -583,7 +599,7 @@ static PreferencesController *prefs = nil; [[StatusWindow sharedWindow] vanish:self]; [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; - [self setLaunchesAtLogin:YES]; + ITSetApplicationLaunchOnLogin([[NSBundle mainBundle] bundlePath], YES); } - (void)autoLaunchCancel @@ -730,6 +746,8 @@ static PreferencesController *prefs = nil; @"trackInfo", @"upcomingSongs", @"playlists", + @"artists", + @"albums", @"eqPresets", @"songRating", @"playPause", @@ -756,6 +774,8 @@ static PreferencesController *prefs = nil; submenuItems = [[NSArray alloc] initWithObjects: @"upcomingSongs", @"playlists", + @"artists", + @"albums", @"eqPresets", @"songRating", nil]; @@ -763,15 +783,12 @@ static PreferencesController *prefs = 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."); @@ -790,19 +807,22 @@ static PreferencesController *prefs = nil; } } + [[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]; [nameCheckbox setState:NSOnState]; // Song info will ALWAYS show song title. [nameCheckbox setEnabled:NO]; // Song info will ALWAYS show song title. [artistCheckbox setState:[df boolForKey:@"showArtist"] ? 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]; - [showToolTipCheckbox setState:[df boolForKey:@"showToolTip"] ? NSOnState : NSOffState]; - if ([df boolForKey:@"runScripts"]) { [runScriptsCheckbox setState:NSOnState]; [showScriptsButton setEnabled:YES]; @@ -812,15 +832,8 @@ static PreferencesController *prefs = nil; // 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 @@ -920,6 +933,30 @@ static PreferencesController *prefs = nil; } } +- (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]; @@ -1017,42 +1054,14 @@ static PreferencesController *prefs = nil; [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 - @@ -1245,6 +1254,7 @@ static PreferencesController *prefs = nil; - (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; [hotKeysArray release]; [hotKeysDictionary release]; [effectClasses release];