• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/chromeos/login/oobe_progress_bar.h"
6 
7 #include "base/logging.h"
8 #include "base/utf_string_conversions.h"
9 #include "grit/theme_resources.h"
10 #include "third_party/skia/include/core/SkBitmap.h"
11 #include "ui/base/l10n/l10n_util.h"
12 #include "ui/base/resource/resource_bundle.h"
13 #include "ui/gfx/canvas_skia.h"
14 
15 namespace chromeos {
16 
17 // static
18 SkBitmap* OobeProgressBar::dot_current_ = NULL;
19 SkBitmap* OobeProgressBar::dot_empty_ = NULL;
20 SkBitmap* OobeProgressBar::dot_filled_ = NULL;
21 SkBitmap* OobeProgressBar::line_ = NULL;
22 SkBitmap* OobeProgressBar::line_left_ = NULL;
23 SkBitmap* OobeProgressBar::line_right_ = NULL;
24 
25 static const SkColor kCurrentTextColor = SkColorSetRGB(255, 255, 255);
26 static const SkColor kEmptyTextColor = SkColorSetRGB(112, 115, 118);
27 static const SkColor kFilledTextColor = SkColorSetRGB(112, 115, 118);
28 static const int kTextPadding = 5;
29 
OobeProgressBar(const std::vector<int> & steps)30 OobeProgressBar::OobeProgressBar(const std::vector<int>& steps)
31     : steps_(steps), progress_(0) {
32   ResourceBundle& rb = ResourceBundle::GetSharedInstance();
33   font_ = rb.GetFont(ResourceBundle::BaseFont);
34   InitClass();
35 }
36 
37 // static
InitClass()38 void OobeProgressBar::InitClass() {
39   static bool initialized = false;
40   if (!initialized) {
41     ResourceBundle& rb = ResourceBundle::GetSharedInstance();
42 
43     // Load images.
44     dot_current_ = rb.GetBitmapNamed(IDR_OOBE_PROGRESS_DOT_CURRENT);
45     dot_empty_ = rb.GetBitmapNamed(IDR_OOBE_PROGRESS_DOT_EMPTY);
46     dot_filled_ = rb.GetBitmapNamed(IDR_OOBE_PROGRESS_DOT_FILLED);
47     line_ = rb.GetBitmapNamed(IDR_OOBE_PROGRESS_LINE);
48     line_left_ = rb.GetBitmapNamed(IDR_OOBE_PROGRESS_LINE_LEFT);
49     line_right_ = rb.GetBitmapNamed(IDR_OOBE_PROGRESS_LINE_RIGHT);
50 
51     initialized = true;
52   }
53 }
54 
OnPaint(gfx::Canvas * canvas)55 void OobeProgressBar::OnPaint(gfx::Canvas* canvas) {
56   gfx::Rect bounds = GetContentsBounds();
57 
58   int x = bounds.x();
59   int y = bounds.y();
60 
61   double step_width = static_cast<double>(bounds.width()) / steps_.size();
62 
63   for (size_t i = 0; i < steps_.size(); ++i) {
64     SkBitmap* dot;
65     SkColor color;
66     SkBitmap* line_before = line_;
67     SkBitmap* line_after = line_;
68     if (i < progress_) {
69       dot = dot_filled_;
70       color = kFilledTextColor;
71     } else if (i == progress_) {
72       dot = dot_current_;
73       color = kCurrentTextColor;
74       line_before = line_left_;
75       line_after = line_right_;
76     } else {
77       dot = dot_empty_;
78       color = kEmptyTextColor;
79     }
80 
81     // x coordinate for next step.
82     int next_x = static_cast<int>((i + 1) * step_width);
83 
84     // Offset of line origin from dot origin.
85     int line_offset_y = (dot->height() - line_->height()) / 2;
86 
87     // Current x for painting.
88     int ix = x;
89 
90     int line_width = ((next_x - x) -
91         (line_before->width() + dot->width() + line_after->width())) / 2;
92     if (i > 0) {
93       canvas->TileImageInt(*line_, ix, y + line_offset_y,
94                            line_width, line_->height());
95     }
96     ix += line_width;
97     if (i > 0) {
98       canvas->DrawBitmapInt(*line_before, ix, y + line_offset_y);
99     }
100     ix += line_before->width();
101 
102     canvas->DrawBitmapInt(*dot, ix, y);
103     ix += dot->width();
104 
105     if (i != steps_.size() - 1)
106       canvas->DrawBitmapInt(*line_after, ix, y + line_offset_y);
107     ix += line_after->width();
108 
109     if (i != steps_.size() - 1) {
110       canvas->TileImageInt(*line_, ix, y + line_offset_y,
111                            next_x - ix, line_->height());
112     }
113 
114     string16 str = l10n_util::GetStringUTF16(steps_[i]);
115     canvas->DrawStringInt(str, font_, color,
116         x + kTextPadding, y + dot->height() + kTextPadding,
117         (next_x - x - 2 * kTextPadding),
118         (bounds.height() - dot->height() - 2 * kTextPadding),
119         gfx::Canvas::MULTI_LINE | gfx::Canvas::TEXT_ALIGN_CENTER |
120             gfx::Canvas::TEXT_VALIGN_TOP);
121 
122     x = next_x;
123   }
124 }
125 
OnLocaleChanged()126 void OobeProgressBar::OnLocaleChanged() {
127   font_ = ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont);
128   SchedulePaint();
129 }
130 
SetStep(int step)131 void OobeProgressBar::SetStep(int step) {
132   for (size_t i = 0; i < steps_.size(); ++i) {
133     if (steps_[i] == step) {
134       progress_ = i;
135       SchedulePaint();
136       return;
137     }
138   }
139   NOTREACHED();
140 }
141 
142 }  // namespace chromeos
143