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