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