| // Copyright (c) 2012 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/ui/gtk/avatar_menu_button_gtk.h" |
| |
| #include "base/i18n/rtl.h" |
| #include "chrome/app/chrome_command_ids.h" |
| #include "chrome/browser/command_updater.h" |
| #include "chrome/browser/profiles/profile_metrics.h" |
| #include "chrome/browser/profiles/profile_info_util.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_commands.h" |
| #include "chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h" |
| #include "chrome/browser/ui/gtk/bubble/bubble_gtk.h" |
| #include "ui/gfx/gtk_util.h" |
| |
| AvatarMenuButtonGtk::AvatarMenuButtonGtk(Browser* browser) |
| : image_(NULL), |
| browser_(browser), |
| frame_style_(BubbleGtk::ANCHOR_TOP_LEFT), |
| is_gaia_picture_(false), |
| old_height_(0) { |
| GtkWidget* event_box = gtk_event_box_new(); |
| image_ = gtk_image_new(); |
| gtk_container_add(GTK_CONTAINER(event_box), image_); |
| |
| g_signal_connect(event_box, "button-press-event", |
| G_CALLBACK(OnButtonPressedThunk), this); |
| g_signal_connect(event_box, "size-allocate", |
| G_CALLBACK(OnSizeAllocateThunk), this); |
| |
| gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box), FALSE); |
| |
| widget_.Own(event_box); |
| } |
| |
| AvatarMenuButtonGtk::~AvatarMenuButtonGtk() { |
| } |
| |
| void AvatarMenuButtonGtk::SetIcon(const gfx::Image& image, |
| bool is_gaia_picture) { |
| icon_.reset(new gfx::Image(image)); |
| is_gaia_picture_ = is_gaia_picture; |
| UpdateButtonIcon(); |
| } |
| |
| gboolean AvatarMenuButtonGtk::OnButtonPressed(GtkWidget* widget, |
| GdkEventButton* event) { |
| if (event->button != 1) |
| return FALSE; |
| |
| ShowAvatarBubble(); |
| ProfileMetrics::LogProfileOpenMethod(ProfileMetrics::ICON_AVATAR_BUBBLE); |
| return TRUE; |
| } |
| |
| void AvatarMenuButtonGtk::OnSizeAllocate(GtkWidget* widget, |
| GtkAllocation* allocation) { |
| if (allocation->height != old_height_) |
| UpdateButtonIcon(); |
| } |
| |
| void AvatarMenuButtonGtk::ShowAvatarBubble() { |
| DCHECK(chrome::IsCommandEnabled(browser_, IDC_SHOW_AVATAR_MENU)); |
| // Only show the avatar bubble if the avatar button is in the title bar. |
| if (gtk_widget_get_parent_window(widget_.get())) |
| new AvatarMenuBubbleGtk(browser_, widget_.get(), frame_style_, NULL); |
| } |
| |
| void AvatarMenuButtonGtk::UpdateButtonIcon() { |
| if (!icon_.get()) |
| return; |
| |
| GtkAllocation allocation; |
| gtk_widget_get_allocation(widget(), &allocation); |
| old_height_ = allocation.height; |
| |
| // GAIA images are square; use kWidth for both destination height and width |
| // since old_height_ is often not usable (typically a value of 1 which, after |
| // subtracting border, tries to resize the profile image to a size of -1). |
| gfx::Image icon = profiles::GetAvatarIconForTitleBar( |
| *icon_, is_gaia_picture_, |
| profiles::kAvatarIconWidth, profiles::kAvatarIconWidth); |
| gtk_image_set_from_pixbuf(GTK_IMAGE(image_), icon.ToGdkPixbuf()); |
| gtk_misc_set_alignment(GTK_MISC(image_), 0.0, 1.0); |
| gtk_widget_set_size_request(image_, -1, 0); |
| } |