diff options
Diffstat (limited to 'ui/compositor/layer.cc')
-rw-r--r-- | ui/compositor/layer.cc | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc index ca3ff28..d57cc3b 100644 --- a/ui/compositor/layer.cc +++ b/ui/compositor/layer.cc @@ -142,10 +142,15 @@ void Layer::SetCompositor(Compositor* compositor) { DCHECK(!compositor || !compositor_); DCHECK(!compositor || compositor->root_layer() == this); DCHECK(!parent_); + if (compositor_) { + RemoveAnimatorsInTreeFromCollection( + compositor_->layer_animator_collection()); + } compositor_ = compositor; if (compositor) { OnDeviceScaleFactorChanged(compositor->device_scale_factor()); SendPendingThreadedAnimations(); + AddAnimatorsInTreeToCollection(compositor_->layer_animator_collection()); } } @@ -159,15 +164,21 @@ void Layer::Add(Layer* child) { child->OnDeviceScaleFactorChanged(device_scale_factor_); if (GetCompositor()) child->SendPendingThreadedAnimations(); + LayerAnimatorCollection* collection = GetLayerAnimatorCollection(); + if (collection) + child->AddAnimatorsInTreeToCollection(collection); } void Layer::Remove(Layer* child) { // Current bounds are used to calculate offsets when layers are reparented. // Stop (and complete) an ongoing animation to update the bounds immediately. - if (child->GetAnimator()) { - child->GetAnimator()->StopAnimatingProperty( - ui::LayerAnimationElement::BOUNDS); - } + LayerAnimator* child_animator = child->animator_; + if (child_animator) + child_animator->StopAnimatingProperty(ui::LayerAnimationElement::BOUNDS); + LayerAnimatorCollection* collection = GetLayerAnimatorCollection(); + if (collection) + child->RemoveAnimatorsInTreeFromCollection(collection); + std::vector<Layer*>::iterator i = std::find(children_.begin(), children_.end(), child); DCHECK(i != children_.end()); @@ -605,6 +616,13 @@ void Layer::SendDamagedRects() { children_[i]->SendDamagedRects(); } +void Layer::CompleteAllAnimations() { + std::vector<scoped_refptr<LayerAnimator> > animators; + CollectAnimators(&animators); + std::for_each(animators.begin(), animators.end(), + std::mem_fun(&LayerAnimator::StopAnimating)); +} + void Layer::SuppressPaint() { if (!delegate_) return; @@ -689,6 +707,15 @@ void Layer::OnAnimationStarted(const cc::AnimationEvent& event) { animator_->OnThreadedAnimationStarted(event); } +void Layer::CollectAnimators( + std::vector<scoped_refptr<LayerAnimator> >* animators) { + if (IsAnimating()) + animators->push_back(animator_); + std::for_each(children_.begin(), children_.end(), + std::bind2nd(std::mem_fun(&Layer::CollectAnimators), + animators)); +} + void Layer::StackRelativeTo(Layer* child, Layer* other, bool above) { DCHECK_NE(child, other); DCHECK_EQ(this, child->parent()); @@ -873,6 +900,11 @@ void Layer::RemoveThreadedAnimation(int animation_id) { pending_threaded_animations_.end()); } +LayerAnimatorCollection* Layer::GetLayerAnimatorCollection() { + Compositor* compositor = GetCompositor(); + return compositor ? compositor->layer_animator_collection() : NULL; +} + void Layer::SendPendingThreadedAnimations() { for (cc::ScopedPtrVector<cc::Animation>::iterator it = pending_threaded_animations_.begin(); @@ -930,4 +962,32 @@ void Layer::RecomputePosition() { cc_layer_->SetPosition(gfx::PointF(bounds_.x(), bounds_.y())); } +void Layer::AddAnimatorsInTreeToCollection( + LayerAnimatorCollection* collection) { + DCHECK(collection); + if (IsAnimating()) + animator_->AddToCollection(collection); + std::for_each( + children_.begin(), + children_.end(), + std::bind2nd(std::mem_fun(&Layer::AddAnimatorsInTreeToCollection), + collection)); +} + +void Layer::RemoveAnimatorsInTreeFromCollection( + LayerAnimatorCollection* collection) { + DCHECK(collection); + if (IsAnimating()) + animator_->RemoveFromCollection(collection); + std::for_each( + children_.begin(), + children_.end(), + std::bind2nd(std::mem_fun(&Layer::RemoveAnimatorsInTreeFromCollection), + collection)); +} + +bool Layer::IsAnimating() const { + return animator_ && animator_->is_animating(); +} + } // namespace ui |