avatar_label.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright 2014 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/views/profiles/avatar_label.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "chrome/browser/signin/signin_header_helper.h"
9#include "chrome/browser/themes/theme_properties.h"
10#include "chrome/browser/ui/views/frame/browser_view.h"
11#include "grit/generated_resources.h"
12#include "grit/theme_resources.h"
13#include "ui/base/l10n/l10n_util.h"
14#include "ui/base/theme_provider.h"
15#include "ui/gfx/canvas.h"
16#include "ui/gfx/color_utils.h"
17#include "ui/views/painter.h"
18
19namespace {
20
21// A custom border for the managed user avatar label.
22class AvatarLabelBorder : public views::Border {
23 public:
24  explicit AvatarLabelBorder(bool label_on_right);
25
26  // views::Border:
27  virtual void Paint(const views::View& view, gfx::Canvas* canvas) OVERRIDE;
28  virtual gfx::Insets GetInsets() const OVERRIDE;
29  virtual gfx::Size GetMinimumSize() const OVERRIDE;
30
31 private:
32  scoped_ptr<views::Painter> painter_;
33  gfx::Insets insets_;
34
35  DISALLOW_COPY_AND_ASSIGN(AvatarLabelBorder);
36};
37
38AvatarLabelBorder::AvatarLabelBorder(bool label_on_right) {
39  const int kHorizontalInsetRight = label_on_right ? 43 : 10;
40  const int kHorizontalInsetLeft = label_on_right ? 10 : 43;
41  const int kVerticalInsetTop = 2;
42  const int kVerticalInsetBottom = 3;
43  // We want to align with the top of the tab. This works if the default font
44  // size is 13. If it is smaller, we need to increase the TopInset accordingly.
45  const int difference = std::max<int>(0, 13 - gfx::FontList().GetFontSize());
46  const int addToTop = difference / 2;
47  const int addToBottom = difference - addToTop;
48  insets_ = gfx::Insets(kVerticalInsetTop + addToTop,
49                        kHorizontalInsetLeft,
50                        kVerticalInsetBottom + addToBottom,
51                        kHorizontalInsetRight);
52  const int kImages[] = IMAGE_GRID(IDR_MANAGED_USER_LABEL);
53  painter_.reset(views::Painter::CreateImageGridPainter(kImages));
54}
55
56void AvatarLabelBorder::Paint(const views::View& view, gfx::Canvas* canvas) {
57  // Paint the default background using the image assets provided by UI. This
58  // includes a border with almost transparent white color.
59  painter_->Paint(canvas, view.size());
60
61  // Repaint the inner part of the background in order to be able to change
62  // the colors according to the currently installed theme.
63  gfx::Rect rect(1, 1, view.size().width() - 2, view.size().height() - 2);
64  SkPaint paint;
65  int kRadius = 2;
66  SkColor background_color = view.GetThemeProvider()->GetColor(
67      ThemeProperties::COLOR_MANAGED_USER_LABEL_BACKGROUND);
68  paint.setStyle(SkPaint::kFill_Style);
69
70  // Paint the inner border with a color slightly darker than the background.
71  SkAlpha kAlphaForBlending = 230;
72  paint.setColor(color_utils::AlphaBlend(
73      background_color, SK_ColorBLACK, kAlphaForBlending));
74  canvas->DrawRoundRect(rect, kRadius, paint);
75
76  // Paint the inner background using the color provided by the ThemeProvider.
77  paint.setColor(background_color);
78  rect = gfx::Rect(2, 2, view.size().width() - 4, view.size().height() - 4);
79  canvas->DrawRoundRect(rect, kRadius, paint);
80}
81
82gfx::Insets AvatarLabelBorder::GetInsets() const {
83  return insets_;
84}
85
86gfx::Size AvatarLabelBorder::GetMinimumSize() const {
87  gfx::Size size(4, 4);
88  size.SetToMax(painter_->GetMinimumSize());
89  return size;
90}
91
92}  // namespace
93
94AvatarLabel::AvatarLabel(BrowserView* browser_view)
95    : LabelButton(NULL,
96                  l10n_util::GetStringUTF16(IDS_MANAGED_USER_AVATAR_LABEL)),
97      browser_view_(browser_view) {
98  SetLabelOnRight(false);
99  UpdateLabelStyle();
100}
101
102AvatarLabel::~AvatarLabel() {}
103
104bool AvatarLabel::OnMousePressed(const ui::MouseEvent& event) {
105  if (!LabelButton::OnMousePressed(event))
106    return false;
107
108  browser_view_->ShowAvatarBubbleFromAvatarButton(
109      BrowserWindow::AVATAR_BUBBLE_MODE_DEFAULT,
110      signin::GAIA_SERVICE_TYPE_NONE);
111  return true;
112}
113
114void AvatarLabel::UpdateLabelStyle() {
115  // |browser_view_| can be NULL in unit tests.
116  if (!browser_view_)
117    return;
118
119  SkColor color_label = browser_view_->frame()->GetThemeProvider()->GetColor(
120      ThemeProperties::COLOR_MANAGED_USER_LABEL);
121  for (size_t state = 0; state < STATE_COUNT; ++state)
122    SetTextColor(static_cast<ButtonState>(state), color_label);
123  SchedulePaint();
124}
125
126void AvatarLabel::SetLabelOnRight(bool label_on_right) {
127  SetBorder(scoped_ptr<views::Border>(new AvatarLabelBorder(label_on_right)));
128}
129