1 // Copyright (c) 2012 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 #ifndef UI_VIEWS_CONTROLS_SLIDER_H_ 6 #define UI_VIEWS_CONTROLS_SLIDER_H_ 7 8 #include "ui/gfx/animation/animation_delegate.h" 9 #include "ui/views/view.h" 10 #include "ui/views/views_export.h" 11 12 typedef unsigned int SkColor; 13 14 namespace gfx { 15 class ImageSkia; 16 class SlideAnimation; 17 } 18 19 namespace views { 20 21 class Slider; 22 23 enum SliderChangeReason { 24 VALUE_CHANGED_BY_USER, // value was changed by the user (by clicking, e.g.) 25 VALUE_CHANGED_BY_API, // value was changed by a call to SetValue. 26 }; 27 28 class VIEWS_EXPORT SliderListener { 29 public: 30 virtual void SliderValueChanged(Slider* sender, 31 float value, 32 float old_value, 33 SliderChangeReason reason) = 0; 34 35 // Invoked when a drag starts or ends (more specifically, when the mouse 36 // button is pressed or released). 37 virtual void SliderDragStarted(Slider* sender) {} 38 virtual void SliderDragEnded(Slider* sender) {} 39 40 protected: 41 virtual ~SliderListener() {} 42 }; 43 44 class VIEWS_EXPORT Slider : public View, public gfx::AnimationDelegate { 45 public: 46 enum Orientation { 47 HORIZONTAL, 48 VERTICAL 49 }; 50 51 Slider(SliderListener* listener, Orientation orientation); 52 virtual ~Slider(); 53 54 float value() const { return value_; } 55 void SetValue(float value); 56 57 // Set the delta used for changing the value via keyboard. 58 void SetKeyboardIncrement(float increment); 59 60 void SetAccessibleName(const string16& name); 61 62 void set_enable_accessibility_events(bool enabled) { 63 accessibility_events_enabled_ = enabled; 64 } 65 66 void set_focus_border_color(SkColor color) { focus_border_color_ = color; } 67 68 // Update UI based on control on/off state. 69 void UpdateState(bool control_on); 70 71 private: 72 void SetValueInternal(float value, SliderChangeReason reason); 73 74 // Should be called on the Mouse Down event. Used to calculate relative 75 // position of the mouse cursor (or the touch point) on the button to 76 // accurately move the button using the MoveButtonTo() method. 77 void PrepareForMove(const gfx::Point& point); 78 79 // Moves the button to the specified point and updates the value accordingly. 80 void MoveButtonTo(const gfx::Point& point); 81 82 void OnPaintFocus(gfx::Canvas* canvas); 83 84 // views::View overrides: 85 virtual gfx::Size GetPreferredSize() OVERRIDE; 86 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 87 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 88 virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE; 89 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; 90 virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE; 91 virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 92 93 // ui::EventHandler overrides: 94 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 95 96 // gfx::AnimationDelegate overrides: 97 virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; 98 99 SliderListener* listener_; 100 Orientation orientation_; 101 102 scoped_ptr<gfx::SlideAnimation> move_animation_; 103 104 float value_; 105 float keyboard_increment_; 106 float animating_value_; 107 bool value_is_valid_; 108 string16 accessible_name_; 109 bool accessibility_events_enabled_; 110 SkColor focus_border_color_; 111 112 // Relative position of the mouse cursor (or the touch point) on the slider's 113 // button. 114 gfx::Point initial_button_offset_; 115 116 const int* bar_active_images_; 117 const int* bar_disabled_images_; 118 const gfx::ImageSkia* thumb_; 119 const gfx::ImageSkia* images_[4]; 120 int bar_height_; 121 122 DISALLOW_COPY_AND_ASSIGN(Slider); 123 }; 124 125 } // namespace views 126 127 #endif // UI_VIEWS_CONTROLS_SLIDER_H_ 128