| Index: app/animation.h
|
| diff --git a/app/animation.h b/app/animation.h
|
| index c483e1dd40ac6eeb1938879533b4759867a6c909..5c672c9a4f80008b87ba492f64137291de05c433 100644
|
| --- a/app/animation.h
|
| +++ b/app/animation.h
|
| @@ -1,32 +1,26 @@
|
| // Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| -// Inspired by NSAnimation
|
|
|
| #ifndef APP_ANIMATION_H_
|
| #define APP_ANIMATION_H_
|
|
|
| +#include "app/animation_container.h"
|
| #include "base/ref_counted.h"
|
| #include "base/time.h"
|
|
|
| -class Animation;
|
| -class AnimationContainer;
|
| -
|
| namespace gfx {
|
| class Rect;
|
| }
|
|
|
| +class Animation;
|
| +
|
| // AnimationDelegate
|
| //
|
| // Implement this interface when you want to receive notifications about the
|
| // state of an animation.
|
| -//
|
| class AnimationDelegate {
|
| public:
|
| - // Called when an animation has started.
|
| - virtual void AnimationStarted(const Animation* animation) {
|
| - }
|
| -
|
| // Called when an animation has completed.
|
| virtual void AnimationEnded(const Animation* animation) {
|
| }
|
| @@ -43,41 +37,26 @@ class AnimationDelegate {
|
| virtual ~AnimationDelegate() {}
|
| };
|
|
|
| -// Animation
|
| -//
|
| -// This class provides a basic implementation of an object that uses a timer
|
| -// to increment its state over the specified time and frame-rate. To
|
| -// actually do something useful with this you need to subclass it and override
|
| -// AnimateToState and optionally GetCurrentValue to update your state.
|
| -//
|
| -// The Animation notifies a delegate when events of interest occur.
|
| -//
|
| -// The practice is to instantiate a subclass and call Init and any other
|
| -// initialization specific to the subclass, and then call |Start|. The
|
| -// animation uses the current thread's message loop.
|
| +// Base class used in implementing animations. You only need use this class if
|
| +// you're implementing a new animation type, otherwise you'll likely want one of
|
| +// LinearAnimation, SlideAnimation, ThrobAnimation or MultiAnimation.
|
| //
|
| -class Animation {
|
| +// To subclass override Step, which is invoked as the animation progresses and
|
| +// GetCurrentValue() to return the value appropriate to the animation.
|
| +class Animation : public AnimationContainer::Element {
|
| public:
|
| - // Initializes everything except the duration.
|
| - //
|
| - // Caller must make sure to call SetDuration() if they use this
|
| - // constructor; it is preferable to use the full one, but sometimes
|
| - // duration can change between calls to Start() and we need to
|
| - // expose this interface.
|
| - Animation(int frame_rate, AnimationDelegate* delegate);
|
| -
|
| - // Initializes all fields.
|
| - Animation(int duration, int frame_rate, AnimationDelegate* delegate);
|
| + explicit Animation(base::TimeDelta timer_interval);
|
| virtual ~Animation();
|
|
|
| - // Called when the animation progresses. Subclasses override this to
|
| - // efficiently update their state.
|
| - virtual void AnimateToState(double state) = 0;
|
| + // Starts the animation. Does nothing if the animation is already running.
|
| + void Start();
|
| +
|
| + // Stops the animation. Does nothing if the animation is not running.
|
| + void Stop();
|
|
|
| // Gets the value for the current state, according to the animation
|
| - // curve in use. This class provides only for a linear relationship,
|
| - // however subclasses can override this to provide others.
|
| - virtual double GetCurrentValue() const;
|
| + // curve in use.
|
| + virtual double GetCurrentValue() const = 0;
|
|
|
| // Convenience for returning a value between |start| and |target| based on
|
| // the current value. This is (target - start) * GetCurrentValue() + start.
|
| @@ -86,27 +65,6 @@ class Animation {
|
| gfx::Rect CurrentValueBetween(const gfx::Rect& start_bounds,
|
| const gfx::Rect& target_bounds) const;
|
|
|
| - // Start the animation.
|
| - void Start();
|
| -
|
| - // Stop the animation.
|
| - void Stop();
|
| -
|
| - // Skip to the end of the current animation.
|
| - void End();
|
| -
|
| - // Return whether this animation is animating.
|
| - bool IsAnimating() const;
|
| -
|
| - // Changes the length of the animation. This resets the current
|
| - // state of the animation to the beginning.
|
| - void SetDuration(int duration);
|
| -
|
| - // Returns true if rich animations should be rendered.
|
| - // Looks at session type (e.g. remote desktop) and accessibility settings
|
| - // to give guidance for heavy animations such as "start download" arrow.
|
| - static bool ShouldRenderRichAnimation();
|
| -
|
| // Sets the delegate.
|
| void set_delegate(AnimationDelegate* delegate) { delegate_ = delegate; }
|
|
|
| @@ -114,39 +72,53 @@ class Animation {
|
| // creating a new AnimationContainer.
|
| void SetContainer(AnimationContainer* container);
|
|
|
| + bool is_animating() const { return is_animating_; }
|
| +
|
| base::TimeDelta timer_interval() const { return timer_interval_; }
|
|
|
| - protected:
|
| - // Invoked by the AnimationContainer when the animation is running to advance
|
| - // the animation. Use |time_now| rather than Time::Now to avoid multiple
|
| - // animations running at the same time diverging.
|
| - virtual void Step(base::TimeTicks time_now);
|
| + // Returns true if rich animations should be rendered.
|
| + // Looks at session type (e.g. remote desktop) and accessibility settings
|
| + // to give guidance for heavy animations such as "start download" arrow.
|
| + static bool ShouldRenderRichAnimation();
|
|
|
| - // Calculates the timer interval from the constructor list.
|
| - base::TimeDelta CalculateInterval(int frame_rate);
|
| + protected:
|
| + // Invoked from Start to allow subclasses to prepare for the animation.
|
| + virtual void AnimationStarted() {}
|
|
|
| - private:
|
| - friend class AnimationContainer;
|
| + // Invoked from Stop after we're removed from the container but before the
|
| + // delegate has been invoked.
|
| + virtual void AnimationStopped() {}
|
|
|
| - // Invoked from AnimationContainer when started.
|
| - void set_start_time(base::TimeTicks start_time) { start_time_ = start_time; }
|
| + // Invoked from stop to determine if cancel should be invoked. If this returns
|
| + // true the delegate is notified the animation was canceled, otherwise the
|
| + // delegate is notified the animation stopped.
|
| + virtual bool ShouldSendCanceledFromStop() { return false; }
|
|
|
| - // Whether or not we are currently animating.
|
| - bool animating_;
|
| + AnimationContainer* container() { return container_.get(); }
|
| + base::TimeTicks start_time() const { return start_time_; }
|
| + AnimationDelegate* delegate() { return delegate_; }
|
|
|
| - int frame_rate_;
|
| - base::TimeDelta timer_interval_;
|
| - base::TimeDelta duration_;
|
| + // AnimationContainer::Element overrides
|
| + virtual void SetStartTime(base::TimeTicks start_time);
|
| + virtual void Step(base::TimeTicks time_now) = 0;
|
| + virtual base::TimeDelta GetTimerInterval() const { return timer_interval_; }
|
|
|
| - // Current state, on a scale from 0.0 to 1.0.
|
| - double state_;
|
| + private:
|
| + // Interval for the animation.
|
| + const base::TimeDelta timer_interval_;
|
|
|
| - base::TimeTicks start_time_;
|
| + // If true we're running.
|
| + bool is_animating_;
|
|
|
| + // Our delegate; may be null.
|
| AnimationDelegate* delegate_;
|
|
|
| + // Container we're in. If non-null we're animating.
|
| scoped_refptr<AnimationContainer> container_;
|
|
|
| + // Time we started at.
|
| + base::TimeTicks start_time_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(Animation);
|
| };
|
|
|
|
|