| Index: ui/compositor/callback_layer_animation_observer.h
|
| diff --git a/ui/compositor/callback_layer_animation_observer.h b/ui/compositor/callback_layer_animation_observer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..236f1a2587291ed9f453867d6cf326dbe6ee2db3
|
| --- /dev/null
|
| +++ b/ui/compositor/callback_layer_animation_observer.h
|
| @@ -0,0 +1,143 @@
|
| +// Copyright 2015 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.
|
| +
|
| +#ifndef UI_COMPOSITOR_CALLBACK_LAYER_ANIMATION_OBSERVER_H_
|
| +#define UI_COMPOSITOR_CALLBACK_LAYER_ANIMATION_OBSERVER_H_
|
| +
|
| +#include "base/callback.h"
|
| +#include "ui/compositor/compositor_export.h"
|
| +#include "ui/compositor/layer_animation_observer.h"
|
| +
|
| +namespace ui {
|
| +
|
| +class LayerAnimationSequence;
|
| +
|
| +// A LayerAnimationObserver that invokes a Callback when all observed
|
| +// LayerAnimationSequence's have started and finished.
|
| +//
|
| +// Example usage:
|
| +// class Foobar {
|
| +// // The Callback that will be invoked when all the animation sequences have
|
| +// // started.
|
| +// void AnimationStartedCallback(
|
| +// const CallbackLayerAnimationObserver& observer) {
|
| +// // Do stuff.
|
| +// }
|
| +//
|
| +// // The Callback that will be invoked when all the animation sequences have
|
| +// // finished.
|
| +// bool AnimationEndedCallback(
|
| +// const CallbackLayerAnimationObserver& observer) {
|
| +// // Do stuff.
|
| +// return true; // Returns true so that |observer| destroys itself.
|
| +// }
|
| +//
|
| +// // Example method that uses the CallbackLayerAnimationObserver.
|
| +// void Animate() {
|
| +// ui::LayerAnimator* animator_1 = layer_1->GetAnimator();
|
| +// ui::LayerAnimator* animator_2 = layer_2->GetAnimator();
|
| +// CallbackLayerAnimationObserver* observer =
|
| +// new CallbackLayerAnimationObserver(
|
| +// base::Bind(&Foobar::AnimationStartedCallback),
|
| +// base::Unretained(this));
|
| +// base::Bind(&Foobar::AnimationEndedCallback),
|
| +// base::Unretained(this));
|
| +// animator_1->AddObserver(observer);
|
| +// animator_2->AddObserver(observer);
|
| +//
|
| +// // Set up animation sequences on |animator_1| and |animator_2|.
|
| +//
|
| +// // The callback won't be invoked until SetActive() is called.
|
| +// observer->SetActive();
|
| +// }
|
| +// }
|
| +//
|
| +// TODO(bruthig): Unify the CallbackLayerAnimationObserver with the
|
| +// ImplicitAnimationObserver. (See www.crbug.com/542825).
|
| +class COMPOSITOR_EXPORT CallbackLayerAnimationObserver
|
| + : public ui::LayerAnimationObserver {
|
| + public:
|
| + // The Callback type that will be invoked when all animation sequences have
|
| + // been started.
|
| + typedef base::Callback<void(const CallbackLayerAnimationObserver&)>
|
| + AnimationStartedCallback;
|
| +
|
| + // The Callback type that will be invoked when all animation sequences have
|
| + // finished. |this| will be destroyed after invoking the Callback if it
|
| + // returns true.
|
| + typedef base::Callback<bool(const CallbackLayerAnimationObserver&)>
|
| + AnimationEndedCallback;
|
| +
|
| + CallbackLayerAnimationObserver(
|
| + AnimationStartedCallback animation_started_callback,
|
| + AnimationEndedCallback animation_ended_callback);
|
| + ~CallbackLayerAnimationObserver() override;
|
| +
|
| + bool active() const { return active_; }
|
| +
|
| + // The callbacks will not be invoked until SetActive() has been called. This
|
| + // allows each sequence to be attached before checking if the sequences have
|
| + // finished.
|
| + void SetActive();
|
| +
|
| + int aborted_count() const { return aborted_count_; }
|
| + int successful_count() const { return successful_count_; }
|
| +
|
| + // ui::LayerAnimationObserver:
|
| + void OnLayerAnimationStarted(ui::LayerAnimationSequence* sequence) override;
|
| + void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override;
|
| + void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override;
|
| + void OnLayerAnimationScheduled(ui::LayerAnimationSequence* sequence) override;
|
| +
|
| + protected:
|
| + // ui::LayerAnimationObserver:
|
| + bool RequiresNotificationWhenAnimatorDestroyed() const override;
|
| + void OnAttachedToSequence(ui::LayerAnimationSequence* sequence) override;
|
| + void OnDetachedFromSequence(ui::LayerAnimationSequence* sequence) override;
|
| +
|
| + private:
|
| + int GetNumSequencesCompleted();
|
| +
|
| + // Checks if all attached sequences have been started and invokes
|
| + // |animation_started_callback_| if |active_| is true.
|
| + void CheckAllSequencesStarted();
|
| +
|
| + // Checks if all attached sequences have completed and invokes
|
| + // |animation_ended_callback_| if |active_| is true.
|
| + void CheckAllSequencesCompleted();
|
| +
|
| + // Allows the callbacks to be invoked when true.
|
| + bool active_;
|
| +
|
| + // The total number of animation sequences that have been attached.
|
| + int attached_sequence_count_;
|
| +
|
| + // The total number of animation sequences that have been detached.
|
| + int detached_sequence_count_;
|
| +
|
| + // The number of animation sequences that have been started.
|
| + int started_count_;
|
| +
|
| + // The number of animation sequences that were aborted.
|
| + int aborted_count_;
|
| +
|
| + // The number of animation sequences that completed successfully.
|
| + int successful_count_;
|
| +
|
| + // The callback to invoke once all the animation sequences have been started.
|
| + AnimationStartedCallback animation_started_callback_;
|
| +
|
| + // The callback to invoke once all the animation sequences have finished.
|
| + AnimationEndedCallback animation_ended_callback_;
|
| +
|
| + // Set to true in the destructor (if non-NULL). Used to detect deletion while
|
| + // calling out.
|
| + bool* destroyed_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CallbackLayerAnimationObserver);
|
| +};
|
| +
|
| +} // namespace ui
|
| +
|
| +#endif // UI_COMPOSITOR_CALLBACK_LAYER_ANIMATION_OBSERVER_H_
|
|
|