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