File: widget_fade_animator.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (145 lines) | stat: -rw-r--r-- 5,301 bytes parent folder | download | duplicates (3)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
// 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_VIEWS_ANIMATION_WIDGET_FADE_ANIMATOR_H_
#define UI_VIEWS_ANIMATION_WIDGET_FADE_ANIMATOR_H_

#include "base/callback_list.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "ui/gfx/animation/linear_animation.h"
#include "ui/gfx/animation/tween.h"
#include "ui/views/animation/animation_delegate_views.h"
#include "ui/views/views_export.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"

namespace views {

class Widget;

// Animates a widget's opacity between fully hidden and fully shown, providing
// a fade-in/fade-out effect.
class VIEWS_EXPORT WidgetFadeAnimator : public AnimationDelegateViews,
                                        public WidgetObserver {
 public:
  // Describes the current fade animation.
  enum class FadeType {
    kNone,
    kFadeIn,
    kFadeOut,
  };

  // Controls the window show type.
  enum class WidgetShowType {
    kNone,
    kShowActive,
    kShowInactive,
  };

  // Defines a callback for when a fade completes. Not called on cancel. The
  // |animation_type| of the completed animation is specified (it will never be
  // kNone).
  using FadeCompleteCallbackSignature = void(WidgetFadeAnimator*,
                                             FadeType animation_type);
  using FadeCompleteCallback =
      base::RepeatingCallback<FadeCompleteCallbackSignature>;

  // Creates a new fade animator for the specified widget. If the widget closes
  // the animator will no longer be valid and should not be used.
  explicit WidgetFadeAnimator(Widget* widget);
  WidgetFadeAnimator(const WidgetFadeAnimator&) = delete;
  WidgetFadeAnimator& operator=(const WidgetFadeAnimator&) = delete;
  ~WidgetFadeAnimator() override;

  void set_fade_in_duration(base::TimeDelta fade_in_duration) {
    fade_in_duration_ = fade_in_duration;
  }
  base::TimeDelta fade_in_duration() const { return fade_in_duration_; }

  void set_fade_out_duration(base::TimeDelta fade_out_duration) {
    fade_out_duration_ = fade_out_duration;
  }
  base::TimeDelta fade_out_duration() const { return fade_out_duration_; }

  void set_tween_type(gfx::Tween::Type tween_type) { tween_type_ = tween_type; }
  gfx::Tween::Type tween_type() const { return tween_type_; }

  void set_close_on_hide(bool close_on_hide) { close_on_hide_ = close_on_hide; }
  bool close_on_hide() const { return close_on_hide_; }

  void set_show_type(WidgetShowType show_type) { show_type_ = show_type; }
  WidgetShowType show_type() const { return show_type_; }

  Widget* widget() { return widget_; }

  bool IsFadingIn() const { return animation_type_ == FadeType::kFadeIn; }

  bool IsFadingOut() const { return animation_type_ == FadeType::kFadeOut; }

  // Plays the fade-in animation. If the widget is not currently visible, it
  // will be made visible.
  void FadeIn();

  // Cancels any pending fade-in, leaves the widget at the current opacity to
  // avoid abrupt visual changes. CancelFadeIn() should be followed with
  // something, either another FadeIn(), or widget closing. It has no effect
  // if the widget is not fading in.
  void CancelFadeIn();

  // Plays the fade-out animation. At the end of the fade, the widget will be
  // hidden or closed, as per |close_on_hide|. If the widget is already hidden
  // or closed, completes immediately.
  void FadeOut();

  // Cancels any pending fade-out, returning the widget to 100% opacity. Has no
  // effect if the widget is not fading out.
  void CancelFadeOut();

  // Adds a listener for fade complete events.
  base::CallbackListSubscription AddFadeCompleteCallback(
      FadeCompleteCallback callback);

 private:
  // AnimationDelegateViews:
  void AnimationProgressed(const gfx::Animation* animation) override;
  void AnimationEnded(const gfx::Animation* animation) override;

  // WidgetObserver:
  void OnWidgetDestroying(Widget* widget) override;

  raw_ptr<Widget> widget_;
  base::ScopedObservation<Widget, WidgetObserver> widget_observation_{this};
  gfx::LinearAnimation fade_animation_{this};
  FadeType animation_type_ = FadeType::kNone;

  // Duration for fade-in animations. The default should be visually pleasing
  // for most applications.
  base::TimeDelta fade_in_duration_ = base::Milliseconds(200);

  // Duration for fade-out animations. The default should be visually pleasing
  // for most applications.
  base::TimeDelta fade_out_duration_ = base::Milliseconds(150);

  // The tween type to use. The default value should be pleasing for most
  // applications.
  gfx::Tween::Type tween_type_ = gfx::Tween::FAST_OUT_SLOW_IN;

  // Whether the widget should be closed at the end of a fade-out animation.
  bool close_on_hide_ = false;

  // Controls the window show type. Specifically whether to show the window as
  // active/inactive, or not show it at all.
  WidgetShowType show_type_ = WidgetShowType::kShowActive;

  base::RepeatingCallbackList<FadeCompleteCallbackSignature>
      fade_complete_callbacks_;
};

}  // namespace views

#endif  // UI_VIEWS_ANIMATION_WIDGET_FADE_ANIMATOR_H_