QmlMaterial 0.1.0
Loading...
Searching...
No Matches
linear_indicator_updator.hpp
1#pragma once
2
3#include <QtCore/QEasingCurve>
4#include <QtGui/QColor>
5#include <QtQml/QQmlEngine>
6
7#include "qml_material/core.hpp"
8
9namespace qml_material
10{
11
12class LinearActiveIndicatorData : public QObject {
13 Q_OBJECT
14 QML_ELEMENT
15
16 Q_PROPERTY(double startFraction READ startFraction NOTIFY updated FINAL)
17 Q_PROPERTY(double endFraction READ endFraction NOTIFY updated FINAL)
18 Q_PROPERTY(QColor color READ getColor NOTIFY updated FINAL)
19 Q_PROPERTY(qint32 gapSize READ getGapSize NOTIFY updated FINAL)
20public:
21 LinearActiveIndicatorData(QObject* parent = nullptr);
22 auto startFraction() const noexcept -> double;
23 auto endFraction() const noexcept -> double;
24 auto getColor() const noexcept -> QColor;
25 auto getGapSize() const noexcept -> qint32;
26
27 Q_SIGNAL void updated();
28
29 float start_fraction = 0;
30 float end_fraction = 0;
31 QColor color {};
32 qint32 gap_size = 0;
33 // The fraction [0, 1] of the amplitude on indicator.
34 float amplitude_fraction = 1;
35 // The fraction [0, 1] of the initial phase [0, 2 * PI] on indicator.
36 float phase_fraction = 0;
37};
38
39class LinearIndicatorUpdator : public QObject {
40 Q_OBJECT
41 QML_ELEMENT
42
43 Q_PROPERTY(QList<QColor> colors READ colors WRITE setColors NOTIFY colorsChanged FINAL)
44
45 Q_PROPERTY(QList<qml_material::LinearActiveIndicatorData*> activeIndicators READ
46 activeIndicators NOTIFY indeterminateAnimationTypeChanged FINAL)
47
48 Q_PROPERTY(double progress READ progress WRITE update NOTIFY updated FINAL)
49 Q_PROPERTY(double completeEndProgress READ completeEndProgress WRITE updateCompleteEndProgress
50 NOTIFY updated FINAL)
51
52 Q_PROPERTY(double duration READ duration NOTIFY indeterminateAnimationTypeChanged FINAL)
53 Q_PROPERTY(double completeEndDuration READ completeEndDuration NOTIFY
54 indeterminateAnimationTypeChanged FINAL)
55
56 Q_PROPERTY(
57 IndeterminateAnimationType indeterminateAnimationType READ indeterminateAnimationType WRITE
58 setIndeterminateAnimationType NOTIFY indeterminateAnimationTypeChanged FINAL)
59
60public:
61 LinearIndicatorUpdator(QObject* parent = nullptr);
62
63 enum class IndeterminateAnimationType
64 {
65 DisJoint = 0,
66 Contiguous,
67 };
68 Q_ENUM(IndeterminateAnimationType)
69
70 auto activeIndicators() -> QList<LinearActiveIndicatorData*>;
71 auto progress() const noexcept -> double;
72 auto completeEndProgress() const noexcept -> double;
73 auto duration() const noexcept -> double;
74 auto completeEndDuration() const noexcept -> double;
75
76 auto colors() const -> QList<QColor>;
77 void setColors(const QList<QColor>&);
78
79 auto indeterminateAnimationType() const noexcept -> IndeterminateAnimationType;
80 void setIndeterminateAnimationType(IndeterminateAnimationType t);
81
82 void updateContiguous(double progress) noexcept;
83 void updateDisjoint(double progress) noexcept;
84 void updateColors() noexcept;
85 Q_SLOT void initIndicatorDatas() noexcept;
86
87 Q_SLOT void update(double progress);
88 Q_SLOT void updateCompleteEndProgress(double progress);
89 Q_SIGNAL void updated();
90 Q_SIGNAL void indeterminateAnimationTypeChanged();
91 Q_SIGNAL void colorsChanged();
92
93private:
94 IndeterminateAnimationType m_type;
95
96 QEasingCurve m_contiguous_interpolator;
97 std::array<QEasingCurve, 4> m_interpolators;
98 double m_progress;
99 double m_complete_end_progress;
100
101 std::array<LinearActiveIndicatorData*, 3> m_active_indicators;
102 QList<QColor> m_colors;
103 quint32 m_color_idx;
104 bool m_color_dirty;
105};
106} // namespace qml_material