From: Kent Sutherland Date: Sun, 1 Dec 2002 16:50:45 +0000 (+0000) Subject: Added launch at login. X-Git-Tag: v1.0~278 X-Git-Url: http://git.ithinksw.org/MenuTunes.git/commitdiff_plain/fcbc4baf73d5054212eb69f728ef9c303e1c62a5 Added launch at login. --- diff --git a/English.lproj/Preferences.nib/classes.nib b/English.lproj/Preferences.nib/classes.nib index 3c22618..10e4f8f 100755 --- a/English.lproj/Preferences.nib/classes.nib +++ b/English.lproj/Preferences.nib/classes.nib @@ -22,22 +22,19 @@ albumCheckbox = NSButton; allTableView = NSTableView; artistCheckbox = NSButton; - genreCheckbox = NSButton; keyComboField = NSTextField; keyComboPanel = NSPanel; + launchAtLoginCheckbox = NSButton; menuTableView = NSTableView; nameCheckbox = NSButton; nextTrackButton = NSButton; playPauseButton = NSButton; previousTrackButton = NSButton; - songRatingCheckbox = NSButton; songsInAdvance = NSTextField; trackInfoButton = NSButton; - trackNumberCheckbox = NSButton; trackTimeCheckbox = NSButton; upcomingSongsButton = NSButton; window = NSWindow; - yearCheckbox = NSButton; }; SUPERCLASS = NSObject; } diff --git a/English.lproj/Preferences.nib/objects.nib b/English.lproj/Preferences.nib/objects.nib index bbf55df..d14359c 100755 Binary files a/English.lproj/Preferences.nib/objects.nib and b/English.lproj/Preferences.nib/objects.nib differ diff --git a/MenuTunes.h b/MenuTunes.h index e726be6..e31a663 100755 --- a/MenuTunes.h +++ b/MenuTunes.h @@ -14,7 +14,6 @@ //Used in updating the menu automatically NSTimer *refreshTimer; int curTrackIndex; - NSString *curPlaylist; int trackInfoIndex; ProcessSerialNumber iTunesPSN; @@ -28,6 +27,10 @@ NSMenuItem *playlistItem; NSMenu *playlistMenu; + //For EQ sets + NSMenuItem *eqItem; + NSMenu *eqMenu; + NSMenuItem *playPauseMenuItem; //Toggle between 'Play' and 'Pause' PreferencesController *prefsController; @@ -38,6 +41,7 @@ - (void)updateMenu; - (void)rebuildUpcomingSongsMenu; - (void)rebuildPlaylistMenu; +- (void)rebuildEQPresetsMenu; - (void)clearHotKeys; - (void)setupHotKeys; diff --git a/MenuTunes.m b/MenuTunes.m index 9879f8a..0227042 100755 --- a/MenuTunes.m +++ b/MenuTunes.m @@ -7,17 +7,14 @@ /* Things to do: -¥ Radio mode makes things ugly -¥ Add other options to the menu - - EQ sets - - set song rating +¥ Radio mode makes things act oddly ¥ Make preferences window pretty ¥ Hot Keys - hot keys can't be set when NSBGOnly is on. The window is not key, - so the KeyBroadcaster does not pick up key combos. Bad... - - the hotkey classes are ugly, I didn't write them -¥ Optimize code -¥ Apple Events! + so the KeyBroadcaster does not pick up key combos + - going to need a different way of defining key combos +¥ Optimize, this thing is big and slow :( +¥ Apple Events! Apple Events! Apple Events! */ #import "MenuTunes.h" @@ -30,44 +27,37 @@ Things to do: - (void)applicationDidFinishLaunching:(NSNotification *)note { - menu = [[NSMenu alloc] initWithTitle:@""]; - if (![[NSUserDefaults standardUserDefaults] objectForKey:@"menu"]) { [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", @"Upcoming Songs", @"Playlists", @"", @"PreferencesÉ", @"Quit", @"", @"Current Track Info", nil] forKey:@"menu"]; } + menu = [[NSMenu alloc] initWithTitle:@""]; iTunesPSN = [self iTunesPSN]; //Get PSN of iTunes if it's running - [self rebuildMenu]; //Create the status item menu - - statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength]; - [statusItem setImage:[NSImage imageNamed:@"menu.tiff"]]; - [statusItem setHighlightMode:YES]; - [statusItem setMenu:menu]; - [statusItem retain]; - - view = [[MenuTunesView alloc] initWithFrame:[[statusItem view] frame]]; - //[statusItem setView:view]; - //If iTunes is running, start the timer if (!((iTunesPSN.highLongOfPSN == kNoProcess) && (iTunesPSN.lowLongOfPSN == 0))) { + [self rebuildMenu]; refreshTimer = [NSTimer scheduledTimerWithTimeInterval:3.5 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } else { - NSMenu *menu2 = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - //Register for the workspace note + menu = [[NSMenu alloc] initWithTitle:@""]; + [[menu addItemWithTitle:@"Open iTunes" action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(iTunesLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; - refreshTimer = NULL; - - [[menu2 addItemWithTitle:@"Open iTunes" action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self]; - [[menu2 addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; - [[menu2 addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; - [statusItem setMenu:menu2]; + refreshTimer = nil; } + + statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength]; + [statusItem setImage:[NSImage imageNamed:@"menu.tiff"]]; + [statusItem setHighlightMode:YES]; + [statusItem setMenu:menu]; + [statusItem retain]; + view = [[MenuTunesView alloc] initWithFrame:[[statusItem view] frame]]; + //[statusItem setView:view]; } - (void)applicationWillTerminate:(NSNotification *)note @@ -95,14 +85,7 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; int i; trackInfoIndex = -1; - if (!((iTunesPSN.highLongOfPSN == kNoProcess) && (iTunesPSN.lowLongOfPSN == 0))) - { - didHaveAlbumName = (([[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn album of current track\nend tell"] length] > 0) ? YES : NO); - } - else - { - didHaveAlbumName = NO; - } + didHaveAlbumName = (([[self runScriptAndReturnResult:@"return album of current track"] length] > 0) ? YES : NO); while ([menu numberOfItems] > 0) { @@ -112,6 +95,11 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; playPauseMenuItem = nil; upcomingSongsItem = nil; playlistItem = nil; + [playlistMenu release]; + playlistMenu = nil; + eqItem = nil; + [eqMenu release]; + eqMenu = nil; for (i = 0; i < [myMenu count]; i++) { @@ -145,6 +133,10 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; { playlistItem = [menu addItemWithTitle:@"Playlists" action:NULL keyEquivalent:@""]; } + else if ([item isEqualToString:@"EQ Presets"]) + { + eqItem = [menu addItemWithTitle:@"EQ Presets" action:NULL keyEquivalent:@""]; + } else if ([item isEqualToString:@"PreferencesÉ"]) { [[menu addItemWithTitle:@"PreferencesÉ" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; @@ -182,8 +174,8 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } //Get the current track name and album. - curSongName = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn name of current track\nend tell"]; - curAlbumName = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn album of current track\nend tell"]; + curSongName = [self runScriptAndReturnResult:@"return name of current track"]; + curAlbumName = [self runScriptAndReturnResult:@"return album of current track"]; if (upcomingSongsItem) { @@ -193,6 +185,10 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; { [self rebuildPlaylistMenu]; } + if (eqItem) + { + [self rebuildEQPresetsMenu]; + } if ([curSongName length] > 0) { @@ -245,12 +241,12 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; //Rebuild the upcoming songs submenu. Can be improved a lot. - (void)rebuildUpcomingSongsMenu { - int numSongs = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn number of tracks in current playlist\nend tell"] intValue]; + int numSongs = [[self runScriptAndReturnResult:@"return number of tracks in current playlist"] intValue]; int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"]; if (numSongs > 0) { - int curTrack = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn index of current track\nend tell"] intValue]; + int curTrack = [[self runScriptAndReturnResult:@"return index of current track"] intValue]; int i; [upcomingSongsMenu release]; @@ -260,10 +256,11 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; { if (i <= numSongs) { - NSString *curSong = [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nreturn name of track %i of current playlist\nend tell", i]]; + NSString *curSong = [self runScriptAndReturnResult:[NSString stringWithFormat:@"return name of track %i of current playlist", i]]; NSMenuItem *songItem; songItem = [[NSMenuItem alloc] initWithTitle:curSong action:@selector(playTrack:) keyEquivalent:@""]; [songItem setTarget:self]; + [songItem setEnabled:YES]; [songItem setRepresentedObject:[NSNumber numberWithInt:i]]; [upcomingSongsMenu addItem:songItem]; [songItem release]; @@ -275,20 +272,24 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } } [upcomingSongsItem setSubmenu:upcomingSongsMenu]; + [upcomingSongsItem setEnabled:YES]; } } - (void)rebuildPlaylistMenu { - int numPlaylists = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn number of playlists\nend tell"] intValue]; - int i; + int numPlaylists = [[self runScriptAndReturnResult:@"return number of playlists"] intValue]; + int i, curPlaylist = [[self runScriptAndReturnResult:@"return index of current playlist"] intValue]; + + if (playlistMenu && (numPlaylists == [playlistMenu numberOfItems])) + return; [playlistMenu release]; playlistMenu = [[NSMenu alloc] initWithTitle:@""]; for (i = 1; i <= numPlaylists; i++) { - NSString *playlistName = [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nreturn name of playlist %i\nend tell", i]]; + NSString *playlistName = [self runScriptAndReturnResult:[NSString stringWithFormat:@"return name of playlist %i", i]]; NSMenuItem *tempItem; tempItem = [[NSMenuItem alloc] initWithTitle:playlistName action:@selector(selectPlaylist:) keyEquivalent:@""]; [tempItem setTarget:self]; @@ -297,6 +298,38 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; [tempItem release]; } [playlistItem setSubmenu:playlistMenu]; + + if (curPlaylist) + { + [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOnState]; + } +} + +//Build a menu with the list of all available EQ presets +- (void)rebuildEQPresetsMenu +{ + int numSets = [[self runScriptAndReturnResult:@"return number of EQ presets"] intValue]; + int i; + + if (eqMenu && (numSets == [eqMenu numberOfItems])) + return; + + [eqMenu release]; + eqMenu = [[NSMenu alloc] initWithTitle:@""]; + + for (i = 1; i <= numSets; i++) + { + NSString *setName = [self runScriptAndReturnResult:[NSString stringWithFormat:@"return name of EQ preset %i", i]]; + NSMenuItem *tempItem; + tempItem = [[NSMenuItem alloc] initWithTitle:setName action:@selector(selectEQPreset:) keyEquivalent:@""]; + [tempItem setTarget:self]; + [tempItem setRepresentedObject:[NSNumber numberWithInt:i]]; + [eqMenu addItem:tempItem]; + [tempItem release]; + } + [eqItem setSubmenu:eqMenu]; + + [[eqMenu itemAtIndex:[[self runScriptAndReturnResult:@"return index of current EQ preset"] intValue] - 1] setState:NSOnState]; } - (void)clearHotKeys @@ -348,7 +381,7 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } } -//Runs an AppleScript and returns the result as an NSString after stripping quotes, if needed. +//Runs an AppleScript and returns the result as an NSString after stripping quotes, if needed. It takes in script and automatically adds the tell iTunes and end tell statements. - (NSString *)runScriptAndReturnResult:(NSString *)script { AEDesc scriptDesc, resultDesc; @@ -356,6 +389,8 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; NSString *result; Ptr buffer; + script = [NSString stringWithFormat:@"tell application \"iTunes\"\n%@\nend tell", script]; + AECreateDesc(typeChar, [script cString], [script cStringLength], &scriptDesc); @@ -381,29 +416,19 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; - (void)timerUpdate { int pid; - if ((GetProcessPID(&iTunesPSN, &pid) == noErr) && (pid > 0)) + if (GetProcessPID(&iTunesPSN, &pid) == noErr) { - int trackPlayingIndex = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn index of current track\nend tell"] intValue]; + int trackPlayingIndex = [[self runScriptAndReturnResult:@"return index of current track"] intValue]; if (trackPlayingIndex != curTrackIndex) { [self updateMenu]; curTrackIndex = trackPlayingIndex; } - /*else - { - NSString *playlist = [self runScriptAndReturnResult:@"tell application\n\"iTunes\"\nreturn name of current playlist\nend tell"]; - - if (![playlist isEqualToString:curPlaylist]) - { - [self updateMenu]; - NSLog(@"update due to playlist change"); - curPlaylist = [NSString stringWithString:playlist]; - } - }*/ + //Update Play/Pause menu item if (playPauseMenuItem) { - if ([[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn player state\nend tell"] isEqualToString:@"playing"]) + if ([[self runScriptAndReturnResult:@"return player state"] isEqualToString:@"playing"]) { [playPauseMenuItem setTitle:@"Pause"]; } @@ -415,19 +440,17 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } else { - NSMenu *menu2 = [[[NSMenu alloc] initWithTitle:@""] autorelease]; + [menu release]; + menu = [[NSMenu alloc] initWithTitle:@""]; + [[menu addItemWithTitle:@"Open iTunes" action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; + [statusItem setMenu:menu]; - [refreshTimer invalidate]; //Stop the timer - refreshTimer = NULL; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(iTunesLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; - - [[menu2 addItemWithTitle:@"Open iTunes" -action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self]; - [[menu2 addItemWithTitle:@"Preferences" -action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; - [[menu2 addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) -keyEquivalent:@""] setTarget:self]; - [statusItem setMenu:menu2]; + [refreshTimer invalidate]; + refreshTimer = nil; + [self clearHotKeys]; } } @@ -443,7 +466,6 @@ keyEquivalent:@""] setTarget:self]; [self rebuildMenu]; //Rebuild the menu since no songs will be playing [statusItem setMenu:menu]; //Set the menu back to the main one - [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self]; } @@ -457,7 +479,6 @@ keyEquivalent:@""] setTarget:self]; while ( (GetNextProcess(&procNum) == noErr) ) { CFStringRef procName; - if ( (CopyProcessName(&procNum, &procName) == noErr) ) { if ([(NSString *)procName isEqualToString:@"iTunes"]) @@ -490,19 +511,31 @@ andEventID:(AEEventID)eventID - (void)playTrack:(id)sender { - [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nplay track %i of current playlist\nend tell", [[sender representedObject] intValue]]]; + [self runScriptAndReturnResult:[NSString stringWithFormat:@"play track %i of current playlist", [[sender representedObject] intValue]]]; [self updateMenu]; } - (void)selectPlaylist:(id)sender { - [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nplay playlist %i\nend tell", [[sender representedObject] intValue]]]; + int playlist = [[sender representedObject] intValue]; + [self runScriptAndReturnResult:[NSString stringWithFormat:@"play playlist %i", playlist]]; + [[playlistMenu itemAtIndex:playlist - 1] setState:NSOnState]; [self updateMenu]; } +- (void)selectEQPreset:(id)sender +{ + int curSet = [[self runScriptAndReturnResult:@"return index of current EQ preset"] intValue]; + int item = [[sender representedObject] intValue]; + [self runScriptAndReturnResult:[NSString stringWithFormat:@"set current EQ preset to EQ preset %i", item]]; + [self runScriptAndReturnResult:@"set EQ enabled to 1"]; + [[eqMenu itemAtIndex:curSet - 1] setState:NSOffState]; + [[eqMenu itemAtIndex:item - 1] setState:NSOnState]; +} + - (void)playPause:(id)sender { - NSString *state = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn player state\nend tell"]; + NSString *state = [self runScriptAndReturnResult:@"return player state"]; if ([state isEqualToString:@"playing"]) { [self sendAEWithEventClass:'hook' andEventID:'Paus']; @@ -563,7 +596,10 @@ isEqualToString:@"rewinding"]) - (void)closePreferences { - [self setupHotKeys]; + if (!((iTunesPSN.highLongOfPSN == kNoProcess) && (iTunesPSN.lowLongOfPSN == 0))) + { + [self setupHotKeys]; + } [prefsController release]; prefsController = nil; } @@ -576,7 +612,7 @@ isEqualToString:@"rewinding"]) - (void)showCurrentTrackInfo { - NSString *trackName = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn name of current track\nend tell"]; + NSString *trackName = [self runScriptAndReturnResult:@"return name of current track"]; if (!statusController && [trackName length]) { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; @@ -585,40 +621,43 @@ isEqualToString:@"rewinding"]) if ([defaults boolForKey:@"showName"]) { + if ([defaults boolForKey:@"showArtist"]) + { + NSString *trackArtist = [self runScriptAndReturnResult:@"return artist of current track"]; + trackName = [NSString stringWithFormat:@"%@ - %@", trackArtist, trackName]; + } stringToShow = [stringToShow stringByAppendingString:trackName]; stringToShow = [stringToShow stringByAppendingString:@"\n"]; - lines++; - } - - if ([defaults boolForKey:@"showArtist"]) - { - NSString *trackArtist = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn artist of current track\nend tell"]; - stringToShow = [stringToShow stringByAppendingString:trackArtist]; - stringToShow = [stringToShow stringByAppendingString:@"\n"]; + if ([trackName length] > 38) + { + lines++; + } lines++; } if ([defaults boolForKey:@"showAlbum"]) { - NSString *trackAlbum = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn album of current track\nend tell"]; - stringToShow = [stringToShow stringByAppendingString:trackAlbum]; - stringToShow = [stringToShow stringByAppendingString:@"\n"]; - lines++; + NSString *trackAlbum = [self runScriptAndReturnResult:@"return album of current track"]; + if ([trackAlbum length]) + { + stringToShow = [stringToShow stringByAppendingString:trackAlbum]; + stringToShow = [stringToShow stringByAppendingString:@"\n"]; + lines++; + } } - //Rating - maybe - //Year - maybe - if ([defaults boolForKey:@"showTime"]) { - NSString *trackLength = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn time of current track\nend tell"]; - stringToShow = [stringToShow stringByAppendingString:trackLength]; - stringToShow = [stringToShow stringByAppendingString:@"\n"]; - lines++; + NSString *trackTime = [self runScriptAndReturnResult:@"return time of current track"]; + if ([trackTime length]) + { + stringToShow = [NSString stringWithFormat:@"%@Total Time: %@\n", stringToShow, trackTime]; + lines++; + } } { - int trackTimeLeft = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn (duration of current track) - player position\nend tell"] intValue]; + int trackTimeLeft = [[self runScriptAndReturnResult:@"return (duration of current track) - player position"] intValue]; int minutes = trackTimeLeft / 60, seconds = trackTimeLeft % 60; if (seconds < 10) { @@ -642,12 +681,12 @@ isEqualToString:@"rewinding"]) { if (!statusController) { - int numSongs = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn number of tracks in current playlist\nend tell"] intValue]; + int numSongs = [[self runScriptAndReturnResult:@"return number of tracks in current playlist"] intValue]; if (numSongs > 0) { int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"]; - int curTrack = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn index of current track\nend tell"] intValue]; + int curTrack = [[self runScriptAndReturnResult:@"return index of current track"] intValue]; int i; NSString *songs = @""; @@ -656,7 +695,7 @@ isEqualToString:@"rewinding"]) { if (i <= numSongs) { - NSString *curSong = [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nreturn name of track %i of current playlist\nend tell", i]]; + NSString *curSong = [self runScriptAndReturnResult:[NSString stringWithFormat:@"return name of track %i of current playlist", i]]; songs = [songs stringByAppendingString:curSong]; songs = [songs stringByAppendingString:@"\n"]; } diff --git a/PreferencesController.h b/PreferencesController.h index f1e3be7..e03a1c8 100755 --- a/PreferencesController.h +++ b/PreferencesController.h @@ -11,19 +11,17 @@ IBOutlet NSButton *artistCheckbox; IBOutlet NSTextField *keyComboField; IBOutlet NSPanel *keyComboPanel; + IBOutlet NSButton *launchAtLoginCheckbox; IBOutlet NSTableView *menuTableView; IBOutlet NSButton *nameCheckbox; IBOutlet NSButton *nextTrackButton; IBOutlet NSButton *playPauseButton; IBOutlet NSButton *previousTrackButton; - IBOutlet NSButton *songRatingCheckbox; IBOutlet NSTextField *songsInAdvance; IBOutlet NSButton *trackInfoButton; - IBOutlet NSButton *trackNumberCheckbox; IBOutlet NSButton *trackTimeCheckbox; IBOutlet NSButton *upcomingSongsButton; IBOutlet NSWindow *window; - IBOutlet NSButton *yearCheckbox; MenuTunes *mt; NSMutableArray *availableItems, *myItems; diff --git a/PreferencesController.m b/PreferencesController.m index 9568696..4a2d389 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -33,13 +33,13 @@ [allTableView registerForDraggedTypes:[NSArray arrayWithObjects:@"MenuTableViewPboardType", @"AllTableViewPboardType", nil]]; //Set the list of items you can have. - availableItems = [[NSMutableArray alloc] initWithObjects:@"Current Track Info", @"Upcoming Songs", @"Playlists", @"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", nil]; + availableItems = [[NSMutableArray alloc] initWithObjects:@"Current Track Info", @"Upcoming Songs", @"Playlists", @"EQ Presets", @"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", nil]; //Get our preferred menu myItems = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"] mutableCopy]; if (myItems == nil) { - myItems = [[NSMutableArray alloc] initWithObjects:@"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", @"Upcoming Songs", @"Playlists", @"", @"PreferencesÉ", @"Quit", @"", @"Current Track Info", nil]; + myItems = [[NSMutableArray alloc] initWithObjects:@"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", @"Upcoming Songs", @"Playlists", @"EQ Presets", @"", @"PreferencesÉ", @"Quit", @"", @"Current Track Info", nil]; [[NSUserDefaults standardUserDefaults] setObject:myItems forKey:@"menu"]; } @@ -54,7 +54,7 @@ } //Items that show should a submenu image - submenuItems = [[NSArray alloc] initWithObjects:@"Upcoming Songs", @"Playlists", nil]; + submenuItems = [[NSArray alloc] initWithObjects:@"Upcoming Songs", @"Playlists", @"EQ Presets", nil]; //Fill in the number of songs in advance to show field if ([defaults integerForKey:@"SongsInAdvance"]) @@ -145,10 +145,31 @@ } [artistCheckbox setState:[defaults boolForKey:@"showArtist"] ? NSOnState : NSOffState]; - [songRatingCheckbox setState:[defaults boolForKey:@"showRating"] ? NSOnState : NSOffState]; - [trackNumberCheckbox setState:[defaults boolForKey:@"showTrackNum"] ? NSOnState : NSOffState]; [trackTimeCheckbox setState:[defaults boolForKey:@"showTime"] ? NSOnState : NSOffState]; - [yearCheckbox setState:[defaults boolForKey:@"showYear"] ? NSOnState : NSOffState]; + + //Set the launch at login checkbox state + { + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + int i; + + [defaults synchronize]; + loginwindow = [[defaults persistentDomainForName:@"loginwindow"] mutableCopy]; + loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; + + for (i = 0; i < [loginarray count]; i++) + { + NSDictionary *tempDict = [loginarray objectAtIndex:i]; + + //Here we are seeing if our program is already in loginwindow.plist. + //See the problem below for this problem here. We will do the same thing. + + if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:@"VocabularyBuilder.app"]) + { + [launchAtLoginCheckbox setState:NSOnState]; + } + } + } } return self; } @@ -172,6 +193,7 @@ - (IBAction)apply:(id)sender { + ProcessSerialNumber psn; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:myItems forKey:@"menu"]; @@ -186,10 +208,64 @@ [defaults setBool:[albumCheckbox state] forKey:@"showAlbum"]; [defaults setBool:[nameCheckbox state] forKey:@"showName"]; [defaults setBool:[artistCheckbox state] forKey:@"showArtist"]; - [defaults setBool:[songRatingCheckbox state] forKey:@"showRating"]; - [defaults setBool:[trackNumberCheckbox state] forKey:@"showTrackNum"]; [defaults setBool:[trackTimeCheckbox state] forKey:@"showTime"]; - [defaults setBool:[yearCheckbox state] forKey:@"showYear"]; + + //Here we set whether we will launch at login by modifying loginwindow.plist + if ([launchAtLoginCheckbox state] == NSOnState) + { + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + int i; + BOOL skip = NO; + + [defaults synchronize]; + loginwindow = [[defaults persistentDomainForName:@"loginwindow"] mutableCopy]; + loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; + + for (i = 0; i < [loginarray count]; i++) + { + NSDictionary *tempDict = [loginarray objectAtIndex:i]; + + //Here we are seeing if our program is already in loginwindow.plist. + //See the problem below for this problem here. We will do the same thing. + + if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:@"VocabularyBuilder.app"]) + { + skip = YES; + } + } + + if (!skip) + { + [loginarray addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], @"Hide", [[NSBundle mainBundle] bundlePath], @"Path", nil]]; + + [defaults setPersistentDomain:loginwindow forName:@"loginwindow"]; + [defaults synchronize]; + } + } + else + { + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + int i; + + [[NSUserDefaults standardUserDefaults] synchronize]; + loginwindow = [[[NSUserDefaults standardUserDefaults] persistentDomainForName:@"loginwindow"] mutableCopy]; + loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; + + for (i = 0; i < [loginarray count]; i++) + { + NSDictionary *tempDict = [loginarray objectAtIndex:i]; + + if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:@"VocabularyBuilder.app"]) + { + [loginarray removeObjectAtIndex:i]; + [defaults setPersistentDomain:loginwindow forName:@"loginwindow"]; + [defaults synchronize]; + break; + } + } + } //Set songs in advance if ([songsInAdvance intValue]) @@ -201,7 +277,11 @@ [defaults setInteger:5 forKey:@"SongsInAdvance"]; } - [mt rebuildMenu]; + psn = [mt iTunesPSN]; + if (!((psn.highLongOfPSN == kNoProcess) && (psn.lowLongOfPSN == 0))) + { + [mt rebuildMenu]; + } [mt clearHotKeys]; } diff --git a/StatusWindowController.m b/StatusWindowController.m index a9859c3..807e89c 100755 --- a/StatusWindowController.m +++ b/StatusWindowController.m @@ -32,7 +32,6 @@ - (void)fadeWindowOut { [NSThread detachNewThreadSelector:@selector(fadeOutAux) toTarget:self withObject:nil]; - } - (void)fadeOutAux