summaryrefslogtreecommitdiffstats
path: root/chrome/browser/browser_theme_provider_mac.mm
diff options
context:
space:
mode:
authoravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-17 22:15:13 +0000
committeravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-17 22:15:13 +0000
commita3d3a7cf3b81cc8d00490bb7bfd92b57f0146d9c (patch)
tree7ae34f2b5e389e3d90bb54a94e04690ca0af416e /chrome/browser/browser_theme_provider_mac.mm
parentd32185d54315610c0f3afc5e57edd9c7b7663a95 (diff)
downloadchromium_src-a3d3a7cf3b81cc8d00490bb7bfd92b57f0146d9c.zip
chromium_src-a3d3a7cf3b81cc8d00490bb7bfd92b57f0146d9c.tar.gz
chromium_src-a3d3a7cf3b81cc8d00490bb7bfd92b57f0146d9c.tar.bz2
Allow the Mac theme provider to give default colors/tints if requested. Switch the download shelf's "open downloads" link to directly use the theme provider.
BUG=http://crbug.com/35554 TEST=no visible change in normal mode; incognito mode still being worked on Review URL: http://codereview.chromium.org/630002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39279 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser_theme_provider_mac.mm')
-rw-r--r--chrome/browser/browser_theme_provider_mac.mm104
1 files changed, 72 insertions, 32 deletions
diff --git a/chrome/browser/browser_theme_provider_mac.mm b/chrome/browser/browser_theme_provider_mac.mm
index 2f8c749..22de117 100644
--- a/chrome/browser/browser_theme_provider_mac.mm
+++ b/chrome/browser/browser_theme_provider_mac.mm
@@ -11,6 +11,9 @@
#include "chrome/browser/browser_theme_pack.h"
#include "skia/ext/skia_utils_mac.h"
+NSString* const kBrowserThemeDidChangeNotification =
+ @"BrowserThemeDidChangeNotification";
+
namespace {
void HSLToHSB(const color_utils::HSL& hsl, CGFloat* h, CGFloat* s, CGFloat* b) {
@@ -25,9 +28,13 @@ void HSLToHSB(const color_utils::HSL& hsl, CGFloat* h, CGFloat* s, CGFloat* b) {
}
-NSImage* BrowserThemeProvider::GetNSImageNamed(int id) const {
+NSImage* BrowserThemeProvider::GetNSImageNamed(int id,
+ bool allow_default) const {
DCHECK(CalledOnValidThread());
+ if (!allow_default && !HasCustomImage(id))
+ return nil;
+
// Check to see if we already have the image in the cache.
NSImageMap::const_iterator nsimage_iter = nsimage_cache_.find(id);
if (nsimage_iter != nsimage_cache_.end())
@@ -65,60 +72,93 @@ NSImage* BrowserThemeProvider::GetNSImageNamed(int id) const {
return empty_image;
}
-NSColor* BrowserThemeProvider::GetNSColor(int id) const {
+NSColor* BrowserThemeProvider::GetNSColor(int id,
+ bool allow_default) const {
DCHECK(CalledOnValidThread());
// Check to see if we already have the color in the cache.
NSColorMap::const_iterator nscolor_iter = nscolor_cache_.find(id);
- if (nscolor_iter != nscolor_cache_.end())
- return nscolor_iter->second;
+ if (nscolor_iter != nscolor_cache_.end()) {
+ bool cached_is_default = nscolor_iter->second.second;
+ if (!cached_is_default || allow_default)
+ return nscolor_iter->second.first;
+ }
+ bool is_default = false;
SkColor sk_color;
if (theme_pack_.get() && theme_pack_->GetColor(id, &sk_color)) {
- NSColor* color = [NSColor
- colorWithCalibratedRed:SkColorGetR(sk_color)/255.0
- green:SkColorGetG(sk_color)/255.0
- blue:SkColorGetB(sk_color)/255.0
- alpha:SkColorGetA(sk_color)/255.0];
-
- // We loaded successfully. Cache the color.
- if (color) {
- nscolor_cache_[id] = [color retain];
- return color;
- }
+ is_default = false;
+ } else {
+ is_default = true;
+ sk_color = GetDefaultColor(id);
+ }
+
+ if (is_default && !allow_default)
+ return nil;
+
+ NSColor* color = [NSColor
+ colorWithCalibratedRed:SkColorGetR(sk_color)/255.0
+ green:SkColorGetG(sk_color)/255.0
+ blue:SkColorGetB(sk_color)/255.0
+ alpha:SkColorGetA(sk_color)/255.0];
+
+ // We loaded successfully. Cache the color.
+ if (color) {
+ nscolor_cache_[id] = std::make_pair([color retain], is_default);
+ return color;
}
return nil;
}
-NSColor* BrowserThemeProvider::GetNSColorTint(int id) const {
+NSColor* BrowserThemeProvider::GetNSColorTint(int id,
+ bool allow_default) const {
DCHECK(CalledOnValidThread());
// Check to see if we already have the color in the cache.
NSColorMap::const_iterator nscolor_iter = nscolor_cache_.find(id);
- if (nscolor_iter != nscolor_cache_.end())
- return nscolor_iter->second;
+ if (nscolor_iter != nscolor_cache_.end()) {
+ bool cached_is_default = nscolor_iter->second.second;
+ if (!cached_is_default || allow_default)
+ return nscolor_iter->second.first;
+ }
+ bool is_default = false;
color_utils::HSL tint;
if (theme_pack_.get() && theme_pack_->GetTint(id, &tint)) {
- CGFloat hue, saturation, brightness;
- HSLToHSB(tint, &hue, &saturation, &brightness);
-
- NSColor* tint_color = [NSColor colorWithCalibratedHue:hue
- saturation:saturation
- brightness:brightness
- alpha:1.0];
-
- // We loaded successfully. Cache the color.
- if (tint_color) {
- nscolor_cache_[id] = [tint_color retain];
- return tint_color;
- }
+ is_default = false;
+ } else {
+ is_default = true;
+ tint = GetDefaultTint(id);
+ }
+
+ if (is_default && !allow_default)
+ return nil;
+
+ CGFloat hue, saturation, brightness;
+ HSLToHSB(tint, &hue, &saturation, &brightness);
+
+ NSColor* tint_color = [NSColor colorWithCalibratedHue:hue
+ saturation:saturation
+ brightness:brightness
+ alpha:1.0];
+
+ // We loaded successfully. Cache the color.
+ if (tint_color) {
+ nscolor_cache_[id] = std::make_pair([tint_color retain], is_default);
+ return tint_color;
}
return nil;
}
+// Let all the browser views know that themes have changed in a platform way.
+void BrowserThemeProvider::NotifyPlatformThemeChanged() {
+ NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
+ [defaultCenter postNotificationName:kBrowserThemeDidChangeNotification
+ object:[NSValue valueWithPointer:this]];
+}
+
void BrowserThemeProvider::FreePlatformCaches() {
DCHECK(CalledOnValidThread());
@@ -132,7 +172,7 @@ void BrowserThemeProvider::FreePlatformCaches() {
// Free colors.
for (NSColorMap::iterator i = nscolor_cache_.begin();
i != nscolor_cache_.end(); i++) {
- [i->second release];
+ [i->second.first release];
}
nscolor_cache_.clear();
}