File: scrollbar_animator_mac.h

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (132 lines) | stat: -rw-r--r-- 4,387 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#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 {

// Timer used for animating scrollbar effects.
// TODO(crbug.com/40626921): Change this to be driven by the client
// (Blink or Views) animation system.
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() {}
    // Return true if the mouse is currently in the tracks' frame. This is used
    // during an initial scroll, because MouseDidEnter and MouseDidExit are not
    // while the scrollbar is hidden.
    virtual bool IsMouseInScrollbarFrameRect() const = 0;

    // Set whether all of the scrollbar is hidden.
    virtual void SetHidden(bool) = 0;

    // Called whenever the value of `GetThumbAlpha` or `GetThumbWidth` may
    // have changed.
    virtual void SetThumbNeedsDisplay() = 0;

    // Called whenever the value of `GetTrackAlpha` may have changed.
    virtual void SetTrackNeedsDisplay() = 0;
  };

  OverlayScrollbarAnimatorMac(
      Client* client,
      int thumb_width_expanded,
      int thumb_width_unexpanded,
      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
  ~OverlayScrollbarAnimatorMac();

  // Called when the mouse moves to be over the scrollbar's area.
  void MouseDidEnter();

  // Called when the mouse leave the scrollbar's area.
  void MouseDidExit();

  // Called in response to a scroll in the direction of this scrollbar.
  void DidScroll();

  // Retrieve the rendering properties of the scrollbar.
  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_;  // Weak, owns `this`.
  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);

  // Animator for expanding `thumb_width_` when the mouse enters the
  // scrollbar area.
  std::unique_ptr<ScrollbarAnimationTimerMac> expand_thumb_animation_;

  // Animator for fading in `track_alpha_` when the mouse enters the scrollbar
  // area. Note that `thumb_alpha_` never fades in (it instantaneously appears).
  std::unique_ptr<ScrollbarAnimationTimerMac> fade_in_track_animation_;

  // Animator for fading out `track_alpha_` and `thumb_alpha_` together after
  // inactivity.
  std::unique_ptr<ScrollbarAnimationTimerMac> fade_out_animation_;

  // Timer to trigger the `fade_out_animation_`.
  std::unique_ptr<base::RetainingOneShotTimer> start_scrollbar_fade_out_timer_;

  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
  base::WeakPtrFactory<OverlayScrollbarAnimatorMac> weak_factory_;
};

}  // namespace ui

#endif  // UI_NATIVE_THEME_SCROLLBAR_ANIMATOR_MAC_H_