Home | History | Annotate | Download | only in animation
      1 // Copyright 2013 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 CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_THINNING_H_
      6 #define CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_THINNING_H_
      7 
      8 #include "base/memory/scoped_ptr.h"
      9 #include "cc/animation/scrollbar_animation_controller.h"
     10 #include "cc/base/cc_export.h"
     11 
     12 namespace cc {
     13 class LayerImpl;
     14 
     15 // Scrollbar animation that partially fades and thins after an idle delay,
     16 // and reacts to mouse movements.
     17 class CC_EXPORT ScrollbarAnimationControllerThinning
     18     : public ScrollbarAnimationController {
     19  public:
     20   static scoped_ptr<ScrollbarAnimationControllerThinning> Create(
     21       LayerImpl* scroll_layer,
     22       ScrollbarAnimationControllerClient* client,
     23       base::TimeDelta delay_before_starting,
     24       base::TimeDelta duration);
     25 
     26   virtual ~ScrollbarAnimationControllerThinning();
     27 
     28   void set_mouse_move_distance_for_test(float distance) {
     29     mouse_move_distance_to_trigger_animation_ = distance;
     30   }
     31   bool mouse_is_over_scrollbar() const { return mouse_is_over_scrollbar_; }
     32   bool mouse_is_near_scrollbar() const { return mouse_is_near_scrollbar_; }
     33 
     34   virtual void DidScrollUpdate() OVERRIDE;
     35   virtual void DidMouseMoveOffScrollbar() OVERRIDE;
     36   virtual void DidMouseMoveNear(float distance) OVERRIDE;
     37 
     38  protected:
     39   ScrollbarAnimationControllerThinning(
     40       LayerImpl* scroll_layer,
     41       ScrollbarAnimationControllerClient* client,
     42       base::TimeDelta delay_before_starting,
     43       base::TimeDelta duration);
     44 
     45   virtual void RunAnimationFrame(float progress) OVERRIDE;
     46 
     47  private:
     48   // Describes whether the current animation should INCREASE (darken / thicken)
     49   // a bar or DECREASE it (lighten / thin).
     50   enum AnimationChange {
     51     NONE,
     52     INCREASE,
     53     DECREASE
     54   };
     55   float OpacityAtAnimationProgress(float progress);
     56   float ThumbThicknessScaleAtAnimationProgress(float progress);
     57   float AdjustScale(float new_value,
     58                     float current_value,
     59                     AnimationChange animation_change);
     60   void ApplyOpacityAndThumbThicknessScale(float opacity,
     61                                           float thumb_thickness_scale);
     62 
     63   LayerImpl* scroll_layer_;
     64 
     65   bool mouse_is_over_scrollbar_;
     66   bool mouse_is_near_scrollbar_;
     67   // Are we narrowing or thickening the bars.
     68   AnimationChange thickness_change_;
     69   // Are we darkening or lightening the bars.
     70   AnimationChange opacity_change_;
     71   // How close should the mouse be to the scrollbar before we thicken it.
     72   float mouse_move_distance_to_trigger_animation_;
     73 
     74   DISALLOW_COPY_AND_ASSIGN(ScrollbarAnimationControllerThinning);
     75 };
     76 
     77 }  // namespace cc
     78 
     79 #endif  // CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_THINNING_H_
     80