Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: chrome/browser/ui/panels/panel_overflow_indicator_view.cc

Issue 8953040: Add overflow indicator count on Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix trybot Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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/panels/panel_overflow_indicator_view.h"
6
7 #include "base/logging.h"
8 #include "base/string_number_conversions.h"
9 #include "chrome/browser/ui/panels/panel_browser_frame_view.h"
10 #include "ui/base/resource/resource_bundle.h"
11 #include "ui/gfx/font.h"
12 #include "ui/gfx/path.h"
13 #include "ui/views/background.h"
14 #include "ui/views/painter.h"
15 #include "ui/views/widget/widget.h"
16
17 namespace {
18
19 enum OverflowPaintState {
20 PAINT_AS_NORMAL,
21 PAINT_FOR_ATTENTION
22 };
23
24 // The height in pixels of the widget to show the plus count.
25 const int kWidgetHeight = 15;
26
27 // The radius of the corner of the border.
28 const int kCornerRadius = 4;
29
30 // Metrics used to draw the text.
31 const int kTextFontSize = 10;
32 const SkColor kTextColor = SK_ColorWHITE;
33
34 // Gradient colors used to draw the background in normal mode.
35 const SkColor kNormalBackgroundColorStart = 0xff777777;
36 const SkColor kNormalBackgroundColorEnd = 0xff555555;
37
38 // Gradient colors used to draw the background in attention mode.
39 const SkColor kAttentionBackgroundColorStart = 0xffffab57;
40 const SkColor kAttentionBackgroundColorEnd = 0xfff59338;
41
42 views::Painter* GetBackgroundPainter(OverflowPaintState paint_state) {
43 static views::Painter* normal_painter = NULL;
44 static views::Painter* attention_painter = NULL;
45
46 if (paint_state == PAINT_AS_NORMAL) {
47 if (!normal_painter) {
48 normal_painter = views::Painter::CreateVerticalGradient(
49 kNormalBackgroundColorStart, kNormalBackgroundColorEnd);
50 }
51 return normal_painter;
52 } else {
53 if (!attention_painter) {
54 attention_painter = views::Painter::CreateVerticalGradient(
55 kAttentionBackgroundColorStart, kAttentionBackgroundColorEnd);
56 }
57 return attention_painter;
58 }
59 }
60
61 } // namespace
62
63 PanelOverflowIndicator* PanelOverflowIndicator::Create() {
64 return new PanelOverflowIndicatorView();
65 }
66
67 PanelOverflowIndicatorView::PanelOverflowIndicatorView()
68 : count_(0),
69 is_drawing_attention_(false) {
70 widget_.reset(new views::Widget);
71 views::Widget::InitParams params;
72 params.type = views::Widget::InitParams::TYPE_POPUP;
73 params.keep_on_top = true;
74 params.can_activate = false;
75 params.transparent = true;
76 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
77 widget_->Init(params);
78 widget_->SetAlwaysOnTop(true);
79
80 const gfx::Font& base_font =
81 ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont);
82 title_.SetFont(base_font.DeriveFont(
83 kTextFontSize - base_font.GetFontSize(), gfx::Font::BOLD));
84 title_.SetHorizontalAlignment(views::Label::ALIGN_CENTER);
85 title_.SetAutoColorReadabilityEnabled(false);
86
87 widget_->SetContentsView(&title_);
88 widget_->Show();
89
90 PaintBackground();
91 }
92
93 PanelOverflowIndicatorView::~PanelOverflowIndicatorView() {
94 }
95
96 int PanelOverflowIndicatorView::GetHeight() const {
97 return kWidgetHeight;
98 }
99
100 gfx::Rect PanelOverflowIndicatorView::GetBounds() const {
101 return widget_->GetWindowScreenBounds();
102 }
103
104 void PanelOverflowIndicatorView::SetBounds(const gfx::Rect& bounds) {
105 widget_->SetBounds(bounds);
106
107 gfx::Path path;
108 GetFrameMask(bounds, &path);
109 widget_->SetShape(path.CreateNativeRegion());
110 }
111
112 int PanelOverflowIndicatorView::GetCount() const {
113 return count_;
114 }
115
116 void PanelOverflowIndicatorView::SetCount(int count) {
117 if (count_ == count)
118 return;
119 count_ = count;
120
121 if (count_ > 0)
122 widget_->Show();
123 else
124 widget_->Hide();
125
126 UpdateTitle();
127 }
128
129 void PanelOverflowIndicatorView::DrawAttention() {
130 if (is_drawing_attention_)
131 return;
132 is_drawing_attention_ = true;
133 PaintBackground();
134 }
135
136 void PanelOverflowIndicatorView::StopDrawingAttention() {
137 if (!is_drawing_attention_)
138 return;
139 is_drawing_attention_ = false;
140 PaintBackground();
141 }
142
143 bool PanelOverflowIndicatorView::IsDrawingAttention() const {
144 return is_drawing_attention_;
145 }
146
147 void PanelOverflowIndicatorView::UpdateTitle() {
148 string16 text(L"+");
149 text += base::IntToString16(count_);
150 title_.SetText(text);
151 }
152
153 void PanelOverflowIndicatorView::PaintBackground() {
154 OverflowPaintState paint_state = is_drawing_attention_ ? PAINT_FOR_ATTENTION
155 : PAINT_AS_NORMAL;
156
157 title_.set_background(views::Background::CreateBackgroundPainter(
158 false, GetBackgroundPainter(paint_state)));
159 title_.SetEnabledColor(kTextColor);
160 title_.SchedulePaint(); // SetEnabledColor does not call SchedulePaint.
161 }
162
163 void PanelOverflowIndicatorView::GetFrameMask(const gfx::Rect& rect,
164 gfx::Path* path) const {
165 SkScalar radius = SkIntToScalar(kCornerRadius);
166 SkScalar spline_radius = radius -
167 SkScalarMul(radius, (SK_ScalarSqrt2 - SK_Scalar1) * 4 / 3);
168 SkScalar left = SkIntToScalar(0);
169 SkScalar top = SkIntToScalar(0);
170 SkScalar right = SkIntToScalar(rect.width());
171 SkScalar bottom = SkIntToScalar(rect.height());
172
173 path->moveTo(left + radius, top);
174 path->lineTo(right - radius, top);
175 path->cubicTo(right - spline_radius, top,
176 right, top + spline_radius,
177 right, top + radius);
178 path->lineTo(right, bottom);
179 path->lineTo(left, bottom);
180 path->lineTo(left, top + radius);
181 path->cubicTo(left, top + spline_radius,
182 left + spline_radius, top,
183 left + radius, top);
184 path->close();
185 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/panels/panel_overflow_indicator_view.h ('k') | chrome/browser/ui/panels/panel_overflow_strip.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698