QmlMaterial 0.1.0
Loading...
Searching...
No Matches
theme.hpp
1#pragma once
2
3#include <functional>
4#include <QProperty>
5#include <optional>
6
7#include <QtCore/QObject>
8#include <QtCore/QTimer>
9#include <QtQml/QQmlEngine>
10#include <QtGui/QColor>
11
12#include "qml_material/core/attached_property.hpp"
13#include "qml_material/token/color.hpp"
14#include "qml_material/control/page_context.hpp"
15
16#define ATTACH_PROPERTY(Type, Name) \
17private: \
18 Q_PROPERTY(Type Name READ Name WRITE set_##Name RESET reset_##Name NOTIFY Name##Changed FINAL) \
19public: \
20 Type Name() const; \
21 void set_##Name(Type); \
22 void reset_##Name(); \
23 AttachProp<Type>& get_##Name(); \
24 Q_SIGNAL void Name##Changed(); \
25 \
26private: \
27 AttachProp<Type> m_##Name { &Self::Name##Changed };
28
29namespace qml_material
30{
31
32class ThemeSize : public QObject {
33 Q_OBJECT
34 QML_ELEMENT
35public:
36 ThemeSize(QObject* parent = nullptr);
37 ~ThemeSize();
38 Q_PROPERTY(
39 qint32 windowClass READ windowClass WRITE setWindowClass NOTIFY windowClassChanged FINAL)
40 Q_PROPERTY(bool isCompact READ isCompact NOTIFY windowClassChanged FINAL)
41 Q_PROPERTY(bool isMedium READ isMedium NOTIFY windowClassChanged FINAL)
42 Q_PROPERTY(bool isExpanded READ isExpanded NOTIFY windowClassChanged FINAL)
43 Q_PROPERTY(bool isLarge READ isLarge NOTIFY windowClassChanged FINAL)
44 Q_PROPERTY(bool isExtraLarge READ isExtraLarge NOTIFY windowClassChanged FINAL)
45
46 Q_PROPERTY(qint32 duration READ duration WRITE setDuration NOTIFY durationChanged FINAL)
47 Q_PROPERTY(qint32 width READ width WRITE setWidth NOTIFY widthChanged FINAL)
48
49 auto isCompact() const -> bool;
50 auto isMedium() const -> bool;
51 auto isExpanded() const -> bool;
52 auto isLarge() const -> bool;
53 auto isExtraLarge() const -> bool;
54
55 auto width() const -> qint32;
56 void setWidth(qint32 w);
57 Q_SIGNAL void widthChanged(qint32);
58
59 auto duration() const -> qint32;
60 void setDuration(qint32 w);
61 Q_SIGNAL void durationChanged(qint32);
62
63 auto windowClass() const -> qint32;
64 void setWindowClass(qint32);
65 Q_SIGNAL void windowClassChanged(qint32);
66
67 Q_PROPERTY(qint32 verticalPadding READ verticalPadding NOTIFY verticalPaddingChanged FINAL)
68 auto verticalPadding() const -> qint32;
69 Q_SIGNAL void verticalPaddingChanged();
70
71private:
72 qint32 m_window_class;
73 qint32 m_width;
74 qint32 m_duration;
75 QTimer m_width_timer;
76};
77
78class QML_MATERIAL_API Theme final : public AttachedPropertyNode {
79 Q_OBJECT
80
81 QML_NAMED_ELEMENT(MProp)
82 QML_UNCREATABLE("")
83 QML_ATTACHED(Theme)
84
85public:
86 using Self = Theme;
87
88 template<typename V>
89 struct AttachProp {
90 using SigFunc = void (Theme::*)();
91 using ReadFunc = V (Theme::* const)();
92 using WriteFunc = void (Theme::*)(V);
93 using GetFunc = AttachProp<V>& (Theme::* const)();
94
95 std::optional<V> value;
96 bool explicited;
97 SigFunc sig_func;
98
99 AttachProp(SigFunc s): value(), explicited(false), sig_func(s) {}
100 };
101
102 Q_PROPERTY(QColor textColor READ textColor WRITE set_textColor RESET reset_textColor NOTIFY
103 textColorChanged BINDABLE bindableTextColor FINAL)
104 Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE set_backgroundColor RESET
105 reset_backgroundColor NOTIFY backgroundColorChanged BINDABLE
106 bindableBackgroundColor FINAL)
107 QColor textColor() const;
108 void set_textColor(QColor);
109 void reset_textColor();
110 QBindable<QColor> bindableTextColor() { return QBindable<QColor>(&m_textColor); }
111 QColor backgroundColor() const;
112 void set_backgroundColor(QColor);
113 void reset_backgroundColor();
114 QBindable<QColor> bindableBackgroundColor() { return QBindable<QColor>(&m_backgroundColor); }
115 Q_SIGNAL void textColorChanged();
116 Q_SIGNAL void backgroundColorChanged();
117 ATTACH_PROPERTY(int, elevation)
118public:
119 Q_PROPERTY(qml_material::MdColorMgr* color READ color WRITE set_color RESET reset_color NOTIFY
120 colorChanged BINDABLE bindableColor FINAL)
121 MdColorMgr* color() const;
122 void set_color(MdColorMgr*);
123 void reset_color();
124 QBindable<MdColorMgr*> bindableColor() { return QBindable<MdColorMgr*>(&m_color); }
125 Q_SIGNAL void colorChanged();
126
127private:
128 void colorChange();
129 QProperty<Theme*> m_colorParent { nullptr };
130 QMetaObject::Connection m_colorParentDestroyed;
131 QMetaObject::Connection m_colorDestroyed;
132 Q_OBJECT_BINDABLE_PROPERTY(Theme, MdColorMgr*, m_color, &Theme::colorChange)
133 Q_OBJECT_BINDABLE_PROPERTY(Theme, QColor, m_textColor, &Theme::textColorChanged)
134 Q_OBJECT_BINDABLE_PROPERTY(Theme, QColor, m_backgroundColor, &Theme::backgroundColorChanged)
135 ATTACH_PROPERTY(qml_material::ThemeSize*, size)
136 ATTACH_PROPERTY(qml_material::PageContext*, page)
137
138public:
139 Theme(QObject* parent);
140 ~Theme();
141
142 static Theme* qmlAttachedProperties(QObject* object);
143
144protected:
145 void updateInheritedValues() override;
146
147private:
148 template<typename V>
149 void setProp(AttachProp<V>& property, const V& value);
150
151 template<typename V>
152 void resetProp(AttachProp<V>& property, const V& inheritedValue);
153
154 template<typename V>
155 bool inheritProp(AttachProp<V>& property, const V& value);
156};
157} // namespace qml_material
158
159#undef ATTACH_PROPERTY
Material Design Color Manager class.
Definition color.hpp:20