X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/154ddd8b39891b174082df48f504f83d0a6a22d9..50485da2e6ae0642e4dfb55ef4c0556ed6ef2a80:/MenuController.m diff --git a/MenuController.m b/MenuController.m index 9c7f9b5..508237e 100755 --- a/MenuController.m +++ b/MenuController.m @@ -21,7 +21,8 @@ - (NSMenu *)playlistsMenu; - (NSMenu *)eqMenu; - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers - onItem:(NSMenuItem *)item; + onItem:(id )item; +- (BOOL)iPodWithNameAutomaticallyUpdates:(NSString *)name; @end @implementation MenuController @@ -41,7 +42,7 @@ NSArray *menuArray = [defaults arrayForKey:@"menu"]; NSEnumerator *enumerator = [menuArray objectEnumerator]; NSString *nextObject; - NSMenuItem *tempItem; + id tempItem; NSEnumerator *itemEnum; ITHotKey *hotKey; NSArray *hotKeys = [[ITHotKeyCenter sharedCenter] allHotKeys]; @@ -269,6 +270,20 @@ } } + if ([defaults boolForKey:@"showComposer"]) { + NSString *curComposer; + NS_DURING + curComposer = [[[MainController sharedController] currentRemote] currentSongComposer]; + NS_HANDLER + [[MainController sharedController] networkError:localException]; + NS_ENDHANDLER + ITDebugLog(@"Add Track Composer (\"%@\") menu item.", curComposer); + if ( curComposer ) { + [menu indentItem: + [menu addItemWithTitle:curComposer action:nil keyEquivalent:@""]]; + } + } + if ([defaults boolForKey:@"showTrackNumber"]) { int track; NS_DURING @@ -398,7 +413,7 @@ - (NSMenu *)menuForNoPlayer { NSMenu *menu = [[NSMenu alloc] initWithTitle:@""]; - NSMenuItem *tempItem; + id tempItem; ITDebugLog(@"Creating menu for when player isn't running."); NS_DURING ITDebugLog(@"Add \"Open %@\" menu item.", [[[MainController sharedController] currentRemote] playerSimpleName]); @@ -430,7 +445,6 @@ - (void)rebuildSubmenus { ITDebugLog(@"Rebuilding all of the submenus."); - NS_DURING _currentPlaylist = [[[MainController sharedController] currentRemote] currentPlaylistIndex]; _currentTrack = [[[MainController sharedController] currentRemote] currentSongIndex]; @@ -438,6 +452,7 @@ NS_HANDLER [[MainController sharedController] networkError:localException]; NS_ENDHANDLER + ITDebugLog(@"Releasing old submenus."); [_ratingMenu release]; [_upcomingSongsMenu release]; [_playlistsMenu release]; @@ -497,7 +512,6 @@ if (_currentPlaylist && !_playingRadio) { if (numSongs > 0) { int i; - for (i = _currentTrack + 1; i <= _currentTrack + numSongsInAdvance; i++) { if (i <= numSongs) { NSString *curSong; @@ -506,7 +520,7 @@ NS_HANDLER [[MainController sharedController] networkError:localException]; NS_ENDHANDLER - NSMenuItem *songItem; + id songItem; ITDebugLog(@"Adding song: %@", curSong); songItem = [upcomingSongsMenu addItemWithTitle:curSong action:@selector(performUpcomingSongsMenuAction:) keyEquivalent:@""]; [songItem setTag:i]; @@ -529,7 +543,7 @@ { NSMenu *playlistsMenu = [[NSMenu alloc] initWithTitle:@""]; NSArray *playlists; - NSMenuItem *tempItem; + id tempItem; ITMTRemotePlayerSource source = [[[MainController sharedController] currentRemote] currentSource]; int i; NS_DURING @@ -570,9 +584,10 @@ { NSMenu *playlistsMenu = [[NSMenu alloc] initWithTitle:@""]; NSArray *playlists; - NSMenuItem *tempItem; + id tempItem; ITMTRemotePlayerSource source = [[[MainController sharedController] currentRemote] currentSource]; int i, j; + NSMutableArray *indices = [[NSMutableArray alloc] init]; NS_DURING playlists = [[[MainController sharedController] currentRemote] playlists]; NS_HANDLER @@ -583,14 +598,16 @@ NSArray *curPlaylist = [playlists objectAtIndex:0]; NSString *name = [curPlaylist objectAtIndex:0]; ITDebugLog(@"Adding main source: %@", name); - for (i = 2; i < [curPlaylist count]; i++) { + for (i = 3; i < [curPlaylist count]; i++) { ITDebugLog(@"Adding playlist: %@", [curPlaylist objectAtIndex:i]); tempItem = [playlistsMenu addItemWithTitle:[curPlaylist objectAtIndex:i] action:@selector(performPlaylistMenuAction:) keyEquivalent:@""]; - [tempItem setTag:i]; + [tempItem setTag:i - 1]; [tempItem setTarget:self]; } + ITDebugLog(@"Adding index to the index array."); + [indices addObject:[curPlaylist objectAtIndex:2]]; } - + [indices addObject:[[playlists objectAtIndex:1] objectAtIndex:2]]; if ( (source == ITMTRemoteRadioSource) || ([playlists count] - 2 > 0) ) { [playlistsMenu addItem:[NSMenuItem separatorItem]]; } @@ -604,25 +621,31 @@ NSString *name = [curPlaylist objectAtIndex:0]; NSMenu *submenu = [[NSMenu alloc] init]; ITDebugLog(@"Adding source: %@", name); - for (j = 2; j < [curPlaylist count]; j++) { - ITDebugLog(@"Adding playlist: %@", [curPlaylist objectAtIndex:j]); - tempItem = [submenu addItemWithTitle:[curPlaylist objectAtIndex:j] action:@selector(performPlaylistMenuAction:) keyEquivalent:@""]; - [tempItem setTag:(i * 1000) + j]; - [tempItem setTarget:self]; - if ([[curPlaylist objectAtIndex:i] intValue] == ITMTRemoteiPodSource) { - [tempItem setEnabled:NO]; + + if ( ([[curPlaylist objectAtIndex:1] intValue] == ITMTRemoteiPodSource) && [self iPodWithNameAutomaticallyUpdates:name] ) { + ITDebugLog(@"Invalid iPod source."); + [playlistsMenu addItemWithTitle:name action:NULL keyEquivalent:@""]; + } else { + for (j = 3; j < [curPlaylist count]; j++) { + ITDebugLog(@"Adding playlist: %@", [curPlaylist objectAtIndex:j]); + tempItem = [submenu addItemWithTitle:[curPlaylist objectAtIndex:j] action:@selector(performPlaylistMenuAction:) keyEquivalent:@""]; + [tempItem setTag:(i * 1000) + j - 1]; + [tempItem setTarget:self]; } + [[playlistsMenu addItemWithTitle:name action:NULL keyEquivalent:@""] setSubmenu:[submenu autorelease]]; } - [[playlistsMenu addItemWithTitle:name action:NULL keyEquivalent:@""] setSubmenu:[submenu autorelease]]; + ITDebugLog(@"Adding index to the index array."); + [indices addObject:[curPlaylist objectAtIndex:2]]; } - - if ( (source == ITMTRemoteSharedLibrarySource) || (source == ITMTRemoteiPodSource) || (source == ITMTRemoteGenericDeviceSource) || (source == ITMTRemoteCDSource) ){ - tempItem = [playlistsMenu itemAtIndex:(int)[[[MainController sharedController] currentRemote] currentSourceIndex] + [playlistsMenu numberOfItems] - 5]; + ITDebugLog(@"Checking the current source."); + if ( (source == ITMTRemoteSharedLibrarySource) || (source == ITMTRemoteiPodSource) || (source == ITMTRemoteGenericDeviceSource) || (source == ITMTRemoteCDSource) ) { + tempItem = [playlistsMenu itemAtIndex:[playlistsMenu numberOfItems] + [indices indexOfObject:[NSNumber numberWithInt:[[[MainController sharedController] currentRemote] currentSourceIndex]]] - [indices count]]; [tempItem setState:NSOnState]; [[[tempItem submenu] itemAtIndex:_currentPlaylist - 1] setState:NSOnState]; } else if (source == ITMTRemoteLibrarySource && _currentPlaylist) { [[playlistsMenu itemAtIndex:_currentPlaylist - 1] setState:NSOnState]; } + [indices release]; ITDebugLog(@"Done Building \"Playlists\" menu"); return playlistsMenu; } @@ -631,7 +654,7 @@ { NSMenu *eqMenu = [[NSMenu alloc] initWithTitle:@""]; NSArray *eqPresets; - NSMenuItem *tempItem; + id tempItem; int i; NS_DURING @@ -759,7 +782,7 @@ } - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers - onItem:(NSMenuItem *)item + onItem:(id )item { unichar charcode = 'a'; int i; @@ -978,4 +1001,40 @@ ITDebugLog(@"Done setting key equivalent on menu item: %@", [item title]); } +- (BOOL)iPodWithNameAutomaticallyUpdates:(NSString *)name +{ + NSArray *volumes = [[NSWorkspace sharedWorkspace] mountedLocalVolumePaths]; + NSEnumerator *volEnum = [volumes objectEnumerator]; + NSString *nextVolume; + ITDebugLog(@"Looking for an iPod named %@", name); + while ( (nextVolume = [volEnum nextObject]) ) { + ITDebugLog(@"- %@", nextVolume); + if ([nextVolume rangeOfString:name options:nil /*range:NSMakeRange(0, [name length] - 1)*/].location != NSNotFound) { + NSFileHandle *handle; + NSData *data; + NSString *path = [nextVolume stringByAppendingPathComponent:@"/iPod_Control/iTunes/iTunesPrefs"]; + if ( ![[NSFileManager defaultManager] fileExistsAtPath:path] ) { + ITDebugLog(@"Error, path isn't an iPod! %@", path); + return NO; + } + handle = [NSFileHandle fileHandleForReadingAtPath:path]; + ITDebugLog(@"File handle: %@", handle); + [handle seekToFileOffset:10]; + data = [handle readDataOfLength:1]; + ITDebugLog(@"Data: %@", data); + if ( (*((unsigned char*)[data bytes]) == 0x00) ) { + ITDebugLog(@"iPod is manually updated. %@", path); + return NO; + } else if ( ( *((unsigned char*)[data bytes]) == 0x01 ) ) { + ITDebugLog(@"iPod is automatically updated. %@", path); + return YES; + } else { + ITDebugLog(@"Error! Value: %h Desc: %@ Path: %@", *((unsigned char*)[data bytes]), [data description], path); + return NO; + } + } + } + return YES; +} + @end \ No newline at end of file