diff options
Diffstat (limited to 'views/controls/progress_bar.cc')
-rw-r--r-- | views/controls/progress_bar.cc | 174 |
1 files changed, 150 insertions, 24 deletions
diff --git a/views/controls/progress_bar.cc b/views/controls/progress_bar.cc index 8c6f0d0..7e4aecf 100644 --- a/views/controls/progress_bar.cc +++ b/views/controls/progress_bar.cc @@ -26,54 +26,82 @@ const int kCornerRadius = 3; // Progress bar's border width const int kBorderWidth = 1; -static void AddRoundRectPath(int x, int y, - int w, int h, - int corner_radius, - SkPath* path) { +static void AddRoundRectPathWithPadding(int x, int y, + int w, int h, + int corner_radius, + SkScalar padding, + SkPath* path) { DCHECK(path); if (path == NULL) return; - SkScalar half = SkIntToScalar(1) / 2; SkRect rect; rect.set( - SkIntToScalar(x) + half, SkIntToScalar(y) + half, - SkIntToScalar(x + w) - half, SkIntToScalar(y + h) - half); + SkIntToScalar(x) + padding, SkIntToScalar(y) + padding, + SkIntToScalar(x + w) - padding, SkIntToScalar(y + h) - padding); path->addRoundRect( rect, - SkIntToScalar(corner_radius - half), - SkIntToScalar(corner_radius - half)); + SkIntToScalar(corner_radius - padding), + SkIntToScalar(corner_radius - padding)); +} + +static void AddRoundRectPath(int x, int y, + int w, int h, + int corner_radius, + SkPath* path) { + static const SkScalar half = SkIntToScalar(1) / 2; + AddRoundRectPathWithPadding(x, y, w, h, corner_radius, half, path); } static void FillRoundRect(gfx::Canvas* canvas, int x, int y, int w, int h, int corner_radius, - SkColor gradient_start_color, - SkColor gradient_end_color, + const SkColor colors[], + const SkScalar points[], + int count, bool gradient_horizontal) { SkPath path; AddRoundRectPath(x, y, w, h, corner_radius, &path); SkPaint paint; paint.setStyle(SkPaint::kFill_Style); paint.setFlags(SkPaint::kAntiAlias_Flag); + + SkPoint p[2]; + p[0].set(SkIntToScalar(x), SkIntToScalar(y)); + if (gradient_horizontal) { + p[1].set(SkIntToScalar(x + w), SkIntToScalar(y)); + } else { + p[1].set(SkIntToScalar(x), SkIntToScalar(y + h)); + } + SkShader* s = SkGradientShader::CreateLinear( + p, colors, points, count, SkShader::kClamp_TileMode, NULL); + paint.setShader(s); + // Need to unref shader, otherwise never deleted. + s->unref(); + + canvas->AsCanvasSkia()->drawPath(path, paint); +} + +static void FillRoundRect(gfx::Canvas* canvas, + int x, int y, + int w, int h, + int corner_radius, + SkColor gradient_start_color, + SkColor gradient_end_color, + bool gradient_horizontal) { if (gradient_start_color != gradient_end_color) { - SkPoint p[2]; - p[0].set(SkIntToScalar(x), SkIntToScalar(y)); - if (gradient_horizontal) { - p[1].set(SkIntToScalar(x + w), SkIntToScalar(y)); - } else { - p[1].set(SkIntToScalar(x), SkIntToScalar(y + h)); - } SkColor colors[2] = { gradient_start_color, gradient_end_color }; - SkShader* s = SkGradientShader::CreateLinear( - p, colors, NULL, 2, SkShader::kClamp_TileMode, NULL); - paint.setShader(s); - // Need to unref shader, otherwise never deleted. - s->unref(); + FillRoundRect(canvas, x, y, w, h, corner_radius, + colors, NULL, 2, gradient_horizontal); } else { + SkPath path; + AddRoundRectPath(x, y, w, h, corner_radius, &path); + SkPaint paint; + paint.setStyle(SkPaint::kFill_Style); + paint.setFlags(SkPaint::kAntiAlias_Flag); paint.setColor(gradient_start_color); + canvas->AsCanvasSkia()->drawPath(path, paint); } - canvas->AsCanvasSkia()->drawPath(path, paint); } static void StrokeRoundRect(gfx::Canvas* canvas, @@ -114,6 +142,103 @@ gfx::Size ProgressBar::GetPreferredSize() { } void ProgressBar::Paint(gfx::Canvas* canvas) { +#if defined(OS_CHROMEOS) + const SkColor background_colors[] = { + SkColorSetRGB(0xBB, 0xBB, 0xBB), + SkColorSetRGB(0xE7, 0xE7, 0xE7), + SkColorSetRGB(0xFE, 0xFE, 0xFE) + }; + + const SkScalar background_points[] = { + SkDoubleToScalar(0), + SkDoubleToScalar(0.1), + SkDoubleToScalar(1) + }; + const SkColor background_border_color = SkColorSetRGB(0xA1, 0xA1, 0xA1); + + // Draw background. + FillRoundRect(canvas, + 0, 0, width(), height(), + kCornerRadius, + background_colors, + background_points, + arraysize(background_colors), + false); + StrokeRoundRect(canvas, + 0, 0, + width(), height(), + kCornerRadius, + background_border_color, + kBorderWidth); + + if (progress_ * width() > 1) { + int progress_width = progress_ * width() / kMaxProgress; + + bool enabled = IsEnabled(); + + const SkColor bar_color_start = enabled ? + SkColorSetRGB(100, 116, 147) : + SkColorSetRGB(229, 232, 237); + const SkColor bar_color_end = enabled ? + SkColorSetRGB(65, 73, 87) : + SkColorSetRGB(224, 225, 227); + + const SkColor bar_outer_color = enabled ? + SkColorSetRGB(0x4A, 0x4A, 0x4A) : + SkColorSetARGB(0x80, 0x4A, 0x4A, 0x4A); + + const SkColor bar_inner_border_color = + SkColorSetARGB(0x3F, 0xFF, 0xFF, 0xFF); // 0.25 white + const SkColor bar_inner_shadow_color = + SkColorSetARGB(0x54, 0xFF, 0xFF, 0xFF); // 0.33 white + + // Draw bar background + FillRoundRect(canvas, + 0, 0, progress_width, height(), + kCornerRadius, + bar_color_start, + bar_color_end, + false); + + // Draw inner stroke and shadow if wide enough. + if (progress_width > 2 * kBorderWidth) { + canvas->AsCanvasSkia()->save(); + + SkPath inner_path; + AddRoundRectPathWithPadding( + 0, 0, progress_width, height(), + kCornerRadius, + SkIntToScalar(kBorderWidth), + &inner_path); + canvas->AsCanvasSkia()->clipPath(inner_path); + + // Draw bar inner stroke + StrokeRoundRect(canvas, + kBorderWidth, kBorderWidth, + progress_width - 2 * kBorderWidth, + height() - 2 * kBorderWidth, + kCornerRadius - kBorderWidth, + bar_inner_border_color, + kBorderWidth); + + // Draw bar inner shadow + StrokeRoundRect(canvas, + 0, kBorderWidth, progress_width, height(), + kCornerRadius, + bar_inner_shadow_color, + kBorderWidth); + + canvas->AsCanvasSkia()->restore(); + } + + // Draw bar stroke + StrokeRoundRect(canvas, + 0, 0, progress_width, height(), + kCornerRadius, + bar_outer_color, + kBorderWidth); + } +#else SkColor bar_color_start = SkColorSetRGB(81, 138, 223); SkColor bar_color_end = SkColorSetRGB(51, 103, 205); SkColor background_color_start = SkColorSetRGB(212, 212, 212); @@ -141,6 +266,7 @@ void ProgressBar::Paint(gfx::Canvas* canvas) { kCornerRadius, border_color, kBorderWidth); +#endif } std::string ProgressBar::GetClassName() const { |