| 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 | 4 |
| 5 #ifndef VIEWS_ANIMATION_BOUNDS_ANIMATOR_H_ | 5 #ifndef VIEWS_ANIMATION_BOUNDS_ANIMATOR_H_ |
| 6 #define VIEWS_ANIMATION_BOUNDS_ANIMATOR_H_ | 6 #define VIEWS_ANIMATION_BOUNDS_ANIMATOR_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 | 10 |
| 11 #include "app/animation_container_observer.h" | |
| 12 #include "app/animation_delegate.h" | |
| 13 #include "base/ref_counted.h" | 11 #include "base/ref_counted.h" |
| 14 #include "gfx/rect.h" | 12 #include "gfx/rect.h" |
| 13 #include "ui/base/animation/animation_container_observer.h" |
| 14 #include "ui/base/animation/animation_delegate.h" |
| 15 | 15 |
| 16 class AnimationContainer; | 16 namespace ui { |
| 17 class SlideAnimation; | 17 class SlideAnimation; |
| 18 } |
| 18 | 19 |
| 19 namespace views { | 20 namespace views { |
| 20 | 21 |
| 21 class BoundsAnimator; | 22 class BoundsAnimator; |
| 22 class View; | 23 class View; |
| 23 | 24 |
| 24 class BoundsAnimatorObserver { | 25 class BoundsAnimatorObserver { |
| 25 public: | 26 public: |
| 26 // Invoked when all animations are complete. | 27 // Invoked when all animations are complete. |
| 27 virtual void OnBoundsAnimatorDone(BoundsAnimator* animator) = 0; | 28 virtual void OnBoundsAnimatorDone(BoundsAnimator* animator) = 0; |
| 28 }; | 29 }; |
| 29 | 30 |
| 30 // Bounds animator is responsible for animating the bounds of a view from the | 31 // Bounds animator is responsible for animating the bounds of a view from the |
| 31 // the views current location and size to a target position and size. To use | 32 // the views current location and size to a target position and size. To use |
| 32 // BoundsAnimator invoke AnimateViewTo for the set of views you want to | 33 // BoundsAnimator invoke AnimateViewTo for the set of views you want to |
| 33 // animate. | 34 // animate. |
| 34 // | 35 // |
| 35 // BoundsAnimator internally creates an animation for each view. If you need | 36 // BoundsAnimator internally creates an animation for each view. If you need |
| 36 // a specific animation invoke SetAnimationForView after invoking AnimateViewTo. | 37 // a specific animation invoke SetAnimationForView after invoking AnimateViewTo. |
| 37 // You can attach an AnimationDelegate to the individual animation for a view | 38 // You can attach an AnimationDelegate to the individual animation for a view |
| 38 // by way of SetAnimationDelegate. Additionally you can attach an observer to | 39 // by way of SetAnimationDelegate. Additionally you can attach an observer to |
| 39 // the BoundsAnimator that is notified when all animations are complete. | 40 // the BoundsAnimator that is notified when all animations are complete. |
| 40 class BoundsAnimator : public AnimationDelegate, | 41 class BoundsAnimator : public ui::AnimationDelegate, |
| 41 public AnimationContainerObserver { | 42 public ui::AnimationContainerObserver { |
| 42 public: | 43 public: |
| 43 // If |delete_when_done| is set to true in |SetAnimationDelegate| the | 44 // If |delete_when_done| is set to true in |SetAnimationDelegate| the |
| 44 // |AnimationDelegate| must subclass this class. | 45 // |AnimationDelegate| must subclass this class. |
| 45 class OwnedAnimationDelegate : public AnimationDelegate { | 46 class OwnedAnimationDelegate : public ui::AnimationDelegate { |
| 46 public: | 47 public: |
| 47 virtual ~OwnedAnimationDelegate() {} | 48 virtual ~OwnedAnimationDelegate() {} |
| 48 }; | 49 }; |
| 49 | 50 |
| 50 explicit BoundsAnimator(View* view); | 51 explicit BoundsAnimator(View* view); |
| 51 ~BoundsAnimator(); | 52 ~BoundsAnimator(); |
| 52 | 53 |
| 53 // Starts animating |view| from its current bounds to |target|. If there is | 54 // Starts animating |view| from its current bounds to |target|. If there is |
| 54 // already an animation running for the view it's stopped and a new one | 55 // already an animation running for the view it's stopped and a new one |
| 55 // started. If an AnimationDelegate has been set for |view| it is removed | 56 // started. If an AnimationDelegate has been set for |view| it is removed |
| 56 // (after being notified that the animation was canceled). | 57 // (after being notified that the animation was canceled). |
| 57 void AnimateViewTo(View* view, const gfx::Rect& target); | 58 void AnimateViewTo(View* view, const gfx::Rect& target); |
| 58 | 59 |
| 59 // Sets the animation for the specified view. BoundsAnimator takes ownership | 60 // Sets the animation for the specified view. BoundsAnimator takes ownership |
| 60 // of the specified animation. | 61 // of the specified animation. |
| 61 void SetAnimationForView(View* view, SlideAnimation* animation); | 62 void SetAnimationForView(View* view, ui::SlideAnimation* animation); |
| 62 | 63 |
| 63 // Returns the animation for the specified view. BoundsAnimator owns the | 64 // Returns the animation for the specified view. BoundsAnimator owns the |
| 64 // returned Animation. | 65 // returned Animation. |
| 65 const SlideAnimation* GetAnimationForView(View* view); | 66 const ui::SlideAnimation* GetAnimationForView(View* view); |
| 66 | 67 |
| 67 // Stops animating the specified view. If the view was scheduled for deletion | 68 // Stops animating the specified view. If the view was scheduled for deletion |
| 68 // it is deleted. This does nothing if |view| is not currently animating. | 69 // it is deleted. This does nothing if |view| is not currently animating. |
| 69 void StopAnimatingView(View* view); | 70 void StopAnimatingView(View* view); |
| 70 | 71 |
| 71 // Sets the delegate for the animation created for the specified view. If | 72 // Sets the delegate for the animation created for the specified view. If |
| 72 // |delete_when_done| is true the |delegate| is deleted when done and | 73 // |delete_when_done| is true the |delegate| is deleted when done and |
| 73 // |delegate| must subclass OwnedAnimationDelegate. | 74 // |delegate| must subclass OwnedAnimationDelegate. |
| 74 void SetAnimationDelegate(View* view, | 75 void SetAnimationDelegate(View* view, |
| 75 AnimationDelegate* delegate, | 76 ui::AnimationDelegate* delegate, |
| 76 bool delete_when_done); | 77 bool delete_when_done); |
| 77 | 78 |
| 78 // Returns true if BoundsAnimator is animating the bounds of |view|. | 79 // Returns true if BoundsAnimator is animating the bounds of |view|. |
| 79 bool IsAnimating(View* view) const; | 80 bool IsAnimating(View* view) const; |
| 80 | 81 |
| 81 // Returns true if BoundsAnimator is animating any view. | 82 // Returns true if BoundsAnimator is animating any view. |
| 82 bool IsAnimating() const; | 83 bool IsAnimating() const; |
| 83 | 84 |
| 84 // Cancels all animations, leaving the views at their current location and | 85 // Cancels all animations, leaving the views at their current location and |
| 85 // size. Any views marked for deletion are deleted. | 86 // size. Any views marked for deletion are deleted. |
| 86 void Cancel(); | 87 void Cancel(); |
| 87 | 88 |
| 88 void set_observer(BoundsAnimatorObserver* observer) { | 89 void set_observer(BoundsAnimatorObserver* observer) { |
| 89 observer_ = observer; | 90 observer_ = observer; |
| 90 } | 91 } |
| 91 | 92 |
| 92 protected: | 93 protected: |
| 93 // Creates the animation to use for animating views. | 94 // Creates the animation to use for animating views. |
| 94 virtual SlideAnimation* CreateAnimation(); | 95 virtual ui::SlideAnimation* CreateAnimation(); |
| 95 | 96 |
| 96 private: | 97 private: |
| 97 // Tracks data about the view being animated. | 98 // Tracks data about the view being animated. |
| 98 struct Data { | 99 struct Data { |
| 99 Data() | 100 Data() |
| 100 : delete_delegate_when_done(false), | 101 : delete_delegate_when_done(false), |
| 101 animation(NULL), | 102 animation(NULL), |
| 102 delegate(NULL) {} | 103 delegate(NULL) {} |
| 103 | 104 |
| 104 // If true the delegate is deleted when done. | 105 // If true the delegate is deleted when done. |
| 105 bool delete_delegate_when_done; | 106 bool delete_delegate_when_done; |
| 106 | 107 |
| 107 // The initial bounds. | 108 // The initial bounds. |
| 108 gfx::Rect start_bounds; | 109 gfx::Rect start_bounds; |
| 109 | 110 |
| 110 // Target bounds. | 111 // Target bounds. |
| 111 gfx::Rect target_bounds; | 112 gfx::Rect target_bounds; |
| 112 | 113 |
| 113 // The animation. We own this. | 114 // The animation. We own this. |
| 114 SlideAnimation* animation; | 115 ui::SlideAnimation* animation; |
| 115 | 116 |
| 116 // Additional delegate for the animation, may be null. | 117 // Additional delegate for the animation, may be null. |
| 117 AnimationDelegate* delegate; | 118 ui::AnimationDelegate* delegate; |
| 118 }; | 119 }; |
| 119 | 120 |
| 120 // Used by AnimationEndedOrCanceled. | 121 // Used by AnimationEndedOrCanceled. |
| 121 enum AnimationEndType { | 122 enum AnimationEndType { |
| 122 ANIMATION_ENDED, | 123 ANIMATION_ENDED, |
| 123 ANIMATION_CANCELED | 124 ANIMATION_CANCELED |
| 124 }; | 125 }; |
| 125 | 126 |
| 126 typedef std::map<View*, Data> ViewToDataMap; | 127 typedef std::map<View*, Data> ViewToDataMap; |
| 127 | 128 |
| 128 typedef std::map<const Animation*, View*> AnimationToViewMap; | 129 typedef std::map<const ui::Animation*, View*> AnimationToViewMap; |
| 129 | 130 |
| 130 // Removes references to |view| and its animation. This does NOT delete the | 131 // Removes references to |view| and its animation. This does NOT delete the |
| 131 // animation or delegate. | 132 // animation or delegate. |
| 132 void RemoveFromMaps(View* view); | 133 void RemoveFromMaps(View* view); |
| 133 | 134 |
| 134 // Does the necessary cleanup for |data|. If |send_cancel| is true and a | 135 // Does the necessary cleanup for |data|. If |send_cancel| is true and a |
| 135 // delegate has been installed on |data| AnimationCanceled is invoked on it. | 136 // delegate has been installed on |data| AnimationCanceled is invoked on it. |
| 136 void CleanupData(bool send_cancel, Data* data, View* view); | 137 void CleanupData(bool send_cancel, Data* data, View* view); |
| 137 | 138 |
| 138 // Used when changing the animation for a view. This resets the maps for | 139 // Used when changing the animation for a view. This resets the maps for |
| 139 // the animation used by view and returns the current animation. Ownership | 140 // the animation used by view and returns the current animation. Ownership |
| 140 // of the returned animation passes to the caller. | 141 // of the returned animation passes to the caller. |
| 141 Animation* ResetAnimationForView(View* view); | 142 ui::Animation* ResetAnimationForView(View* view); |
| 142 | 143 |
| 143 // Invoked from AnimationEnded and AnimationCanceled. | 144 // Invoked from AnimationEnded and AnimationCanceled. |
| 144 void AnimationEndedOrCanceled(const Animation* animation, | 145 void AnimationEndedOrCanceled(const ui::Animation* animation, |
| 145 AnimationEndType type); | 146 AnimationEndType type); |
| 146 | 147 |
| 147 // AnimationDelegate overrides. | 148 // ui::AnimationDelegate overrides. |
| 148 virtual void AnimationProgressed(const Animation* animation); | 149 virtual void AnimationProgressed(const ui::Animation* animation); |
| 149 virtual void AnimationEnded(const Animation* animation); | 150 virtual void AnimationEnded(const ui::Animation* animation); |
| 150 virtual void AnimationCanceled(const Animation* animation); | 151 virtual void AnimationCanceled(const ui::Animation* animation); |
| 151 | 152 |
| 152 // AnimationContainerObserver overrides. | 153 // ui::AnimationContainerObserver overrides. |
| 153 virtual void AnimationContainerProgressed(AnimationContainer* container); | 154 virtual void AnimationContainerProgressed(ui::AnimationContainer* container); |
| 154 virtual void AnimationContainerEmpty(AnimationContainer* container); | 155 virtual void AnimationContainerEmpty(ui::AnimationContainer* container); |
| 155 | 156 |
| 156 // Parent of all views being animated. | 157 // Parent of all views being animated. |
| 157 View* parent_; | 158 View* parent_; |
| 158 | 159 |
| 159 BoundsAnimatorObserver* observer_; | 160 BoundsAnimatorObserver* observer_; |
| 160 | 161 |
| 161 // All animations we create up with the same container. | 162 // All animations we create up with the same container. |
| 162 scoped_refptr<AnimationContainer> container_; | 163 scoped_refptr<ui::AnimationContainer> container_; |
| 163 | 164 |
| 164 // Maps from view being animated to info about the view. | 165 // Maps from view being animated to info about the view. |
| 165 ViewToDataMap data_; | 166 ViewToDataMap data_; |
| 166 | 167 |
| 167 // Makes from animation to view. | 168 // Makes from animation to view. |
| 168 AnimationToViewMap animation_to_view_; | 169 AnimationToViewMap animation_to_view_; |
| 169 | 170 |
| 170 // As the animations we created update (AnimationProgressed is invoked) this | 171 // As the animations we created update (AnimationProgressed is invoked) this |
| 171 // is updated. When all the animations have completed for a given tick of | 172 // is updated. When all the animations have completed for a given tick of |
| 172 // the timer (AnimationContainerProgressed is invoked) the parent_ is asked | 173 // the timer (AnimationContainerProgressed is invoked) the parent_ is asked |
| 173 // to repaint these bounds. | 174 // to repaint these bounds. |
| 174 gfx::Rect repaint_bounds_; | 175 gfx::Rect repaint_bounds_; |
| 175 | 176 |
| 176 DISALLOW_COPY_AND_ASSIGN(BoundsAnimator); | 177 DISALLOW_COPY_AND_ASSIGN(BoundsAnimator); |
| 177 }; | 178 }; |
| 178 | 179 |
| 179 } // namespace views | 180 } // namespace views |
| 180 | 181 |
| 181 #endif // VIEWS_ANIMATION_BOUNDS_ANIMATOR_H_ | 182 #endif // VIEWS_ANIMATION_BOUNDS_ANIMATOR_H_ |
| OLD | NEW |