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