Chromium Code Reviews| Index: ui/gfx/compositor/layer_animator.cc |
| diff --git a/ui/gfx/compositor/layer_animator.cc b/ui/gfx/compositor/layer_animator.cc |
| index e737377c86c600ca0674470eba190fc75b18ee7f..339bb3870714543351f5e5b9cca52549a57ee89a 100644 |
| --- a/ui/gfx/compositor/layer_animator.cc |
| +++ b/ui/gfx/compositor/layer_animator.cc |
| @@ -10,7 +10,7 @@ |
| #include "ui/base/animation/animation_container.h" |
| #include "ui/gfx/compositor/compositor.h" |
| #include "ui/gfx/compositor/layer.h" |
| -#include "ui/gfx/compositor/layer_animation_delegate.h" |
| +#include "ui/gfx/compositor/layer_animator_delegate.h" |
| #include "ui/gfx/compositor/layer_animation_sequence.h" |
| namespace ui { |
| @@ -55,30 +55,45 @@ void LayerAnimator::SetTransform(const Transform& transform) { |
| if (transition_duration_ == base::TimeDelta()) |
| delegate_->SetTransformFromAnimation(transform); |
| else |
| - StartAnimation(new LayerAnimationSequence( |
| - LayerAnimationElement::CreateTransformElement(transform, |
| - transition_duration_))); |
| + StartAnimationElement(LayerAnimationElement::CreateTransformElement( |
| + transform, transition_duration_)); |
| +} |
| + |
| +Transform LayerAnimator::GetTargetTransform() const { |
| + LayerAnimationElement::TargetValue target; |
| + GetTargetValue(&target); |
| + return target.transform; |
| } |
| void LayerAnimator::SetBounds(const gfx::Rect& bounds) { |
| if (transition_duration_ == base::TimeDelta()) |
| delegate_->SetBoundsFromAnimation(bounds); |
| else |
| - StartAnimation(new LayerAnimationSequence( |
| - LayerAnimationElement::CreateBoundsElement(bounds, |
| - transition_duration_))); |
| + StartAnimationElement(LayerAnimationElement::CreateBoundsElement( |
| + bounds, transition_duration_)); |
| +} |
| + |
| +gfx::Rect LayerAnimator::GetTargetBounds() const { |
| + LayerAnimationElement::TargetValue target; |
| + GetTargetValue(&target); |
| + return target.bounds; |
| } |
| void LayerAnimator::SetOpacity(float opacity) { |
| if (transition_duration_ == base::TimeDelta()) |
| delegate_->SetOpacityFromAnimation(opacity); |
| else |
| - StartAnimation(new LayerAnimationSequence( |
| - LayerAnimationElement::CreateOpacityElement(opacity, |
| - transition_duration_))); |
| + StartAnimationElement(LayerAnimationElement::CreateOpacityElement( |
| + opacity, transition_duration_)); |
| } |
| -void LayerAnimator::SetDelegate(LayerAnimationDelegate* delegate) { |
| +float LayerAnimator::GetTargetOpacity() const { |
| + LayerAnimationElement::TargetValue target; |
| + GetTargetValue(&target); |
| + return target.opacity; |
| +} |
| + |
| +void LayerAnimator::SetDelegate(LayerAnimatorDelegate* delegate) { |
| DCHECK(delegate); |
| delegate_ = delegate; |
| } |
| @@ -107,6 +122,7 @@ void LayerAnimator::StartAnimation(LayerAnimationSequence* animation) { |
| } |
| } |
| FinishAnyAnimationWithZeroDuration(); |
| + UpdateAnimationState(); |
| } |
| void LayerAnimator::ScheduleAnimation(LayerAnimationSequence* animation) { |
| @@ -116,6 +132,7 @@ void LayerAnimator::ScheduleAnimation(LayerAnimationSequence* animation) { |
| } else { |
| StartSequenceImmediately(animation); |
| } |
| + UpdateAnimationState(); |
| } |
| void LayerAnimator::ScheduleTogether( |
| @@ -141,6 +158,24 @@ void LayerAnimator::ScheduleTogether( |
| for (iter = animations.begin(); iter != animations.end(); ++iter) { |
| ScheduleAnimation(*iter); |
| } |
| + |
| + UpdateAnimationState(); |
| +} |
| + |
| +void LayerAnimator::StartAnimationElement(LayerAnimationElement* animation) { |
| + StartAnimation(new LayerAnimationSequence(animation)); |
| +} |
| + |
| +void LayerAnimator::ScheduleAnimationElement(LayerAnimationElement* animation) { |
| + ScheduleAnimation(new LayerAnimationSequence(animation)); |
| +} |
| + |
| +void LayerAnimator::ScheduleElementsTogether( |
| + const std::vector<LayerAnimationElement*>& animations) { |
| + std::vector<LayerAnimationSequence*> sequences; |
| + for (size_t i = 0; i < animations.size(); ++i) |
| + sequences.push_back(new LayerAnimationSequence(animations[i])); |
| + ScheduleTogether(sequences); |
| } |
| void LayerAnimator::StopAnimatingProperty( |
| @@ -158,10 +193,24 @@ void LayerAnimator::StopAnimating() { |
| FinishAnimation(running_animations_[0].sequence); |
| } |
| +LayerAnimator::ScopedSettings::ScopedSettings(LayerAnimator* animator) |
| + : animator_(animator), |
| + old_transition_duration_(animator->transition_duration_) { |
| +} |
| + |
| +LayerAnimator::ScopedSettings::~ScopedSettings() { |
| + animator_->transition_duration_ = old_transition_duration_; |
| +} |
| + |
| +void LayerAnimator::ScopedSettings::SetTransitionDuration( |
| + base::TimeDelta duration) { |
| + animator_->transition_duration_ = duration; |
| +} |
| + |
| // LayerAnimator private ------------------------------------------------------- |
| void LayerAnimator::Step(base::TimeTicks now) { |
| - TRACE_EVENT0("LayerAnimator", "Step"); |
| + //TRACE_EVENT0("LayerAnimator", "Step"); |
|
sky
2011/10/26 15:39:15
Remove if not needed.
|
| last_step_time_ = now; |
| std::vector<LayerAnimationSequence*> to_finish; |
| for (RunningAnimations::iterator iter = running_animations_.begin(); |
| @@ -228,6 +277,7 @@ void LayerAnimator::RemoveAnimation(LayerAnimationSequence* sequence) { |
| void LayerAnimator::FinishAnimation(LayerAnimationSequence* sequence) { |
| sequence->Progress(sequence->duration(), delegate()); |
| + delegate()->OnLayerAnimationEnded(sequence); |
| RemoveAnimation(sequence); |
| ProcessQueue(); |
| UpdateAnimationState(); |
| @@ -243,6 +293,7 @@ void LayerAnimator::FinishAnyAnimationWithZeroDuration() { |
| if (running_animations_[i].sequence->duration() == base::TimeDelta()) { |
| running_animations_[i].sequence->Progress( |
| running_animations_[i].sequence->duration(), delegate()); |
| + delegate()->OnLayerAnimationEnded(running_animations_[i].sequence); |
| RemoveAnimation(running_animations_[i].sequence); |
| } else { |
| ++i; |
| @@ -300,11 +351,13 @@ void LayerAnimator::RemoveAllAnimationsWithACommonProperty( |
| if (running_animations_[i].sequence->HasCommonProperty( |
| sequence->properties())) { |
| // Finish the animation. |
| - if (abort) |
| + if (abort){ |
| running_animations_[i].sequence->Abort(); |
| - else |
| + } else { |
| running_animations_[i].sequence->Progress( |
| running_animations_[i].sequence->duration(), delegate()); |
| + delegate()->OnLayerAnimationEnded(running_animations_[i].sequence); |
| + } |
| RemoveAnimation(running_animations_[i].sequence); |
| } else { |
| ++i; |
| @@ -331,6 +384,7 @@ void LayerAnimator::ImmediatelySetNewTarget(LayerAnimationSequence* sequence) { |
| const bool abort = false; |
| RemoveAllAnimationsWithACommonProperty(sequence, abort); |
| sequence->Progress(sequence->duration(), delegate()); |
| + delegate()->OnLayerAnimationEnded(sequence); |
| RemoveAnimation(sequence); |
| } |
| @@ -377,10 +431,8 @@ void LayerAnimator::ProcessQueue() { |
| bool started_sequence = false; |
| do { |
| started_sequence = false; |
| - |
| // Build a list of all currently animated properties. |
| LayerAnimationElement::AnimatableProperties animated; |
| - |
| for (RunningAnimations::const_iterator iter = running_animations_.begin(); |
| iter != running_animations_.end(); ++iter) { |
| animated.insert((*iter).sequence->properties().begin(), |
| @@ -440,4 +492,12 @@ bool LayerAnimator::StartSequenceImmediately(LayerAnimationSequence* sequence) { |
| return true; |
| } |
| +void LayerAnimator::GetTargetValue( |
| + LayerAnimationElement::TargetValue* target) const { |
| + for (RunningAnimations::const_iterator iter = running_animations_.begin(); |
| + iter != running_animations_.end(); ++iter) { |
| + (*iter).sequence->GetTargetValue(target); |
| + } |
| +} |
| + |
| } // namespace ui |