QmlMaterial 0.1.0
Loading...
Searching...
No Matches
token.hpp
1#pragma once
2
3#include <array>
4#include <QtCore/QEasingCurve>
5#include <QtGui/QFont>
6#include <QtQml/QQmlEngine>
7#include <QtQuick/QQuickWindow>
8
9#include "qml_material/core.hpp"
10#include "qml_material/token/type_scale.hpp"
11#include "qml_material/anim/interpolator.hpp"
12#include "qml_material/enum.hpp"
13Q_MOC_INCLUDE("qml_material/token/icon.hpp")
14
15namespace qml_material::token
16{
17
18class IconToken;
19auto create_icon_token(QObject* parent) -> IconToken*;
20
28 Q_GADGET
29 QML_ANONYMOUS
30
32 Q_PROPERTY(qint32 min_width MEMBER min_width CONSTANT FINAL)
34 Q_PROPERTY(qint32 max_width MEMBER max_width CONSTANT FINAL)
36 Q_PROPERTY(qml_material::Enum::WindowClassType type MEMBER type CONSTANT FINAL)
37
38public:
39 Q_INVOKABLE bool contains(i32 w) const { return w >= min_width && w < max_width; }
40 i32 min_width { 0 };
41 i32 max_width { std::numeric_limits<i32>::max() };
42 Enum::WindowClassType type { Enum::WindowClassType::WindowClassCompact };
43};
44
52 Q_GADGET
53 QML_ANONYMOUS
54
56 Q_PROPERTY(qml_material::token::WindowClassItem compact MEMBER compact CONSTANT FINAL)
58 Q_PROPERTY(qml_material::token::WindowClassItem medium MEMBER medium CONSTANT FINAL)
60 Q_PROPERTY(qml_material::token::WindowClassItem expanded MEMBER expanded CONSTANT FINAL)
62 Q_PROPERTY(qml_material::token::WindowClassItem large MEMBER large CONSTANT FINAL)
64 Q_PROPERTY(qml_material::token::WindowClassItem extra_large MEMBER extra_large CONSTANT FINAL)
65
66public:
67 using Type = Enum::WindowClassType;
68
69 Q_INVOKABLE WindowClassItem select(i32 w) const {
70 std::array wcs { &compact, &medium, &expanded, &large, &extra_large };
71 for (auto& el : wcs) {
72 if (el->contains(w)) return *el;
73 }
74 return compact;
75 }
76 Q_INVOKABLE Enum::WindowClassType select_type(i32 w) const {
77 std::array wcs { &compact, &medium, &expanded, &large, &extra_large };
78 for (auto& el : wcs) {
79 if (el->contains(w)) return el->type;
80 }
81 return compact.type;
82 }
83 WindowClassItem compact { 0, 600, Type::WindowClassCompact };
84 WindowClassItem medium { 600, 840, Type::WindowClassMedium };
85 WindowClassItem expanded { 840, 1200, Type::WindowClassExpanded };
86 WindowClassItem large { 1200, 1600, Type::WindowClassLarge };
87 WindowClassItem extra_large { 1600,
88 std::numeric_limits<i32>::max(),
89 Type::WindowClassExtraLarge };
90};
91
98struct Elevation {
99 Q_GADGET
100 QML_ANONYMOUS
101
103 Q_PROPERTY(qint32 level0 MEMBER level0 CONSTANT FINAL)
105 Q_PROPERTY(qint32 level1 MEMBER level1 CONSTANT FINAL)
107 Q_PROPERTY(qint32 level2 MEMBER level2 CONSTANT FINAL)
109 Q_PROPERTY(qint32 level3 MEMBER level3 CONSTANT FINAL)
111 Q_PROPERTY(qint32 level4 MEMBER level4 CONSTANT FINAL)
113 Q_PROPERTY(qint32 level5 MEMBER level5 CONSTANT FINAL)
114public:
115 i32 level0 { 0 };
116 i32 level1 { 1 };
117 i32 level2 { 3 };
118 i32 level3 { 6 };
119 i32 level4 { 8 };
120 i32 level5 { 12 };
121};
122
127struct Easing {
128 Q_GADGET
129 QML_ANONYMOUS
131 Q_PROPERTY(QEasingCurve emphasized READ emphasized CONSTANT FINAL)
133 Q_PROPERTY(QEasingCurve emphasized_accelerate READ emphasized_accelerate CONSTANT FINAL)
135 Q_PROPERTY(QEasingCurve emphasized_decelerate READ emphasized_decelerate CONSTANT FINAL)
137 Q_PROPERTY(QEasingCurve standard READ standard CONSTANT FINAL)
139 Q_PROPERTY(QEasingCurve standard_accelerate READ standard_accelerate CONSTANT FINAL)
141 Q_PROPERTY(QEasingCurve standard_decelerate READ standard_decelerate CONSTANT FINAL)
143 Q_PROPERTY(QEasingCurve legacy READ legacy CONSTANT FINAL)
145 Q_PROPERTY(QEasingCurve legacy_accelerate READ legacy_accelerate CONSTANT FINAL)
147 Q_PROPERTY(QEasingCurve legacy_decelerate READ legacy_decelerate CONSTANT FINAL)
149 Q_PROPERTY(QEasingCurve linear READ linear CONSTANT FINAL)
150
151public:
152 auto emphasized() const noexcept -> QEasingCurve { return anim::emphasized(); }
153 auto emphasized_accelerate() const noexcept -> QEasingCurve {
154 return anim::emphasized_accelerate();
155 }
156 auto emphasized_decelerate() const noexcept -> QEasingCurve {
157 return anim::emphasized_decelerate();
158 }
159 auto standard() const noexcept -> QEasingCurve { return anim::standard(); }
160 auto standard_accelerate() const noexcept -> QEasingCurve {
161 return anim::standard_accelerate();
162 }
163 auto standard_decelerate() const noexcept -> QEasingCurve {
164 return anim::standard_decelerate();
165 }
166 auto legacy() const noexcept -> QEasingCurve { return anim::legacy(); }
167 auto legacy_accelerate() const noexcept -> QEasingCurve { return anim::legacy_accelerate(); }
168 auto legacy_decelerate() const noexcept -> QEasingCurve { return anim::legacy_decelerate(); }
169 auto linear() const noexcept -> QEasingCurve { return anim::linear(); }
170};
171
176struct Duration {
177 Q_GADGET
178 QML_ANONYMOUS
180 Q_PROPERTY(qreal short1 MEMBER short1 CONSTANT FINAL)
182 Q_PROPERTY(qreal short2 MEMBER short2 CONSTANT FINAL)
184 Q_PROPERTY(qreal short3 MEMBER short3 CONSTANT FINAL)
186 Q_PROPERTY(qreal short4 MEMBER short4 CONSTANT FINAL)
188 Q_PROPERTY(qreal medium1 MEMBER medium1 CONSTANT FINAL)
190 Q_PROPERTY(qreal medium2 MEMBER medium2 CONSTANT FINAL)
192 Q_PROPERTY(qreal medium3 MEMBER medium3 CONSTANT FINAL)
194 Q_PROPERTY(qreal medium4 MEMBER medium4 CONSTANT FINAL)
196 Q_PROPERTY(qreal long1 MEMBER long1 CONSTANT FINAL)
198 Q_PROPERTY(qreal long2 MEMBER long2 CONSTANT FINAL)
200 Q_PROPERTY(qreal long3 MEMBER long3 CONSTANT FINAL)
202 Q_PROPERTY(qreal long4 MEMBER long4 CONSTANT FINAL)
204 Q_PROPERTY(qreal extra_long1 MEMBER extra_long1 CONSTANT FINAL)
206 Q_PROPERTY(qreal extra_long2 MEMBER extra_long2 CONSTANT FINAL)
208 Q_PROPERTY(qreal extra_long3 MEMBER extra_long3 CONSTANT FINAL)
210 Q_PROPERTY(qreal extra_long4 MEMBER extra_long4 CONSTANT FINAL)
211
212public:
213 qreal short1 { 50 };
214 qreal short2 { 100 };
215 qreal short3 { 150 };
216 qreal short4 { 200 };
217 qreal medium1 { 250 };
218 qreal medium2 { 300 };
219 qreal medium3 { 350 };
220 qreal medium4 { 400 };
221 qreal long1 { 450 };
222 qreal long2 { 500 };
223 qreal long3 { 550 };
224 qreal long4 { 600 };
225 qreal extra_long1 { 700 };
226 qreal extra_long2 { 800 };
227 qreal extra_long3 { 900 };
228 qreal extra_long4 { 1000 };
229};
230
238 Q_GADGET
239 QML_ANONYMOUS
241 Q_PROPERTY(qint32 none MEMBER none CONSTANT FINAL)
243 Q_PROPERTY(qint32 extra_small MEMBER extra_small CONSTANT FINAL)
245 Q_PROPERTY(qint32 small MEMBER small CONSTANT FINAL)
247 Q_PROPERTY(qint32 medium MEMBER medium CONSTANT FINAL)
249 Q_PROPERTY(qint32 large MEMBER large CONSTANT FINAL)
251 Q_PROPERTY(qint32 extra_large MEMBER extra_large CONSTANT FINAL)
253 Q_PROPERTY(qint32 full MEMBER full CONSTANT FINAL)
254public:
256 i32 none { 0 };
257 i32 extra_small { 4 };
258 i32 small { 8 };
259 i32 medium { 12 };
260 i32 large { 16 };
261 i32 extra_large { 28 };
262 i32 full { 100 };
263};
264
270struct Shape {
271 Q_GADGET
272 QML_ANONYMOUS
273 Q_PROPERTY(qml_material::token::ShapeCorner corner MEMBER corner CONSTANT FINAL)
274public:
275 ShapeCorner corner;
276};
277
284struct StateItem {
285 Q_GADGET
286 QML_ANONYMOUS
288 Q_PROPERTY(double state_layer_opacity MEMBER state_layer_opacity CONSTANT FINAL)
289public:
290 double state_layer_opacity;
291};
292
299struct State {
300 Q_GADGET
301 QML_ANONYMOUS
303 Q_PROPERTY(qml_material::token::StateItem hover MEMBER hover CONSTANT FINAL)
305 Q_PROPERTY(qml_material::token::StateItem pressed MEMBER pressed CONSTANT FINAL)
307 Q_PROPERTY(qml_material::token::StateItem focus MEMBER focus CONSTANT FINAL)
308
309public:
310 StateItem hover { 0.08 };
311 StateItem pressed { 0.1 };
312 StateItem focus { 0.1 };
313};
314
321class Flick : public QObject {
322 Q_OBJECT
323 QML_ANONYMOUS
325 Q_PROPERTY(qint32 pressDelay READ pressDelay NOTIFY pressDelayChanged FINAL)
327 Q_PROPERTY(
328 double flickDeceleration READ flickDeceleration NOTIFY flickDecelerationChanged FINAL)
330 Q_PROPERTY(double maximumFlickVelocity READ maximumFlickVelocity NOTIFY
331 maximumFlickVelocityChanged FINAL)
332public:
333 Flick(QObject* parent = nullptr);
334 ~Flick();
335 auto pressDelay() const -> qint32;
336 auto flickDeceleration() const -> double;
337 auto maximumFlickVelocity() const -> double;
338
339 Q_SIGNAL void pressDelayChanged();
340 Q_SIGNAL void flickDecelerationChanged();
341 Q_SIGNAL void maximumFlickVelocityChanged();
342
343private:
344 qint32 m_press_delay;
345 double m_flick_deceleration;
346 double m_maximum_flickVelocity;
347};
348
355class Token : public QObject {
356 Q_OBJECT
357 Q_PROPERTY(QQmlListProperty<QObject> datas READ datas FINAL)
358 Q_CLASSINFO("DefaultProperty", "datas")
359 QML_NAMED_ELEMENT(TokenImpl)
360
361 Q_PROPERTY(QString version READ version CONSTANT FINAL)
362 Q_PROPERTY(QString iconFontUrl READ icon_font_url CONSTANT FINAL)
363 Q_PROPERTY(QString iconFill0FontUrl READ icon_fill_0_font_url CONSTANT FINAL)
364 Q_PROPERTY(QString iconFill1FontUrl READ icon_fill_1_font_url CONSTANT FINAL)
365
366
367 Q_PROPERTY(qml_material::token::TypeScale* typescale READ typescale CONSTANT FINAL)
369 Q_PROPERTY(qml_material::token::IconToken* icon READ icon CONSTANT FINAL)
371 Q_PROPERTY(qml_material::token::Flick* flick READ flick CONSTANT FINAL)
373 Q_PROPERTY(qml_material::token::Elevation elevation READ elevation CONSTANT FINAL)
375 Q_PROPERTY(qml_material::token::Duration duration READ duration CONSTANT FINAL)
377 Q_PROPERTY(qml_material::token::Easing easing READ easing CONSTANT FINAL)
379 Q_PROPERTY(qml_material::token::State state READ state CONSTANT FINAL)
381 Q_PROPERTY(qml_material::token::Shape shape READ shape CONSTANT FINAL)
383 Q_PROPERTY(qml_material::token::WindowClass window_class READ window_class CONSTANT FINAL)
384public:
385 Token(QObject* = nullptr);
386 ~Token();
387
388 auto version() const -> QString;
389 auto icon_font_url() const -> QString;
390 auto icon_fill_0_font_url() const -> QString;
391 auto icon_fill_1_font_url() const -> QString;
392
393 auto typescale() const -> TypeScale*;
394 auto icon() const -> IconToken*;
395 auto flick() const -> Flick*;
396 auto elevation() const -> const Elevation&;
397 auto state() const -> const State&;
398 auto shape() const -> const Shape&;
399 auto window_class() const -> const WindowClass&;
400 auto duration() const -> const Duration&;
401 auto easing() const -> const Easing&;
402
403 auto datas() -> QQmlListProperty<QObject>;
404
405 Q_INVOKABLE double cal_curve_scale(double dpr) const;
406
407private:
408 TypeScale* m_typescale;
409 IconToken* m_icon;
410 Flick* m_flick;
411 Duration m_duration;
412 Easing m_easing;
413 Elevation m_elevation;
414 State m_state;
415 Shape m_shape;
416 WindowClass m_win_class;
417
418 QList<QObject*> m_datas;
419};
420} // namespace qml_material::token
Enum.
Definition enum.hpp:13
WindowClassType
Definition enum.hpp:118
Handles flicking behavior and physics parameters.
Definition token.hpp:321
IconToken, full codes.
Definition icon.hpp:15
Main token container for Material Design system.
Definition token.hpp:355
TypeScale.
Definition type_scale.hpp:64
Motion duration.
Definition token.hpp:176
Motion easing.
Definition token.hpp:127
Defines elevation levels for Material Design shadows.
Definition token.hpp:98
Defines corner radius values for shape styling.
Definition token.hpp:237
Container for shape-related styling properties.
Definition token.hpp:270
Defines opacity values for different UI states.
Definition token.hpp:284
Manages UI element state appearances.
Definition token.hpp:299
Represents a window class category with size constraints.
Definition token.hpp:27
qml_material::Enum::WindowClassType type
Type classification of the window size (compact, medium, expanded etc.)
Definition token.hpp:36
Window classification system based on width ranges.
Definition token.hpp:51