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

Unified Diff: ui/views/controls/slider.cc

Issue 10830027: Implement new slider control and disable the volume control when audio is muted. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move enum from .h to .cc. Created 8 years, 5 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/slider.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/slider.cc
diff --git a/ui/views/controls/slider.cc b/ui/views/controls/slider.cc
index 6929fb0016b03556015d7476b3a13625bbc0f368..97b5eaf1756883b667133f3470a067a82c79c1b5 100644
--- a/ui/views/controls/slider.cc
+++ b/ui/views/controls/slider.cc
@@ -8,11 +8,13 @@
#include "base/message_loop.h"
#include "base/stringprintf.h"
#include "base/utf_string_conversions.h"
+#include "grit/ui_resources.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkPaint.h"
#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/animation/slide_animation.h"
+#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/point.h"
#include "ui/gfx/rect.h"
@@ -20,6 +22,28 @@
namespace {
const int kSlideValueChangeDurationMS = 150;
+
+const int kBarImagesActive[] = {
+ IDR_SLIDER_ACTIVE_LEFT,
+ IDR_SLIDER_ACTIVE_CENTER,
+ IDR_SLIDER_PRESSED_CENTER,
+ IDR_SLIDER_PRESSED_RIGHT,
+};
+
+const int kBarImagesDisabled[] = {
+ IDR_SLIDER_DISABLED_LEFT,
+ IDR_SLIDER_DISABLED_CENTER,
+ IDR_SLIDER_DISABLED_CENTER,
+ IDR_SLIDER_DISABLED_RIGHT,
+};
+
+// The image chunks.
+enum BorderElements {
+ LEFT,
+ CENTER_LEFT,
+ CENTER_RIGHT,
+ RIGHT,
+};
}
namespace views {
@@ -32,9 +56,12 @@ Slider::Slider(SliderListener* listener, Orientation orientation)
animating_value_(0.f),
value_is_valid_(false),
accessibility_events_enabled_(true),
- focus_border_color_(0) {
+ focus_border_color_(0),
+ bar_active_images_(kBarImagesActive),
+ bar_disabled_images_(kBarImagesDisabled) {
EnableCanvasFlippingForRTLUI(true);
set_focusable(true);
+ UpdateState(true);
}
Slider::~Slider() {
@@ -93,6 +120,21 @@ void Slider::MoveButtonTo(const gfx::Point& point) {
}
}
+void Slider::UpdateState(bool control_on) {
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ if (control_on) {
+ thumb_ = rb.GetImageNamed(IDR_SLIDER_ACTIVE_THUMB).ToImageSkia();
+ for (int i = 0; i < 4; ++i)
+ images_[i] = rb.GetImageNamed(bar_active_images_[i]).ToImageSkia();
+ } else {
+ thumb_ = rb.GetImageNamed(IDR_SLIDER_DISABLED_THUMB).ToImageSkia();
+ for (int i = 0; i < 4; ++i)
+ images_[i] = rb.GetImageNamed(bar_disabled_images_[i]).ToImageSkia();
+ }
+ bar_height_ = images_[LEFT]->height();
+ SchedulePaint();
+}
+
void Slider::SetAccessibleName(const string16& name) {
accessible_name_ = name;
}
@@ -107,33 +149,56 @@ gfx::Size Slider::GetPreferredSize() {
}
void Slider::OnPaint(gfx::Canvas* canvas) {
- // TODO(sad): The painting code should use NativeTheme for various platforms.
- const int kButtonRadius = 5;
- const int kLineThickness = 5;
- const SkColor kFullColor = SkColorSetARGB(125, 0, 0, 0);
- const SkColor kEmptyColor = SkColorSetARGB(50, 0, 0, 0);
- const SkColor kButtonColor = SK_ColorBLACK;
-
gfx::Rect content = GetContentsBounds();
float value = move_animation_.get() && move_animation_->is_animating() ?
animating_value_ : value_;
-
- int button_cx = 0, button_cy = 0;
if (orientation_ == HORIZONTAL) {
- int w = content.width() - kButtonRadius * 2;
+ // Paint slider bar with image resources.
+
+ // Inset the slider bar a little bit, so that the left or the right end of
+ // the slider bar will not be exposed under the thumb button when the thumb
+ // button slides to the left most or right most position.
+ const int kBarInsetX = 2;
+ int bar_width = content.width() - kBarInsetX * 2;
+ int bar_cy = content.height() / 2 - bar_height_ / 2;
+
+ int w = content.width() - thumb_->width();
int full = value * w;
- int empty = w - full;
- int y = content.height() / 2 - kLineThickness / 2;
- canvas->FillRect(gfx::Rect(content.x() + kButtonRadius, y,
- full, kLineThickness),
- kFullColor);
- canvas->FillRect(gfx::Rect(content.x() + full + 2 * kButtonRadius, y,
- std::max(0, empty - kButtonRadius), kLineThickness),
- kEmptyColor);
+ int middle = std::max(full, images_[LEFT]->width());
- button_cx = content.x() + full + kButtonRadius;
- button_cy = y + kLineThickness / 2;
+ canvas->Save();
+ canvas->Translate(gfx::Point(kBarInsetX, bar_cy));
+ canvas->DrawImageInt(*images_[LEFT], 0, 0);
+ canvas->DrawImageInt(*images_[RIGHT],
+ bar_width - images_[RIGHT]->width(),
+ 0);
+ canvas->TileImageInt(*images_[CENTER_LEFT],
+ images_[LEFT]->width(),
+ 0,
+ middle - images_[LEFT]->width(),
+ bar_height_);
+ canvas->TileImageInt(*images_[CENTER_RIGHT],
+ middle,
+ 0,
+ bar_width - middle - images_[RIGHT]->width(),
+ bar_height_);
+ canvas->Restore();
+
+ // Paint slider thumb.
+ int button_cx = content.x() + full;
+ int thumb_y = content.height() / 2 - thumb_->height() / 2;
+ canvas->DrawImageInt(*thumb_, button_cx, thumb_y);
} else {
+ // TODO(jennyz): draw vertical slider bar with resources.
+ // TODO(sad): The painting code should use NativeTheme for various
+ // platforms.
+ const int kButtonRadius = 5;
+ const int kLineThickness = 5;
+ const SkColor kFullColor = SkColorSetARGB(125, 0, 0, 0);
+ const SkColor kEmptyColor = SkColorSetARGB(50, 0, 0, 0);
+ const SkColor kButtonColor = SK_ColorBLACK;
+
+ int button_cx = 0, button_cy = 0;
int h = content.height() - kButtonRadius * 2;
int full = value * h;
int empty = h - full;
@@ -147,14 +212,14 @@ void Slider::OnPaint(gfx::Canvas* canvas) {
button_cx = x + kLineThickness / 2;
button_cy = content.y() + empty + kButtonRadius;
- }
- SkPaint paint;
- paint.setStyle(SkPaint::kFill_Style);
- paint.setAntiAlias(true);
- paint.setColor(kButtonColor);
- canvas->sk_canvas()->drawCircle(button_cx, button_cy, kButtonRadius, paint);
- View::OnPaint(canvas);
+ SkPaint paint;
+ paint.setStyle(SkPaint::kFill_Style);
+ paint.setAntiAlias(true);
+ paint.setColor(kButtonColor);
+ canvas->sk_canvas()->drawCircle(button_cx, button_cy, kButtonRadius, paint);
+ View::OnPaint(canvas);
+ }
}
bool Slider::OnMousePressed(const views::MouseEvent& event) {
« no previous file with comments | « ui/views/controls/slider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698