Home | History | Annotate | Download | only in profiles
      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/border.h"
     18 #include "ui/views/painter.h"
     19 
     20 namespace {
     21 
     22 // A custom border for the supervised user avatar label.
     23 class AvatarLabelBorder : public views::Border {
     24  public:
     25   explicit AvatarLabelBorder(bool label_on_right);
     26 
     27   // views::Border:
     28   virtual void Paint(const views::View& view, gfx::Canvas* canvas) OVERRIDE;
     29   virtual gfx::Insets GetInsets() const OVERRIDE;
     30   virtual gfx::Size GetMinimumSize() const OVERRIDE;
     31 
     32  private:
     33   scoped_ptr<views::Painter> painter_;
     34   gfx::Insets insets_;
     35 
     36   DISALLOW_COPY_AND_ASSIGN(AvatarLabelBorder);
     37 };
     38 
     39 AvatarLabelBorder::AvatarLabelBorder(bool label_on_right) {
     40   const int kHorizontalInsetRight = label_on_right ? 43 : 10;
     41   const int kHorizontalInsetLeft = label_on_right ? 10 : 43;
     42   const int kVerticalInsetTop = 2;
     43   const int kVerticalInsetBottom = 3;
     44   // We want to align with the top of the tab. This works if the default font
     45   // size is 13. If it is smaller, we need to increase the TopInset accordingly.
     46   const int difference = std::max<int>(0, 13 - gfx::FontList().GetFontSize());
     47   const int addToTop = difference / 2;
     48   const int addToBottom = difference - addToTop;
     49   insets_ = gfx::Insets(kVerticalInsetTop + addToTop,
     50                         kHorizontalInsetLeft,
     51                         kVerticalInsetBottom + addToBottom,
     52                         kHorizontalInsetRight);
     53   const int kImages[] = IMAGE_GRID(IDR_MANAGED_USER_LABEL);
     54   painter_.reset(views::Painter::CreateImageGridPainter(kImages));
     55 }
     56 
     57 void AvatarLabelBorder::Paint(const views::View& view, gfx::Canvas* canvas) {
     58   // Paint the default background using the image assets provided by UI. This
     59   // includes a border with almost transparent white color.
     60   painter_->Paint(canvas, view.size());
     61 
     62   // Repaint the inner part of the background in order to be able to change
     63   // the colors according to the currently installed theme.
     64   gfx::Rect rect(1, 1, view.size().width() - 2, view.size().height() - 2);
     65   SkPaint paint;
     66   int kRadius = 2;
     67   SkColor background_color = view.GetThemeProvider()->GetColor(
     68       ThemeProperties::COLOR_SUPERVISED_USER_LABEL_BACKGROUND);
     69   paint.setStyle(SkPaint::kFill_Style);
     70 
     71   // Paint the inner border with a color slightly darker than the background.
     72   SkAlpha kAlphaForBlending = 230;
     73   paint.setColor(color_utils::AlphaBlend(
     74       background_color, SK_ColorBLACK, kAlphaForBlending));
     75   canvas->DrawRoundRect(rect, kRadius, paint);
     76 
     77   // Paint the inner background using the color provided by the ThemeProvider.
     78   paint.setColor(background_color);
     79   rect = gfx::Rect(2, 2, view.size().width() - 4, view.size().height() - 4);
     80   canvas->DrawRoundRect(rect, kRadius, paint);
     81 }
     82 
     83 gfx::Insets AvatarLabelBorder::GetInsets() const {
     84   return insets_;
     85 }
     86 
     87 gfx::Size AvatarLabelBorder::GetMinimumSize() const {
     88   gfx::Size size(4, 4);
     89   size.SetToMax(painter_->GetMinimumSize());
     90   return size;
     91 }
     92 
     93 }  // namespace
     94 
     95 AvatarLabel::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 
    103 AvatarLabel::~AvatarLabel() {}
    104 
    105 bool 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::ManageAccountsParams());
    112   return true;
    113 }
    114 
    115 void 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 
    127 void AvatarLabel::SetLabelOnRight(bool label_on_right) {
    128   SetBorder(scoped_ptr<views::Border>(new AvatarLabelBorder(label_on_right)));
    129 }
    130