diff options
author | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-06 20:30:40 +0000 |
---|---|---|
committer | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-06 20:30:40 +0000 |
commit | 5af45c4304f4cec5c68d151f7973181e8dcd73c7 (patch) | |
tree | a9cf0d336dfc63fab5273f4f45aecf18d263fa8c | |
parent | 7ea066a9c3e54b7a2fd0c2ac30c8f4a64cf8eb90 (diff) | |
download | chromium_src-5af45c4304f4cec5c68d151f7973181e8dcd73c7.zip chromium_src-5af45c4304f4cec5c68d151f7973181e8dcd73c7.tar.gz chromium_src-5af45c4304f4cec5c68d151f7973181e8dcd73c7.tar.bz2 |
Write the star toggle button. Clicking it will bookmark the page.
(Clicking it a second time won't remove the bookmark; need to write the
infobubble next...)
Review URL: http://codereview.chromium.org/63020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13182 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/gtk/browser_toolbar_gtk.cc | 18 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_toolbar_gtk.h | 8 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_window_gtk.cc | 11 | ||||
-rw-r--r-- | chrome/browser/gtk/toolbar_star_toggle_gtk.cc | 77 | ||||
-rw-r--r-- | chrome/browser/gtk/toolbar_star_toggle_gtk.h | 47 | ||||
-rw-r--r-- | chrome/chrome.gyp | 2 |
6 files changed, 154 insertions, 9 deletions
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc index a3b587c..0eca5b5 100644 --- a/chrome/browser/gtk/browser_toolbar_gtk.cc +++ b/chrome/browser/gtk/browser_toolbar_gtk.cc @@ -16,6 +16,7 @@ #include "chrome/browser/gtk/location_bar_view_gtk.h" #include "chrome/browser/gtk/nine_box.h" #include "chrome/browser/gtk/standard_menus.h" +#include "chrome/browser/gtk/toolbar_star_toggle_gtk.h" #include "chrome/browser/net/url_fixer_upper.h" #include "chrome/browser/profile.h" #include "chrome/common/l10n_util.h" @@ -115,8 +116,7 @@ void BrowserToolbarGtk::Init(Profile* profile, gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0); - star_.reset(BuildToolbarButton(IDR_STAR, IDR_STAR_P, IDR_STAR_H, IDR_STAR_D, - l10n_util::GetString(IDS_TOOLTIP_STAR))); + star_.reset(BuildStarButton(l10n_util::GetString(IDS_TOOLTIP_STAR))); location_bar_->Init(); gtk_box_pack_start(GTK_BOX(toolbar_), location_bar_->widget(), TRUE, TRUE, 0); @@ -230,6 +230,20 @@ CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton( return button; } +ToolbarStarToggleGtk* BrowserToolbarGtk::BuildStarButton( + const std::wstring& localized_tooltip) { + ToolbarStarToggleGtk* button = new ToolbarStarToggleGtk; + + gtk_widget_set_tooltip_text(button->widget(), + WideToUTF8(localized_tooltip).c_str()); + g_signal_connect(G_OBJECT(button->widget()), "clicked", + G_CALLBACK(OnButtonClick), this); + GTK_WIDGET_UNSET_FLAGS(button->widget(), GTK_CAN_FOCUS); + + gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0); + return button; +} + CustomContainerButton* BrowserToolbarGtk::BuildToolbarMenuButton( int icon_id, const std::wstring& localized_tooltip) { diff --git a/chrome/browser/gtk/browser_toolbar_gtk.h b/chrome/browser/gtk/browser_toolbar_gtk.h index d4134ba9..1223061 100644 --- a/chrome/browser/gtk/browser_toolbar_gtk.h +++ b/chrome/browser/gtk/browser_toolbar_gtk.h @@ -24,6 +24,7 @@ class NineBox; class Profile; class TabContents; class ToolbarModel; +class ToolbarStarToggleGtk; // View class that displays the GTK version of the toolbar and routes gtk // events back to the Browser. @@ -64,6 +65,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, // Message that we should react to a state change. void UpdateTabContents(TabContents* contents, bool should_restore_state); + ToolbarStarToggleGtk* star() { return star_.get(); } + private: // Builds a toolbar button with all the properties set. CustomDrawButton* BuildToolbarButton(int normal_id, @@ -72,6 +75,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, int depressed_id, const std::wstring& localized_tooltip); + ToolbarStarToggleGtk* BuildStarButton(const std::wstring& localized_tooltip); + CustomContainerButton* BuildToolbarMenuButton( int icon_id, const std::wstring& localized_tooltip); @@ -124,7 +129,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, scoped_ptr<CustomDrawButton> back_, forward_; scoped_ptr<CustomDrawButton> reload_; scoped_ptr<CustomDrawButton> home_; // May be NULL. - scoped_ptr<CustomDrawButton> star_, go_; + scoped_ptr<ToolbarStarToggleGtk> star_; + scoped_ptr<CustomDrawButton> go_; scoped_ptr<CustomContainerButton> page_menu_button_, app_menu_button_; // The model that contains the security level, text, icon to display... diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc index 6bd4367..e8887a6 100644 --- a/chrome/browser/gtk/browser_window_gtk.cc +++ b/chrome/browser/gtk/browser_window_gtk.cc @@ -22,6 +22,7 @@ #include "chrome/browser/gtk/status_bubble_gtk.h" #include "chrome/browser/gtk/tab_contents_container_gtk.h" #include "chrome/browser/gtk/tabs/tab_strip_gtk.h" +#include "chrome/browser/gtk/toolbar_star_toggle_gtk.h" #include "chrome/browser/location_bar.h" #include "chrome/browser/renderer_host/render_widget_host_view_gtk.h" #include "chrome/browser/tab_contents/web_contents.h" @@ -278,7 +279,7 @@ void BrowserWindowGtk::Close() { // TODO(tc): We should store the window position, perhaps using // gtk_window_set_role. - //SaveWindowPosition(); + // SaveWindowPosition(); GtkWidget* window = GTK_WIDGET(window_); // To help catch bugs in any event handlers that might get fired during the @@ -333,9 +334,7 @@ void BrowserWindowGtk::UpdateLoadingAnimations(bool should_animate) { } void BrowserWindowGtk::SetStarredState(bool is_starred) { - // Hide our current lack of starring support from NOTIMPLEMENTED spew. - if (is_starred) - NOTIMPLEMENTED(); + toolbar_->star()->SetStarred(is_starred); } gfx::Rect BrowserWindowGtk::GetNormalBounds() const { @@ -509,8 +508,8 @@ bool BrowserWindowGtk::CanClose() const { // TODO(tc): We don't have tab dragging yet. // You cannot close a frame for which there is an active originating drag // session. - //if (tabstrip_->IsDragSessionActive()) - // return false; + // if (tabstrip_->IsDragSessionActive()) + // return false; // Give beforeunload handlers the chance to cancel the close before we hide // the window below. diff --git a/chrome/browser/gtk/toolbar_star_toggle_gtk.cc b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc new file mode 100644 index 0000000..26a8561 --- /dev/null +++ b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc @@ -0,0 +1,77 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/gtk/toolbar_star_toggle_gtk.h" +#include "chrome/common/resource_bundle.h" +#include "grit/theme_resources.h" + +ToolbarStarToggleGtk::ToolbarStarToggleGtk() { + widget_ = gtk_button_new(); + + // Load the button images from the resource bundle. + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + unstarred_pixbuf_[GTK_STATE_NORMAL] = rb.LoadPixbuf(IDR_STAR); + unstarred_pixbuf_[GTK_STATE_ACTIVE] = rb.LoadPixbuf(IDR_STAR_P); + unstarred_pixbuf_[GTK_STATE_PRELIGHT] = rb.LoadPixbuf(IDR_STAR_H); + unstarred_pixbuf_[GTK_STATE_SELECTED] = NULL; + unstarred_pixbuf_[GTK_STATE_INSENSITIVE] = rb.LoadPixbuf(IDR_STAR_D); + + starred_pixbuf_[GTK_STATE_NORMAL] = rb.LoadPixbuf(IDR_STARRED); + starred_pixbuf_[GTK_STATE_ACTIVE] = rb.LoadPixbuf(IDR_STARRED_P); + starred_pixbuf_[GTK_STATE_PRELIGHT] = rb.LoadPixbuf(IDR_STARRED_H); + starred_pixbuf_[GTK_STATE_SELECTED] = NULL; + starred_pixbuf_[GTK_STATE_INSENSITIVE] = NULL; + + gtk_widget_set_size_request(widget_, + gdk_pixbuf_get_width(unstarred_pixbuf_[0]), + gdk_pixbuf_get_height(unstarred_pixbuf_[0])); + + gtk_widget_set_app_paintable(widget_, TRUE); + // We effectively double-buffer by virtue of having only one image... + gtk_widget_set_double_buffered(widget_, FALSE); + g_signal_connect(G_OBJECT(widget_), "expose-event", + G_CALLBACK(OnExpose), this); +} + +ToolbarStarToggleGtk::~ToolbarStarToggleGtk() { + for (size_t i = 0; i < arraysize(unstarred_pixbuf_); ++i) { + if (unstarred_pixbuf_[i]) + gdk_pixbuf_unref(unstarred_pixbuf_[i]); + if (starred_pixbuf_[i]) + gdk_pixbuf_unref(starred_pixbuf_[i]); + } +} + +void ToolbarStarToggleGtk::SetStarred(bool starred) { + starred_ = starred; + gtk_widget_queue_draw(widget_); +} + +// static +gboolean ToolbarStarToggleGtk::OnExpose(GtkWidget* widget, GdkEventExpose* e, + ToolbarStarToggleGtk* button) { + GdkPixbuf** pixbuf_bank = NULL; + if (button->starred_) + pixbuf_bank = button->starred_pixbuf_; + else + pixbuf_bank = button->unstarred_pixbuf_; + + GdkPixbuf* pixbuf = pixbuf_bank[GTK_WIDGET_STATE(widget)]; + + // Fall back to the default image if we don't have one for this state. + if (!pixbuf) + pixbuf = pixbuf_bank[GTK_STATE_NORMAL]; + + if (!pixbuf) + return FALSE; + + gdk_draw_pixbuf(widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE(widget)], + pixbuf, + 0, 0, + widget->allocation.x, widget->allocation.y, -1, -1, + GDK_RGB_DITHER_NONE, 0, 0); + + return TRUE; +} diff --git a/chrome/browser/gtk/toolbar_star_toggle_gtk.h b/chrome/browser/gtk/toolbar_star_toggle_gtk.h new file mode 100644 index 0000000..584d2b6 --- /dev/null +++ b/chrome/browser/gtk/toolbar_star_toggle_gtk.h @@ -0,0 +1,47 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_GTK_TOOLBAR_STAR_TOGGLE_GTK_H_ +#define CHROME_BROWSER_GTK_TOOLBAR_STAR_TOGGLE_GTK_H_ + +#include <gtk/gtk.h> + +#include "base/basictypes.h" + +class GURL; + +// Displays the bookmark star button, which toggles between two images. +class ToolbarStarToggleGtk { + public: + ToolbarStarToggleGtk(); + ~ToolbarStarToggleGtk(); + + // If the bubble isn't showing, shows it above the star button. + void ShowStarBubble(const GURL& url, bool newly_bookmarked); + + void SetStarred(bool starred); + + GtkWidget* widget() const { return widget_; } + + private: + // Callback for expose, used to draw the custom graphics. + static gboolean OnExpose(GtkWidget* widget, GdkEventExpose* e, + ToolbarStarToggleGtk* obj); + + // The actual button widget. + GtkWidget* widget_; + + // Whether we show the yellow star. + bool starred_; + + // Unstarred images + GdkPixbuf* unstarred_pixbuf_[GTK_STATE_INSENSITIVE + 1]; + + // Starred images + GdkPixbuf* starred_pixbuf_[GTK_STATE_INSENSITIVE + 1]; + + DISALLOW_EVIL_CONSTRUCTORS(ToolbarStarToggleGtk); +}; + +#endif // CHROME_BROWSER_GTK_TOOLBAR_STAR_TOGGLE_GTK_H_ diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 8a82e3d..14c8601 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -703,6 +703,8 @@ 'browser/gtk/tabs/tab_renderer_gtk.h', 'browser/gtk/tabs/tab_strip_gtk.cc', 'browser/gtk/tabs/tab_strip_gtk.h', + 'browser/gtk/toolbar_star_toggle_gtk.cc', + 'browser/gtk/toolbar_star_toggle_gtk.h', 'browser/hang_monitor/hung_plugin_action.cc', 'browser/hang_monitor/hung_plugin_action.h', 'browser/hang_monitor/hung_window_detector.cc', |