QmlMaterial 0.1.0
Loading...
Searching...
No Matches
slider_state.hpp
1#pragma once
2#include <functional>
3#include "qml_material/style/common_state.hpp"
4Q_MOC_INCLUDE("qml_material/control/slider.hpp")
5Q_MOC_INCLUDE("qml_material/control/range_slider.hpp")
6namespace qml_material
7{
8class Slider;
9class RangeSlider;
10class Control;
11class QML_MATERIAL_API SliderAppearance : public CommonState {
12 Q_OBJECT
13 QML_ANONYMOUS
14 Q_PROPERTY(QColor trackColor READ trackColor WRITE setTrackColor RESET resetTrackColor NOTIFY
15 trackColorChanged BINDABLE bindableTrackColor)
16 Q_PROPERTY(QColor trackOverlayColor READ trackOverlayColor WRITE setTrackOverlayColor RESET
17 resetTrackOverlayColor NOTIFY trackOverlayColorChanged BINDABLE
18 bindableTrackOverlayColor)
19 Q_PROPERTY(QColor trackInactiveColor READ trackInactiveColor WRITE setTrackInactiveColor RESET
20 resetTrackInactiveColor NOTIFY trackInactiveColorChanged BINDABLE
21 bindableTrackInactiveColor)
22 Q_PROPERTY(QColor trackMarkInactiveColor READ trackMarkInactiveColor WRITE
23 setTrackMarkInactiveColor RESET resetTrackMarkInactiveColor NOTIFY
24 trackMarkInactiveColorChanged BINDABLE bindableTrackMarkInactiveColor)
25 Q_PROPERTY(QColor trackMarkColor READ trackMarkColor WRITE setTrackMarkColor RESET
26 resetTrackMarkColor NOTIFY trackMarkColorChanged BINDABLE bindableTrackMarkColor)
27 Q_PROPERTY(qreal trackOverlayOpacity READ trackOverlayOpacity WRITE setTrackOverlayOpacity RESET
28 resetTrackOverlayOpacity NOTIFY trackOverlayOpacityChanged BINDABLE
29 bindableTrackOverlayOpacity)
30public:
31 explicit SliderAppearance(QObject* parent = nullptr);
32 ~SliderAppearance() override;
33 QColor trackColor() const;
34 void setTrackColor(const QColor&);
35 void resetTrackColor();
36 QBindable<QColor> bindableTrackColor();
37 Q_SIGNAL void trackColorChanged();
38 QColor trackOverlayColor() const;
39 void setTrackOverlayColor(const QColor&);
40 void resetTrackOverlayColor();
41 QBindable<QColor> bindableTrackOverlayColor();
42 Q_SIGNAL void trackOverlayColorChanged();
43 QColor trackInactiveColor() const;
44 void setTrackInactiveColor(const QColor&);
45 void resetTrackInactiveColor();
46 QBindable<QColor> bindableTrackInactiveColor();
47 Q_SIGNAL void trackInactiveColorChanged();
48 QColor trackMarkInactiveColor() const;
49 void setTrackMarkInactiveColor(const QColor&);
50 void resetTrackMarkInactiveColor();
51 QBindable<QColor> bindableTrackMarkInactiveColor();
52 Q_SIGNAL void trackMarkInactiveColorChanged();
53 QColor trackMarkColor() const;
54 void setTrackMarkColor(const QColor&);
55 void resetTrackMarkColor();
56 QBindable<QColor> bindableTrackMarkColor();
57 Q_SIGNAL void trackMarkColorChanged();
58 qreal trackOverlayOpacity() const;
59 void setTrackOverlayOpacity(const qreal&);
60 void resetTrackOverlayOpacity();
61 QBindable<qreal> bindableTrackOverlayOpacity();
62 Q_SIGNAL void trackOverlayOpacityChanged();
63
64protected:
65 enum class Interaction
66 {
67 Base,
68 Disabled,
69 Pressed,
70 Hovered
71 };
72 StateBindingSet<Interaction> m_bindings { Interaction::Base };
73 bool active() const;
74 Control* control() const;
75 void setControl(Control*, std::function<bool()> pressed);
76 Q_SIGNAL void controlChanged();
77
78private:
79 void selectionChanged();
80 struct Selection {
81 Interaction state = Interaction::Base;
82 quint64 generation = 0;
83 bool operator==(const Selection&) const = default;
84 };
85 QProperty<Control*> m_control { nullptr };
86 QProperty<bool> m_pressed { false };
87 QProperty<bool> m_disabled { false };
88 QList<QMetaObject::Connection> m_connections;
89 bool m_ready = false;
90 Q_OBJECT_BINDABLE_PROPERTY(SliderAppearance, Selection, m_selection,
91 &SliderAppearance::selectionChanged)
92 Q_OBJECT_BINDABLE_PROPERTY(SliderAppearance, QColor, m_trackColor,
93 &SliderAppearance::trackColorChanged)
94 PropertyKey<QColor> m_trackColorKey;
95 Q_OBJECT_BINDABLE_PROPERTY(SliderAppearance, QColor, m_trackOverlayColor,
96 &SliderAppearance::trackOverlayColorChanged)
97 PropertyKey<QColor> m_trackOverlayColorKey;
98 Q_OBJECT_BINDABLE_PROPERTY(SliderAppearance, QColor, m_trackInactiveColor,
99 &SliderAppearance::trackInactiveColorChanged)
100 PropertyKey<QColor> m_trackInactiveColorKey;
101 Q_OBJECT_BINDABLE_PROPERTY(SliderAppearance, QColor, m_trackMarkInactiveColor,
102 &SliderAppearance::trackMarkInactiveColorChanged)
103 PropertyKey<QColor> m_trackMarkInactiveColorKey;
104 Q_OBJECT_BINDABLE_PROPERTY(SliderAppearance, QColor, m_trackMarkColor,
105 &SliderAppearance::trackMarkColorChanged)
106 PropertyKey<QColor> m_trackMarkColorKey;
107 Q_OBJECT_BINDABLE_PROPERTY(SliderAppearance, qreal, m_trackOverlayOpacity,
108 &SliderAppearance::trackOverlayOpacityChanged)
109 PropertyKey<qreal> m_trackOverlayOpacityKey;
110 StateBindingSet<Interaction>::Lifetime m_lifetime { m_bindings.lifetime() };
111};
112class QML_MATERIAL_API SliderHandleAppearance : public SliderAppearance {
113 Q_OBJECT
114 QML_ANONYMOUS
115 Q_PROPERTY(
116 int handleLineWidth READ handleLineWidth WRITE setHandleLineWidth RESET resetHandleLineWidth
117 NOTIFY handleLineWidthChanged BINDABLE bindableHandleLineWidth)
118 Q_PROPERTY(int handleWidth READ handleWidth WRITE setHandleWidth RESET resetHandleWidth NOTIFY
119 handleWidthChanged BINDABLE bindableHandleWidth)
120 Q_PROPERTY(int handleHeight READ handleHeight WRITE setHandleHeight RESET resetHandleHeight
121 NOTIFY handleHeightChanged BINDABLE bindableHandleHeight)
122public:
123 explicit SliderHandleAppearance(QObject* parent = nullptr);
124 int handleLineWidth() const;
125 void setHandleLineWidth(const int&);
126 void resetHandleLineWidth();
127 QBindable<int> bindableHandleLineWidth();
128 Q_SIGNAL void handleLineWidthChanged();
129 int handleWidth() const;
130 void setHandleWidth(const int&);
131 void resetHandleWidth();
132 QBindable<int> bindableHandleWidth();
133 Q_SIGNAL void handleWidthChanged();
134 int handleHeight() const;
135 void setHandleHeight(const int&);
136 void resetHandleHeight();
137 QBindable<int> bindableHandleHeight();
138 Q_SIGNAL void handleHeightChanged();
139
140private:
141 Q_OBJECT_BINDABLE_PROPERTY(SliderHandleAppearance, int, m_handleLineWidth,
142 &SliderHandleAppearance::handleLineWidthChanged)
143 PropertyKey<int> m_handleLineWidthKey;
144 Q_OBJECT_BINDABLE_PROPERTY(SliderHandleAppearance, int, m_handleWidth,
145 &SliderHandleAppearance::handleWidthChanged)
146 PropertyKey<int> m_handleWidthKey;
147 Q_OBJECT_BINDABLE_PROPERTY(SliderHandleAppearance, int, m_handleHeight,
148 &SliderHandleAppearance::handleHeightChanged)
149 PropertyKey<int> m_handleHeightKey;
150 StateBindingSet<Interaction>::Lifetime m_lifetime { m_bindings.lifetime() };
151};
152class QML_MATERIAL_API SliderM2State : public SliderAppearance {
153 Q_OBJECT
154 QML_NAMED_ELEMENT(StateSliderM2)
155 Q_PROPERTY(qml_material::Slider* item READ item WRITE setItem NOTIFY itemChanged FINAL)
156public:
157 explicit SliderM2State(QObject* parent = nullptr);
158 Slider* item() const;
159 void setItem(Slider*);
160 Q_SIGNAL void itemChanged();
161};
162class QML_MATERIAL_API SliderState : public SliderHandleAppearance {
163 Q_OBJECT
164 QML_NAMED_ELEMENT(StateSlider)
165 Q_PROPERTY(qml_material::Slider* item READ item WRITE setItem NOTIFY itemChanged FINAL)
166public:
167 explicit SliderState(QObject* parent = nullptr);
168 Slider* item() const;
169 void setItem(Slider*);
170 Q_SIGNAL void itemChanged();
171};
172class QML_MATERIAL_API RangeSliderState : public SliderHandleAppearance {
173 Q_OBJECT
174 QML_NAMED_ELEMENT(StateRangeSlider)
175 Q_PROPERTY(qml_material::RangeSlider* item READ item WRITE setItem NOTIFY itemChanged FINAL)
176 Q_PROPERTY(int handleIndex READ handleIndex WRITE setHandleIndex NOTIFY handleIndexChanged
177 BINDABLE bindableHandleIndex FINAL)
178public:
179 explicit RangeSliderState(QObject* parent = nullptr);
180 RangeSlider* item() const;
181 void setItem(RangeSlider*);
182 Q_SIGNAL void itemChanged();
183 int handleIndex() const { return m_handleIndex.value(); }
184 void setHandleIndex(int value) { m_handleIndex = value; }
185 QBindable<int> bindableHandleIndex() { return QBindable<int>(&m_handleIndex); }
186 Q_SIGNAL void handleIndexChanged();
187
188private:
189 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(RangeSliderState, int, m_handleIndex, -1,
190 &RangeSliderState::handleIndexChanged)
191};
192} // namespace qml_material