Added audioscrobbler to the preferences. Haven't hooked it up to the keychain yet.
[MenuTunes.git] / PreferencesController.m
index 4773ab8..139872a 100755 (executable)
@@ -7,13 +7,15 @@
 #import "StatusWindowController.h"
 #import "CustomMenuTableView.h"
 
+#import <Security/Security.h>
+
 #import <netinet/in.h>
 #import <arpa/inet.h>
 #import <openssl/sha.h>
 #import <sys/types.h>
 #import <sys/stat.h>
 
-#import <ITFoundation/ITLoginItem.h>
+#import <ITKit/ITLoginItem.h>
 
 #import <ITKit/ITHotKeyCenter.h>
 #import <ITKit/ITKeyCombo.h>
@@ -42,6 +44,7 @@
 - (void)setupCustomizationTables;
 - (void)setupMenuItems;
 - (void)setupUI;
+- (void)setupScreenPopup;
 - (void)setStatusWindowEntryEffect:(Class)effectClass;
 - (void)setStatusWindowExitEffect:(Class)effectClass;
 - (void)setCustomColor:(NSColor *)color updateWell:(BOOL)update;
@@ -86,6 +89,8 @@ static PreferencesController *prefs = nil;
         hotKeysArray = [[NSArray alloc] initWithObjects:@"PlayPause",
                                                        @"NextTrack",
                                                        @"PrevTrack",
+                                                       @"FastForward",
+                                                       @"Rewind",
                                                        @"ShowPlayer",
                                                        @"TrackInfo",
                                                        @"UpcomingSongs",
@@ -95,11 +100,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",
@@ -109,6 +124,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;
@@ -188,6 +211,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,7 +225,9 @@ static PreferencesController *prefs = nil;
     [self resetRemotePlayerTextFields];
     [launchAtLoginCheckbox becomeFirstResponder];
     [NSApp activateIgnoringOtherApps:YES];
-    [window center];
+       if (![window isVisible]) {
+               [window center];
+       }
     [window orderFrontRegardless];
     [window makeKeyWindow];
 }
@@ -216,7 +242,7 @@ static PreferencesController *prefs = nil;
     } else if ( [sender tag] == 1030) {
         [df setInteger:[sender intValue] forKey:@"SongsInAdvance"];
         if ([[controller currentRemote] playerRunningState] == ITMTRemotePlayerRunning) {
-            [[controller menuController] rebuildSubmenus];
+            [[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.
@@ -231,6 +257,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) {
@@ -246,7 +274,31 @@ static PreferencesController *prefs = nil;
     } else if ( [sender tag] == 1120) {
         mkdir([[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"] cString], 0744);
         [[NSWorkspace sharedWorkspace] openFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"]];
-    }
+    } else if ( [sender tag] == 6010) {
+               //Toggle the other Audioscrobbler options
+               [df setBool:SENDER_STATE forKey:@"audioscrobblerEnabled"];
+               [audioscrobblerUseCacheCheckbox setEnabled:SENDER_STATE];
+               [audioscrobblerUserTextField setEnabled:SENDER_STATE];
+               [audioscrobblerPasswordTextField setEnabled:SENDER_STATE];
+       } else if ( [sender tag ] == 6015) {
+               [df setString:[sender stringValue] forKey:@"audioscrobblerUser"];
+       } else if ( [sender tag ] == 6030) {
+               //Set the password in the keychain
+               char *service = "Audioscrobbler";
+               NSString *account = [df stringForKey:@"audioscrobblerUser"];
+               SecKeychainItemRef item;
+               OSStatus status = SecKeychainFindGenericPassword(NULL, strlen(service), service, [account length], [account UTF8String], NULL, NULL, &item);
+               if (status == errSecItemNotFound) {
+                       //Create the keychain
+               } else if (status == noErr) {
+                       //Modify the current item
+                       //SecKeychainItemFreeContent(NULL, item);
+               } else {
+                       ITDebugLog(@"Audioscrobbler: Unable to retrieve keychain password.");
+               }
+       } else if ( [sender tag] == 6045) {
+               [df setBool:SENDER_STATE forKey:@"audioscrobblerCacheSubmissions"];
+       }
     [df synchronize];
 }
 
@@ -443,7 +495,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]];
@@ -532,6 +587,7 @@ static PreferencesController *prefs = nil;
         @"upcomingSongs",
         @"separator",
         @"preferences",
+               @"about",
         @"quit",
         nil] forKey:@"menu"];
 
@@ -552,6 +608,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"];
@@ -718,6 +775,8 @@ static PreferencesController *prefs = nil;
         @"trackInfo",
         @"upcomingSongs",
         @"playlists",
+        @"artists",
+        @"albums",
         @"eqPresets",
         @"songRating",
         @"playPause",
@@ -726,6 +785,7 @@ static PreferencesController *prefs = nil;
         @"fastForward",
         @"rewind",
         @"showPlayer",
+               @"about",
         @"quit",
         nil];
     
@@ -744,6 +804,8 @@ static PreferencesController *prefs = nil;
     submenuItems = [[NSArray alloc] initWithObjects:
         @"upcomingSongs",
         @"playlists",
+        @"artists",
+        @"albums",
         @"eqPresets",
         @"songRating",
         nil];
@@ -756,7 +818,7 @@ static PreferencesController *prefs = nil;
     NSData         *colorData;
     int selectedBGStyle;
     id anItem;
-    
+       
     [df setInteger:MT_CURRENT_VERSION forKey:@"appVersion"];
     
     ITDebugLog(@"Setting up preferences UI.");
@@ -775,6 +837,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];
@@ -784,6 +849,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];
     
@@ -870,6 +936,22 @@ static PreferencesController *prefs = nil;
         [selectSharedPlayerButton setEnabled:YES];
     }
     
+       //Setup the Audioscrobbler controls
+       if ([df boolForKey:@"audioscrobblerEnabled"]) {
+               [audioscrobblerEnabledCheckbox setState:NSOnState];
+               [audioscrobblerUserTextField setEnabled:YES];
+               [audioscrobblerPasswordTextField setEnabled:YES];
+               [audioscrobblerUseCacheCheckbox setEnabled:YES];
+       } else {
+               [audioscrobblerUserTextField setEnabled:NO];
+               [audioscrobblerPasswordTextField setEnabled:NO];
+               [audioscrobblerUseCacheCheckbox setEnabled:NO];
+       }
+       [audioscrobblerUserTextField setStringValue:[df stringForKey:@"audioscrobblerUser"]];
+       if ([[audioscrobblerUserTextField stringValue] length] > 0) {
+               [audioscrobblerPasswordTextField setStringValue:@"******"];
+       }
+       
     [[NSNotificationCenter defaultCenter] addObserver:sharingTableView selector:@selector(reloadData) name:@"ITMTFoundNetService" object:nil];
     
     serverName = [df stringForKey:@"sharedPlayerName"];
@@ -897,6 +979,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];
@@ -994,6 +1100,8 @@ 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];
@@ -1192,6 +1300,7 @@ static PreferencesController *prefs = nil;
 
 - (void)dealloc
 {
+       [[NSNotificationCenter defaultCenter] removeObserver:self];
     [hotKeysArray release];
     [hotKeysDictionary release];
     [effectClasses release];
@@ -1202,6 +1311,7 @@ static PreferencesController *prefs = nil;
     [submenuItems release];
     [myItems release];
     [df release];
+       [super dealloc];
 }
 
 @end