summaryrefslogtreecommitdiffstats
path: root/app/animation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'app/animation.cc')
-rw-r--r--app/animation.cc172
1 files changed, 52 insertions, 120 deletions
diff --git a/app/animation.cc b/app/animation.cc
index 5e9d10c..2dc2bcf6 100644
--- a/app/animation.cc
+++ b/app/animation.cc
@@ -4,120 +4,87 @@
#include "app/animation.h"
-#include "app/animation_container.h"
+#include "app/tween.h"
#include "gfx/rect.h"
#if defined(OS_WIN)
#include "base/win_util.h"
#endif
-using base::Time;
-using base::TimeDelta;
-
-Animation::Animation(int frame_rate,
- AnimationDelegate* delegate)
- : animating_(false),
- frame_rate_(frame_rate),
- timer_interval_(CalculateInterval(frame_rate)),
- state_(0.0),
- delegate_(delegate) {
-}
-
-Animation::Animation(int duration,
- int frame_rate,
- AnimationDelegate* delegate)
- : animating_(false),
- frame_rate_(frame_rate),
- timer_interval_(CalculateInterval(frame_rate)),
- duration_(TimeDelta::FromMilliseconds(duration)),
- state_(0.0),
- delegate_(delegate) {
-
- SetDuration(duration);
+Animation::Animation(base::TimeDelta timer_interval)
+ : timer_interval_(timer_interval),
+ is_animating_(false),
+ delegate_(NULL) {
}
Animation::~Animation() {
- if (animating_)
+ // Don't send out notification from the destructor. Chances are the delegate
+ // owns us and is being deleted as well.
+ if (is_animating_)
container_->Stop(this);
}
-double Animation::GetCurrentValue() const {
- // Default is linear relationship, subclass to adapt.
- return state_;
-}
+void Animation::Start() {
+ if (is_animating_)
+ return;
-double Animation::CurrentValueBetween(double start, double target) const {
- return start + (target - start) * GetCurrentValue();
-}
+ if (!container_.get())
+ container_ = new AnimationContainer();
-int Animation::CurrentValueBetween(int start, int target) const {
- return static_cast<int>(CurrentValueBetween(static_cast<double>(start),
- static_cast<double>(target)));
-}
+ is_animating_ = true;
-gfx::Rect Animation::CurrentValueBetween(const gfx::Rect& start_bounds,
- const gfx::Rect& target_bounds) const {
- return gfx::Rect(CurrentValueBetween(start_bounds.x(), target_bounds.x()),
- CurrentValueBetween(start_bounds.y(), target_bounds.y()),
- CurrentValueBetween(start_bounds.width(),
- target_bounds.width()),
- CurrentValueBetween(start_bounds.height(),
- target_bounds.height()));
+ container_->Start(this);
+
+ AnimationStarted();
}
-void Animation::Start() {
- if (!animating_) {
- if (!container_.get())
- container_ = new AnimationContainer();
+void Animation::Stop() {
+ if (!is_animating_)
+ return;
- animating_ = true;
+ is_animating_ = false;
- container_->Start(this);
+ // Notify the container first as the delegate may delete us.
+ container_->Stop(this);
- if (delegate_)
- delegate_->AnimationStarted(this);
+ AnimationStopped();
+
+ if (delegate_) {
+ if (ShouldSendCanceledFromStop())
+ delegate_->AnimationCanceled(this);
+ else
+ delegate_->AnimationEnded(this);
}
}
-void Animation::Stop() {
- if (animating_) {
- animating_ = false;
+double Animation::CurrentValueBetween(double start, double target) const {
+ return Tween::ValueBetween(GetCurrentValue(), start, target);
+}
- // Notify the container first as the delegate may delete us.
- container_->Stop(this);
+int Animation::CurrentValueBetween(int start, int target) const {
+ return Tween::ValueBetween(GetCurrentValue(), start, target);
- if (delegate_) {
- if (state_ >= 1.0)
- delegate_->AnimationEnded(this);
- else
- delegate_->AnimationCanceled(this);
- }
- }
}
-void Animation::End() {
- if (animating_) {
- animating_ = false;
+gfx::Rect Animation::CurrentValueBetween(const gfx::Rect& start_bounds,
+ const gfx::Rect& target_bounds) const {
+ return Tween::ValueBetween(GetCurrentValue(), start_bounds, target_bounds);
+}
- // Notify the container first as the delegate may delete us.
- container_->Stop(this);
+void Animation::SetContainer(AnimationContainer* container) {
+ if (container == container_.get())
+ return;
- AnimateToState(1.0);
- if (delegate_)
- delegate_->AnimationEnded(this);
- }
-}
+ if (is_animating_)
+ container_->Stop(this);
-bool Animation::IsAnimating() const {
- return animating_;
-}
+ if (container)
+ container_ = container;
+ else
+ container_ = new AnimationContainer();
-void Animation::SetDuration(int duration) {
- duration_ = TimeDelta::FromMilliseconds(duration);
- if (duration_ < timer_interval_)
- duration_ = timer_interval_;
- if (animating_)
- start_time_ = container_->last_tick_time();
+ if (is_animating_)
+ container_->Start(this);
}
// static
@@ -139,41 +106,6 @@ bool Animation::ShouldRenderRichAnimation() {
return true;
}
-void Animation::SetContainer(AnimationContainer* container) {
- if (container == container_.get())
- return;
-
- if (animating_)
- container_->Stop(this);
-
- if (container)
- container_ = container;
- else
- container_ = new AnimationContainer();
-
- if (animating_)
- container_->Start(this);
-}
-
-void Animation::Step(base::TimeTicks time_now) {
- TimeDelta elapsed_time = time_now - start_time_;
- state_ = static_cast<double>(elapsed_time.InMicroseconds()) /
- static_cast<double>(duration_.InMicroseconds());
- if (state_ >= 1.0)
- state_ = 1.0;
-
- AnimateToState(state_);
-
- if (delegate_)
- delegate_->AnimationProgressed(this);
-
- if (state_ == 1.0)
- Stop();
-}
-
-TimeDelta Animation::CalculateInterval(int frame_rate) {
- int timer_interval = 1000000 / frame_rate;
- if (timer_interval < 10000)
- timer_interval = 10000;
- return TimeDelta::FromMicroseconds(timer_interval);
+void Animation::SetStartTime(base::TimeTicks start_time) {
+ start_time_ = start_time;
}