#ifndef UI_VIEWS_CONTROLS_ANIMATED_IMAGE_VIEW_H_
#define UI_VIEWS_CONTROLS_ANIMATED_IMAGE_VIEW_H_
#include <memory>
#include <optional>
#include <utility>
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/compositor/compositor_animation_observer.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/lottie/animation.h"
#include "ui/views/controls/image_view_base.h"
#include "ui/views/metadata/view_factory.h"
#include "ui/views/views_export.h"
namespace gfx {
class Canvas;
}
namespace ui {
class Compositor;
}
namespace views {
class VIEWS_EXPORT AnimatedImageView : public ImageViewBase,
public ui::CompositorAnimationObserver {
METADATA_HEADER(AnimatedImageView, ImageViewBase)
public:
enum class State {
kPlaying,
kStopped
};
AnimatedImageView();
AnimatedImageView(const AnimatedImageView&) = delete;
AnimatedImageView& operator=(const AnimatedImageView&) = delete;
~AnimatedImageView() override;
void SetAnimatedImage(std::unique_ptr<lottie::Animation> animated_image);
void Play(std::optional<lottie::Animation::PlaybackConfig> playback_config =
std::nullopt);
void Stop();
lottie::Animation* animated_image() { return animated_image_.get(); }
void SetAdditionalTranslation(gfx::Vector2d additional_translation) {
additional_translation_ = std::move(additional_translation);
}
State state() const { return state_; }
lottie::Animation* GetAnimatedImageForTesting() {
return animated_image_.get();
}
private:
void OnPaint(gfx::Canvas* canvas) override;
void NativeViewHierarchyChanged() override;
void AddedToWidget() override;
void RemovedFromWidget() override;
void OnAnimationStep(base::TimeTicks timestamp) override;
void OnCompositingShuttingDown(ui::Compositor* compositor) override;
gfx::Size GetImageSize() const override;
void DoPlay(lottie::Animation::PlaybackConfig playback_config);
void SetCompositorFromWidget();
void ClearCurrentCompositor();
State state_ = State::kStopped;
std::unique_ptr<lottie::Animation::PlaybackConfig> playback_config_;
raw_ptr<ui::Compositor> compositor_ = nullptr;
base::TimeTicks previous_timestamp_;
std::unique_ptr<lottie::Animation> animated_image_;
gfx::Vector2d additional_translation_;
};
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, AnimatedImageView, ImageViewBase)
VIEW_BUILDER_PROPERTY(std::unique_ptr<lottie::Animation>, AnimatedImage)
VIEW_BUILDER_PROPERTY(gfx::Vector2d, AdditionalTranslation)
END_VIEW_BUILDER
}
DEFINE_VIEW_BUILDER(VIEWS_EXPORT, AnimatedImageView)
#endif