- (void)applicationLaunched:(NSNotification *)note
{
if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) {
+ unichar fullstar = 0x2605;
+ unichar emptystar = 0x2606;
+ NSString *fullStarChar = [NSString stringWithCharacters:&fullstar length:1];
+ NSString *emptyStarChar = [NSString stringWithCharacters:&emptystar length:1];
+ //Build the song rating menu
+ ratingMenu = [[NSMenu alloc] initWithTitle:@""];
+ [[ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""] setTag:0];
+ [[ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""] setTag:20];
+ [[ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""] setTag:40];
+ [[ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""] setTag:60];
+ [[ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, fullStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""] setTag:80];
+ [[ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, fullStarChar, fullStarChar] action:@selector(selectSongRating:) keyEquivalent:@""] setTag:100];
[NSThread detachNewThreadSelector:@selector(startTimerInNewThread) toTarget:self withObject:nil];
- [self rebuildMenu];
[self setupHotKeys];
+ [self rebuildMenu];
isAppRunning = ITMTRemotePlayerRunning;
- return;
}
-
- isAppRunning = ITMTRemotePlayerRunning;
}
- (void)applicationTerminated:(NSNotification *)note
{
- if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) {
+ if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) {
NSMenu *notRunningMenu = [[NSMenu alloc] initWithTitle:@""];
- [[notRunningMenu addItemWithTitle:[NSString stringWithFormat:@"Open %@", [currentRemote playerSimpleName]] action:@selector(showPlayer:) keyEquivalent:@""] setTarget:self];
+ [notRunningMenu addItemWithTitle:[NSString stringWithFormat:@"Open %@", [currentRemote playerSimpleName]] action:@selector(showPlayer:) keyEquivalent:@""];
[notRunningMenu addItem:[NSMenuItem separatorItem]];
- [[notRunningMenu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self];
- [[notRunningMenu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self];
- [statusItem setMenu:[notRunningMenu autorelease]];
+ [notRunningMenu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""];
+ [notRunningMenu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""];
[refreshTimer invalidate];
[refreshTimer release];
refreshTimer = nil;
[self clearHotKeys];
- isAppRunning = NO;
- return;
+ isAppRunning = ITMTRemotePlayerNotRunning;
+
+ [ratingMenu release];
+
+ [statusItem setMenu:[notRunningMenu autorelease]];
}
}
int playlist = [currentRemote currentPlaylistIndex];
int i;
+ if ([currentRemote playerRunningState] == ITMTRemotePlayerNotRunning) {
+ return;
+ }
+
trackInfoIndex = -1;
lastPlaylistIndex = -1;
- didHaveAlbumName = ([[currentRemote currentSongAlbum] length] > 0);
- didHaveArtistName = ([[currentRemote currentSongArtist] length] > 0);
- [menu autorelease];
+ [menu release];
menu = [[NSMenu alloc] initWithTitle:@""];
playPauseItem = nil;
- lastSongIdentifier = @"0-0";
upcomingSongsItem = nil;
[upcomingSongsMenu release];
upcomingSongsMenu = nil;
- ratingItem = nil;
- [ratingMenu release];
- ratingMenu = nil;
+ if (ratingItem) {
+ [ratingItem setSubmenu:nil];
+ }
playlistItem = nil;
[playlistMenu release];
[eqMenu release];
eqMenu = nil;
+ //Build the custom menu
for (i = 0; i < [myMenu count]; i++) {
NSString *item = [myMenu objectAtIndex:i];
if ([item isEqualToString:@"Play/Pause"]) {
upcomingSongsItem = [menu addItemWithTitle:@"Upcoming Songs"
action:nil
keyEquivalent:@""];
+ upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""];
+ [upcomingSongsItem setSubmenu:upcomingSongsMenu];
+ [upcomingSongsItem setEnabled:NO];
} else if ([item isEqualToString:@"Playlists"]) {
playlistItem = [menu addItemWithTitle:@"Playlists"
action:nil
action:nil
keyEquivalent:@""];
} else if ([item isEqualToString:@"Song Rating"]) {
- unichar fullstar = 0x2605;
- unichar emptystar = 0x2606;
- NSString *fullStarChar = [NSString stringWithCharacters:&fullstar length:1];
- NSString *emptyStarChar = [NSString stringWithCharacters:&emptystar length:1];
- NSMenuItem *item;
-
ratingItem = [menu addItemWithTitle:@"Song Rating"
action:nil
keyEquivalent:@""];
-
- ratingMenu = [[NSMenu alloc] initWithTitle:@""];
-
- item = [ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""];
- [item setTag:0];
-
- item = [ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, emptyStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""];
- [item setTag:20];
-
- item = [ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, emptyStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""];
- [item setTag:40];
-
- item = [ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, emptyStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""];
- [item setTag:60];
-
- item = [ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, fullStarChar, emptyStarChar] action:@selector(selectSongRating:) keyEquivalent:@""];
- [item setTag:80];
-
- item = [ratingMenu addItemWithTitle:[NSString stringWithFormat:@"%@%@%@%@%@", fullStarChar, fullStarChar, fullStarChar, fullStarChar, fullStarChar] action:@selector(selectSongRating:) keyEquivalent:@""];
- [item setTag:100];
+ [ratingItem setSubmenu:ratingMenu];
} else if ([item isEqualToString:@"<separator>"]) {
[menu addItem:[NSMenuItem separatorItem]];
}
}
- if ( (isAppRunning == ITMTRemotePlayerRunning) ) {
- isPlayingRadio = ([currentRemote classOfPlaylistAtIndex:playlist] == ITMTRemotePlayerRadioPlaylist);
-
- if (upcomingSongsItem) {
- [self rebuildUpcomingSongsMenu];
+ if (playlistItem) {
+ [self rebuildPlaylistMenu];
+ }
+
+ if (eqItem) {
+ [self rebuildEQPresetsMenu];
+ }
+
+ isPlayingRadio = ([currentRemote classOfPlaylistAtIndex:playlist] == ITMTRemotePlayerRadioPlaylist);
+
+ if (upcomingSongsItem) {
+ [self rebuildUpcomingSongsMenu];
+ }
+
+ if (ratingItem) {
+ if (isPlayingRadio || !playlist) {
+ [ratingItem setEnabled:NO];
+ } else {
+ int currentSongRating = ([currentRemote currentSongRating] * 5);
+ [[ratingMenu itemAtIndex:lastSongRating] setState:NSOffState];
+ lastSongRating = currentSongRating;
+ [[ratingMenu itemAtIndex:lastSongRating] setState:NSOnState];
+ [ratingItem setEnabled:YES];
}
+ }
+
+ //Set the new unique song identifier
+ lastSongIdentifier = [[currentRemote currentSongUniqueIdentifier] retain];
+
+ //If we're in a playlist or radio mode
+ if ( ![lastSongIdentifier isEqualToString:@"0-0"] && (trackInfoIndex > -1) ) {
+ NSString *title;
- if (playlistItem) {
- [self rebuildPlaylistMenu];
+ if ( (i = [menu indexOfItemWithTitle:@"No Song"]) ) {
+ if ( (i > -1) ) {
+ [menu removeItemAtIndex:i];
+ [menu insertItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@"" atIndex:i];
+ }
}
- if (eqItem) {
- [self rebuildEQPresetsMenu];
- }
+ title = [currentRemote currentSongTitle];
- if (ratingItem) {
- if (isPlayingRadio || !playlist) {
- [ratingItem setEnabled:NO];
- if ([ratingItem submenu]) {
- [ratingItem setSubmenu:nil];
+ if (!isPlayingRadio) {
+ if ([defaults boolForKey:@"showTime"]) {
+ NSString *length = [currentRemote currentSongLength];
+ char character = [length characterAtIndex:0];
+ if ( (character > '0') && (character < '9') ) {
+ [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongLength]] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
}
- } else {
- int currentSongRating = ([currentRemote currentSongRating] * 5);
- [[ratingMenu itemAtIndex:lastSongRating] setState:NSOffState];
- lastSongRating = currentSongRating;
- [[ratingMenu itemAtIndex:lastSongRating] setState:NSOnState];
- [ratingItem setEnabled:YES];
- [ratingItem setSubmenu:ratingMenu];
}
- }
-
- //Set the new unique song identifier
- lastSongIdentifier = [[currentRemote currentSongUniqueIdentifier] retain];
-
- //If we're in a playlist or radio mode
- if ( (trackInfoIndex > -1) && (playlist || isPlayingRadio) ) {
- NSString *title, *album, *artist;
- if ( (i = [menu indexOfItemWithTitle:@"No Song"]) && (i > -1) ) {
- [menu removeItemAtIndex:i];
- [menu insertItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@"" atIndex:i];
+ if ([defaults boolForKey:@"showTrackRating"]) {
+ if (title) { //Check to see if there's a song playing
+ [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", [[ratingMenu itemAtIndex:[currentRemote currentSongRating] * 5] title]] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
+ }
}
- title = [currentRemote currentSongTitle];
-
- if (!isPlayingRadio) {
- ([defaults boolForKey:@"showAlbum"]) ? (album = [currentRemote currentSongAlbum]) :
- (album = @"");
- ([defaults boolForKey:@"showArtist"]) ? (artist = [currentRemote currentSongArtist]) :
- (artist = @"");
- if ([defaults boolForKey:@"showTime"]) {
- [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongLength]] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
- }
-
+ if ([defaults boolForKey:@"showArtist"]) {
+ NSString *artist = [currentRemote currentSongArtist];
if ([artist length] > 0) {
[menu insertItemWithTitle:[NSString stringWithFormat:@" %@", artist] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
}
-
- if ([album length] > 0) {
- [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", album] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
- }
-
- if ([defaults boolForKey:@"showArtist"]) {
- didHaveArtistName = (([artist length] > 0) ? YES : NO);
- }
-
- if ([defaults boolForKey:@"showAlbum"]) {
- didHaveAlbumName = (([album length] > 0) ? YES : NO);
+ }
+
+ if ([defaults boolForKey:@"showTrackNumber"]) {
+ int track = [currentRemote currentSongTrack];
+ int total = [currentRemote currentAlbumTrackCount];
+ if (total > 0) {
+ [menu insertItemWithTitle:[NSString stringWithFormat:@" Track %i of %i", track, total] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
}
}
- if ([title length] > 0) {
- [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", title] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
+ if ([defaults boolForKey:@"showAlbum"]) {
+ NSString *album = [currentRemote currentSongAlbum];
+ if ([album length] > 0) {
+ [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", album] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
+ }
}
}
+
+ if ([title length] > 0) {
+ [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", title] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1];
+ }
}
[statusItem setMenu:menu];
- (void)rebuildEQPresetsMenu
{
NSArray *eqPresets = [currentRemote eqPresets];
- NSMenuItem *enabledItem;
int i;
- [eqMenu release];
+ [eqMenu autorelease];
eqMenu = [[NSMenu alloc] initWithTitle:@""];
- enabledItem = [eqMenu addItemWithTitle:@"Enabled"
- action:@selector(selectEQPreset:)
- keyEquivalent:@""];
- [enabledItem setTag:-1];
-
- if ([currentRemote equalizerEnabled]) {
- [enabledItem setState:NSOnState];
- }
-
- [eqMenu addItem:[NSMenuItem separatorItem]];
-
for (i = 0; i < [eqPresets count]; i++) {
- NSString *name = [eqPresets objectAtIndex:i];
+ NSString *name;
NSMenuItem *tempItem;
- if (name) {
+ if ( ( name = [eqPresets objectAtIndex:i] ) ) {
tempItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(selectEQPreset:) keyEquivalent:@""];
[tempItem setTag:i];
[eqMenu addItem:tempItem];
- [tempItem release];
+ [tempItem autorelease];
}
}
+
[eqItem setSubmenu:eqMenu];
[eqItem setEnabled:YES];
-
- [[eqMenu itemAtIndex:[currentRemote currentEQPresetIndex] + 1] setState:NSOnState];
+ [[eqMenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState];
}
- (void)updateRatingMenu
int curSet = [currentRemote currentEQPresetIndex];
int item = [sender tag];
- if (item == -1) {
- [currentRemote setEqualizerEnabled:![currentRemote equalizerEnabled]];
- } else {
- [currentRemote setEqualizerEnabled:YES];
- [currentRemote switchToEQAtIndex:item];
- [[eqMenu itemAtIndex:curSet + 1] setState:NSOffState];
- [[eqMenu itemAtIndex:item + 2] setState:NSOnState];
- }
+ [currentRemote switchToEQAtIndex:item];
+ [[eqMenu itemAtIndex:curSet - 1] setState:NSOffState];
+ [[eqMenu itemAtIndex:item] setState:NSOnState];
}
- (void)selectSongRating:(id)sender
}
}
+- (ITMTRemote *)currentRemote
+{
+ return currentRemote;
+}
//
//
//Space -- ARGH!
case 49:
{
+ // Haven't tested this, though it should work.
+ unichar buffer;
+ [[NSString stringWithString:@"Space"] getCharacters:&buffer];
+ charcode = buffer;
/*MenuRef menuRef = _NSGetCarbonMenu([item menu]);
NSLog(@"%@", menuRef);
SetMenuItemCommandKey(menuRef, 0, NO, 49);
SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier);
SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph);
charcode = 'b';*/
+
}
break;