diff options
author | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-10 19:41:53 +0000 |
---|---|---|
committer | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-10 19:41:53 +0000 |
commit | af62bb4afd0dba5e607643f818a08a2aec642a80 (patch) | |
tree | 577687d6570ae15b9d23ccf2673eb669a31c4866 | |
parent | b8da78ad0ca066ada021b02bf4aaf1a686ef5af3 (diff) | |
download | chromium_src-af62bb4afd0dba5e607643f818a08a2aec642a80.zip chromium_src-af62bb4afd0dba5e607643f818a08a2aec642a80.tar.gz chromium_src-af62bb4afd0dba5e607643f818a08a2aec642a80.tar.bz2 |
Revert "Revert "Add button tinting to the toolbar buttons.""
This reverts commit r20399 and re-applies the button tinting
code. There's a fix for the go button gtk unittest by checking
to see if the browser is non-NULL before getting the theme provider.
TBR=erg
Review URL: http://codereview.chromium.org/155369
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20402 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/gtk/back_forward_button_gtk.cc | 5 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_toolbar_gtk.cc | 4 | ||||
-rw-r--r-- | chrome/browser/gtk/custom_button.cc | 96 | ||||
-rw-r--r-- | chrome/browser/gtk/custom_button.h | 40 | ||||
-rw-r--r-- | chrome/browser/gtk/go_button_gtk.cc | 7 | ||||
-rw-r--r-- | chrome/browser/gtk/toolbar_star_toggle_gtk.cc | 7 |
6 files changed, 121 insertions, 38 deletions
diff --git a/chrome/browser/gtk/back_forward_button_gtk.cc b/chrome/browser/gtk/back_forward_button_gtk.cc index dd35a0b..bc5238e 100644 --- a/chrome/browser/gtk/back_forward_button_gtk.cc +++ b/chrome/browser/gtk/back_forward_button_gtk.cc @@ -12,6 +12,7 @@ #include "chrome/browser/browser.h" #include "chrome/browser/gtk/back_forward_menu_model_gtk.h" #include "chrome/browser/gtk/menu_gtk.h" +#include "chrome/browser/profile.h" #include "chrome/common/gtk_util.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" @@ -41,8 +42,8 @@ BackForwardButtonGtk::BackForwardButtonGtk(Browser* browser, bool is_forward) tooltip = IDS_TOOLTIP_BACK; stock = GTK_STOCK_GO_BACK; } - button_.reset(new CustomDrawButton(normal, active, highlight, depressed, - stock)); + button_.reset(new CustomDrawButton(browser_->profile()->GetThemeProvider(), + normal, active, highlight, depressed, stock)); gtk_widget_set_tooltip_text(widget(), l10n_util::GetStringUTF8(tooltip).c_str()); menu_model_.reset(new BackForwardMenuModelGtk(browser, diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc index 673e4bf..03639be 100644 --- a/chrome/browser/gtk/browser_toolbar_gtk.cc +++ b/chrome/browser/gtk/browser_toolbar_gtk.cc @@ -328,8 +328,8 @@ gfx::Rect BrowserToolbarGtk::GetPopupBounds() const { CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton( int normal_id, int active_id, int highlight_id, int depressed_id, const std::string& localized_tooltip, const char* stock_id) { - CustomDrawButton* button = new CustomDrawButton(normal_id, active_id, - highlight_id, depressed_id, stock_id); + CustomDrawButton* button = new CustomDrawButton(profile_->GetThemeProvider(), + normal_id, active_id, highlight_id, depressed_id, stock_id); gtk_widget_set_tooltip_text(button->widget(), localized_tooltip.c_str()); diff --git a/chrome/browser/gtk/custom_button.cc b/chrome/browser/gtk/custom_button.cc index 6729ee6..cbe0f94 100644 --- a/chrome/browser/gtk/custom_button.cc +++ b/chrome/browser/gtk/custom_button.cc @@ -6,28 +6,43 @@ #include "app/l10n_util.h" #include "app/resource_bundle.h" +#include "app/theme_provider.h" #include "base/basictypes.h" #include "base/gfx/gtk_util.h" - +#include "chrome/common/notification_service.h" #include "grit/theme_resources.h" -CustomDrawButtonBase::CustomDrawButtonBase( - int normal_id, - int active_id, - int highlight_id, - int depressed_id) - : paint_override_(-1) { - // Load the button images from the resource bundle. - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - pixbufs_[GTK_STATE_NORMAL] = - normal_id ? rb.GetRTLEnabledPixbufNamed(normal_id) : NULL; - pixbufs_[GTK_STATE_ACTIVE] = - active_id ? rb.GetRTLEnabledPixbufNamed(active_id) : NULL; - pixbufs_[GTK_STATE_PRELIGHT] = - highlight_id ? rb.GetRTLEnabledPixbufNamed(highlight_id) : NULL; - pixbufs_[GTK_STATE_SELECTED] = NULL; - pixbufs_[GTK_STATE_INSENSITIVE] = - depressed_id ? rb.GetRTLEnabledPixbufNamed(depressed_id) : NULL; +CustomDrawButtonBase::CustomDrawButtonBase(ThemeProvider* theme_provider, + int normal_id, int active_id, int highlight_id, int depressed_id) + : paint_override_(-1), + normal_id_(normal_id), + active_id_(active_id), + highlight_id_(highlight_id), + depressed_id_(depressed_id), + theme_provider_(theme_provider) { + if (theme_provider) { + // Load images by pretending that we got a BROWSER_THEME_CHANGED + // notification. + Observe(NotificationType::BROWSER_THEME_CHANGED, + NotificationService::AllSources(), + NotificationService::NoDetails()); + + registrar_.Add(this, + NotificationType::BROWSER_THEME_CHANGED, + NotificationService::AllSources()); + } else { + // Load the button images from the resource bundle. + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + pixbufs_[GTK_STATE_NORMAL] = + normal_id ? rb.GetRTLEnabledPixbufNamed(normal_id) : NULL; + pixbufs_[GTK_STATE_ACTIVE] = + active_id ? rb.GetRTLEnabledPixbufNamed(active_id) : NULL; + pixbufs_[GTK_STATE_PRELIGHT] = + highlight_id ? rb.GetRTLEnabledPixbufNamed(highlight_id) : NULL; + pixbufs_[GTK_STATE_SELECTED] = NULL; + pixbufs_[GTK_STATE_INSENSITIVE] = + depressed_id ? rb.GetRTLEnabledPixbufNamed(depressed_id) : NULL; + } } CustomDrawButtonBase::~CustomDrawButtonBase() { @@ -61,24 +76,51 @@ gboolean CustomDrawButtonBase::OnExpose(GtkWidget* widget, GdkEventExpose* e) { return TRUE; } -CustomDrawButton::CustomDrawButton( - int normal_id, - int active_id, - int highlight_id, - int depressed_id, +void CustomDrawButtonBase::Observe(NotificationType type, + const NotificationSource& source, const NotificationDetails& details) { + DCHECK(theme_provider_); + DCHECK(NotificationType::BROWSER_THEME_CHANGED == type); + + // TODO(tc): Add GetRTLEnabledPixbufNamed to ThemeProviderGtk. + pixbufs_[GTK_STATE_NORMAL] = + normal_id_ ? theme_provider_->GetPixbufNamed(normal_id_) : NULL; + pixbufs_[GTK_STATE_ACTIVE] = + active_id_ ? theme_provider_->GetPixbufNamed(active_id_) : NULL; + pixbufs_[GTK_STATE_PRELIGHT] = + highlight_id_ ? theme_provider_->GetPixbufNamed(highlight_id_) : NULL; + pixbufs_[GTK_STATE_SELECTED] = NULL; + pixbufs_[GTK_STATE_INSENSITIVE] = + depressed_id_ ? theme_provider_->GetPixbufNamed(depressed_id_) : NULL; +} + +CustomDrawButton::CustomDrawButton(int normal_id, int active_id, + int highlight_id, int depressed_id, const char* stock_id) + : button_base_(NULL, normal_id, active_id, highlight_id, depressed_id), + gtk_stock_name_(stock_id), + has_expose_signal_handler_(false) { + Init(); +} + +CustomDrawButton::CustomDrawButton(ThemeProvider* theme_provider, + int normal_id, int active_id, int highlight_id, int depressed_id, const char* stock_id) - : button_base_(normal_id, active_id, highlight_id, depressed_id), + : button_base_(theme_provider, normal_id, active_id, highlight_id, + depressed_id), gtk_stock_name_(stock_id), has_expose_signal_handler_(false) { - widget_.Own(gtk_button_new()); - GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS); - SetUseSystemTheme(false); + Init(); } CustomDrawButton::~CustomDrawButton() { widget_.Destroy(); } +void CustomDrawButton::Init() { + widget_.Own(gtk_button_new()); + GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS); + SetUseSystemTheme(false); +} + void CustomDrawButton::SetUseSystemTheme(bool use_gtk) { if (use_gtk && gtk_stock_name_) { gtk_button_set_image( diff --git a/chrome/browser/gtk/custom_button.h b/chrome/browser/gtk/custom_button.h index 143a090..2c6bc68 100644 --- a/chrome/browser/gtk/custom_button.h +++ b/chrome/browser/gtk/custom_button.h @@ -11,20 +11,28 @@ #include "base/gfx/rect.h" #include "base/scoped_ptr.h" +#include "chrome/common/notification_observer.h" +#include "chrome/common/notification_registrar.h" #include "chrome/common/owned_widget_gtk.h" +class ThemeProvider; + // These classes implement two kinds of custom-drawn buttons. They're // used on the toolbar and the bookmarks bar. // CustomDrawButtonBase provides the base for building a custom drawn button. // It handles managing the pixbufs containing all the static images used to draw // the button. It also manages painting these pixbufs. -class CustomDrawButtonBase { +class CustomDrawButtonBase : public NotificationObserver { public: - CustomDrawButtonBase(int normal_id, + // If the images come from ResourceBundle rather than the theme provider, + // pass in NULL for |theme_provider|. + CustomDrawButtonBase(ThemeProvider* theme_provider, + int normal_id, int active_id, int highlight_id, int depressed_id); + ~CustomDrawButtonBase(); GdkPixbuf* pixbufs(int i) const { return pixbufs_[i]; } @@ -33,6 +41,11 @@ class CustomDrawButtonBase { void set_paint_override(int state) { paint_override_ = state; } + // Provide NotificationObserver implementation. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + private: // We store one GdkPixbuf* for each possible state of the button; // INSENSITIVE is the last available state; @@ -41,6 +54,17 @@ class CustomDrawButtonBase { // If non-negative, the state to paint the button. int paint_override_; + // We need to remember the image ids that the user passes in and the theme + // provider so we can reload images if the user changes theme. + int normal_id_; + int active_id_; + int highlight_id_; + int depressed_id_; + ThemeProvider* theme_provider_; + + // Used to listen for theme change notifications. + NotificationRegistrar registrar_; + DISALLOW_COPY_AND_ASSIGN(CustomDrawButtonBase); }; @@ -56,9 +80,19 @@ class CustomDrawButton { int highlight_id, int depressed_id, const char* stock_id); - explicit CustomDrawButton(const std::string& filename); + + // Same as above, but uses themed (and possibly tinted) images. + CustomDrawButton(ThemeProvider* theme_provider, + int normal_id, + int active_id, + int highlight_id, + int depressed_id, + const char* stock_id); + ~CustomDrawButton(); + void Init(); + GtkWidget* widget() const { return widget_.get(); } gfx::Rect bounds() const { diff --git a/chrome/browser/gtk/go_button_gtk.cc b/chrome/browser/gtk/go_button_gtk.cc index ef58f76..799b7e8 100644 --- a/chrome/browser/gtk/go_button_gtk.cc +++ b/chrome/browser/gtk/go_button_gtk.cc @@ -10,6 +10,7 @@ #include "chrome/app/chrome_dll_resource.h" #include "chrome/browser/browser.h" #include "chrome/browser/gtk/location_bar_view_gtk.h" +#include "chrome/browser/profile.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" @@ -21,8 +22,10 @@ GoButtonGtk::GoButtonGtk(LocationBarViewGtk* location_bar, Browser* browser) intended_mode_(MODE_GO), visible_mode_(MODE_GO), state_(BS_NORMAL), - go_(IDR_GO, IDR_GO_P, IDR_GO_H, 0), - stop_(IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0), + go_(browser ? browser->profile()->GetThemeProvider() : NULL, + IDR_GO, IDR_GO_P, IDR_GO_H, 0), + stop_(browser ? browser->profile()->GetThemeProvider() : NULL, + IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0), widget_(gtk_button_new()) { gtk_widget_set_size_request(widget_.get(), gdk_pixbuf_get_width(go_.pixbufs(0)), diff --git a/chrome/browser/gtk/toolbar_star_toggle_gtk.cc b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc index 77c5732..2692df7 100644 --- a/chrome/browser/gtk/toolbar_star_toggle_gtk.cc +++ b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc @@ -8,14 +8,17 @@ #include "base/gfx/rect.h" #include "chrome/browser/gtk/bookmark_bubble_gtk.h" #include "chrome/browser/gtk/browser_toolbar_gtk.h" +#include "chrome/browser/profile.h" #include "grit/theme_resources.h" ToolbarStarToggleGtk::ToolbarStarToggleGtk(BrowserToolbarGtk* host) : host_(host), widget_(gtk_button_new()), is_starred_(false), - unstarred_(IDR_STAR, IDR_STAR_P, IDR_STAR_H, IDR_STAR_D), - starred_(IDR_STARRED, IDR_STARRED_P, IDR_STARRED_H, 0) { + unstarred_(host->profile()->GetThemeProvider(), IDR_STAR, IDR_STAR_P, + IDR_STAR_H, IDR_STAR_D), + starred_(host->profile()->GetThemeProvider(), IDR_STARRED, IDR_STARRED_P, + IDR_STARRED_H, 0) { gtk_widget_set_size_request(widget_.get(), gdk_pixbuf_get_width(unstarred_.pixbufs(0)), gdk_pixbuf_get_height(unstarred_.pixbufs(0))); |