| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // Inspired by NSAnimation | |
| 5 | 4 |
| 6 #ifndef APP_ANIMATION_H_ | 5 #ifndef APP_ANIMATION_H_ |
| 7 #define APP_ANIMATION_H_ | 6 #define APP_ANIMATION_H_ |
| 8 | 7 |
| 8 #include "app/animation_container.h" |
| 9 #include "base/ref_counted.h" | 9 #include "base/ref_counted.h" |
| 10 #include "base/time.h" | 10 #include "base/time.h" |
| 11 | 11 |
| 12 class Animation; | |
| 13 class AnimationContainer; | |
| 14 | |
| 15 namespace gfx { | 12 namespace gfx { |
| 16 class Rect; | 13 class Rect; |
| 17 } | 14 } |
| 18 | 15 |
| 16 class Animation; |
| 17 |
| 19 // AnimationDelegate | 18 // AnimationDelegate |
| 20 // | 19 // |
| 21 // Implement this interface when you want to receive notifications about the | 20 // Implement this interface when you want to receive notifications about the |
| 22 // state of an animation. | 21 // state of an animation. |
| 23 // | |
| 24 class AnimationDelegate { | 22 class AnimationDelegate { |
| 25 public: | 23 public: |
| 26 // Called when an animation has started. | |
| 27 virtual void AnimationStarted(const Animation* animation) { | |
| 28 } | |
| 29 | |
| 30 // Called when an animation has completed. | 24 // Called when an animation has completed. |
| 31 virtual void AnimationEnded(const Animation* animation) { | 25 virtual void AnimationEnded(const Animation* animation) { |
| 32 } | 26 } |
| 33 | 27 |
| 34 // Called when an animation has progressed. | 28 // Called when an animation has progressed. |
| 35 virtual void AnimationProgressed(const Animation* animation) { | 29 virtual void AnimationProgressed(const Animation* animation) { |
| 36 } | 30 } |
| 37 | 31 |
| 38 // Called when an animation has been canceled. | 32 // Called when an animation has been canceled. |
| 39 virtual void AnimationCanceled(const Animation* animation) { | 33 virtual void AnimationCanceled(const Animation* animation) { |
| 40 } | 34 } |
| 41 | 35 |
| 42 protected: | 36 protected: |
| 43 virtual ~AnimationDelegate() {} | 37 virtual ~AnimationDelegate() {} |
| 44 }; | 38 }; |
| 45 | 39 |
| 46 // Animation | 40 // Base class used in implementing animations. You only need use this class if |
| 41 // you're implementing a new animation type, otherwise you'll likely want one of |
| 42 // LinearAnimation, SlideAnimation, ThrobAnimation or MultiAnimation. |
| 47 // | 43 // |
| 48 // This class provides a basic implementation of an object that uses a timer | 44 // To subclass override Step, which is invoked as the animation progresses and |
| 49 // to increment its state over the specified time and frame-rate. To | 45 // GetCurrentValue() to return the value appropriate to the animation. |
| 50 // actually do something useful with this you need to subclass it and override | 46 class Animation : public AnimationContainer::Element { |
| 51 // AnimateToState and optionally GetCurrentValue to update your state. | |
| 52 // | |
| 53 // The Animation notifies a delegate when events of interest occur. | |
| 54 // | |
| 55 // The practice is to instantiate a subclass and call Init and any other | |
| 56 // initialization specific to the subclass, and then call |Start|. The | |
| 57 // animation uses the current thread's message loop. | |
| 58 // | |
| 59 class Animation { | |
| 60 public: | 47 public: |
| 61 // Initializes everything except the duration. | 48 explicit Animation(base::TimeDelta timer_interval); |
| 62 // | |
| 63 // Caller must make sure to call SetDuration() if they use this | |
| 64 // constructor; it is preferable to use the full one, but sometimes | |
| 65 // duration can change between calls to Start() and we need to | |
| 66 // expose this interface. | |
| 67 Animation(int frame_rate, AnimationDelegate* delegate); | |
| 68 | |
| 69 // Initializes all fields. | |
| 70 Animation(int duration, int frame_rate, AnimationDelegate* delegate); | |
| 71 virtual ~Animation(); | 49 virtual ~Animation(); |
| 72 | 50 |
| 73 // Called when the animation progresses. Subclasses override this to | 51 // Starts the animation. Does nothing if the animation is already running. |
| 74 // efficiently update their state. | 52 void Start(); |
| 75 virtual void AnimateToState(double state) = 0; | 53 |
| 54 // Stops the animation. Does nothing if the animation is not running. |
| 55 void Stop(); |
| 76 | 56 |
| 77 // Gets the value for the current state, according to the animation | 57 // Gets the value for the current state, according to the animation |
| 78 // curve in use. This class provides only for a linear relationship, | 58 // curve in use. |
| 79 // however subclasses can override this to provide others. | 59 virtual double GetCurrentValue() const = 0; |
| 80 virtual double GetCurrentValue() const; | |
| 81 | 60 |
| 82 // Convenience for returning a value between |start| and |target| based on | 61 // Convenience for returning a value between |start| and |target| based on |
| 83 // the current value. This is (target - start) * GetCurrentValue() + start. | 62 // the current value. This is (target - start) * GetCurrentValue() + start. |
| 84 double CurrentValueBetween(double start, double target) const; | 63 double CurrentValueBetween(double start, double target) const; |
| 85 int CurrentValueBetween(int start, int target) const; | 64 int CurrentValueBetween(int start, int target) const; |
| 86 gfx::Rect CurrentValueBetween(const gfx::Rect& start_bounds, | 65 gfx::Rect CurrentValueBetween(const gfx::Rect& start_bounds, |
| 87 const gfx::Rect& target_bounds) const; | 66 const gfx::Rect& target_bounds) const; |
| 88 | 67 |
| 89 // Start the animation. | |
| 90 void Start(); | |
| 91 | |
| 92 // Stop the animation. | |
| 93 void Stop(); | |
| 94 | |
| 95 // Skip to the end of the current animation. | |
| 96 void End(); | |
| 97 | |
| 98 // Return whether this animation is animating. | |
| 99 bool IsAnimating() const; | |
| 100 | |
| 101 // Changes the length of the animation. This resets the current | |
| 102 // state of the animation to the beginning. | |
| 103 void SetDuration(int duration); | |
| 104 | |
| 105 // Returns true if rich animations should be rendered. | |
| 106 // Looks at session type (e.g. remote desktop) and accessibility settings | |
| 107 // to give guidance for heavy animations such as "start download" arrow. | |
| 108 static bool ShouldRenderRichAnimation(); | |
| 109 | |
| 110 // Sets the delegate. | 68 // Sets the delegate. |
| 111 void set_delegate(AnimationDelegate* delegate) { delegate_ = delegate; } | 69 void set_delegate(AnimationDelegate* delegate) { delegate_ = delegate; } |
| 112 | 70 |
| 113 // Sets the container used to manage the timer. A value of NULL results in | 71 // Sets the container used to manage the timer. A value of NULL results in |
| 114 // creating a new AnimationContainer. | 72 // creating a new AnimationContainer. |
| 115 void SetContainer(AnimationContainer* container); | 73 void SetContainer(AnimationContainer* container); |
| 116 | 74 |
| 75 bool is_animating() const { return is_animating_; } |
| 76 |
| 117 base::TimeDelta timer_interval() const { return timer_interval_; } | 77 base::TimeDelta timer_interval() const { return timer_interval_; } |
| 118 | 78 |
| 79 // Returns true if rich animations should be rendered. |
| 80 // Looks at session type (e.g. remote desktop) and accessibility settings |
| 81 // to give guidance for heavy animations such as "start download" arrow. |
| 82 static bool ShouldRenderRichAnimation(); |
| 83 |
| 119 protected: | 84 protected: |
| 120 // Invoked by the AnimationContainer when the animation is running to advance | 85 // Invoked from Start to allow subclasses to prepare for the animation. |
| 121 // the animation. Use |time_now| rather than Time::Now to avoid multiple | 86 virtual void AnimationStarted() {} |
| 122 // animations running at the same time diverging. | |
| 123 virtual void Step(base::TimeTicks time_now); | |
| 124 | 87 |
| 125 // Calculates the timer interval from the constructor list. | 88 // Invoked from Stop after we're removed from the container but before the |
| 126 base::TimeDelta CalculateInterval(int frame_rate); | 89 // delegate has been invoked. |
| 90 virtual void AnimationStopped() {} |
| 91 |
| 92 // Invoked from stop to determine if cancel should be invoked. If this returns |
| 93 // true the delegate is notified the animation was canceled, otherwise the |
| 94 // delegate is notified the animation stopped. |
| 95 virtual bool ShouldSendCanceledFromStop() { return false; } |
| 96 |
| 97 AnimationContainer* container() { return container_.get(); } |
| 98 base::TimeTicks start_time() const { return start_time_; } |
| 99 AnimationDelegate* delegate() { return delegate_; } |
| 100 |
| 101 // AnimationContainer::Element overrides |
| 102 virtual void SetStartTime(base::TimeTicks start_time); |
| 103 virtual void Step(base::TimeTicks time_now) = 0; |
| 104 virtual base::TimeDelta GetTimerInterval() const { return timer_interval_; } |
| 127 | 105 |
| 128 private: | 106 private: |
| 129 friend class AnimationContainer; | 107 // Interval for the animation. |
| 108 const base::TimeDelta timer_interval_; |
| 130 | 109 |
| 131 // Invoked from AnimationContainer when started. | 110 // If true we're running. |
| 132 void set_start_time(base::TimeTicks start_time) { start_time_ = start_time; } | 111 bool is_animating_; |
| 133 | 112 |
| 134 // Whether or not we are currently animating. | 113 // Our delegate; may be null. |
| 135 bool animating_; | |
| 136 | |
| 137 int frame_rate_; | |
| 138 base::TimeDelta timer_interval_; | |
| 139 base::TimeDelta duration_; | |
| 140 | |
| 141 // Current state, on a scale from 0.0 to 1.0. | |
| 142 double state_; | |
| 143 | |
| 144 base::TimeTicks start_time_; | |
| 145 | |
| 146 AnimationDelegate* delegate_; | 114 AnimationDelegate* delegate_; |
| 147 | 115 |
| 116 // Container we're in. If non-null we're animating. |
| 148 scoped_refptr<AnimationContainer> container_; | 117 scoped_refptr<AnimationContainer> container_; |
| 149 | 118 |
| 119 // Time we started at. |
| 120 base::TimeTicks start_time_; |
| 121 |
| 150 DISALLOW_COPY_AND_ASSIGN(Animation); | 122 DISALLOW_COPY_AND_ASSIGN(Animation); |
| 151 }; | 123 }; |
| 152 | 124 |
| 153 #endif // APP_ANIMATION_H_ | 125 #endif // APP_ANIMATION_H_ |
| OLD | NEW |