over to AE.
CLASS = PreferencesController;
LANGUAGE = ObjC;
OUTLETS = {
+ albumArtworkCheckbox = NSButton;
albumCheckbox = NSButton;
allTableView = NSTableView;
appearanceEffectPopup = NSPopUpButton;
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
- <string>37 226 356 240 0 0 1024 746 </string>
+ <string>43 33 356 240 0 0 1152 746 </string>
<key>IBEditorPositions</key>
<dict>
<key>634</key>
NSString *artist = nil;
NSString *time = nil;
NSString *track = nil;
+ NSImage *art = nil;
int rating = -1;
NS_DURING
}
}
+ if ( [df boolForKey:@"showAlbumArtwork"] ) {
+ NS_DURING
+ art = [[self currentRemote] currentSongAlbumArt];
+ NS_HANDLER
+ [self networkError:localException];
+ NS_ENDHANDLER
+ }
+
} else {
title = NSLocalizedString(@"noSongPlaying", @"No song is playing.");
}
artist:artist
time:time
track:track
- rating:rating];
+ rating:rating
+ image:art];
}
- (void)showUpcomingSongs
children = (
1058C7A1FEA54F0111CA2CBB,
7C95A0EF05A92B4800B4F576,
- 7C95A02A05A9288F00B4F576,
7C95A03705A928A300B4F576,
- 7C95A0DF05A929B200B4F576,
+ 3740714D05ACE0B500CC2142,
+ 3740716C05ACE20500CC2142,
7C95A0E805A92B0700B4F576,
);
isa = PBXGroup;
//322
//323
//324
+//370
+//371
+//372
+//373
+//374
+ 3740714D05ACE0B500CC2142 = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.framework;
+ path = ITFoundation.framework;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3740714E05ACE0B500CC2142 = {
+ fileRef = 3740714D05ACE0B500CC2142;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3740714F05ACE0B500CC2142 = {
+ fileRef = 3740714D05ACE0B500CC2142;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3740716B05ACE14D00CC2142 = {
+ fileRef = 3740714D05ACE0B500CC2142;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3740716C05ACE20500CC2142 = {
+ isa = PBXFileReference;
+ lastKnownFileType = archive.ar;
+ path = libValidate.a;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3740716D05ACE20500CC2142 = {
+ fileRef = 3740716C05ACE20500CC2142;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+//370
+//371
+//372
+//373
+//374
//4A0
//4A1
//4A2
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
OPTIMIZATION_CFLAGS = "-O0";
- ZERO_LINK = YES;
+ ZERO_LINK = NO;
};
isa = PBXBuildStyle;
name = Development;
files = (
7C33202105A925BC0088905B,
7C33202005A925BA0088905B,
- 7C95A02D05A9288F00B4F576,
+ 3740714E05ACE0B500CC2142,
);
isa = PBXFrameworksBuildPhase;
runOnlyForDeploymentPostprocessing = 0;
buildRules = (
);
buildSettings = {
- FRAMEWORK_SEARCH_PATHS = "/Volumes/Data/Desktop/ITFoundation/build /Volumes/Data/Desktop/ITKit/build";
+ FRAMEWORK_SEARCH_PATHS = "/Volumes/Data/Desktop/ITFoundation/build /Volumes/Data/Desktop/ITKit/build /Users/kent/Programming/iThink/MenuTunes";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = MenuTunes_Prefix.pch;
GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
settings = {
};
};
- 7C95A02A05A9288F00B4F576 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = ITFoundation.framework;
- path = ../ITFoundation/build/ITFoundation.framework;
- refType = 2;
- sourceTree = SOURCE_ROOT;
- };
- 7C95A02B05A9288F00B4F576 = {
- fileRef = 7C95A02A05A9288F00B4F576;
- isa = PBXBuildFile;
- settings = {
- };
- };
- 7C95A02D05A9288F00B4F576 = {
- fileRef = 7C95A02A05A9288F00B4F576;
- isa = PBXBuildFile;
- settings = {
- };
- };
7C95A03705A928A300B4F576 = {
isa = PBXFileReference;
lastKnownFileType = wrapper.framework;
settings = {
};
};
- 7C95A0DF05A929B200B4F576 = {
- isa = PBXFileReference;
- lastKnownFileType = archive.ar;
- path = libValidate.a;
- refType = 4;
- sourceTree = "<group>";
- };
- 7C95A0E005A929B200B4F576 = {
- fileRef = 7C95A0DF05A929B200B4F576;
- isa = PBXBuildFile;
- settings = {
- };
- };
7C95A0E105A929F400B4F576 = {
fileEncoding = 4;
isa = PBXFileReference;
dstPath = "";
dstSubfolderSpec = 10;
files = (
+ 3740716B05ACE14D00CC2142,
7C95A18A05A92B9700B4F576,
7C95A18905A92B9500B4F576,
- 7C95A18805A92B9100B4F576,
);
isa = PBXCopyFilesBuildPhase;
runOnlyForDeploymentPostprocessing = 0;
};
- 7C95A18805A92B9100B4F576 = {
- fileRef = 7C95A02A05A9288F00B4F576;
- isa = PBXBuildFile;
- settings = {
- };
- };
7C95A18905A92B9500B4F576 = {
fileRef = 7C95A03705A928A300B4F576;
isa = PBXBuildFile;
buildRules = (
);
buildSettings = {
- FRAMEWORK_SEARCH_PATHS = "../ITFoundation/build ../ITKit/build /Volumes/Data/Desktop/ITFoundation/build";
+ FRAMEWORK_SEARCH_PATHS = "../ITFoundation/build ../ITKit/build /Volumes/Data/Desktop/ITFoundation/build /Users/kent/Programming/iThink/MenuTunes";
GCC_ENABLE_TRIGRAPHS = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
HEADER_SEARCH_PATHS = "../ITKit/build/ITKit.framework/PrivateHeaders ../ITFoundation/build/ITFoundation.framework/PrivateHeaders ";
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
- LIBRARY_SEARCH_PATHS = /Volumes/Data/Desktop/MenuTunes;
+ LIBRARY_SEARCH_PATHS = "/Volumes/Data/Desktop/MenuTunes /Users/kent/Programming/iThink/MenuTunes";
MACOSX_DEPLOYMENT_TARGET = 10.2;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
files = (
7C33201F05A925AF0088905B,
8D11072F0486CEB800E47090,
- 7C95A02B05A9288F00B4F576,
7C95A03805A928A300B4F576,
- 7C95A0E005A929B200B4F576,
7C95A0E905A92B0700B4F576,
7C95A0F005A92B4800B4F576,
+ 3740714F05ACE0B500CC2142,
+ 3740716D05ACE20500CC2142,
);
isa = PBXFrameworksBuildPhase;
runOnlyForDeploymentPostprocessing = 0;
@interface PreferencesController : NSObject
{
+ IBOutlet NSButton *albumArtworkCheckbox;
IBOutlet NSButton *albumCheckbox;
IBOutlet NSTableView *allTableView;
IBOutlet NSPopUpButton *appearanceEffectPopup;
[passwordPanelOKButton setTitle:@"Connect"];
[passwordPanelTitle setStringValue:@"Password Required"];
[passwordPanelMessage setStringValue:[NSString stringWithFormat:@"Please enter a password for access to the MenuTunes player named %@ at %@.", [[[NetworkController sharedController] networkObject] serverName], [[NetworkController sharedController] remoteHost]]];
- [passwordPanel center];
[passwordPanel setLevel:NSStatusWindowLevel];
- [passwordPanel makeKeyAndOrderFront:nil];
+ [NSApp activateIgnoringOtherApps: YES];
+ [window center];
+ [window orderFrontRegardless];
+ [window makeKeyWindow];
if ([NSApp runModalForWindow:passwordPanel]) {
return YES;
} else {
[passwordPanelOKButton setTitle:@"Retry"];
[passwordPanelTitle setStringValue:@"Invalid Password"];
[passwordPanelMessage setStringValue:[NSString stringWithFormat:@"The password entered for access to the MenuTunes player named %@ at %@ is invalid. Please provide a new password.", [[[NetworkController sharedController] networkObject] serverName], [[NetworkController sharedController] remoteHost]]];
- [passwordPanel center];
[passwordPanel setLevel:NSStatusWindowLevel];
- [passwordPanel makeKeyAndOrderFront:nil];
+ [NSApp activateIgnoringOtherApps: YES];
+ [window center];
+ [window orderFrontRegardless];
+ [window makeKeyWindow];
if ([NSApp runModalForWindow:passwordPanel]) {
return YES;
} else {
}
[self resetRemotePlayerTextFields];
+ [NSApp activateIgnoringOtherApps: YES];
[window center];
- [NSApp activateIgnoringOtherApps:YES];
+ [window orderFrontRegardless];
+ [window makeKeyWindow];
[window performSelector:@selector(makeKeyAndOrderFront:) withObject:self afterDelay:0.0];
}
[df setBool:SENDER_STATE forKey:@"showTrackNumber"];
} else if ( [sender tag] == 1090) {
[df setBool:SENDER_STATE forKey:@"showTrackRating"];
+ } else if ( [sender tag] == 1100) {
+ [df setBool:SENDER_STATE forKey:@"showAlbumArtwork"];
}
[df synchronize];
}
[trackTimeCheckbox setState:[df boolForKey:@"showTime"] ? NSOnState : NSOffState];
[trackNumberCheckbox setState:[df boolForKey:@"showTrackNumber"] ? NSOnState : NSOffState];
[ratingCheckbox setState:[df boolForKey:@"showTrackRating"] ? NSOnState : NSOffState];
+ [albumArtworkCheckbox setState:[df boolForKey:@"showAlbumArtwork"] ? NSOnState : NSOffState];
// Set the launch at login checkbox state
ITDebugLog(@"Setting launch at login state.");
#import <Cocoa/Cocoa.h>
#import <ITKit/ITKit.h>
-
-typedef enum _StatusWindowSizing {
- StatusWindowRegular,
- StatusWindowSmall,
- StatusWindowMini
-} StatusWindowSizing;
-
-
@interface StatusWindow : ITTransientStatusWindow {
NSImage *_image;
BOOL _locked;
- StatusWindowSizing _sizing;
}
- (void)setImage:(NSImage *)newImage;
- (void)setLocked:(BOOL)flag;
-- (void)setSizing:(StatusWindowSizing)newSizing;
- (void)buildTextWindowWithString:(NSString *)text;
- (void)buildMeterWindowWithCharacter:(NSString *)character
// Set default values.
_image = [[NSImage imageNamed:@"NSApplicationIcon"] retain];
_locked = NO;
- _sizing = StatusWindowRegular;
+ _sizing = ITTransientStatusWindowRegular;
}
return self;
[self setExitMode:(flag ? ITTransientStatusWindowExitOnCommand : ITTransientStatusWindowExitAfterDelay)];
}
-- (void)setSizing:(StatusWindowSizing)newSizing
+- (void)setSizing:(ITTransientStatusWindowSizing)newSizing
{
_sizing = newSizing;
}
BOOL shouldAnimate = ( ! (([self visibilityState] == ITWindowAppearingState) ||
([self visibilityState] == ITWindowVanishingState)) );
- if ( _sizing == StatusWindowSmall ) {
+ if ( _sizing == ITTransientStatusWindowSmall ) {
divisor = SMALL_DIVISOR;
- } else if ( _sizing == StatusWindowMini ) {
+ } else if ( _sizing == ITTransientStatusWindowMini ) {
divisor = MINI_DIVISOR;
}
NSFont *font;
NSDictionary *attr;
- if ( _sizing == StatusWindowSmall ) {
+ if ( _sizing == ITTransientStatusWindowSmall ) {
divisor = SMALL_DIVISOR;
- } else if ( _sizing == StatusWindowMini ) {
+ } else if ( _sizing == ITTransientStatusWindowMini ) {
divisor = MINI_DIVISOR;
}
NSColor *offColor = [NSColor colorWithCalibratedWhite:0.15 alpha:0.50];
NSMatrix *volMatrix;
- if ( _sizing == StatusWindowSmall ) {
+ if ( _sizing == ITTransientStatusWindowSmall ) {
divisor = SMALL_DIVISOR;
- } else if ( _sizing == StatusWindowMini ) {
+ } else if ( _sizing == ITTransientStatusWindowMini ) {
divisor = MINI_DIVISOR;
}
artist: (NSString *)artist
time: (NSString *)time // FLOW: Should probably be NSDate or something.
track: (NSString *)track
- rating: (int)rating;
+ rating: (int)rating
+ image: (NSImage *)art;
@end
[_window setHorizontalPosition:[df integerForKey:@"statusWindowHorizontalPosition"]];
[_window setVerticalPosition:[df integerForKey:@"statusWindowVerticalPosition"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
if ( [classList containsObject:NSClassFromString(entryClass)] ) {
entryEffect = [[[NSClassFromString(entryClass) alloc] initWithWindow:_window] autorelease];
time: (NSString *)time // FLOW: Should probably be NSDate or something.
track: (NSString *)track
rating: (int)rating
+ image: (NSImage *)art
{
NSImage *image = nil;
NSString *text = title;
- if ( source == ITMTRemoteLibrarySource ) {
+ if ( art != nil ) {
+ image = art;
+ NSSize size = [image size];
+ if (size.width > 110) {
+ [image setScalesWhenResized:YES];
+ [image setSize:NSMakeSize(110, (size.width / size.height) * 110)];
+ }
+ } else if ( source == ITMTRemoteLibrarySource ) {
image = [NSImage imageNamed:@"Library"];
} else if ( source == ITMTRemoteCDSource ) {
image = [NSImage imageNamed:@"CD"];
} else if ( source == ITMTRemoteSharedLibrarySource ) {
image = [NSImage imageNamed:@"Library"];
}
-
+
[_window setImage:image];
-
+
if ( album ) {
text = [text stringByAppendingString:[@"\n" stringByAppendingString:album]];
}
}
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildTextWindowWithString:text];
[_window appear:self];
}
NSString *bull = [NSString stringWithUTF8String:"♪ "];
NSString *end = [@"\n" stringByAppendingString:bull];
[_window setImage:[NSImage imageNamed:@"Upcoming"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildTextWindowWithString:[bull stringByAppendingString:[titleStrings componentsJoinedByString:end]]];
[_window appear:self];
}
- (void)showVolumeWindowWithLevel:(float)level
{
[_window setImage:[NSImage imageNamed:@"Volume"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildMeterWindowWithCharacter:[NSString stringWithUTF8String:"▊"]
size:18
count:10
- (void)showRatingWindowWithRating:(float)rating
{
[_window setImage:[NSImage imageNamed:@"Rating"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildMeterWindowWithCharacter:[NSString stringWithUTF8String:"★"]
size:48
count:5
- (void)showShuffleWindow:(BOOL)shuffle
{
[_window setImage:[NSImage imageNamed:@"Shuffle"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildTextWindowWithString:( shuffle ? @"Shuffle On" : @"Shuffle Off")];
[_window appear:self];
}
}
[_window setImage:[NSImage imageNamed:@"Repeat"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildTextWindowWithString:string];
[_window appear:self];
}
NSString *message = @"Would you like MenuTunes to launch\nautomatically at startup?";
[_window setImage:[NSImage imageNamed:@"Setup"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildDialogWindowWithMessage:message
defaultButton:@"Launch at Startup"
alternateButton:@"Launch Manually"
NSString *message = @"Your 7-day unlimited trial period has elapsed.\nYou must register to continue using MenuTunes.";
[_window setImage:[NSImage imageNamed:@"Register"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildDialogWindowWithMessage:message
defaultButton:@"Register Now"
alternateButton:@"Quit MenuTunes"
NSString *message = @"The selected shared player is available again.\nWould you like to reconnect to it?.";
[_window setImage:[NSImage imageNamed:@"Register"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildDialogWindowWithMessage:message
defaultButton:@"Reconnect"
alternateButton:@"Ignore"
NSString *message = @"The new features in this version of MenuTunes\nrequire you to reconfigure your preferences.";
[_window setImage:[NSImage imageNamed:@"Setup"]];
- [_window setSizing:(StatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
+ [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]];
[_window buildDialogWindowWithMessage:message
defaultButton:@"Show Preferences"
alternateButton:@"OK"
- (NSImage *)currentSongAlbumArt
{
- return nil;
+ NSAppleScript *script;
+ NSAppleEventDescriptor *moof;
+ NSData *data;
+ script = [[NSAppleScript alloc] initWithSource:@"tell application \"iTunes\"\nget data of artwork 1 of current track\nend tell"];
+ moof = [script executeAndReturnError:nil];
+ data = [moof data];
+ if (data) {
+ return [[[NSImage alloc] initWithData:data] autorelease];
+ } else {
+ return nil;
+ }
}
- (float)currentSongRating