diff options
author | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2009-07-10 15:45:20 +0000 |
---|---|---|
committer | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2009-07-10 15:45:20 +0000 |
commit | 8d01a5af0ac2c95920642bddf22e737882e751e7 (patch) | |
tree | ed92c42232ccfc21d833ad4887d9a2811813f448 /AppKit | |
parent | 519612de76ef07e2290e95ef5b844dd60b4580a8 (diff) |
[Author: alcor]
Updated theme methods for chrome/qsb
R=avi
DELTA=283 (152 added, 33 deleted, 98 changed)
Diffstat (limited to 'AppKit')
-rw-r--r-- | AppKit/GTMTheme.h | 57 | ||||
-rw-r--r-- | AppKit/GTMTheme.m | 378 | ||||
-rw-r--r-- | AppKit/GTMThemeTest.m | 20 |
3 files changed, 287 insertions, 168 deletions
diff --git a/AppKit/GTMTheme.h b/AppKit/GTMTheme.h index 5f4700e..c4de712 100644 --- a/AppKit/GTMTheme.h +++ b/AppKit/GTMTheme.h @@ -31,48 +31,85 @@ enum { GTMThemeStyleToolBar, GTMThemeStyleToolBarButton, GTMThemeStyleToolBarButtonPressed, - GTMThemeStyleBookmarksBar, + GTMThemeStyleBookmarksBarButton, }; typedef NSUInteger GTMThemeStyle; +enum { + GTMThemeStateActiveWindow = 1 << 0 +}; +typedef NSUInteger GTMThemeState; + // GTMTheme provides a range of values for procedural drawing of UI elements // based on interpolation of a single background color @interface GTMTheme : NSObject { - @private +@private NSColor *backgroundColor_; // bound to user defaults NSImage *backgroundImage_; // bound to user defaults NSMutableDictionary *values_; // cached values + NSString *basePath_; // base path for referenced resources } // Access the global theme. By default this is bound to user defaults + (GTMTheme *)defaultTheme; + (void)setDefaultTheme:(GTMTheme *)theme; +// Bind this theme to user defaults +- (void)bindToUserDefaults; + // returns base theme color - (NSColor *)backgroundColor; +// sets the base theme color +- (void)setBackgroundColor:(NSColor *)value; + // base background color - (NSImage *)backgroundImage; -// NSColor (or pattern color) for the background of the window -- (NSColor *)windowBackgroundColor:(BOOL)active; +// NSImage pattern background +- (NSImage *)backgroundImageForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state; + +// NSColor of the above image, if present, else gradientForStyle +- (NSColor *)backgroundPatternColorForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state; // NSGradient for specific usage, active indicates whether the window is key -- (NSGradient *)gradientForStyle:(GTMThemeStyle)style active:(BOOL)active; +- (NSGradient *)gradientForStyle:(GTMThemeStyle)style state:(GTMThemeState)state; // Outline color for stroke, active indicates whether the window is key -- (NSColor *)strokeColorForStyle:(GTMThemeStyle)style active:(BOOL)active; +- (NSColor *)strokeColorForStyle:(GTMThemeStyle)style state:(GTMThemeState)state; // Indicates whether luminance is dark or light -- (BOOL)styleIsDark:(GTMThemeStyle)style active:(BOOL)active; +- (BOOL)styleIsDark:(GTMThemeStyle)style state:(GTMThemeState)state; // Background style for this style and state - (NSBackgroundStyle)interiorBackgroundStyleForStyle:(GTMThemeStyle)style - active:(BOOL)active; + state:(GTMThemeState)state; + +- (NSColor *)iconColorForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state; + +// Manually set a theme value +- (void)setValue:(id)value + forAttribute:(NSString *)attribute + style:(GTMThemeStyle)style + state:(GTMThemeState)state; +@end + +// Convenience categories for NSWindow and NSView to access the current theme +// Default implementation polls the window delegate +@interface NSWindow (GTMTheme) +- (GTMTheme *)gtm_theme; +@end + +@interface NSView (GTMTheme) +- (GTMTheme *)gtm_theme; +@end -// NSColor version of the gradient (for window backgrounds, etc) -- (NSColor *)patternColorForStyle:(GTMThemeStyle)style active:(BOOL)active; +@protocol GTMThemeDelegate +- (GTMTheme *)gtm_themeForWindow:(NSWindow *)window; @end #endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 diff --git a/AppKit/GTMTheme.m b/AppKit/GTMTheme.m index 3ce4291..3eecd06 100644 --- a/AppKit/GTMTheme.m +++ b/AppKit/GTMTheme.m @@ -6,9 +6,9 @@ // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy // of the License at -// +// // http://www.apache.org/licenses/LICENSE-2.0 -// +// // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -20,10 +20,31 @@ #import "GTMTheme.h" #import "GTMNSColor+Luminance.h" +#import <QuartzCore/QuartzCore.h> static GTMTheme *gGTMDefaultTheme = nil; NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; +@implementation NSWindow (GTMTheme) +- (GTMTheme *)gtm_theme { + GTMTheme *theme = nil; + if ([[self delegate] conformsToProtocol: + @protocol(GTMThemeDelegate)]) { + theme = [[self delegate] gtm_themeForWindow:self]; + } else if ([[self windowController] conformsToProtocol: + @protocol(GTMThemeDelegate)]) { + theme = [[self windowController] gtm_themeForWindow:self]; + } + return theme; +} +@end + +@implementation NSView (GTMTheme) +- (GTMTheme *)gtm_theme { + return [[self window] gtm_theme]; +} +@end + @interface GTMTheme () - (void)bindToUserDefaults; - (void)sendChangeNotification; @@ -34,7 +55,7 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; + (void)setDefaultTheme:(GTMTheme *)theme { if (gGTMDefaultTheme != theme) { [gGTMDefaultTheme release]; - gGTMDefaultTheme = [theme retain]; + gGTMDefaultTheme = [theme retain]; [gGTMDefaultTheme sendChangeNotification]; } } @@ -46,12 +67,12 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; [gGTMDefaultTheme bindToUserDefaults]; } } - return gGTMDefaultTheme; + return gGTMDefaultTheme; } - (void)bindToUserDefaults { - NSUserDefaultsController * controller - = [NSUserDefaultsController sharedUserDefaultsController]; + NSUserDefaultsController * controller = + [NSUserDefaultsController sharedUserDefaultsController]; [self bind:@"backgroundColor" toObject:controller withKeyPath:@"values.GTMThemeBackgroundColor" @@ -59,7 +80,7 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; NSUnarchiveFromDataTransformerName, NSValueTransformerNameBindingOption, nil]]; - + [self bind:@"backgroundImage" toObject:controller withKeyPath:@"values.GTMThemeBackgroundImageData" @@ -92,32 +113,44 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; - (void)sendChangeNotification { [[NSNotificationCenter defaultCenter] - postNotificationName:kGTMThemeDidChangeNotification - object:self]; + postNotificationName:kGTMThemeDidChangeNotification + object:self]; } -- (id)keyForSelector:(SEL)selector +- (id)keyForSelector:(SEL)selector style:(GTMThemeStyle)style - active:(BOOL)active { - return [NSString stringWithFormat:@"%p.%d.%d", selector, style, active]; + state:(GTMThemeState)state { + return [NSString stringWithFormat:@"%p.%d.%d", selector, style, state]; } -- (id)valueForSelector:(SEL)selector +- (id)valueForSelector:(SEL)selector style:(GTMThemeStyle)style - active:(BOOL)active { + state:(GTMThemeState)state { id value = [values_ objectForKey: - [self keyForSelector:selector style:style active:active]]; + [self keyForSelector:selector style:style state:state]]; return value; } - (void)cacheValue:(id)value - forSelector:(SEL)selector - style:(GTMThemeStyle)style - active:(BOOL)active { - id key = [self keyForSelector:selector style:style active:active]; + forSelector:(SEL)selector + style:(GTMThemeStyle)style + state:(GTMThemeState)state { + id key = [self keyForSelector:selector style:style state:state]; if (key && value) [values_ setObject:value forKey:key]; } +- (void)setValue:(id)value + forAttribute:(NSString *)attribute + style:(GTMThemeStyle)style + state:(GTMThemeState)state { + NSString *selector = [NSString stringWithFormat:@"%@ForStyle:state:", + attribute]; + [self cacheValue:value + forSelector:NSSelectorFromString(selector) + style:style + state:state]; +} + - (void)setBackgroundColor:(NSColor *)value { if (backgroundColor_ != value) { [backgroundColor_ release]; @@ -128,9 +161,9 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; } - (NSColor *)backgroundColor { // For nil, we return a color that works with a normal textured window - if (!backgroundColor_) - return [NSColor colorWithCalibratedWhite:0.75 alpha:1.0]; - return backgroundColor_; + if (!backgroundColor_) + return [NSColor colorWithCalibratedWhite:0.667 alpha:1.0]; + return backgroundColor_; } - (void)setBackgroundImage:(NSImage *)value { @@ -141,103 +174,142 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; } } -- (NSColor *)windowBackgroundColor:(BOOL)active { - NSColor *color = nil; - if (backgroundImage_) { - // TODO(alcor): dim images when disabled - color = [NSColor colorWithPatternImage:backgroundImage_]; - } else if (backgroundColor_) { - color = [self patternColorForStyle:GTMThemeStyleWindow active:active]; - } - return color; +- (NSImage *)backgroundImage { + return backgroundImage_; } -- (NSImage *)backgroundImage { - return backgroundImage_; +- (NSImage *)backgroundImageForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state { + id value = [self valueForSelector:_cmd style:style state:state]; + if (value) return value; + + if (style == GTMThemeStyleWindow) { + NSColor *color = nil; + if (!state) { + // TODO(alcor): dim images when disabled + color = [NSColor colorWithPatternImage:backgroundImage_]; + + if (state != GTMThemeStateActiveWindow) { + NSImage *image = + [self backgroundImageForStyle:style + state:GTMThemeStateActiveWindow]; + NSBitmapImageRep *rep = (NSBitmapImageRep *)[image + bestRepresentationForDevice:nil]; + if ([rep respondsToSelector:@selector(CGImage)]) { + CIImage *ciimage = [CIImage imageWithCGImage:[rep CGImage]]; + CIFilter *filter = [CIFilter filterWithName:@"CIColorControls" + keysAndValues: + @"inputSaturation", + [NSNumber numberWithFloat:0.8], + @"inputBrightness", + [NSNumber numberWithFloat:0.2f], + @"inputContrast", + [NSNumber numberWithFloat:0.8f], + @"inputImage", + ciimage, + nil]; + + ciimage = [filter valueForKey:@"outputImage"]; + + value = [[[NSImage alloc] init] autorelease]; + [value addRepresentation:[NSCIImageRep imageRepWithCIImage:ciimage]]; + } + } + } + } + + if (value) [self cacheValue:value forSelector:_cmd style:style state:state]; + return value; } -- (NSBackgroundStyle)interiorBackgroundStyleForStyle:(GTMThemeStyle)style - active:(BOOL)active { - id value = [self valueForSelector:_cmd style:style active:active]; +- (NSBackgroundStyle)interiorBackgroundStyleForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state { + id value = [self valueForSelector:_cmd style:style state:state]; if (value) return [value intValue]; - - NSGradient *gradient = [self gradientForStyle:style active:active]; + + NSGradient *gradient = [self gradientForStyle:style state:state]; NSColor *color = [gradient interpolatedColorAtLocation:0.5]; BOOL dark = [color gtm_isDarkColor]; - value = [NSNumber numberWithInt: dark ? NSBackgroundStyleLowered + value = [NSNumber numberWithInt: dark ? NSBackgroundStyleLowered : NSBackgroundStyleRaised]; - [self cacheValue:value forSelector:_cmd style:style active:active]; + [self cacheValue:value forSelector:_cmd style:style state:state]; return [value intValue]; } -- (BOOL)styleIsDark:(GTMThemeStyle)style active:(BOOL)active { - id value = [self valueForSelector:_cmd style:style active:active]; +- (BOOL)styleIsDark:(GTMThemeStyle)style state:(GTMThemeState)state { + id value = [self valueForSelector:_cmd style:style state:state]; if (value) return [value boolValue]; - + if (style == GTMThemeStyleToolBarButtonPressed) { value = [NSNumber numberWithBool:YES]; } else { value = [NSNumber numberWithBool:[[self backgroundColor] gtm_isDarkColor]]; } - [self cacheValue:value forSelector:_cmd style:style active:active]; + [self cacheValue:value forSelector:_cmd style:style state:state]; return [value boolValue]; } -- (NSColor *)patternColorForStyle:(GTMThemeStyle)style active:(BOOL)active { - NSColor *color = [self valueForSelector:_cmd style:style active:active]; +- (NSColor *)backgroundPatternColorForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state { + NSColor *color = [self valueForSelector:_cmd style:style state:state]; if (color) return color; - - NSGradient *gradient = [self gradientForStyle:style active:active]; - if (gradient) { - // create a gradient image for the background - CGRect r = CGRectZero; - // TODO(alcor): figure out a better way to get an image that is the right - // size - r.size = CGSizeMake(4, 36); - size_t bytesPerRow = 4 * r.size.width; - - CGColorSpaceRef space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); - CGContextRef context = CGBitmapContextCreate(NULL, - r.size.width, - r.size.height, - 8, - bytesPerRow, - space, - kCGImageAlphaPremultipliedFirst); - CGColorSpaceRelease(space); - NSGraphicsContext *nsContext - = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:YES]; - [NSGraphicsContext saveGraphicsState]; - [NSGraphicsContext setCurrentContext:nsContext]; - [gradient drawInRect:NSMakeRect(0, 0, r.size.width, r.size.height) - angle:270]; - [NSGraphicsContext restoreGraphicsState]; - - CGImageRef cgImage = CGBitmapContextCreateImage(context); - CGContextRelease(context); - NSBitmapImageRep *rep = nil; - if (cgImage) { - rep = [[[NSBitmapImageRep alloc] initWithCGImage:cgImage] - autorelease]; - CGImageRelease(cgImage); + + NSImage *image = [self backgroundImageForStyle:style state:state]; + if (!image) { + NSGradient *gradient = [self gradientForStyle:style state:state]; + if (gradient) { + // create a gradient image for the background + CGRect r = CGRectZero; + // TODO(alcor): figure out a better way to get an image that is the right + // size. + r.size = CGSizeMake(4, 36); + size_t bytesPerRow = 4 * r.size.width; + + CGColorSpaceRef space + = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); + CGContextRef context + = CGBitmapContextCreate(NULL, + r.size.width, + r.size.height, + 8, + bytesPerRow, + space, + kCGImageAlphaPremultipliedFirst); + CGColorSpaceRelease(space); + NSGraphicsContext *nsContext = + [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:YES]; + [NSGraphicsContext saveGraphicsState]; + [NSGraphicsContext setCurrentContext:nsContext]; + [gradient drawInRect:NSMakeRect(0, 0, r.size.width, r.size.height) + angle:270]; + [NSGraphicsContext restoreGraphicsState]; + + CGImageRef cgImage = CGBitmapContextCreateImage(context); + CGContextRelease(context); + NSBitmapImageRep *rep = nil; + if (cgImage) { + rep = [[[NSBitmapImageRep alloc] initWithCGImage:cgImage] + autorelease]; + CGImageRelease(cgImage); + } + + image = [[[NSImage alloc] initWithSize:NSSizeFromCGSize(r.size)] + autorelease]; + [image addRepresentation:rep]; } - - NSImage *image = [[[NSImage alloc] initWithSize:NSSizeFromCGSize(r.size)] - autorelease]; - [image addRepresentation:rep]; - - color = [NSColor colorWithPatternImage:image]; } - [self cacheValue:color forSelector:_cmd style:style active:active]; + color = [NSColor colorWithPatternImage:image]; + [self cacheValue:color forSelector:_cmd style:style state:state]; return color; } -- (NSGradient *)gradientForStyle:(GTMThemeStyle)style active:(BOOL)active { - NSGradient *gradient = [self valueForSelector:_cmd style:style active:active]; +- (NSGradient *)gradientForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state { + NSGradient *gradient = [self valueForSelector:_cmd style:style state:state]; if (gradient) return gradient; - + BOOL useDarkColors = backgroundImage_ != nil || style == GTMThemeStyleWindow; - + NSUInteger uses[4]; if (useDarkColors) { uses[0] = GTMColorationBaseHighlight; @@ -251,13 +323,16 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; uses[3] = GTMColorationLightPenumbra; } NSColor *backgroundColor = [self backgroundColor]; + + BOOL active = + (state & GTMThemeStateActiveWindow) == GTMThemeStateActiveWindow; switch (style) { case GTMThemeStyleTabBarDeselected: { - NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[2] + NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[2] faded:!active]; - NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[2] - faded:!active]; - + NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[3] + faded:!active]; + gradient = [[[NSGradient alloc] initWithStartingColor:startColor endingColor:endColor] autorelease]; @@ -265,106 +340,88 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; } case GTMThemeStyleTabBarSelected: { NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[0] - faded:!active]; - NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[1] - faded:!active]; + faded:!active]; + NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[1] + faded:!active]; gradient = [[[NSGradient alloc] initWithStartingColor:startColor - endingColor:endColor] + endingColor:endColor] autorelease]; break; } case GTMThemeStyleWindow: { CGFloat luminance = [backgroundColor gtm_luminance]; - + // Adjust luminance so it never hits black if (luminance < 0.5) { CGFloat adjustment = (0.5 - luminance) / 1.5; backgroundColor - = [backgroundColor gtm_colorByAdjustingLuminance:adjustment]; + = [backgroundColor gtm_colorByAdjustingLuminance:adjustment]; } - NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[1] + NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[1] faded:!active]; - NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[2] - faded:!active]; - - + NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[2] + faded:!active]; + + if (!active) { - startColor = [startColor gtm_colorByAdjustingLuminance:0.1 + startColor = [startColor gtm_colorByAdjustingLuminance:0.1 saturation:0.5]; endColor = [endColor gtm_colorByAdjustingLuminance:0.1 saturation:0.5]; - + } gradient = [[[NSGradient alloc] initWithStartingColor:startColor endingColor:endColor] autorelease]; break; } - case GTMThemeStyleToolBar: { - NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[1] - faded:!active]; - NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[2] - faded:!active]; - gradient = [[[NSGradient alloc] initWithStartingColor:startColor - endingColor:endColor] - autorelease]; - break; - } + case GTMThemeStyleToolBar: case GTMThemeStyleToolBarButton: { NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[0] faded:!active]; NSColor *midColor = [backgroundColor gtm_colorAdjustedFor:uses[1] - faded:!active]; + faded:!active]; NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[2] - faded:!active]; + faded:!active]; NSColor *glowColor = [backgroundColor gtm_colorAdjustedFor:uses[3] - faded:!active]; - + faded:!active]; + gradient = [[[NSGradient alloc] initWithColorsAndLocations: startColor, 0.0, - midColor, 0.5, - endColor, 0.9, - glowColor, 1.0, + midColor, 0.25, + endColor, 0.5, + glowColor, 0.75, nil] autorelease]; break; } case GTMThemeStyleToolBarButtonPressed: { - NSColor *startColor = [backgroundColor - gtm_colorAdjustedFor:GTMColorationBaseShadow + NSColor *startColor = [backgroundColor + gtm_colorAdjustedFor:GTMColorationBaseShadow faded:!active]; NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:GTMColorationBaseMidtone - faded:!active]; - gradient = [[[NSGradient alloc] initWithStartingColor:startColor - endingColor:endColor] - autorelease]; - break; - } - case GTMThemeStyleBookmarksBar: { - NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[2] - faded:!active]; - NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[3] - faded:!active]; - + faded:!active]; gradient = [[[NSGradient alloc] initWithStartingColor:startColor endingColor:endColor] autorelease]; - break; } default: _GTMDevLog(@"Unexpected style: %d", style); break; } - - [self cacheValue:gradient forSelector:_cmd style:style active:active]; + + [self cacheValue:gradient forSelector:_cmd style:style state:state]; return gradient; } -- (NSColor *)strokeColorForStyle:(GTMThemeStyle)style active:(BOOL)active { - NSColor *color = [self valueForSelector:_cmd style:style active:active]; +- (NSColor *)strokeColorForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state { + NSColor *color = [self valueForSelector:_cmd style:style state:state]; if (color) return color; NSColor *backgroundColor = [self backgroundColor]; + BOOL active = (state & GTMThemeStateActiveWindow) + == GTMThemeStateActiveWindow; switch (style) { case GTMThemeStyleToolBarButton: color = [[backgroundColor gtm_colorAdjustedFor:GTMColorationDarkShadow @@ -372,17 +429,40 @@ NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; colorWithAlphaComponent:0.3]; break; case GTMThemeStyleToolBar: - case GTMThemeStyleBookmarksBar: default: - color = [[self backgroundColor] gtm_colorAdjustedFor:GTMColorationBaseShadow - faded:!active]; + color = [[self backgroundColor] + gtm_colorAdjustedFor:GTMColorationBaseShadow + faded:!active]; break; } - - [self cacheValue:color forSelector:_cmd style:style active:active]; + + [self cacheValue:color forSelector:_cmd style:style state:state]; return color; } +- (NSColor *)iconColorForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state { + NSColor *color = [self valueForSelector:_cmd style:style state:state]; + if (color) return color; + + [self cacheValue:color forSelector:_cmd style:style state:state]; + return color; +} + +- (NSColor *)textColorForStyle:(GTMThemeStyle)style + state:(GTMThemeState)state { + NSColor *color = [self valueForSelector:_cmd style:style state:state]; + if (color) return color; + + if ([self styleIsDark:style state:state]) { + color = [NSColor whiteColor]; + } else { + color = [NSColor blackColor]; + } + + [self cacheValue:color forSelector:_cmd style:style state:state]; + return color; +} @end #endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 diff --git a/AppKit/GTMThemeTest.m b/AppKit/GTMThemeTest.m index 3e37c1f..dd6cd37 100644 --- a/AppKit/GTMThemeTest.m +++ b/AppKit/GTMThemeTest.m @@ -34,28 +34,30 @@ // When there are no values, use window default colors STAssertEqualObjects([theme backgroundColor], [NSColor colorWithCalibratedWhite:0.75 alpha:1.0], nil); - STAssertNil([theme windowBackgroundColor:YES], nil); + STAssertNil([theme backgroundImageForStyle:GTMThemeStyleWindow state:YES], + nil); STAssertNil([theme backgroundImage], nil); NSColor *color = [NSColor redColor]; NSData *colorData = [NSArchiver archivedDataWithRootObject:color]; [[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"GTMThemeBackgroundColor"]; - - STAssertNotNil([theme windowBackgroundColor:YES], nil); - STAssertNotNil([theme patternColorForStyle:GTMThemeStyleToolBar - active:YES], nil); + + STAssertNotNil([theme backgroundImageForStyle:GTMThemeStyleWindow state:YES], + nil); + STAssertNotNil([theme backgroundPatternColorForStyle:GTMThemeStyleToolBar + state:YES], nil); STAssertNotNil([theme strokeColorForStyle:GTMThemeStyleToolBar - active:YES], nil); + state:YES], nil); STAssertNotNil([theme gradientForStyle:GTMThemeStyleToolBar - active:YES], nil); - + state:YES], nil); + STAssertEqualObjects([theme backgroundColor], color, nil); // TODO(alcor): add more of these cases once the constants are more concrete STAssertEquals([theme interiorBackgroundStyleForStyle:GTMThemeStyleToolBar - active:YES], + state:YES], (NSBackgroundStyle)NSBackgroundStyleRaised, nil); [[NSUserDefaults standardUserDefaults] removeObjectForKey: |