X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/06957bb412305361a6668e12c22481c16cc16886..7ff7cb5b12bf1e81deefbb2af0e37051c1d3f021:/PreferencesController.m?ds=inline diff --git a/PreferencesController.m b/PreferencesController.m index 8849759..b66520b 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -1,10 +1,12 @@ #import "PreferencesController.h" #import "MainController.h" #import "StatusWindow.h" +#import "StatusWindowController.h" #import "CustomMenuTableView.h" #import #import +#import #import #import @@ -59,7 +61,35 @@ static PreferencesController *prefs = nil; - (id)init { if ( (self = [super init]) ) { + ITDebugLog(@"Preferences initialized."); df = [[NSUserDefaults standardUserDefaults] retain]; + hotKeysArray = [[NSArray alloc] initWithObjects:@"PlayPause", + @"NextTrack", + @"PrevTrack", + @"ShowPlayer", + @"TrackInfo", + @"UpcomingSongs", + @"IncrementVolume", + @"DecrementVolume", + @"IncrementRating", + @"DecrementRating", + @"ToggleShuffle", + @"ToggleLoop", + nil]; + + hotKeyNamesArray = [[NSArray alloc] initWithObjects:@"Play/Pause", + @"Next Track", + @"Previous Track", + @"Show Player", + @"Track Info", + @"Upcoming Songs", + @"Increment Volume", + @"Decrement Volume", + @"Increment Rating", + @"Decrement Rating", + @"Toggle Shuffle", + @"Toggle Loop", + nil]; hotKeysDictionary = [[NSMutableDictionary alloc] init]; controller = nil; } @@ -91,25 +121,29 @@ static PreferencesController *prefs = nil; - (IBAction)showPrefsWindow:(id)sender { + ITDebugLog(@"Showing preferences window."); if (! window) { // If window does not exist yet, then the nib hasn't been loaded. + ITDebugLog(@"Window doesn't exist, initial setup."); [self setupWindow]; // Load in the nib, and perform any initial setup. [self setupCustomizationTables]; // Setup the DnD manu config tables. [self setupMenuItems]; // Setup the arrays of menu items [self setupUI]; // Sets up additional UI [window setDelegate:self]; [menuTableView reloadData]; + [hotKeysTableView setDoubleAction:@selector(hotKeysTableViewDoubleClicked:)]; //Change the launch player checkbox to the proper name [launchPlayerAtLaunchCheckbox setTitle:[NSString stringWithFormat:@"Launch %@ when MenuTunes launches", [[controller currentRemote] playerSimpleName]]]; //This isn't localized... } - - [window setLevel:NSStatusWindowLevel]; + [window center]; - [window makeKeyAndOrderFront:self]; + [NSApp activateIgnoringOtherApps:YES]; + [window performSelector:@selector(makeKeyAndOrderFront:) withObject:self afterDelay:0.0]; } - (IBAction)changeGeneralSetting:(id)sender { + ITDebugLog(@"Changing general setting of tag %i.", [sender tag]); if ( [sender tag] == 1010) { [self setLaunchesAtLogin:SENDER_STATE]; } else if ( [sender tag] == 1020) { @@ -131,14 +165,13 @@ static PreferencesController *prefs = nil; } else if ( [sender tag] == 1090) { [df setBool:SENDER_STATE forKey:@"showTrackRating"]; } - [df synchronize]; } - (IBAction)changeStatusWindowSetting:(id)sender { StatusWindow *sw = [StatusWindow sharedWindow]; - + ITDebugLog(@"Changing status window setting of tag %i", [sender tag]); if ( [sender tag] == 2010) { [df setInteger:[sender selectedRow] forKey:@"statusWindowVerticalPosition"]; [df setInteger:[sender selectedColumn] forKey:@"statusWindowHorizontalPosition"]; @@ -199,66 +232,9 @@ static PreferencesController *prefs = nil; } else if ( [sender tag] == 2080) { [df setBool:SENDER_STATE forKey:@"showSongInfoOnChange"]; } - [df synchronize]; } -- (IBAction)changeHotKey:(id)sender -{ - [controller clearHotKeys]; - switch ([sender tag]) - { - case 4010: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"PlayPause"]]; - [self setCurrentHotKey:@"PlayPause"]; - break; - case 4020: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"NextTrack"]]; - [self setCurrentHotKey:@"NextTrack"]; - break; - case 4030: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"PrevTrack"]]; - [self setCurrentHotKey:@"PrevTrack"]; - break; - case 4035: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"ShowPlayer"]]; - [self setCurrentHotKey:@"ShowPlayer"]; - break; - case 4040: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"ToggleLoop"]]; - [self setCurrentHotKey:@"ToggleLoop"]; - break; - case 4050: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"ToggleShuffle"]]; - [self setCurrentHotKey:@"ToggleShuffle"]; - break; - case 4060: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"TrackInfo"]]; - [self setCurrentHotKey:@"TrackInfo"]; - break; - case 4070: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"UpcomingSongs"]]; - [self setCurrentHotKey:@"UpcomingSongs"]; - break; - case 4080: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"IncrementVolume"]]; - [self setCurrentHotKey:@"IncrementVolume"]; - break; - case 4090: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"DecrementVolume"]]; - [self setCurrentHotKey:@"DecrementVolume"]; - break; - case 4100: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"IncrementRating"]]; - [self setCurrentHotKey:@"IncrementRating"]; - break; - case 4110: - [self setKeyCombo:[hotKeysDictionary objectForKey:@"DecrementRating"]]; - [self setCurrentHotKey:@"DecrementRating"]; - break; - } -} - - (void)registerDefaults { BOOL found = NO; @@ -266,24 +242,19 @@ static PreferencesController *prefs = nil; NSMutableArray *loginArray; NSEnumerator *loginEnum; id anItem; - + ITDebugLog(@"Registering defaults."); [df setObject:[NSArray arrayWithObjects: + @"trackInfo", + @"separator", @"playPause", @"prevTrack", @"nextTrack", - @"fastForward", - @"rewind", - @"showPlayer", @"separator", - @"songRating", - @"eqPresets", @"playlists", @"upcomingSongs", @"separator", @"preferences", @"quit", - @"separator", - @"trackInfo", nil] forKey:@"menu"]; [df setInteger:5 forKey:@"SongsInAdvance"]; @@ -292,6 +263,13 @@ static PreferencesController *prefs = nil; [df setBool:NO forKey:@"showAlbum"]; [df setBool:NO forKey:@"showTime"]; + [df setInteger:2100 forKey:@"statusWindowAppearanceEffect"]; + [df setInteger:2101 forKey:@"statusWindowVanishEffect"]; + [df setFloat:0.8 forKey:@"statusWindowAppearanceSpeed"]; + [df setFloat:0.8 forKey:@"statusWindowVanishSpeed"]; + [df setFloat:4.0 forKey:@"statusWindowVanishDelay"]; + [df setBool:YES forKey:@"showSongInfoOnChange"]; + [df synchronize]; loginWindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; @@ -303,174 +281,109 @@ static PreferencesController *prefs = nil; found = YES; } } - [loginWindow release]; - // This is teh sux - // We must fix it so it is no longer suxy if (!found) { - if (NSRunInformationalAlertPanel(NSLocalizedString(@"autolaunch", @"Auto-launch MenuTunes"), NSLocalizedString(@"autolaunch_msg", @"Would you like MenuTunes to automatically launch at login?"), @"Yes", @"No", nil) == NSOKButton) { - AEDesc scriptDesc, resultDesc; - NSString *script = [NSString stringWithFormat:@"tell application \"System Events\"\nmake new login item at end of login items with properties {path:\"%@\", kind:\"APPLICATION\"}\nend tell", [[NSBundle mainBundle] bundlePath]]; - ComponentInstance asComponent = OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype); - - AECreateDesc(typeChar, [script cString], [script cStringLength], - &scriptDesc); - - OSADoScript(asComponent, &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc); - - AEDisposeDesc(&scriptDesc); - AEDisposeDesc(&resultDesc); - - CloseComponent(asComponent); - } + [[StatusWindowController sharedController] showSetupQueryWindow]; } } -- (IBAction)cancelHotKey:(id)sender +- (void)autoLaunchOK { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [NSApp endSheet:keyComboPanel]; - [keyComboPanel orderOut:nil]; -} - -- (IBAction)clearHotKey:(id)sender -{ - [self setKeyCombo:[ITKeyCombo clearKeyCombo]]; + [[StatusWindow sharedWindow] setLocked:NO]; + [[StatusWindow sharedWindow] vanish:self]; + [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; + + [self setLaunchesAtLogin:YES]; } -- (IBAction)okHotKey:(id)sender +- (void)autoLaunchCancel { - NSString *string = [combo description]; - NSEnumerator *enumerator = [hotKeysDictionary keyEnumerator]; - NSString *enumKey; - - if (string == nil) { - string = @""; - } - - while ( (enumKey = [enumerator nextObject]) ) { - if (![enumKey isEqualToString:currentHotKey]) { - if (![combo isEqual:[ITKeyCombo clearKeyCombo]] && - [combo isEqual:[hotKeysDictionary objectForKey:enumKey]]) { - [window setLevel:NSNormalWindowLevel]; - if ( NSRunAlertPanel(NSLocalizedString(@"duplicateCombo", @"Duplicate Key Combo") , NSLocalizedString(@"duplicateCombo_msg", @"The specified key combo is already in use..."), NSLocalizedString(@"replace", @"Replace"), NSLocalizedString(@"cancel", @"Cancel"), nil) ) { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:currentHotKey]; - if ([enumKey isEqualToString:@"PlayPause"]) { - [playPauseButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"NextTrack"]) { - [nextTrackButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"PrevTrack"]) { - [previousTrackButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"ShowPlayer"]) { - [showPlayerButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"TrackInfo"]) { - [trackInfoButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"UpcomingSongs"]) { - [upcomingSongsButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"IncrementVolume"]) { - [volumeIncrementButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"DecrementVolume"]) { - [volumeDecrementButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"IncrementRating"]) { - [ratingIncrementButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"DecrementRating"]) { - [ratingDecrementButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"ToggleShuffle"]) { - [toggleShuffleButton setTitle:@"(None)"]; - } else if ([enumKey isEqualToString:@"ToggleLoop"]) { - [toggleLoopButton setTitle:@"(None)"]; - } - [df setObject:[[ITKeyCombo clearKeyCombo] plistRepresentation] forKey:enumKey]; - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:enumKey]; - } else { - return; - } - [window setLevel:NSStatusWindowLevel]; - } - } - } - - [hotKeysDictionary setObject:combo forKey:currentHotKey]; - [df setObject:[combo plistRepresentation] forKey:currentHotKey]; - - if ([currentHotKey isEqualToString:@"PlayPause"]) { - [playPauseButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"NextTrack"]) { - [nextTrackButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"PrevTrack"]) { - [previousTrackButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"ShowPlayer"]) { - [showPlayerButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"TrackInfo"]) { - [trackInfoButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"UpcomingSongs"]) { - [upcomingSongsButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"IncrementVolume"]) { - [volumeIncrementButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"DecrementVolume"]) { - [volumeDecrementButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"IncrementRating"]) { - [ratingIncrementButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"DecrementRating"]) { - [ratingDecrementButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"ToggleShuffle"]) { - [toggleShuffleButton setTitle:string]; - } else if ([currentHotKey isEqualToString:@"ToggleLoop"]) { - [toggleLoopButton setTitle:string]; - } - [controller setupHotKeys]; - [self cancelHotKey:sender]; + [[StatusWindow sharedWindow] setLocked:NO]; + [[StatusWindow sharedWindow] vanish:self]; + [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; } - (void)deletePressedInTableView:(NSTableView *)tableView { if (tableView == menuTableView) { int selRow = [tableView selectedRow]; + ITDebugLog(@"Delete pressed in menu table view."); if (selRow != - 1) { NSString *object = [myItems objectAtIndex:selRow]; + + if ([object isEqualToString:@"preferences"]) { + NSBeep(); + return; + } + if (![object isEqualToString:@"separator"]) [availableItems addObject:object]; + ITDebugLog(@"Removing object named %@", object); [myItems removeObjectAtIndex:selRow]; [menuTableView reloadData]; [allTableView reloadData]; } + [self changeMenus:self]; } } - /*************************************************************************/ #pragma mark - #pragma mark HOTKEY SUPPORT METHODS /*************************************************************************/ -- (void)setCurrentHotKey:(NSString *)key +- (IBAction)clearHotKey:(id)sender { - [currentHotKey autorelease]; - currentHotKey = [key copy]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyEvent:) name:ITKeyBroadcasterKeyEvent object:nil]; - [NSApp beginSheet:keyComboPanel modalForWindow:window modalDelegate:self didEndSelector:nil contextInfo:nil]; + [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:[hotKeysArray objectAtIndex:[hotKeysTableView selectedRow]]]; + [df setObject:[[ITKeyCombo clearKeyCombo] plistRepresentation] forKey:[hotKeysArray objectAtIndex:[hotKeysTableView selectedRow]]]; + [controller setupHotKeys]; + [hotKeysTableView reloadData]; } -- (void)keyEvent:(NSNotification *)note +- (IBAction)editHotKey:(id)sender { - [self setKeyCombo:[[[note userInfo] objectForKey:@"keyCombo"] copy]]; + ITKeyComboPanel *panel = [ITKeyComboPanel sharedPanel]; + NSString *keyComboKey = [hotKeysArray objectAtIndex:[hotKeysTableView selectedRow]]; + ITKeyCombo *keyCombo; + + ITDebugLog(@"Setting key combo on hot key %@.", keyComboKey); + [controller clearHotKeys]; + [panel setKeyCombo:[hotKeysDictionary objectForKey:[hotKeysArray objectAtIndex:[hotKeysTableView selectedRow]]]]; + [panel setKeyBindingName:[hotKeyNamesArray objectAtIndex:[hotKeysTableView selectedRow]]]; + if ([panel runModal] == NSOKButton) { + NSEnumerator *keyEnumerator = [[hotKeysDictionary allKeys] objectEnumerator]; + NSString *nextKey; + keyCombo = [panel keyCombo]; + + //Check for duplicate key combo + while ( (nextKey = [keyEnumerator nextObject]) ) { + if ([[hotKeysDictionary objectForKey:nextKey] isEqual:keyCombo] && + ![keyCombo isEqual:[ITKeyCombo clearKeyCombo]]) { + [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] + forKey:nextKey]; + [df setObject:[[ITKeyCombo clearKeyCombo] plistRepresentation] + forKey:nextKey]; + } + } + + [hotKeysDictionary setObject:keyCombo forKey:keyComboKey]; + [df setObject:[keyCombo plistRepresentation] forKey:keyComboKey]; + [controller setupHotKeys]; + [hotKeysTableView reloadData]; + ITDebugLog(@"Set combo %@ on hot key %@.", keyCombo, keyComboKey); + } else { + ITDebugLog(@"Hot key setting on hot key %@ cancelled.", keyComboKey); + } } -- (void)setKeyCombo:(ITKeyCombo *)newCombo +- (void)hotKeysTableViewDoubleClicked:(id)sender { - NSString *string; - [combo release]; - combo = [newCombo copy]; - - string = [combo description]; - if (string == nil) { - string = @"(None)"; + if ([sender clickedRow] > -1) { + [self editHotKey:sender]; } - [keyComboField setStringValue:string]; } - /*************************************************************************/ #pragma mark - #pragma mark PRIVATE METHOD IMPLEMENTATIONS @@ -478,8 +391,9 @@ static PreferencesController *prefs = nil; - (void)setupWindow { + ITDebugLog(@"Loading Preferences.nib."); if (![NSBundle loadNibNamed:@"Preferences" owner:self]) { - NSLog(@"MenuTunes: Failed to load Preferences.nib"); + ITDebugLog(@"Failed to load Preferences.nib."); NSBeep(); return; } @@ -488,7 +402,7 @@ static PreferencesController *prefs = nil; - (void)setupCustomizationTables { NSImageCell *imgCell = [[[NSImageCell alloc] initImageCell:nil] autorelease]; - + ITDebugLog(@"Setting up table views."); // Set the table view cells up [imgCell setImageScaling:NSScaleNone]; [[menuTableView tableColumnWithIdentifier:@"submenu"] setDataCell:imgCell]; @@ -509,6 +423,7 @@ static PreferencesController *prefs = nil; { NSEnumerator *itemEnum; id anItem; + ITDebugLog(@"Setting up table view arrays."); // Set the list of items you can have. availableItems = [[NSMutableArray alloc] initWithObjects: @"separator", @@ -550,121 +465,26 @@ static PreferencesController *prefs = nil; { NSMutableDictionary *loginwindow; NSMutableArray *loginarray; - NSEnumerator *loginEnum; + NSEnumerator *loginEnum, *keyArrayEnum; id anItem; + ITDebugLog(@"Setting up preferences UI."); // Fill in the number of songs in advance to show field [songsInAdvance setIntValue:[df integerForKey:@"SongsInAdvance"]]; - // Fill in hot key buttons - if ([df objectForKey:@"PlayPause"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PlayPause"]]; - [hotKeysDictionary setObject:anItem forKey:@"PlayPause"]; - [playPauseButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"PlayPause"]; - [playPauseButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"NextTrack"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"NextTrack"]]; - [hotKeysDictionary setObject:anItem forKey:@"NextTrack"]; - [nextTrackButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"NextTrack"]; - [nextTrackButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"PrevTrack"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PrevTrack"]]; - [hotKeysDictionary setObject:anItem forKey:@"PrevTrack"]; - [previousTrackButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"PrevTrack"]; - [previousTrackButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"ShowPlayer"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ShowPlayer"]]; - [hotKeysDictionary setObject:anItem forKey:@"ShowPlayer"]; - [showPlayerButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ShowPlayer"]; - [showPlayerButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"TrackInfo"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"TrackInfo"]]; - [hotKeysDictionary setObject:anItem forKey:@"TrackInfo"]; - [trackInfoButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"TrackInfo"]; - [trackInfoButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"UpcomingSongs"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"UpcomingSongs"]]; - [hotKeysDictionary setObject:anItem forKey:@"UpcomingSongs"]; - [upcomingSongsButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"UpcomingSongs"]; - [upcomingSongsButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"IncrementVolume"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementVolume"]]; - [hotKeysDictionary setObject:anItem forKey:@"IncrementVolume"]; - [volumeIncrementButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"IncrementVolume"]; - [volumeIncrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"DecrementVolume"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementVolume"]]; - [hotKeysDictionary setObject:anItem forKey:@"DecrementVolume"]; - [volumeDecrementButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"DecrementVolume"]; - [volumeDecrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"IncrementRating"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementRating"]]; - [hotKeysDictionary setObject:anItem forKey:@"IncrementRating"]; - [ratingIncrementButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"IncrementRating"]; - [ratingIncrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"DecrementRating"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementRating"]]; - [hotKeysDictionary setObject:anItem forKey:@"DecrementRating"]; - [ratingDecrementButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"DecrementRating"]; - [ratingDecrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } - - if ([df objectForKey:@"ToggleLoop"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleLoop"]]; - [hotKeysDictionary setObject:anItem forKey:@"ToggleLoop"]; - [toggleLoopButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ToggleLoop"]; - [toggleLoopButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; - } + // Fill hot key array + keyArrayEnum = [hotKeysArray objectEnumerator]; - if ([df objectForKey:@"ToggleShuffle"]) { - anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleShuffle"]]; - [hotKeysDictionary setObject:anItem forKey:@"ToggleShuffle"]; - [toggleShuffleButton setTitle:[anItem description]]; - } else { - [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ToggleShuffle"]; - [toggleShuffleButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; + while ( (anItem = [keyArrayEnum nextObject]) ) { + if ([df objectForKey:anItem]) { + ITDebugLog(@"Setting up \"%@\" hot key.", anItem); + [hotKeysDictionary setObject:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:anItem]] forKey:anItem]; + } else { + [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:anItem]; + } } + 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. @@ -675,6 +495,7 @@ static PreferencesController *prefs = nil; [ratingCheckbox setState:[df boolForKey:@"showTrackRating"] ? 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"]; @@ -685,10 +506,25 @@ static PreferencesController *prefs = nil; [launchAtLoginCheckbox setState:NSOnState]; } } + + // Set the launch player checkbox state + ITDebugLog(@"Setting launch player with MenuTunes state."); + [launchPlayerAtLaunchCheckbox setState:[df boolForKey:@"LaunchPlayerWithMT"] ? NSOnState : NSOffState]; + + // Setup the positioning controls + + // Setup effects controls + [appearanceEffectPopup selectItem:[appearanceEffectPopup itemAtIndex:[appearanceEffectPopup indexOfItemWithTag:[df integerForKey:@"statusWindowAppearanceEffect"]]]]; + [vanishEffectPopup selectItem:[vanishEffectPopup itemAtIndex:[vanishEffectPopup indexOfItemWithTag:[df integerForKey:@"statusWindowVanishEffect"]]]]; + [appearanceSpeedSlider setFloatValue:-([df floatForKey:@"statusWindowAppearanceSpeed"])]; + [vanishSpeedSlider setFloatValue:-([df floatForKey:@"statusWindowVanishSpeed"])]; + [vanishDelaySlider setFloatValue:[df floatForKey:@"statusWindowVanishDelay"]]; + [showOnChangeCheckbox setState:([df boolForKey:@"showSongInfoOnChange"] ? NSOnState : NSOffState)]; } - (IBAction)changeMenus:(id)sender { + ITDebugLog(@"Synchronizing menus"); [df setObject:myItems forKey:@"menu"]; [df synchronize]; } @@ -697,7 +533,7 @@ static PreferencesController *prefs = nil; { NSMutableDictionary *loginwindow; NSMutableArray *loginarray; - + ITDebugLog(@"Setting launches at login: %i", flag); [df synchronize]; loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; @@ -720,6 +556,7 @@ static PreferencesController *prefs = nil; [df setPersistentDomain:loginwindow forName:@"loginwindow"]; [df synchronize]; [loginwindow release]; + ITDebugLog(@"Finished setting launches at login."); } @@ -743,38 +580,50 @@ static PreferencesController *prefs = nil; { if (aTableView == menuTableView) { return [myItems count]; - } else { + } else if (aTableView == allTableView) { return [availableItems count]; + } else { + return [hotKeysArray count]; } } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { if (aTableView == menuTableView) { + NSString *object = [myItems objectAtIndex:rowIndex]; if ([[aTableColumn identifier] isEqualToString:@"name"]) { - NSString *object = [myItems objectAtIndex:rowIndex]; - if ([object isEqualToString:@"Show Player"]) { + if ([object isEqualToString:@"showPlayer"]) { return [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"show", @"Show"), [[controller currentRemote] playerSimpleName]]; } return NSLocalizedString(object, @"ERROR"); } else { - if ([submenuItems containsObject:[myItems objectAtIndex:rowIndex]]) + if ([submenuItems containsObject:object]) { return [NSImage imageNamed:@"submenu"]; } else { return nil; } } - } else { + } else if (aTableView == allTableView) { + NSString *object = [availableItems objectAtIndex:rowIndex]; if ([[aTableColumn identifier] isEqualToString:@"name"]) { - return NSLocalizedString([availableItems objectAtIndex:rowIndex], @"ERROR"); + if ([object isEqualToString:@"showPlayer"]) { + return [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"show", @"Show"), [[controller currentRemote] playerSimpleName]]; + } + return NSLocalizedString(object, @"ERROR"); } else { - if ([submenuItems containsObject:[availableItems objectAtIndex:rowIndex]]) { + if ([submenuItems containsObject:object]) { return [NSImage imageNamed:@"submenu"]; } else { return nil; } } + } else { + if ([[aTableColumn identifier] isEqualToString:@"name"]) { + return [hotKeyNamesArray objectAtIndex:rowIndex]; + } else { + return [[hotKeysDictionary objectForKey:[hotKeysArray objectAtIndex:rowIndex]] description]; + } } } @@ -814,7 +663,7 @@ static PreferencesController *prefs = nil; } else { [myItems removeObjectAtIndex:dragRow + 1]; } - } else { + } else if (tableView == allTableView) { if (![temp isEqualToString:@"separator"]) { [availableItems addObject:temp]; } @@ -847,7 +696,7 @@ static PreferencesController *prefs = nil; if ([[[info draggingPasteboard] types] containsObject:@"MenuTableViewPboardType"]) { NSString *item = [myItems objectAtIndex:[[[info draggingPasteboard] stringForType:@"MenuTableViewPboardType"] intValue]]; - if ([item isEqualToString:@"preferences"]) { + if ([item isEqualToString:@"preferences"] || [item isEqualToString:@"quit"]) { return NSDragOperationNone; } } @@ -860,7 +709,6 @@ static PreferencesController *prefs = nil; { return NSDragOperationNone; } - return NSDragOperationGeneric; } @@ -872,9 +720,8 @@ static PreferencesController *prefs = nil; - (void)dealloc { - [self setKeyCombo:nil]; + [hotKeysArray release]; [hotKeysDictionary release]; - [keyComboPanel release]; [menuTableView setDataSource:nil]; [allTableView setDataSource:nil]; [controller release]; @@ -884,5 +731,4 @@ static PreferencesController *prefs = nil; [df release]; } - @end