X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/418a547d5daa457e97c3964224af5d703df5a19f..6162e11fb9ec9ca0f4add4d5838e98a31ead4a21:/StatusWindowController.m diff --git a/StatusWindowController.m b/StatusWindowController.m index d7bd2ff..8eaba4f 100755 --- a/StatusWindowController.m +++ b/StatusWindowController.m @@ -1,77 +1,321 @@ #import "StatusWindowController.h" #import "StatusWindow.h" +#import "PreferencesController.h" +#import "MainController.h" + +#import +#import +#import +#import +#import +#import +#import + +static StatusWindowController *sharedController; @implementation StatusWindowController -- (id)init + ++ (StatusWindowController *)sharedController { - if ( (self = [super init]) ) { - [NSBundle loadNibNamed:@"StatusWindow" owner:self]; - [statusWindow center]; + if ( ! sharedController ) { + sharedController = [[StatusWindowController alloc] init]; } - return self; + + return sharedController; } -- (void)setUpcomingSongs:(NSString *)string + +- (id)init { - int size = 0, i; - NSArray *lines = [string componentsSeparatedByString:@"\n"]; - - for (i = 0; i < [lines count]; i++) { - int temp = [[lines objectAtIndex:i] sizeWithAttributes:[NSDictionary dictionaryWithObject:[NSFont fontWithName:@"Lucida Grande" size:12] forKey:NSFontAttributeName]].width; + if ( ( self = [super init] ) ) { + + float exitDelay; + NSString *entryClass; + NSString *exitClass; + NSArray *classList = [ITWindowEffect effectClasses]; + float entrySpeed; + float exitSpeed; - if (temp > size) { - size = temp; + NSData *colorData; + + ITWindowEffect *entryEffect; + ITWindowEffect *exitEffect; + + _window = [[StatusWindow sharedWindow] retain]; + df = [[NSUserDefaults standardUserDefaults] retain]; + + exitDelay = [df floatForKey:@"statusWindowVanishDelay"]; + entryClass = [df stringForKey:@"statusWindowAppearanceEffect"]; + exitClass = [df stringForKey:@"statusWindowVanishEffect"]; + entrySpeed = [df floatForKey:@"statusWindowAppearanceSpeed"]; + exitSpeed = [df floatForKey:@"statusWindowVanishSpeed"]; + + [_window setExitMode:ITTransientStatusWindowExitAfterDelay]; + [_window setExitDelay:(exitDelay ? exitDelay : 4.0)]; + + [_window setHorizontalPosition:[df integerForKey:@"statusWindowHorizontalPosition"]]; + [_window setVerticalPosition:[df integerForKey:@"statusWindowVerticalPosition"]]; + + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + + if ( [classList containsObject:NSClassFromString(entryClass)] ) { + entryEffect = [[[NSClassFromString(entryClass) alloc] initWithWindow:_window] autorelease]; + } else { + entryEffect = [[[ITCutWindowEffect alloc] initWithWindow:_window] autorelease]; + } + + if ( [classList containsObject:NSClassFromString(exitClass)] ) { + exitEffect = [[[NSClassFromString(exitClass) alloc] initWithWindow:_window] autorelease]; + } else { + exitEffect = [[[ITDissolveWindowEffect alloc] initWithWindow:_window] autorelease]; + } + + [_window setEntryEffect:entryEffect]; + [_window setExitEffect:exitEffect]; + + [[_window entryEffect] setEffectTime:(entrySpeed ? entrySpeed : 0.8)]; + [[_window exitEffect] setEffectTime:(exitSpeed ? exitSpeed : 0.8)]; + + [(ITTSWBackgroundView *)[_window contentView]setBackgroundMode: + (ITTSWBackgroundMode)[df integerForKey:@"statusWindowBackgroundMode"]]; + + colorData = [df dataForKey:@"statusWindowBackgroundColor"]; + + if ( colorData ) { + [(ITTSWBackgroundView *)[_window contentView] setBackgroundColor: + (NSColor *)[NSUnarchiver unarchiveObjectWithData:colorData]]; + } else { + [(ITTSWBackgroundView *)[_window contentView] setBackgroundColor:[NSColor blueColor]]; } } - if (size < 255) { - size = 255; - } - - [statusField setStringValue:string]; - [statusWindow setFrame:NSMakeRect(0, 0, size + 45, 40 + ([lines count] * 17)) display:NO]; - [statusWindow center]; - [statusWindow makeKeyAndOrderFront:nil]; + return self; } -- (void)setTrackInfo:(NSString *)string +- (void)dealloc { - int size = 0, i; - NSArray *lines = [string componentsSeparatedByString:@"\n"]; + [_window release]; + [super dealloc]; +} + +- (void)showSongInfoWindowWithSource:(ITMTRemotePlayerSource)source + title: (NSString *)title + album: (NSString *)album + artist: (NSString *)artist + composer: (NSString *)composer + time: (NSString *)time // FLOW: Should probably be NSDate or something. + track: (NSString *)track + rating: (int)rating + playCount: (int)playCount + image: (NSImage *)art +{ + NSImage *image = nil; + NSString *text = title; + + if ( art != nil ) { + image = art; + } else if ( source == ITMTRemoteLibrarySource ) { + image = [NSImage imageNamed:@"Library"]; + } else if ( source == ITMTRemoteCDSource ) { + image = [NSImage imageNamed:@"CD"]; + } else if ( source == ITMTRemoteRadioSource ) { + image = [NSImage imageNamed:@"Radio"]; + } else if ( source == ITMTRemoteiPodSource ) { + image = [NSImage imageNamed:@"iPod"]; + } else if ( source == ITMTRemoteGenericDeviceSource ) { + image = [NSImage imageNamed:@"MP3Player"]; + } else if ( source == ITMTRemoteSharedLibrarySource ) { + image = [NSImage imageNamed:@"Library"]; + } - for (i = 0; i < [lines count]; i++) { - int temp = [[lines objectAtIndex:i] sizeWithAttributes:[NSDictionary dictionaryWithObject:[NSFont fontWithName:@"Lucida Grande" size:12] forKey:NSFontAttributeName]].width; + [_window setImage:image]; + + if ( album ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:album]]; + } + if ( artist ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:artist]]; + } + if ( composer ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:composer]]; + } + if ( time ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:time]]; + } + if ( track ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:track]]; + } + if (playCount > -1) { + text = [text stringByAppendingString:[NSString stringWithFormat:@"\nPlay Count: %i", playCount]]; + } + if ( rating > -1 ) { + + NSString *ratingString = [NSString string]; + NSString *emptyChar = [NSString stringWithUTF8String:"☆"]; + NSString *fullChar = [NSString stringWithUTF8String:"★"]; + int i; - if (temp > size) { - size = temp; + for ( i = 1; i < 6; i++ ) { + + if ( rating >= i ) { + ratingString = [ratingString stringByAppendingString:fullChar]; + } else { + ratingString = [ratingString stringByAppendingString:emptyChar]; + } } - } - if (size < 285) { - size = 285; + text = [text stringByAppendingString:[@"\n" stringByAppendingString:ratingString]]; } - [statusField setStringValue:string]; - [statusWindow setFrame:NSMakeRect(0, 0, size + 45, 40 + ([lines count] * 17)) display:NO]; - [statusWindow center]; - [statusWindow makeKeyAndOrderFront:nil]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildTextWindowWithString:text]; + [_window appear:self]; +} + +- (void)showUpcomingSongsWindowWithTitles:(NSArray *)titleStrings +{ +// NSString *bull = [NSString stringWithUTF8String:"‣ "]; + NSString *bull = [NSString stringWithUTF8String:"♪ "]; + NSString *end = [@"\n" stringByAppendingString:bull]; + [_window setImage:[NSImage imageNamed:@"Upcoming"]]; + [_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:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildMeterWindowWithCharacter:[NSString stringWithUTF8String:"▊"] + size:18 + count:10 + active:( ceil(level * 100) / 10 )]; + [_window appear:self]; +} + +- (void)showRatingWindowWithRating:(float)rating +{ + [_window setImage:[NSImage imageNamed:@"Rating"]]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildMeterWindowWithCharacter:[NSString stringWithUTF8String:"★"] + size:48 + count:5 + active:( ceil(rating * 100) / 20 )]; + [_window appear:self]; } -- (void)fadeWindowOut +- (void)showShuffleWindow:(BOOL)shuffle { - [NSThread detachNewThreadSelector:@selector(fadeOutAux) toTarget:self withObject:nil]; + [_window setImage:[NSImage imageNamed:@"Shuffle"]]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildTextWindowWithString:( shuffle ? @"Shuffle On" : @"Shuffle Off")]; + [_window appear:self]; } -- (void)fadeOutAux +- (void)showRepeatWindowWithMode:(StatusWindowRepeatMode)mode { - NSAutoreleasePool *p00l = [[NSAutoreleasePool alloc] init]; - float i; - for (i = 1.0; i > 0; i -= .003) { - [statusWindow setAlphaValue:i]; + NSString *string = nil; + + if ( mode == StatusWindowRepeatNone ) { + string = @"Repeat Off"; + } else if ( mode == StatusWindowRepeatGroup ) { + string = @"Repeat Playlist"; + } else if ( mode == StatusWindowRepeatTrack ) { + string = @"Repeat One Track"; } - [statusWindow close]; - [p00l release]; + + [_window setImage:[NSImage imageNamed:@"Repeat"]]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildTextWindowWithString:string]; + [_window appear:self]; +} + +- (void)showSetupQueryWindow +{ + NSString *message = @"Would you like MenuTunes to launch\nautomatically at startup?"; + + [_window setImage:[NSImage imageNamed:@"Setup"]]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildDialogWindowWithMessage:message + defaultButton:@"Launch at Startup" + alternateButton:@"Launch Manually" + target:[PreferencesController sharedPrefs] + defaultAction:@selector(autoLaunchOK) + alternateAction:@selector(autoLaunchCancel)]; + + [_window appear:self]; + [_window setLocked:YES]; +} + + +- (void)showRegistrationQueryWindow +{ + NSString *message = @"Your 7-day unlimited trial period has elapsed.\nYou must register to continue using MenuTunes."; + + [_window setImage:[NSImage imageNamed:@"Register"]]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildDialogWindowWithMessage:message + defaultButton:@"Register Now" + alternateButton:@"Quit MenuTunes" + target:[MainController sharedController] + defaultAction:@selector(registerNowOK) + alternateAction:@selector(registerNowCancel)]; + + [_window appear:self]; + [_window setLocked:YES]; +} + +- (void)showReconnectQueryWindow +{ + NSString *message = @"The selected shared player is available again.\nWould you like to reconnect to it?"; + [_window setLocked:NO]; + [_window setImage:[NSImage imageNamed:@"Setup"]]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildDialogWindowWithMessage:message + defaultButton:@"Reconnect" + alternateButton:@"Ignore" + target:[MainController sharedController] + defaultAction:@selector(reconnect) + alternateAction:@selector(cancelReconnect)]; + + [_window appear:self]; + [_window setLocked:YES]; +} + +- (void)showNetworkErrorQueryWindow +{ + NSString *message = @"The remote MenuTunes server is unreachable.\nMenuTunes will revert back to the local player."; + + [_window setImage:[NSImage imageNamed:@"Setup"]]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildDialogWindowWithMessage:message + defaultButton:@" OK " + alternateButton:nil + target:[MainController sharedController] + defaultAction:@selector(cancelReconnect) + alternateAction:nil]; + + [_window appear:self]; + [_window setLocked:YES]; +} + +- (void)showPreferencesUpdateWindow +{ + NSString *message = @"The new features in this version of MenuTunes\nrequire you to reconfigure your preferences."; + + [_window setImage:[NSImage imageNamed:@"Setup"]]; + [_window setSizing:(ITTransientStatusWindowSizing)[df integerForKey:@"statusWindowSizing"]]; + [_window buildDialogWindowWithMessage:message + defaultButton:@"Show Preferences" + alternateButton:@"OK" + target:[MainController sharedController] + defaultAction:@selector(showPreferencesAndClose) + alternateAction:@selector(cancelReconnect)]; + + [_window appear:self]; + [_window setLocked:YES]; } -@end +@end \ No newline at end of file