| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/ui/gtk/avatar_menu_button_gtk.h" | |
| 6 | |
| 7 #include "base/i18n/rtl.h" | |
| 8 #include "chrome/app/chrome_command_ids.h" | |
| 9 #include "chrome/browser/command_updater.h" | |
| 10 #include "chrome/browser/profiles/profile_avatar_icon_util.h" | |
| 11 #include "chrome/browser/profiles/profile_metrics.h" | |
| 12 #include "chrome/browser/ui/browser.h" | |
| 13 #include "chrome/browser/ui/browser_commands.h" | |
| 14 #include "chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h" | |
| 15 #include "chrome/browser/ui/gtk/bubble/bubble_gtk.h" | |
| 16 #include "ui/gfx/gtk_util.h" | |
| 17 | |
| 18 AvatarMenuButtonGtk::AvatarMenuButtonGtk(Browser* browser) | |
| 19 : image_(NULL), | |
| 20 browser_(browser), | |
| 21 frame_style_(BubbleGtk::ANCHOR_TOP_LEFT), | |
| 22 is_gaia_picture_(false), | |
| 23 old_height_(0) { | |
| 24 GtkWidget* event_box = gtk_event_box_new(); | |
| 25 image_ = gtk_image_new(); | |
| 26 gtk_container_add(GTK_CONTAINER(event_box), image_); | |
| 27 | |
| 28 g_signal_connect(event_box, "button-press-event", | |
| 29 G_CALLBACK(OnButtonPressedThunk), this); | |
| 30 g_signal_connect(event_box, "size-allocate", | |
| 31 G_CALLBACK(OnSizeAllocateThunk), this); | |
| 32 | |
| 33 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box), FALSE); | |
| 34 | |
| 35 widget_.Own(event_box); | |
| 36 } | |
| 37 | |
| 38 AvatarMenuButtonGtk::~AvatarMenuButtonGtk() { | |
| 39 } | |
| 40 | |
| 41 void AvatarMenuButtonGtk::SetIcon(const gfx::Image& image, | |
| 42 bool is_gaia_picture) { | |
| 43 icon_.reset(new gfx::Image(image)); | |
| 44 is_gaia_picture_ = is_gaia_picture; | |
| 45 UpdateButtonIcon(); | |
| 46 } | |
| 47 | |
| 48 gboolean AvatarMenuButtonGtk::OnButtonPressed(GtkWidget* widget, | |
| 49 GdkEventButton* event) { | |
| 50 if (event->button != 1) | |
| 51 return FALSE; | |
| 52 | |
| 53 ShowAvatarBubble(); | |
| 54 ProfileMetrics::LogProfileOpenMethod(ProfileMetrics::ICON_AVATAR_BUBBLE); | |
| 55 return TRUE; | |
| 56 } | |
| 57 | |
| 58 void AvatarMenuButtonGtk::OnSizeAllocate(GtkWidget* widget, | |
| 59 GtkAllocation* allocation) { | |
| 60 if (allocation->height != old_height_) | |
| 61 UpdateButtonIcon(); | |
| 62 } | |
| 63 | |
| 64 void AvatarMenuButtonGtk::ShowAvatarBubble() { | |
| 65 DCHECK(chrome::IsCommandEnabled(browser_, IDC_SHOW_AVATAR_MENU)); | |
| 66 // Only show the avatar bubble if the avatar button is in the title bar. | |
| 67 if (gtk_widget_get_parent_window(widget_.get())) | |
| 68 new AvatarMenuBubbleGtk(browser_, widget_.get(), frame_style_, NULL); | |
| 69 } | |
| 70 | |
| 71 void AvatarMenuButtonGtk::UpdateButtonIcon() { | |
| 72 if (!icon_.get()) | |
| 73 return; | |
| 74 | |
| 75 GtkAllocation allocation; | |
| 76 gtk_widget_get_allocation(widget(), &allocation); | |
| 77 old_height_ = allocation.height; | |
| 78 | |
| 79 // GAIA images are square; use kWidth for both destination height and width | |
| 80 // since old_height_ is often not usable (typically a value of 1 which, after | |
| 81 // subtracting border, tries to resize the profile image to a size of -1). | |
| 82 gfx::Image icon = profiles::GetAvatarIconForTitleBar( | |
| 83 *icon_, is_gaia_picture_, | |
| 84 profiles::kAvatarIconWidth, profiles::kAvatarIconWidth); | |
| 85 gtk_image_set_from_pixbuf(GTK_IMAGE(image_), icon.ToGdkPixbuf()); | |
| 86 gtk_misc_set_alignment(GTK_MISC(image_), 0.0, 1.0); | |
| 87 gtk_widget_set_size_request(image_, -1, 0); | |
| 88 } | |
| OLD | NEW |