blob: 2bd5ed22c1191081a51746dc23e799598a63f6b8 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_GLIC_WIDGET_GLIC_WINDOW_ANIMATOR_H_
#define CHROME_BROWSER_GLIC_WIDGET_GLIC_WINDOW_ANIMATOR_H_
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/ui/views/tabs/glic_button.h"
#include "ui/gfx/animation/animation_delegate.h"
#include "ui/gfx/animation/linear_animation.h"
namespace glic {
class GlicWidget;
class GlicWindowResizeAnimation;
// This class will handle the open and close animations for the glic widget
// including referring to GlicWindowResizeAnimation for
// resizing-related animations.
class GlicWindowAnimator : public gfx::AnimationDelegate {
public:
explicit GlicWindowAnimator(base::WeakPtr<GlicWidget> widget,
base::RepeatingClosure resize_finished_callback);
GlicWindowAnimator(const GlicWindowAnimator&) = delete;
GlicWindowAnimator& operator=(const GlicWindowAnimator&) = delete;
~GlicWindowAnimator() override;
// Animate the window size, maintaining the position of the top right corner.
// If there is already a running bounds change animation, update that
// animation's target size.
void AnimateSize(const gfx::Size& target_size,
base::TimeDelta duration,
base::OnceClosure callback);
// Animate the window's top left position maintaining size. If there is
// already a running bounds change animation, update that animation's target
// origin.
void AnimatePosition(const gfx::Point& target_position,
base::TimeDelta duration,
base::OnceClosure callback);
// Called when the programmatic resize has finished. Public for use by
// GlicWindowResizeAnimation.
void ResizeFinished();
// Gets the bounds for the widget's resize animation. If there is an animation
// already ongoing, use the target bounds for that animation. Otherwise, use
// the widget's current bounds.
gfx::Rect GetCurrentTargetBounds();
// Reset the saved target size.
void ResetLastTargetSize();
// If there's a saved target size, start the resize animation for it.
void MaybeAnimateToTargetSize();
bool IsAnimating() const;
void CancelAnimation();
private:
// Sets target bounds for the widget (must exist) and creates a
// GlicWindowResizeAnimation instance to begin a new animation. If a bounds
// animation is already running, end it and start a new one. Duration is set
// to 0 if negative.
void AnimateBounds(const gfx::Rect& target_bounds,
base::TimeDelta duration,
base::OnceClosure callback);
// Sets target opacity for the widget (must exist) and creates a
// GlicWindowOpacityAnimation instance to begin a new opacity animation.
void AnimateWindowOpacity(float start_opacity,
float target_opacity,
base::TimeDelta duration);
// Sets target opacity for the GlicView's web view and creates a
// GlicViewOpacityAnimation instance to begin a new animation.
void AnimateViewOpacity(float start_opacity,
float target_opacity,
base::TimeDelta duration);
// The widget that this animator is responsible for.
base::WeakPtr<GlicWidget> widget_;
std::unique_ptr<GlicWindowResizeAnimation> window_resize_animation_;
base::RepeatingClosure resize_finished_callback_;
// Last requested target size. Will be (0, 0) if there hasn't been a resize
// request or glic has already been resized to the target size.
gfx::Size last_target_size_;
base::WeakPtrFactory<GlicWindowAnimator> weak_ptr_factory_{this};
};
} // namespace glic
#endif // CHROME_BROWSER_GLIC_WIDGET_GLIC_WINDOW_ANIMATOR_H_