Index: app/animation.cc |
diff --git a/app/animation.cc b/app/animation.cc |
index 5e9d10cf75bcc9b3818fe97b0b49f5a846527418..2dc2bcf6bce0ebf8d12320701987fba75170e7b9 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; |
} |