-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathQelAnimationHelper.cpp
More file actions
126 lines (102 loc) · 3.39 KB
/
Copy pathQelAnimationHelper.cpp
File metadata and controls
126 lines (102 loc) · 3.39 KB
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
#include "QelAnimationHelper.h"
#include <QAbstractAnimation>
#include <QGraphicsOpacityEffect>
#include <QPointer>
#include <QPropertyAnimation>
#include <QWidget>
namespace qel {
bool QelAnimationHelper::animationEnabled_ = true;
void QelAnimationHelper::setAnimationEnabled(bool enabled)
{
animationEnabled_ = enabled;
}
bool QelAnimationHelper::isAnimationEnabled()
{
return animationEnabled_;
}
void QelAnimationHelper::fadeIn(QWidget *target, int duration)
{
if (target == nullptr) {
return;
}
target->show();
if (!animationEnabled_) {
target->setWindowOpacity(1.0);
return;
}
auto *effect = qobject_cast<QGraphicsOpacityEffect *>(target->graphicsEffect());
if (effect == nullptr) {
effect = new QGraphicsOpacityEffect(target);
target->setGraphicsEffect(effect);
}
auto *animation = new QPropertyAnimation(effect, "opacity", target);
animation->setDuration(duration);
animation->setStartValue(0.0);
animation->setEndValue(1.0);
animation->setEasingCurve(QEasingCurve::OutCubic);
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
void QelAnimationHelper::fadeOut(QWidget *target, int duration)
{
if (target == nullptr) {
return;
}
if (!animationEnabled_) {
target->hide();
return;
}
auto *effect = qobject_cast<QGraphicsOpacityEffect *>(target->graphicsEffect());
if (effect == nullptr) {
effect = new QGraphicsOpacityEffect(target);
target->setGraphicsEffect(effect);
}
auto *animation = new QPropertyAnimation(effect, "opacity", target);
animation->setDuration(duration);
animation->setStartValue(1.0);
animation->setEndValue(0.0);
animation->setEasingCurve(QEasingCurve::OutCubic);
QPointer<QWidget> safeTarget(target);
QObject::connect(animation, &QPropertyAnimation::finished, target, [safeTarget]() {
if (safeTarget != nullptr) {
safeTarget->hide();
}
});
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
void QelAnimationHelper::pressFeedback(QWidget *target, int duration)
{
if (target == nullptr) {
return;
}
if (!animationEnabled_) {
return;
}
const QRect baseGeometry = target->geometry();
const int offsetX = baseGeometry.width() > 8 ? 1 : 0;
const int offsetY = baseGeometry.height() > 8 ? 1 : 0;
const QRect pressedGeometry = baseGeometry.adjusted(offsetX, offsetY, -offsetX, -offsetY);
auto *animation = new QPropertyAnimation(target, "geometry", target);
animation->setDuration(duration);
animation->setKeyValueAt(0.0, baseGeometry);
animation->setKeyValueAt(0.5, pressedGeometry);
animation->setKeyValueAt(1.0, baseGeometry);
animation->setEasingCurve(QEasingCurve::OutQuad);
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
void QelAnimationHelper::focusRingPulse(QWidget *target, int duration, QEasingCurve::Type easing)
{
if (target == nullptr) {
return;
}
if (!animationEnabled_) {
return;
}
auto *animation = new QPropertyAnimation(target, "windowOpacity", target);
animation->setDuration(duration);
animation->setKeyValueAt(0.0, 1.0);
animation->setKeyValueAt(0.5, 0.92);
animation->setKeyValueAt(1.0, 1.0);
animation->setEasingCurve(easing);
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
} // namespace qel