1 // This file is part of Desktop App Toolkit,
2 // a set of libraries for developing nice desktop applications.
3 //
4 // For license and copyright information please follow this link:
5 // https://github.com/desktop-app/legal/blob/master/LEGAL
6 //
7 #include "ui/effects/animation_value.h"
8 
9 #include "ui/painter.h"
10 
11 #include <QtCore/QtMath> // M_PI
12 
13 namespace anim {
14 namespace {
15 
16 rpl::variable<bool> AnimationsDisabled = false;
17 
18 } // namespace
19 
__anon6e81a8760202(const float64 &delta, const float64 &dt) 20 transition linear = [](const float64 &delta, const float64 &dt) {
21 	return delta * dt;
22 };
23 
__anon6e81a8760302(const float64 &delta, const float64 &dt) 24 transition sineInOut = [](const float64 &delta, const float64 &dt) {
25 	return -(delta / 2) * (cos(M_PI * dt) - 1);
26 };
27 
__anon6e81a8760402(const float64 &delta, const float64 &dt) 28 transition halfSine = [](const float64 &delta, const float64 &dt) {
29 	return delta * sin(M_PI * dt / 2);
30 };
31 
__anon6e81a8760502(const float64 &delta, const float64 &dt) 32 transition easeOutBack = [](const float64 &delta, const float64 &dt) {
33 	static constexpr auto s = 1.70158;
34 
35 	const float64 t = dt - 1;
36 	return delta * (t * t * ((s + 1) * t + s) + 1);
37 };
38 
__anon6e81a8760602(const float64 &delta, const float64 &dt) 39 transition easeInCirc = [](const float64 &delta, const float64 &dt) {
40 	return -delta * (sqrt(1 - dt * dt) - 1);
41 };
42 
__anon6e81a8760702(const float64 &delta, const float64 &dt) 43 transition easeOutCirc = [](const float64 &delta, const float64 &dt) {
44 	const float64 t = dt - 1;
45 	return delta * sqrt(1 - t * t);
46 };
47 
__anon6e81a8760802(const float64 &delta, const float64 &dt) 48 transition easeInCubic = [](const float64 &delta, const float64 &dt) {
49 	return delta * dt * dt * dt;
50 };
51 
__anon6e81a8760902(const float64 &delta, const float64 &dt) 52 transition easeOutCubic = [](const float64 &delta, const float64 &dt) {
53 	const float64 t = dt - 1;
54 	return delta * (t * t * t + 1);
55 };
56 
__anon6e81a8760a02(const float64 &delta, const float64 &dt) 57 transition easeInQuint = [](const float64 &delta, const float64 &dt) {
58 	const float64 t2 = dt * dt;
59 	return delta * t2 * t2 * dt;
60 };
61 
__anon6e81a8760b02(const float64 &delta, const float64 &dt) 62 transition easeOutQuint = [](const float64 &delta, const float64 &dt) {
63 	const float64 t = dt - 1, t2 = t * t;
64 	return delta * (t2 * t2 * t + 1);
65 };
66 
Disables()67 rpl::producer<bool> Disables() {
68 	return AnimationsDisabled.value();
69 };
70 
Disabled()71 bool Disabled() {
72 	return AnimationsDisabled.current();
73 }
74 
SetDisabled(bool disabled)75 void SetDisabled(bool disabled) {
76 	AnimationsDisabled = disabled;
77 }
78 
DrawStaticLoading(QPainter & p,QRectF rect,int stroke,QPen pen,QBrush brush)79 void DrawStaticLoading(
80 		QPainter &p,
81 		QRectF rect,
82 		int stroke,
83 		QPen pen,
84 		QBrush brush) {
85 	PainterHighQualityEnabler hq(p);
86 
87 	p.setBrush(brush);
88 	pen.setWidthF(stroke);
89 	pen.setCapStyle(Qt::RoundCap);
90 	pen.setJoinStyle(Qt::RoundJoin);
91 	p.setPen(pen);
92 	p.drawEllipse(rect);
93 
94 	const auto center = rect.center();
95 	const auto first = QPointF(center.x(), rect.y() + 1.5 * stroke);
96 	const auto delta = center.y() - first.y();
97 	const auto second = QPointF(center.x() + delta * 2 / 3., center.y());
98 	if (delta > 0) {
99 		QPainterPath path;
100 		path.moveTo(first);
101 		path.lineTo(center);
102 		path.lineTo(second);
103 		p.drawPath(path);
104 	}
105 }
106 
107 } // anim
108