QmlMaterial 0.1.0
Loading...
Searching...
No Matches
token.hpp
1#pragma once
2
3#include <array>
4#include <QtGui/QFont>
5#include <QtQml/QQmlEngine>
6#include <QtQuick/QQuickWindow>
7
8#include "qml_material/core.hpp"
9#include "qml_material/token/type_scale.hpp"
10#include "qml_material/enum.hpp"
11Q_MOC_INCLUDE("qml_material/token/icon.hpp")
12
13namespace qml_material::token
14{
15
16class IconToken;
17auto create_icon_token(QObject* parent) -> IconToken*;
18
26 Q_GADGET
27 QML_ANONYMOUS
28
30 Q_PROPERTY(qint32 min_width MEMBER min_width CONSTANT FINAL)
32 Q_PROPERTY(qint32 max_width MEMBER max_width CONSTANT FINAL)
34 Q_PROPERTY(qml_material::Enum::WindowClassType type MEMBER type CONSTANT FINAL)
35
36public:
37 Q_INVOKABLE bool contains(i32 w) const { return w >= min_width && w < max_width; }
38 i32 min_width { 0 };
39 i32 max_width { std::numeric_limits<i32>::max() };
40 Enum::WindowClassType type { Enum::WindowClassType::WindowClassCompact };
41};
42
50 Q_GADGET
51 QML_ANONYMOUS
52
54 Q_PROPERTY(qml_material::token::WindowClassItem compact MEMBER compact CONSTANT FINAL)
56 Q_PROPERTY(qml_material::token::WindowClassItem medium MEMBER medium CONSTANT FINAL)
58 Q_PROPERTY(qml_material::token::WindowClassItem expanded MEMBER expanded CONSTANT FINAL)
60 Q_PROPERTY(qml_material::token::WindowClassItem large MEMBER large CONSTANT FINAL)
62 Q_PROPERTY(qml_material::token::WindowClassItem extra_large MEMBER extra_large CONSTANT FINAL)
63
64public:
65 using Type = Enum::WindowClassType;
66
67 Q_INVOKABLE WindowClassItem select(i32 w) const {
68 std::array wcs { &compact, &medium, &expanded, &large, &extra_large };
69 for (auto& el : wcs) {
70 if (el->contains(w)) return *el;
71 }
72 return compact;
73 }
74 Q_INVOKABLE Enum::WindowClassType select_type(i32 w) const {
75 std::array wcs { &compact, &medium, &expanded, &large, &extra_large };
76 for (auto& el : wcs) {
77 if (el->contains(w)) return el->type;
78 }
79 return compact.type;
80 }
81 WindowClassItem compact { 0, 600, Type::WindowClassCompact };
82 WindowClassItem medium { 600, 840, Type::WindowClassMedium };
83 WindowClassItem expanded { 840, 1200, Type::WindowClassExpanded };
84 WindowClassItem large { 1200, 1600, Type::WindowClassLarge };
85 WindowClassItem extra_large { 1600,
86 std::numeric_limits<i32>::max(),
87 Type::WindowClassExtraLarge };
88};
89
96struct Elevation {
97 Q_GADGET
98 QML_ANONYMOUS
99
101 Q_PROPERTY(qint32 level0 MEMBER level0 CONSTANT FINAL)
103 Q_PROPERTY(qint32 level1 MEMBER level1 CONSTANT FINAL)
105 Q_PROPERTY(qint32 level2 MEMBER level2 CONSTANT FINAL)
107 Q_PROPERTY(qint32 level3 MEMBER level3 CONSTANT FINAL)
109 Q_PROPERTY(qint32 level4 MEMBER level4 CONSTANT FINAL)
111 Q_PROPERTY(qint32 level5 MEMBER level5 CONSTANT FINAL)
112public:
113 i32 level0 { 0 };
114 i32 level1 { 1 };
115 i32 level2 { 3 };
116 i32 level3 { 6 };
117 i32 level4 { 8 };
118 i32 level5 { 12 };
119};
120
126 Q_GADGET
127 Q_PROPERTY(QList<double> list READ toList CONSTANT FINAL)
128 Q_INVOKABLE QList<double> toList() const;
129
130public:
131 qreal x0;
132 qreal y0;
133 qreal x1;
134 qreal y1;
135};
136
141struct Easing {
142 Q_GADGET
143 QML_ANONYMOUS
145 Q_PROPERTY(qml_material::token::EasingItem emphasized_accelerate MEMBER emphasized_accelerate
146 CONSTANT FINAL)
148 Q_PROPERTY(qml_material::token::EasingItem emphasized_decelerate MEMBER emphasized_decelerate
149 CONSTANT FINAL)
151 Q_PROPERTY(qml_material::token::EasingItem standard MEMBER standard CONSTANT FINAL)
153 Q_PROPERTY(qml_material::token::EasingItem standard_accelerate MEMBER standard_accelerate
154 CONSTANT FINAL)
156 Q_PROPERTY(qml_material::token::EasingItem standard_decelerate MEMBER standard_decelerate
157 CONSTANT FINAL)
159 Q_PROPERTY(qml_material::token::EasingItem legacy MEMBER legacy CONSTANT FINAL)
161 Q_PROPERTY(
162 qml_material::token::EasingItem legacy_accelerate MEMBER legacy_accelerate CONSTANT FINAL)
164 Q_PROPERTY(
165 qml_material::token::EasingItem legacy_decelerate MEMBER legacy_decelerate CONSTANT FINAL)
167 Q_PROPERTY(qml_material::token::EasingItem linear MEMBER linear CONSTANT FINAL)
168
169private:
170 EasingItem emphasized_accelerate { .x0 = 0.3, .y0 = 0, .x1 = 0.8, .y1 = 0.15 };
171 EasingItem emphasized_decelerate { .x0 = 0.05, .y0 = 0.7, .x1 = 0.1, .y1 = 1 };
172 EasingItem standard { .x0 = 0.2, .y0 = 0, .x1 = 0, .y1 = 1 };
173 EasingItem standard_accelerate { .x0 = 0.3, .y0 = 0, .x1 = 1, .y1 = 1 };
174 EasingItem standard_decelerate { .x0 = 0, .y0 = 0, .x1 = 0, .y1 = 1 };
175 EasingItem legacy { .x0 = 0.4, .y0 = 0, .x1 = 0.2, .y1 = 1 };
176 EasingItem legacy_accelerate { .x0 = 0.4, .y0 = 0, .x1 = 1, .y1 = 1 };
177 EasingItem legacy_decelerate { .x0 = 0, .y0 = 0, .x1 = 0.2, .y1 = 1 };
178 EasingItem linear { .x0 = 0, .y0 = 0, .x1 = 1, .y1 = 1 };
179};
180
185struct Duration {
186 Q_GADGET
187 QML_ANONYMOUS
189 Q_PROPERTY(qreal short1 MEMBER short1 CONSTANT FINAL)
191 Q_PROPERTY(qreal short2 MEMBER short2 CONSTANT FINAL)
193 Q_PROPERTY(qreal short3 MEMBER short3 CONSTANT FINAL)
195 Q_PROPERTY(qreal short4 MEMBER short4 CONSTANT FINAL)
197 Q_PROPERTY(qreal medium1 MEMBER medium1 CONSTANT FINAL)
199 Q_PROPERTY(qreal medium2 MEMBER medium2 CONSTANT FINAL)
201 Q_PROPERTY(qreal medium3 MEMBER medium3 CONSTANT FINAL)
203 Q_PROPERTY(qreal medium4 MEMBER medium4 CONSTANT FINAL)
205 Q_PROPERTY(qreal long1 MEMBER long1 CONSTANT FINAL)
207 Q_PROPERTY(qreal long2 MEMBER long2 CONSTANT FINAL)
209 Q_PROPERTY(qreal long3 MEMBER long3 CONSTANT FINAL)
211 Q_PROPERTY(qreal long4 MEMBER long4 CONSTANT FINAL)
213 Q_PROPERTY(qreal extra_long1 MEMBER extra_long1 CONSTANT FINAL)
215 Q_PROPERTY(qreal extra_long2 MEMBER extra_long2 CONSTANT FINAL)
217 Q_PROPERTY(qreal extra_long3 MEMBER extra_long3 CONSTANT FINAL)
219 Q_PROPERTY(qreal extra_long4 MEMBER extra_long4 CONSTANT FINAL)
220
221public:
222 qreal short1 { 50 };
223 qreal short2 { 100 };
224 qreal short3 { 150 };
225 qreal short4 { 200 };
226 qreal medium1 { 250 };
227 qreal medium2 { 300 };
228 qreal medium3 { 350 };
229 qreal medium4 { 400 };
230 qreal long1 { 450 };
231 qreal long2 { 500 };
232 qreal long3 { 550 };
233 qreal long4 { 600 };
234 qreal extra_long1 { 700 };
235 qreal extra_long2 { 800 };
236 qreal extra_long3 { 900 };
237 qreal extra_long4 { 1000 };
238};
239
247 Q_GADGET
248 QML_ANONYMOUS
250 Q_PROPERTY(qint32 none MEMBER none CONSTANT FINAL)
252 Q_PROPERTY(qint32 extra_small MEMBER extra_small CONSTANT FINAL)
254 Q_PROPERTY(qint32 small MEMBER small CONSTANT FINAL)
256 Q_PROPERTY(qint32 medium MEMBER medium CONSTANT FINAL)
258 Q_PROPERTY(qint32 large MEMBER large CONSTANT FINAL)
260 Q_PROPERTY(qint32 extra_large MEMBER extra_large CONSTANT FINAL)
262 Q_PROPERTY(qint32 full MEMBER full CONSTANT FINAL)
263public:
265 i32 none { 0 };
266 i32 extra_small { 4 };
267 i32 small { 8 };
268 i32 medium { 12 };
269 i32 large { 16 };
270 i32 extra_large { 28 };
271 i32 full { 100 };
272};
273
279struct Shape {
280 Q_GADGET
281 QML_ANONYMOUS
282 Q_PROPERTY(ShapeCorner corner MEMBER corner CONSTANT FINAL)
283public:
284 ShapeCorner corner;
285};
286
293struct StateItem {
294 Q_GADGET
295 QML_ANONYMOUS
297 Q_PROPERTY(double state_layer_opacity MEMBER state_layer_opacity CONSTANT FINAL)
298public:
299 double state_layer_opacity;
300};
301
308struct State {
309 Q_GADGET
310 QML_ANONYMOUS
312 Q_PROPERTY(qml_material::token::StateItem hover MEMBER hover CONSTANT FINAL)
314 Q_PROPERTY(qml_material::token::StateItem pressed MEMBER pressed CONSTANT FINAL)
316 Q_PROPERTY(qml_material::token::StateItem focus MEMBER focus CONSTANT FINAL)
317
318public:
319 StateItem hover { 0.08 };
320 StateItem pressed { 0.1 };
321 StateItem focus { 0.1 };
322};
323
330class Flick : public QObject {
331 Q_OBJECT
332 QML_ANONYMOUS
334 Q_PROPERTY(qint32 pressDelay READ pressDelay NOTIFY pressDelayChanged FINAL)
336 Q_PROPERTY(
337 double flickDeceleration READ flickDeceleration NOTIFY flickDecelerationChanged FINAL)
339 Q_PROPERTY(double maximumFlickVelocity READ maximumFlickVelocity NOTIFY
340 maximumFlickVelocityChanged FINAL)
341public:
342 Flick(QObject* parent = nullptr);
343 ~Flick();
344 auto pressDelay() const -> qint32;
345 auto flickDeceleration() const -> double;
346 auto maximumFlickVelocity() const -> double;
347
348 Q_SIGNAL void pressDelayChanged();
349 Q_SIGNAL void flickDecelerationChanged();
350 Q_SIGNAL void maximumFlickVelocityChanged();
351
352private:
353 qint32 m_press_delay;
354 double m_flick_deceleration;
355 double m_maximum_flickVelocity;
356};
357
364class Token : public QObject {
365 Q_OBJECT
366 Q_PROPERTY(QQmlListProperty<QObject> datas READ datas FINAL)
367 Q_CLASSINFO("DefaultProperty", "datas")
368 QML_NAMED_ELEMENT(TokenImpl)
369
370 Q_PROPERTY(QString version READ version CONSTANT FINAL)
371 Q_PROPERTY(QString iconFontUrl READ icon_font_url CONSTANT FINAL)
372 Q_PROPERTY(QString iconFill0FontUrl READ icon_fill_0_font_url CONSTANT FINAL)
373 Q_PROPERTY(QString iconFill1FontUrl READ icon_fill_1_font_url CONSTANT FINAL)
374
375
376 Q_PROPERTY(qml_material::token::TypeScale* typescale READ typescale CONSTANT FINAL)
378 Q_PROPERTY(qml_material::token::IconToken* icon READ icon CONSTANT FINAL)
380 Q_PROPERTY(qml_material::token::Flick* flick READ flick CONSTANT FINAL)
382 Q_PROPERTY(qml_material::token::Elevation elevation READ elevation CONSTANT FINAL)
384 Q_PROPERTY(qml_material::token::Duration duration READ duration CONSTANT FINAL)
386 Q_PROPERTY(qml_material::token::Easing easing READ easing CONSTANT FINAL)
388 Q_PROPERTY(qml_material::token::State state READ state CONSTANT FINAL)
390 Q_PROPERTY(qml_material::token::Shape shape READ shape CONSTANT FINAL)
392 Q_PROPERTY(qml_material::token::WindowClass window_class READ window_class CONSTANT FINAL)
393public:
394 Token(QObject* = nullptr);
395 ~Token();
396
397 auto version() const -> QString;
398 auto icon_font_url() const -> QString;
399 auto icon_fill_0_font_url() const -> QString;
400 auto icon_fill_1_font_url() const -> QString;
401
402 auto typescale() const -> TypeScale*;
403 auto icon() const -> IconToken*;
404 auto flick() const -> Flick*;
405 auto elevation() const -> const Elevation&;
406 auto state() const -> const State&;
407 auto shape() const -> const Shape&;
408 auto window_class() const -> const WindowClass&;
409 auto duration() const -> const Duration&;
410 auto easing() const -> const Easing&;
411
412 auto datas() -> QQmlListProperty<QObject>;
413
414 Q_INVOKABLE double cal_curve_scale(double dpr) const;
415
416private:
417 TypeScale* m_typescale;
418 IconToken* m_icon;
419 Flick* m_flick;
420 Duration m_duration;
421 Easing m_easing;
422 Elevation m_elevation;
423 State m_state;
424 Shape m_shape;
425 WindowClass m_win_class;
426
427 QList<QObject*> m_datas;
428};
429} // namespace qml_material::token
Enum.
Definition enum.hpp:13
WindowClassType
Definition enum.hpp:118
Handles flicking behavior and physics parameters.
Definition token.hpp:330
IconToken, full codes.
Definition icon.hpp:15
Main token container for Material Design system.
Definition token.hpp:364
TypeScale.
Definition type_scale.hpp:64
Motion duration.
Definition token.hpp:185
Motion easing.
Definition token.hpp:125
Motion easing.
Definition token.hpp:141
Defines elevation levels for Material Design shadows.
Definition token.hpp:96
Defines corner radius values for shape styling.
Definition token.hpp:246
Container for shape-related styling properties.
Definition token.hpp:279
Defines opacity values for different UI states.
Definition token.hpp:293
Manages UI element state appearances.
Definition token.hpp:308
Represents a window class category with size constraints.
Definition token.hpp:25
qml_material::Enum::WindowClassType type
Type classification of the window size (compact, medium, expanded etc.)
Definition token.hpp:34
Window classification system based on width ranges.
Definition token.hpp:49