Fixed the state for the playlists menu item to show the currently playing playlist.
[MenuTunes.git] / PreferencesController.m
index 51271ab..02ba0a0 100755 (executable)
@@ -13,7 +13,7 @@
 #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
 
 
@@ -87,6 +87,8 @@ static PreferencesController *prefs = nil;
         hotKeysArray = [[NSArray alloc] initWithObjects:@"PlayPause",
                                                        @"NextTrack",
                                                        @"PrevTrack",
+                                                       @"FastForward",
+                                                       @"Rewind",
                                                        @"ShowPlayer",
                                                        @"TrackInfo",
                                                        @"UpcomingSongs",
@@ -96,11 +98,21 @@ static PreferencesController *prefs = nil;
                                                        @"DecrementRating",
                                                        @"ToggleShuffle",
                                                        @"ToggleLoop",
+                                                                                                          @"ToggleShufflability",
+                                                       @"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",
@@ -110,6 +122,14 @@ static PreferencesController *prefs = nil;
                                                        @"Decrement Rating",
                                                        @"Toggle Shuffle",
                                                        @"Toggle Loop",
+                                                                                                          @"Toggle Song Included In Shuffle",
+                                                       @"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;
@@ -189,6 +209,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
@@ -202,7 +223,9 @@ static PreferencesController *prefs = nil;
     [self resetRemotePlayerTextFields];
     [launchAtLoginCheckbox becomeFirstResponder];
     [NSApp activateIgnoringOtherApps:YES];
-    [window center];
+       if (![window isVisible]) {
+               [window center];
+       }
     [window orderFrontRegardless];
     [window makeKeyWindow];
 }
@@ -211,12 +234,14 @@ static PreferencesController *prefs = nil;
 {
     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"];
@@ -230,6 +255,8 @@ static PreferencesController *prefs = nil;
         [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) {
@@ -442,7 +469,10 @@ 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]];
@@ -519,11 +549,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",
@@ -536,6 +561,7 @@ static PreferencesController *prefs = nil;
         @"upcomingSongs",
         @"separator",
         @"preferences",
+               @"about",
         @"quit",
         nil] forKey:@"menu"];
 
@@ -556,6 +582,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"];
@@ -564,18 +591,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];
     }
 }
@@ -586,7 +602,7 @@ static PreferencesController *prefs = nil;
     [[StatusWindow sharedWindow] vanish:self];
     [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES];
     
-    [self setLaunchesAtLogin:YES];
+    ITSetApplicationLaunchOnLogin([[NSBundle mainBundle] bundlePath], YES);
 }
 
 - (void)autoLaunchCancel
@@ -733,6 +749,8 @@ static PreferencesController *prefs = nil;
         @"trackInfo",
         @"upcomingSongs",
         @"playlists",
+        @"artists",
+        @"albums",
         @"eqPresets",
         @"songRating",
         @"playPause",
@@ -741,6 +759,7 @@ static PreferencesController *prefs = nil;
         @"fastForward",
         @"rewind",
         @"showPlayer",
+               @"about",
         @"quit",
         nil];
     
@@ -759,6 +778,8 @@ static PreferencesController *prefs = nil;
     submenuItems = [[NSArray alloc] initWithObjects:
         @"upcomingSongs",
         @"playlists",
+        @"artists",
+        @"albums",
         @"eqPresets",
         @"songRating",
         nil];
@@ -766,15 +787,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.");
@@ -793,6 +811,9 @@ 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];
@@ -802,6 +823,7 @@ static PreferencesController *prefs = nil;
     [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];
     
@@ -814,15 +836,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
@@ -922,6 +937,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];
@@ -1019,42 +1058,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 -
@@ -1247,6 +1258,7 @@ static PreferencesController *prefs = nil;
 
 - (void)dealloc
 {
+       [[NSNotificationCenter defaultCenter] removeObserver:self];
     [hotKeysArray release];
     [hotKeysDictionary release];
     [effectClasses release];
@@ -1257,6 +1269,7 @@ static PreferencesController *prefs = nil;
     [submenuItems release];
     [myItems release];
     [df release];
+       [super dealloc];
 }
 
 @end