OLD | NEW |
| (Empty) |
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 "chrome/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_SUPERVISED_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_SUPERVISED_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 } | |
OLD | NEW |