aboutsummaryrefslogtreecommitdiff
path: root/AppKit
diff options
context:
space:
mode:
authorGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2009-07-10 15:45:20 +0000
committerGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2009-07-10 15:45:20 +0000
commit8d01a5af0ac2c95920642bddf22e737882e751e7 (patch)
treeed92c42232ccfc21d833ad4887d9a2811813f448 /AppKit
parent519612de76ef07e2290e95ef5b844dd60b4580a8 (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.h57
-rw-r--r--AppKit/GTMTheme.m378
-rw-r--r--AppKit/GTMThemeTest.m20
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: