From: Matthew Judy Date: Sun, 14 Sep 2003 07:07:36 +0000 (+0000) Subject: Volume Window s3x. Auto-displayed song info is disabled right now. Will thread... X-Git-Tag: v1.0~65 X-Git-Url: http://git.ithinksw.org/MenuTunes.git/commitdiff_plain/c92930f48a560adbc8f80ef106a3128cf9c176bf Volume Window s3x. Auto-displayed song info is disabled right now. Will thread to eliminate problems soon. I've noted, however, that I can press keys rapidly to adjust the volume without crashing. --- diff --git a/English.lproj/Preferences.nib/info.nib b/English.lproj/Preferences.nib/info.nib index 2aff2c8..7718757 100755 --- a/English.lproj/Preferences.nib/info.nib +++ b/English.lproj/Preferences.nib/info.nib @@ -3,7 +3,7 @@ IBDocumentLocation - 4 4 356 240 0 0 1056 770 + 1 3 356 240 0 0 1056 770 IBFramework Version 286.0 IBGroupedObjects @@ -23,7 +23,6 @@ IBOpenObjects 6 - 115 IBSystem Version 6L60 diff --git a/English.lproj/Preferences.nib/keyedobjects.nib b/English.lproj/Preferences.nib/keyedobjects.nib index 62f97d5..f99cf5d 100755 Binary files a/English.lproj/Preferences.nib/keyedobjects.nib and b/English.lproj/Preferences.nib/keyedobjects.nib differ diff --git a/MainController.m b/MainController.m index fd932be..7a0c29a 100755 --- a/MainController.m +++ b/MainController.m @@ -173,13 +173,13 @@ static MainController *sharedController; ( ([self radioIsPlaying]) && (latestPlaylistClass != ITMTRemotePlayerRadioPlaylist) ) || ( (! [self radioIsPlaying]) && (latestPlaylistClass == ITMTRemotePlayerRadioPlaylist) ) )*/ - if ([self songChanged]) { + if ( [self songChanged] ) { [self setLatestSongIdentifier:[currentRemote playerStateUniqueIdentifier]]; latestPlaylistClass = [currentRemote currentPlaylistClass]; [menuController rebuildSubmenus]; if ( [df boolForKey:@"showSongInfoOnChange"] ) { - [self showCurrentTrackInfo]; +// [self performSelector:@selector(showCurrentTrackInfo) withObject:nil afterDelay:0.0]; } } } @@ -518,28 +518,40 @@ static MainController *sharedController; - (void)incrementVolume { - float volume = [currentRemote volume]; - volume += 0.2; + float volume = [currentRemote volume]; + float dispVol = volume; + + volume += 0.110; + dispVol += 0.100; + if (volume > 1.0) { - volume = 1.0; + volume = 1.0; + dispVol = 1.0; } + [currentRemote setVolume:volume]; - - //Show volume status window - [statusWindowController showVolumeWindowWithLevel:volume]; + + // Show volume status window + [statusWindowController showVolumeWindowWithLevel:dispVol]; } - (void)decrementVolume { - float volume = [currentRemote volume]; - volume -= 0.2; + float volume = [currentRemote volume]; + float dispVol = volume; + + volume -= 0.090; + dispVol -= 0.100; + if (volume < 0.0) { - volume = 0.0; + volume = 0.0; + dispVol = 0.0; } + [currentRemote setVolume:volume]; //Show volume status window - [statusWindowController showVolumeWindowWithLevel:volume]; + [statusWindowController showVolumeWindowWithLevel:dispVol]; } - (void)incrementRating diff --git a/StatusWindow.h b/StatusWindow.h index 3fbc7be..b72ca71 100755 --- a/StatusWindow.h +++ b/StatusWindow.h @@ -21,16 +21,23 @@ #define SW_MINW 211.0 #define SW_BORDER 32.0 +typedef enum { + StatusWindowTextMode, + StatusWindowVolumeMode +} StatusWindowMode; @interface StatusWindow : ITTransientStatusWindow { - NSImage *image; - NSString *text; - NSImageView *imageView; - ITTextField *textField; + NSImage *image; + NSString *text; + NSImageView *imageView; + ITTextField *textField; + NSMatrix *volMatrix; + StatusWindowMode windowMode; + float volumeLevel; } - (void)setImage:(NSImage *)newImage; - (void)setText:(NSString *)newText; - +- (void)setVolume:(float)level; @end diff --git a/StatusWindow.m b/StatusWindow.m index a2a223a..6fb6ca4 100755 --- a/StatusWindow.m +++ b/StatusWindow.m @@ -23,22 +23,26 @@ if ( ( self = [super initWithContentView:contentView exitMode:exitMode backgroundType:backgroundType]) ) { - // Default images and text. - image = [NSImage imageNamed:@"NSApplicationIcon"]; - text = @"No string set yet."; + // Set default values. + windowMode = StatusWindowTextMode; + image = [NSImage imageNamed:@"NSApplicationIcon"]; + text = @"No string set yet."; + volumeLevel = 0.0; + [self buildStatusWindow]; } + return self; } - (void)buildStatusWindow { NSRect imageRect; - NSRect textRect; + NSRect dataRect; float imageWidth = 0.0; float imageHeight = 0.0; - float textWidth = 0.0; - float textHeight = 0.0; + float dataWidth = 0.0; + float dataHeight = 0.0; float contentHeight = 0.0; float windowWidth = 0.0; float windowHeight = 0.0; @@ -51,25 +55,30 @@ // Get image width and height. imageWidth = [image size].width; imageHeight = [image size].height; - + + if ( windowMode == StatusWindowTextMode ) { // Iterate over each line to get text width and height - while ( (oneLine = [lineEnum nextObject]) ) { + while ( (oneLine = [lineEnum nextObject]) ) { // Get the width of one line, adding 8.0 because Apple sucks donkey rectum. - float oneLineWidth = ( [oneLine sizeWithAttributes:attr].width + 8.0 ); + float oneLineWidth = ( [oneLine sizeWithAttributes:attr].width + 8.0 ); // Add the height of this line to the total text height - textHeight += [oneLine sizeWithAttributes:attr].height; + dataHeight += [oneLine sizeWithAttributes:attr].height; // If this line wider than the last one, set it as the text width. - textWidth = ( ( textWidth > oneLineWidth ) ? textWidth : oneLineWidth ); + dataWidth = ( ( dataWidth > oneLineWidth ) ? dataWidth : oneLineWidth ); + } + + // Add 4.0 to the final dataHeight to accomodate the shadow. + dataHeight += 4.0; + } else { + dataHeight = 24.0; + dataWidth = 200.0; } - // Add 4.0 to the final textHeight to accomodate the shadow. - textHeight += 4.0; - // Set the content height to the greater of the text and image heights. - contentHeight = ( ( imageHeight > textHeight ) ? imageHeight : textHeight ); + contentHeight = ( ( imageHeight > dataHeight ) ? imageHeight : dataHeight ); // Setup the Window, and remove all its contentview's subviews. - windowWidth = ( SW_PAD + imageWidth + SW_SPACE + textWidth + SW_PAD ); + windowWidth = ( SW_PAD + imageWidth + SW_SPACE + dataWidth + SW_PAD ); windowHeight = ( SW_PAD + contentHeight + SW_PAD ); [self setFrame:NSMakeRect(SW_BORDER, SW_BORDER, windowWidth, windowHeight) display:YES]; [[[self contentView] subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; @@ -82,25 +91,70 @@ imageView = [[[NSImageView alloc] initWithFrame:imageRect] autorelease]; [imageView setImage:image]; [[self contentView] addSubview:imageView]; + + dataRect = NSMakeRect( (SW_PAD + imageWidth + SW_SPACE), + (SW_PAD + ((contentHeight - dataHeight) / 2)), + dataWidth, + dataHeight); + + if ( windowMode == StatusWindowTextMode ) { // Setup, position, fill, and add the text view to the content view. - textRect = NSMakeRect( (SW_PAD + imageWidth + SW_SPACE), - (SW_PAD + ((contentHeight - textHeight) / 2)), - textWidth, - textHeight); - textField = [[[ITTextField alloc] initWithFrame:textRect] autorelease]; - [textField setEditable:NO]; - [textField setSelectable:NO]; - [textField setBordered:NO]; - [textField setDrawsBackground:NO]; - [textField setFont:[NSFont fontWithName:@"Lucida Grande Bold" size:18]]; - [textField setTextColor:[NSColor whiteColor]]; - [textField setCastsShadow:YES]; - [textField setStringValue:text]; - [[self contentView] addSubview:textField]; + textField = [[[ITTextField alloc] initWithFrame:dataRect] autorelease]; + [textField setEditable:NO]; + [textField setSelectable:NO]; + [textField setBordered:NO]; + [textField setDrawsBackground:NO]; + [textField setFont:[NSFont fontWithName:@"Lucida Grande Bold" size:18]]; + [textField setTextColor:[NSColor whiteColor]]; + [textField setCastsShadow:YES]; + [textField setStringValue:text]; + [[self contentView] addSubview:textField]; + + } else if ( windowMode == StatusWindowVolumeMode ) { + + NSEnumerator *cellEnum; + id aCell; + int lights = ( ceil(volumeLevel * 100) / 10 ); + int lightCount = 0; + + volMatrix = [[[NSMatrix alloc] initWithFrame:dataRect + mode:NSHighlightModeMatrix + cellClass:NSClassFromString(@"ITTextFieldCell") + numberOfRows:1 + numberOfColumns:10] autorelease]; + + [volMatrix setCellSize:NSMakeSize(20, 24)]; + [volMatrix setIntercellSpacing:NSMakeSize(0, 0)]; + + cellEnum = [[volMatrix cells] objectEnumerator]; + + while ( (aCell = [cellEnum nextObject]) ) { + [aCell setEditable:NO]; + [aCell setSelectable:NO]; + [aCell setBordered:NO]; + [aCell setDrawsBackground:NO]; + [aCell setFont:[NSFont fontWithName:@"Lucida Grande Bold" size:18]]; + [aCell setStringValue:[NSString stringWithUTF8String:"▊"]]; + + lightCount ++; + + NSLog(@"%f, %i, %i", volumeLevel, lights, lightCount); + + if ( lights >= lightCount ) { + [aCell setCastsShadow:YES]; + [aCell setTextColor:[NSColor whiteColor]]; + } else { + [aCell setCastsShadow:NO]; + [aCell setTextColor:[NSColor darkGrayColor]]; + } + + } + + [[self contentView] addSubview:volMatrix]; + } [[self contentView] setNeedsDisplay:YES]; - } - (void)setImage:(NSImage *)newImage @@ -114,9 +168,15 @@ { [text autorelease]; text = [newText copy]; + windowMode = StatusWindowTextMode; [self buildStatusWindow]; } - +- (void)setVolume:(float)level +{ + volumeLevel = level; + windowMode = StatusWindowVolumeMode; + [self buildStatusWindow]; +} @end diff --git a/StatusWindowController.h b/StatusWindowController.h index 804c090..913432b 100755 --- a/StatusWindowController.h +++ b/StatusWindowController.h @@ -47,7 +47,7 @@ typedef enum { - (void)showUpcomingSongsWithTitles:(NSArray *)titleStrings; -- (void)showVolumeWindowWithLevel:(int)level; +- (void)showVolumeWindowWithLevel:(float)level; - (void)showRatingWindowWithLevel:(int)level; - (void)showShuffleWindowWithMode:(MTStatusWindowShuffleMode)mode; - (void)showLoopWindowWithMode:(MTStatusWindowLoopMode)mode; diff --git a/StatusWindowController.m b/StatusWindowController.m index 146c1a8..43fdd46 100755 --- a/StatusWindowController.m +++ b/StatusWindowController.m @@ -104,9 +104,11 @@ } -- (void)showVolumeWindowWithLevel:(int)level +- (void)showVolumeWindowWithLevel:(float)level { - + [_window setImage:[NSImage imageNamed:@"Volume"]]; + [_window setVolume:level]; + [_window appear:self]; } - (void)showRatingWindowWithLevel:(int)level