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_INPUT_TOP_CONTROLS_MANAGER_H_ 6 #define CC_INPUT_TOP_CONTROLS_MANAGER_H_ 7 8 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/weak_ptr.h" 10 #include "cc/input/top_controls_state.h" 11 #include "cc/layers/layer_impl.h" 12 #include "ui/gfx/size.h" 13 #include "ui/gfx/vector2d_f.h" 14 15 namespace base { 16 class TimeTicks; 17 } 18 19 namespace cc { 20 21 class KeyframedFloatAnimationCurve; 22 class LayerTreeImpl; 23 class TopControlsManagerClient; 24 25 // Manages the position of the top controls. 26 class CC_EXPORT TopControlsManager 27 : public base::SupportsWeakPtr<TopControlsManager> { 28 public: 29 enum AnimationDirection { 30 NO_ANIMATION, 31 SHOWING_CONTROLS, 32 HIDING_CONTROLS 33 }; 34 35 static scoped_ptr<TopControlsManager> Create( 36 TopControlsManagerClient* client, 37 float top_controls_height, 38 float top_controls_show_threshold, 39 float top_controls_hide_threshold); 40 virtual ~TopControlsManager(); 41 42 float controls_top_offset() { return controls_top_offset_; } 43 float content_top_offset() { 44 return controls_top_offset_ + top_controls_height_; 45 } 46 KeyframedFloatAnimationCurve* animation() { 47 return top_controls_animation_.get(); 48 } 49 AnimationDirection animation_direction() { return animation_direction_; } 50 51 void UpdateTopControlsState(TopControlsState constraints, 52 TopControlsState current, 53 bool animate); 54 55 void ScrollBegin(); 56 gfx::Vector2dF ScrollBy(const gfx::Vector2dF pending_delta); 57 void ScrollEnd(); 58 59 // The caller should ensure that |Pinch{Begin,End}| are called within 60 // the scope of |Scroll{Begin,End}|. 61 void PinchBegin(); 62 void PinchEnd(); 63 64 gfx::Vector2dF Animate(base::TimeTicks monotonic_time); 65 66 protected: 67 TopControlsManager(TopControlsManagerClient* client, 68 float top_controls_height, 69 float top_controls_show_threshold, 70 float top_controls_hide_threshold); 71 72 private: 73 void SetControlsTopOffset(float offset); 74 void ResetAnimations(); 75 void SetupAnimation(AnimationDirection direction); 76 void StartAnimationIfNecessary(); 77 bool IsAnimationCompleteAtTime(base::TimeTicks time); 78 79 TopControlsManagerClient* client_; // The client manages the lifecycle of 80 // this. 81 82 scoped_ptr<KeyframedFloatAnimationCurve> top_controls_animation_; 83 AnimationDirection animation_direction_; 84 TopControlsState permitted_state_; 85 float controls_top_offset_; 86 float top_controls_height_; 87 88 float current_scroll_delta_; 89 float controls_scroll_begin_offset_; 90 91 // The height of the visible top control such that it must be shown when 92 // the user stops the scroll. 93 float top_controls_show_height_; 94 95 // The height of the visible top control such that it must be hidden when 96 // the user stops the scroll. 97 float top_controls_hide_height_; 98 99 bool pinch_gesture_active_; 100 101 DISALLOW_COPY_AND_ASSIGN(TopControlsManager); 102 }; 103 104 } // namespace cc 105 106 #endif // CC_INPUT_TOP_CONTROLS_MANAGER_H_ 107