Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7536)

Unified Diff: chrome/browser/ui/gtk/action_box_button_gtk.cc

Issue 12319031: Display Page Launcher icons in gtk. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Estade comments Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/gtk/action_box_button_gtk.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/gtk/action_box_button_gtk.cc
diff --git a/chrome/browser/ui/gtk/action_box_button_gtk.cc b/chrome/browser/ui/gtk/action_box_button_gtk.cc
index ed0f17a0ca165190352f561d6239598d942ecc59..1a8d3369c49b3c1bf8ce74e406bfaa677008859f 100644
--- a/chrome/browser/ui/gtk/action_box_button_gtk.cc
+++ b/chrome/browser/ui/gtk/action_box_button_gtk.cc
@@ -6,16 +6,102 @@
#include <gtk/gtk.h>
+#include "base/logging.h"
+#include "chrome/browser/extensions/extension_icon_image.h"
+#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/gtk/custom_button.h"
#include "chrome/browser/ui/gtk/view_id_util.h"
#include "chrome/browser/ui/toolbar/action_box_menu_model.h"
#include "chrome/browser/ui/view_ids.h"
+#include "chrome/common/extensions/api/extension_action/action_info.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_constants.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/layout.h"
+#include "ui/gfx/gtk_util.h"
+#include "ui/gfx/image/image_skia.h"
+#include "ui/gfx/image/image_skia_rep.h"
+
+using extensions::ActionInfo;
+using extensions::Extension;
+using extensions::IconImage;
+
+namespace {
+
+// This class provides a GtkWidget that shows an Extension's page launcher icon.
+// We can't use GtkImage directly because loading the icon from the extension
+// must be done asynchronously. The lifetime of this object is tied to its
+// GtkWidget, and it will delete itself upon receiving a "destroy" signal from
+// the widget.
+class ExtensionIcon : public IconImage::Observer {
+ public:
+ ExtensionIcon(Profile* profile, const Extension* extension);
+
+ GtkWidget* GetWidget();
+
+ private:
+ virtual ~ExtensionIcon() {}
+
+ virtual void OnExtensionIconImageChanged(IconImage* image) OVERRIDE;
+ void UpdateIcon();
+
+ CHROMEGTK_CALLBACK_0(ExtensionIcon, void, OnDestroyed);
+
+ GtkWidget* image_;
+
+ scoped_ptr<IconImage> icon_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionIcon);
+};
+
+ExtensionIcon::ExtensionIcon(Profile* profile, const Extension* extension)
+ : image_(NULL) {
+ const ActionInfo* page_launcher_info =
+ ActionInfo::GetPageLauncherInfo(extension);
+ icon_.reset(new IconImage(profile,
+ extension,
+ page_launcher_info->default_icon,
+ extension_misc::EXTENSION_ICON_ACTION,
+ Extension::GetDefaultIcon(true),
+ this));
+ UpdateIcon();
+}
+
+GtkWidget* ExtensionIcon::GetWidget() {
+ return image_;
+}
+
+void ExtensionIcon::OnExtensionIconImageChanged(IconImage* image) {
+ DCHECK_EQ(image, icon_.get());
+ UpdateIcon();
+}
+
+void ExtensionIcon::UpdateIcon() {
+ const gfx::ImageSkiaRep& rep =
+ icon_->image_skia().GetRepresentation(ui::SCALE_FACTOR_NONE);
+ GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(rep.sk_bitmap());
+
+ if (!image_) {
+ image_ = gtk_image_new_from_pixbuf(pixbuf);
+ g_signal_connect(image_, "destroy", G_CALLBACK(OnDestroyedThunk), this);
+ } else {
+ gtk_image_set_from_pixbuf(GTK_IMAGE(image_), pixbuf);
+ }
+ g_object_unref(pixbuf);
+}
+
+void ExtensionIcon::OnDestroyed(GtkWidget* sender) {
+ DCHECK_EQ(sender, image_);
+ delete this;
+}
+
+} // namespace
ActionBoxButtonGtk::ActionBoxButtonGtk(Browser* browser)
- : controller_(browser, this) {
+ : controller_(browser, this),
+ browser_(browser) {
button_.reset(new CustomDrawButton(
IDR_ACTION_BOX_BUTTON,
IDR_ACTION_BOX_BUTTON_PRESSED,
@@ -37,6 +123,16 @@ bool ActionBoxButtonGtk::AlwaysShowIconForCmd(int command_id) const {
return true;
}
+GtkWidget* ActionBoxButtonGtk::GetImageForCommandId(int command_id) const {
+ int index = model_->GetIndexOfCommandId(command_id);
+ if (model_->IsItemExtension(index)) {
+ const Extension* extension = model_->GetExtensionAt(index);
+ return (new ExtensionIcon(browser_->profile(), extension))->GetWidget();
+ }
+
+ return GetDefaultImageForCommandId(command_id);
+}
+
GtkWidget* ActionBoxButtonGtk::widget() {
return button_->widget();
}
« no previous file with comments | « chrome/browser/ui/gtk/action_box_button_gtk.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698