root/chrome/browser/ui/gtk/avatar_menu_button_gtk.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. old_height_
  2. SetIcon
  3. OnButtonPressed
  4. OnSizeAllocate
  5. ShowAvatarBubble
  6. UpdateButtonIcon

// 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);
}

/* [<][>][^][v][top][bottom][index][help] */