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 class CC_EXPORT ScrollbarAnimationControllerThinning 17 : public ScrollbarAnimationController { 18 public: 19 static scoped_ptr<ScrollbarAnimationControllerThinning> Create( 20 LayerImpl* scroll_layer); 21 22 static scoped_ptr<ScrollbarAnimationControllerThinning> CreateForTest( 23 LayerImpl* scroll_layer, 24 base::TimeDelta animation_delay, 25 base::TimeDelta animation_duration); 26 27 virtual ~ScrollbarAnimationControllerThinning(); 28 29 void set_mouse_move_distance_for_test(float distance) { 30 mouse_move_distance_to_trigger_animation_ = distance; 31 } 32 bool mouse_is_over_scrollbar() const { return mouse_is_over_scrollbar_; } 33 bool mouse_is_near_scrollbar() const { return mouse_is_near_scrollbar_; } 34 35 // ScrollbarAnimationController overrides. 36 virtual bool IsAnimating() const OVERRIDE; 37 virtual base::TimeDelta DelayBeforeStart(base::TimeTicks now) const OVERRIDE; 38 39 virtual bool Animate(base::TimeTicks now) OVERRIDE; 40 virtual void DidScrollGestureBegin() OVERRIDE; 41 virtual void DidScrollGestureEnd(base::TimeTicks now) OVERRIDE; 42 virtual void DidMouseMoveOffScrollbar(base::TimeTicks now) OVERRIDE; 43 virtual bool DidScrollUpdate(base::TimeTicks now) OVERRIDE; 44 virtual bool DidMouseMoveNear(base::TimeTicks now, float distance) OVERRIDE; 45 46 protected: 47 ScrollbarAnimationControllerThinning(LayerImpl* scroll_layer, 48 base::TimeDelta animation_delay, 49 base::TimeDelta animation_duration); 50 51 private: 52 // Describes whether the current animation should INCREASE (darken / thicken) 53 // a bar or DECREASE it (lighten / thin). 54 enum AnimationChange { 55 NONE, 56 INCREASE, 57 DECREASE 58 }; 59 // Returns how far through the animation we are as a progress value from 60 // 0 to 1. 61 float AnimationProgressAtTime(base::TimeTicks now); 62 float OpacityAtAnimationProgress(float progress); 63 float ThumbThicknessScaleAtAnimationProgress(float progress); 64 float AdjustScale(float new_value, 65 float current_value, 66 AnimationChange animation_change); 67 void ApplyOpacityAndThumbThicknessScale(float opacity, 68 float thumb_thickness_scale); 69 70 LayerImpl* scroll_layer_; 71 72 base::TimeTicks last_awaken_time_; 73 bool mouse_is_over_scrollbar_; 74 bool mouse_is_near_scrollbar_; 75 // Are we narrowing or thickening the bars. 76 AnimationChange thickness_change_; 77 // Are we darkening or lightening the bars. 78 AnimationChange opacity_change_; 79 // Should the animation be delayed or start immediately. 80 bool should_delay_animation_; 81 // If |should_delay_animation_| is true, delay the animation by this amount. 82 base::TimeDelta animation_delay_; 83 // The time for the animation to run. 84 base::TimeDelta animation_duration_; 85 // How close should the mouse be to the scrollbar before we thicken it. 86 float mouse_move_distance_to_trigger_animation_; 87 88 DISALLOW_COPY_AND_ASSIGN(ScrollbarAnimationControllerThinning); 89 }; 90 91 } // namespace cc 92 93 #endif // CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_THINNING_H_ 94