From b5111a52983c34e3d63dd8547a1f259a7cb5edda Mon Sep 17 00:00:00 2001 From: Kent Sutherland Date: Thu, 22 Jul 2004 17:55:35 +0000 Subject: [PATCH] Added -artists and -albums methods to the iTunes remote. Added an artists menu to the menu. Trying to figure out how to effectively deal with the huge menu, and how to keep the speed up. --- English.lproj/Localizable.strings | 2 + ITMTRemote.h | 10 +++ ITMTRemote.m | 15 ++++ MenuController.h | 2 +- MenuController.m | 119 ++++++++++++++++++++++-------- PreferencesController.m | 4 + iTunesRemote.m | 36 +++++++++ 7 files changed, 157 insertions(+), 31 deletions(-) diff --git a/English.lproj/Localizable.strings b/English.lproj/Localizable.strings index ba3b981..1423e53 100755 --- a/English.lproj/Localizable.strings +++ b/English.lproj/Localizable.strings @@ -20,6 +20,8 @@ songRating = "Song Rating"; upcomingSongs = "Upcoming Songs"; playlists = "Playlists"; eqPresets = "EQ Presets"; +artists = "Artists"; +albums = "Albums"; refresh = "Refresh"; open = "Open"; noSongPlaying = "No song is playing."; diff --git a/ITMTRemote.h b/ITMTRemote.h index 7abcedf..91c3512 100755 --- a/ITMTRemote.h +++ b/ITMTRemote.h @@ -204,6 +204,16 @@ er's process managment. */ - (NSArray *)playlists; +/*! + * @method artists + */ +- (NSArray *)artists; + +/*! + * @method albums + */ +- (NSArray *)albums; + /*! * @method numberOfSongsInPlaylistAtIndex: */ diff --git a/ITMTRemote.m b/ITMTRemote.m index bafb49e..183648f 100755 --- a/ITMTRemote.m +++ b/ITMTRemote.m @@ -79,11 +79,26 @@ return nil; } +- (NSArray *)artists +{ + return nil; +} + +- (NSArray *)albums +{ + return nil; +} + - (int)numberOfSources { return nil; } +- (int)numberOfSongsInPlaylistAtIndex:(int)index +{ + return nil; +} + - (ITMTRemotePlayerSource)currentSource { return nil; diff --git a/MenuController.h b/MenuController.h index c9a393b..c9769f3 100755 --- a/MenuController.h +++ b/MenuController.h @@ -42,7 +42,7 @@ typedef enum { { NSMutableArray *_menuLayout; NSMenu *_currentMenu; - NSMenu *_ratingMenu, *_upcomingSongsMenu, *_eqMenu, *_playlistsMenu; //Submenus + NSMenu *_ratingMenu, *_upcomingSongsMenu, *_eqMenu, *_playlistsMenu, *_artistsMenu; //Submenus int _currentPlaylist, _currentTrack; BOOL _playingRadio; diff --git a/MenuController.m b/MenuController.m index 0bc8c2d..c207e66 100755 --- a/MenuController.m +++ b/MenuController.m @@ -21,6 +21,7 @@ - (NSMenu *)upcomingSongsMenu; - (NSMenu *)playlistsMenu; - (NSMenu *)eqMenu; +- (NSMenu *)artistsMenu; - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers onItem:(id )item; - (BOOL)iPodWithNameAutomaticallyUpdates:(NSString *)name; @@ -82,6 +83,11 @@ [tempItem setSubmenu:nil]; } + if ( (tempItem = [_currentMenu itemWithTag:5]) ) { + ITDebugLog(@"Removing \"Artists\" submenu."); + [tempItem setSubmenu:nil]; + } + ITDebugLog(@"Begin building menu."); //create our menu @@ -396,38 +402,50 @@ [[MainController sharedController] networkError:localException]; NS_ENDHANDLER } else if ([nextObject isEqualToString:@"songRating"] && currentSongRating) { - ITDebugLog(@"Add \"Song Rating\" submenu."); - tempItem = [menu addItemWithTitle:NSLocalizedString(@"songRating", @"Song Rating") - action:nil - keyEquivalent:@""]; - [tempItem setSubmenu:_ratingMenu]; - [tempItem setTag:1]; - if (_playingRadio || !_currentPlaylist) { - [tempItem setEnabled:NO]; - } - - itemEnum = [[_ratingMenu itemArray] objectEnumerator]; - while ( (tempItem = [itemEnum nextObject]) ) { - [tempItem setState:NSOffState]; - } - - NS_DURING - [[_ratingMenu itemAtIndex:([mtr currentSongRating] * 5)] setState:NSOnState]; - NS_HANDLER - [[MainController sharedController] networkError:localException]; - NS_ENDHANDLER - } else if ([nextObject isEqualToString:@"upcomingSongs"]) { - ITDebugLog(@"Add \"Upcoming Songs\" submenu."); - tempItem = [menu addItemWithTitle:NSLocalizedString(@"upcomingSongs", @"Upcoming Songs") - action:nil - keyEquivalent:@""]; - [tempItem setSubmenu:_upcomingSongsMenu]; - [tempItem setTag:2]; - if (_playingRadio || !_currentPlaylist) { - [tempItem setEnabled:NO]; - } + ITDebugLog(@"Add \"Song Rating\" submenu."); + tempItem = [menu addItemWithTitle:NSLocalizedString(@"songRating", @"Song Rating") + action:nil + keyEquivalent:@""]; + [tempItem setSubmenu:_ratingMenu]; + [tempItem setTag:1]; + if (_playingRadio || !_currentPlaylist) { + [tempItem setEnabled:NO]; + } + + itemEnum = [[_ratingMenu itemArray] objectEnumerator]; + while ( (tempItem = [itemEnum nextObject]) ) { + [tempItem setState:NSOffState]; + } + + NS_DURING + [[_ratingMenu itemAtIndex:([mtr currentSongRating] * 5)] setState:NSOnState]; + NS_HANDLER + [[MainController sharedController] networkError:localException]; + NS_ENDHANDLER + } else if ([nextObject isEqualToString:@"upcomingSongs"]) { + ITDebugLog(@"Add \"Upcoming Songs\" submenu."); + tempItem = [menu addItemWithTitle:NSLocalizedString(@"upcomingSongs", @"Upcoming Songs") + action:nil + keyEquivalent:@""]; + [tempItem setSubmenu:_upcomingSongsMenu]; + [tempItem setTag:2]; + if (_playingRadio || !_currentPlaylist) { + [tempItem setEnabled:NO]; + } + } else if ([nextObject isEqualToString:@"artists"]) { + ITDebugLog(@"Add \"Artists\" submenu."); + tempItem = [menu addItemWithTitle:NSLocalizedString(@"artists", @"Artists") + action:nil + keyEquivalent:@""]; + [tempItem setSubmenu:_artistsMenu]; + [tempItem setTag:5]; + + itemEnum = [[_eqMenu itemArray] objectEnumerator]; + while ( (tempItem = [itemEnum nextObject]) ) { + [tempItem setState:NSOffState]; } } + } ITDebugLog(@"Finished building menu."); [_currentMenu release]; _currentMenu = menu; @@ -468,6 +486,7 @@ - (void)rebuildSubmenus { + NSArray *menu = [[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"]; ITDebugLog(@"Rebuilding all of the submenus."); NS_DURING _currentPlaylist = [[[MainController sharedController] currentRemote] currentPlaylistIndex]; @@ -485,6 +504,7 @@ [_playlistsMenu release]; ITDebugLog(@" - EQ menu"); [_eqMenu release]; + ITDebugLog(@"Beginning Rebuild of \"Song Rating\" submenu."); _ratingMenu = [self ratingMenu]; ITDebugLog(@"Beginning Rebuild of \"Upcoming Songs\" submenu."); @@ -493,6 +513,13 @@ _playlistsMenu = [self playlistsMenu]; ITDebugLog(@"Beginning Rebuild of \"EQ Presets\" submenu."); _eqMenu = [self eqMenu]; + + if ([menu containsObject:@"artists"]) { + ITDebugLog(@"Releasing artists menu"); + [_artistsMenu release]; + ITDebugLog(@"Beginning Rebuild of \"Artists\" submenu."); + _artistsMenu = [self artistsMenu]; + } ITDebugLog(@"Done rebuilding all of the submenus."); } @@ -728,6 +755,27 @@ return eqMenu; } +- (NSMenu *)artistsMenu +{ + NSMenu *artistsMenu = [[NSMenu alloc] initWithTitle:@""]; + NSEnumerator *artistsEnumerator; + NSString *nextArtist; + id tempItem; + ITDebugLog(@"Building \"Artists\" menu."); + NS_DURING + artistsEnumerator = [[[[MainController sharedController] currentRemote] artists] objectEnumerator]; + while ( (nextArtist = [artistsEnumerator nextObject]) ) { + tempItem = [artistsMenu addItemWithTitle:nextArtist action:@selector(performArtistsMenuAction:) keyEquivalent:@""]; + [tempItem setRepresentedObject:nextArtist]; + [tempItem setTarget:self]; + } + NS_HANDLER + [[MainController sharedController] networkError:localException]; + NS_ENDHANDLER + ITDebugLog(@"Done Building \"Artists\" menu"); + return artistsMenu; +} + - (void)performMainMenuAction:(id)sender { switch ( [sender tag] ) @@ -798,6 +846,17 @@ [[MainController sharedController] selectSongAtIndex:[sender tag]]; } +- (void)performArtistsMenuAction:(id)sender +{ + ITDebugLog(@"Artist action selected on item with object %i", [sender representedObject]); + /* + ** 1 - Artist + ** 2 - Album + ** 3 - Genre? + */ + //[[MainController sharedController] createAndPlayPlaylistWithTerm:[sender representedObject] ofType:1]; +} + - (void)updateMenu { ITDebugLog(@"Update Menu"); diff --git a/PreferencesController.m b/PreferencesController.m index b1c2432..ccc9467 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -739,6 +739,7 @@ static PreferencesController *prefs = nil; @"trackInfo", @"upcomingSongs", @"playlists", + @"artists", @"eqPresets", @"songRating", @"playPause", @@ -765,6 +766,7 @@ static PreferencesController *prefs = nil; submenuItems = [[NSArray alloc] initWithObjects: @"upcomingSongs", @"playlists", + @"artists", @"eqPresets", @"songRating", nil]; @@ -1016,6 +1018,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]; diff --git a/iTunesRemote.m b/iTunesRemote.m index dde194f..b4479a9 100755 --- a/iTunesRemote.m +++ b/iTunesRemote.m @@ -226,6 +226,42 @@ return [allSources autorelease]; } +- (NSArray *)artists +{ + NSAppleEventDescriptor *rawr = ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pArt'), from:obj { form:'indx', want:type('cTrk'), seld:abso($616C6C20$), from:obj { form:'indx', want:type('cPly'), seld:long(1), from:obj { form:'indx', want:type('cSrc'), seld:long(1), from:() } } } }", 'core', 'getd', &savedPSN); + int i; + NSMutableArray *array = [[NSMutableArray alloc] init]; + NSArray *returnArray; + for (i = 1; i <= [rawr numberOfItems]; i++) { + NSString *artist = [[rawr descriptorAtIndex:i] stringValue]; + if (artist && [artist length] && ![array containsObject:artist]) { + [array addObject:artist]; + } + } + [array sortUsingSelector:@selector(caseInsensitiveCompare:)]; + returnArray = [NSArray arrayWithArray:array]; + [array release]; + return returnArray; +} + +- (NSArray *)albums +{ + NSAppleEventDescriptor *rawr = ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pAlb'), from:obj { form:'indx', want:type('cTrk'), seld:abso($616C6C20$), from:obj { form:'indx', want:type('cPly'), seld:long(1), from:obj { form:'indx', want:type('cSrc'), seld:long(1), from:() } } } }", 'core', 'getd', &savedPSN); + int i; + NSMutableArray *array = [[NSMutableArray alloc] init]; + NSArray *returnArray; + for (i = 1; i <= [rawr numberOfItems]; i++) { + NSString *album = [[rawr descriptorAtIndex:i] stringValue]; + if (album && [album length] && ![array containsObject:album]) { + [array addObject:album]; + } + } + [array sortUsingSelector:@selector(caseInsensitiveCompare:)]; + returnArray = [NSArray arrayWithArray:array]; + [array release]; + return returnArray; +} + - (int)numberOfSongsInPlaylistAtIndex:(int)index { int temp1; -- 2.20.1