#ifndef UI_NATIVE_THEME_SCROLLBAR_ANIMATOR_MAC_H_
#define UI_NATIVE_THEME_SCROLLBAR_ANIMATOR_MAC_H_
#include "base/component_export.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "ui/gfx/animation/keyframe/timing_function.h"
namespace ui {
class COMPONENT_EXPORT(NATIVE_THEME) ScrollbarAnimationTimerMac {
public:
ScrollbarAnimationTimerMac(
base::RepeatingCallback<void(double)> callback,
base::TimeDelta duration,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~ScrollbarAnimationTimerMac();
void Start();
void Stop();
void SetDuration(base::TimeDelta duration);
private:
void TimerFired();
base::RepeatingTimer timer_;
base::TimeTicks start_time_;
base::TimeDelta duration_;
base::RepeatingCallback<void(double)> callback_;
std::unique_ptr<gfx::CubicBezierTimingFunction> timing_function_;
};
class COMPONENT_EXPORT(NATIVE_THEME) OverlayScrollbarAnimatorMac {
public:
class Client {
public:
virtual ~Client() {}
virtual bool IsMouseInScrollbarFrameRect() const = 0;
virtual void SetHidden(bool) = 0;
virtual void SetThumbNeedsDisplay() = 0;
virtual void SetTrackNeedsDisplay() = 0;
};
OverlayScrollbarAnimatorMac(
Client* client,
int thumb_width_expanded,
int thumb_width_unexpanded,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~OverlayScrollbarAnimatorMac();
void MouseDidEnter();
void MouseDidExit();
void DidScroll();
float GetThumbAlpha() const { return thumb_alpha_; }
float GetTrackAlpha() const { return track_alpha_; }
int GetThumbWidth() const { return thumb_width_; }
protected:
void ExpandThumbAnimationStart();
void ExpandThumbAnimationTicked(double progress);
void FadeInTrackAnimationStart();
void FadeInTrackAnimationTicked(double progress);
void FadeOutTimerUpdate();
void FadeOutAnimationStart();
void FadeOutAnimationTicked(double progress);
void FadeOutAnimationCancel();
const raw_ptr<Client> client_;
const int thumb_width_expanded_;
const int thumb_width_unexpanded_;
int thumb_width_ = 0;
float thumb_alpha_ = 0;
float track_alpha_ = 0;
bool mouse_in_track_ = false;
bool animations_enabled_;
static constexpr base::TimeDelta kAnimationDuration = base::Milliseconds(250);
static constexpr base::TimeDelta kFadeOutDelay = base::Milliseconds(500);
std::unique_ptr<ScrollbarAnimationTimerMac> expand_thumb_animation_;
std::unique_ptr<ScrollbarAnimationTimerMac> fade_in_track_animation_;
std::unique_ptr<ScrollbarAnimationTimerMac> fade_out_animation_;
std::unique_ptr<base::RetainingOneShotTimer> start_scrollbar_fade_out_timer_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
base::WeakPtrFactory<OverlayScrollbarAnimatorMac> weak_factory_;
};
}
#endif