DtkDeclarative
DTK Declarative module
载入中...
搜索中...
未找到
dsettingscontainer_p.h
1// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: LGPL-3.0-or-later
4
5#ifndef DSETTINGSCONTAINER_P_H
6#define DSETTINGSCONTAINER_P_H
7
8#include <dtkdeclarative_global.h>
9
10#include <QQmlParserStatus>
11#include <QQmlComponent>
12#include <private/qqmlobjectmodel_p.h>
13
14DQUICK_BEGIN_NAMESPACE
15
16class SettingsOption : public QObject
17{
18 Q_OBJECT
19 Q_PROPERTY(QString key READ key WRITE setKey NOTIFY keyChanged)
20 Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
21 Q_PROPERTY(QVariant value READ value WRITE setValue RESET resetValue NOTIFY valueChanged)
22 Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
23 Q_CLASSINFO("DefaultProperty", "delegate")
24#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
25 QML_NAMED_ELEMENT(SettingsOption)
26#endif
27
28public:
29 explicit SettingsOption(QObject *parent = nullptr);
30 virtual ~SettingsOption() override;
31
32 QString key() const;
33 void setKey(QString key);
34 QString name() const;
35 void setName(QString name);
36 QVariant value() ;
37 void setValue(QVariant value);
38 void resetValue();
39
40 QQmlComponent *delegate() const;
41 void setDelegate(QQmlComponent *delegate);
42 void setConfig(QObject *config);
43
44 static SettingsOption *qmlAttachedProperties(QObject *object);
45
46Q_SIGNALS:
47 void keyChanged(QString key);
48 void nameChanged(QString name);
49 void valueChanged(QVariant value);
50 void delegateChanged();
51
52private Q_SLOTS:
53 void onConfigValueChanged();
54 void onValueChanged(const QString &key, const QVariant &value);
55
56private:
57 void setValue(const QVariant &value, bool updateConfig);
58
59 QString m_key;
60 QString m_name;
61 QVariant m_value;
62 bool m_valueInitialized = false;
63 QQmlComponent *m_delegate = nullptr;
64 QObject *m_config = nullptr;
65};
66
67class SettingsGroup : public QObject
68{
69 Q_OBJECT
70 Q_PROPERTY(QString key READ key WRITE setKey NOTIFY keyChanged)
71 Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
72 Q_PROPERTY(int level READ level CONSTANT)
73 Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged)
74 Q_PROPERTY(int index READ index NOTIFY indexChanged)
75 Q_PROPERTY(QQmlListProperty<DTK_QUICK_NAMESPACE::SettingsOption> options READ options NOTIFY optionsChanged)
76 Q_PROPERTY(QQmlListProperty<DTK_QUICK_NAMESPACE::SettingsGroup> children READ children NOTIFY childrenChanged)
77 Q_PROPERTY(QQmlComponent *background READ background WRITE setBackground NOTIFY backgroundChanged)
78 Q_CLASSINFO("DefaultProperty", "options")
79#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
80 QML_NAMED_ELEMENT(SettingsGroup)
81 QML_ATTACHED(SettingsGroup)
82#endif
83
84public:
85 explicit SettingsGroup(QObject * parent = nullptr);
86 virtual ~SettingsGroup() override;
87
88 QString key() const;
89 void setKey(const QString &key);
90 QString name() const;
91 void setName(QString name);
92 int level() const;
93 void setLevel(int level);
94 bool visible() const;
95 void setVisible(bool visible);
96 QQmlListProperty<DTK_QUICK_NAMESPACE::SettingsOption> options();
97 QQmlListProperty<DTK_QUICK_NAMESPACE::SettingsGroup> children();
98 QQmlComponent *background() const;
99 void setBackground(QQmlComponent *background);
100 void setConfig(QObject *config);
101 SettingsGroup *parentGroup() const;
102 void setParentGroup(SettingsGroup *parentGroup);
103 int index() const;
104 void setIndex(const int index);
105
106 static SettingsGroup *qmlAttachedProperties(QObject *object);
107
108Q_SIGNALS:
109 void keyChanged(QString key);
110 void nameChanged(QString name);
111 void visibleChanged(bool visible);
112 void optionsChanged();
113 void childrenChanged();
114 void backgroundChanged();
115 void indexChanged(int index);
116
117private:
118
119 QString m_key;
120 QString m_name;
121 int m_level = -1;
122 bool m_visible = true;
123 int m_index;
124 QList<SettingsOption*> m_options;
125 QList<SettingsGroup*> m_children;
126 QQmlComponent * m_background = nullptr;
127 SettingsGroup* m_parentGroup = nullptr;
128};
129
132class SettingsInstanceModel : public QQmlInstanceModel
133{
134 Q_OBJECT
135public:
136 explicit SettingsInstanceModel(SettingsContainer *container);
137
138public:
139 virtual int count() const override;
140#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
141 virtual QVariant variantValue(int index, const QString &name) override;
142 virtual ReleaseFlags release(QObject *object, ReusableFlag reusableFlag = NotReusable) override;
143#else
144 virtual QString stringValue(int index, const QString &name) override;
145 virtual ReleaseFlags release(QObject *object) override;
146#endif
147 virtual void setWatchedRoles(const QList<QByteArray> &roles) override;
148 virtual QQmlIncubator::Status incubationStatus(int index) override;
149 virtual int indexOf(QObject *object, QObject *objectContext) const override;
150
151 void updateModel();
152
153public:
154 void insert(SettingsGroup *group);
155 void remove(SettingsGroup *group);
156
157protected:
158 Q_DECLARE_PRIVATE(SettingsInstanceModel)
159};
160
162{
163 Q_OBJECT
164public:
165 explicit SettingsContentModel(SettingsContainer *container = nullptr);
166
167public:
168 bool isValid() const override;
169 virtual QObject *object(int index, QQmlIncubator::IncubationMode incubationMode) override;
170
171private:
172 QQmlComponent *contentBackgroundByGroup(const SettingsGroup *group);
173 static const QByteArray groupComponentData();
174 static const QByteArray optionsLayoutComponentData();
175};
176
178 Q_OBJECT
179public:
180 SettingsNavigationModel(SettingsContainer *container = nullptr);
181
182public:
183 virtual bool isValid() const override;
184 virtual QObject *object(int index, QQmlIncubator::IncubationMode incubationMode) override;
185};
186
188class SettingsModelAttached;
189class SettingsContainer : public QObject, public QQmlParserStatus
190{
191 Q_OBJECT
192 Q_INTERFACES(QQmlParserStatus)
193 Q_PROPERTY(QObject *config READ config WRITE setConfig NOTIFY configChanged)
194 Q_PROPERTY(QQmlListProperty<DTK_QUICK_NAMESPACE::SettingsGroup> groups READ groups NOTIFY groupsChanged)
195 Q_PROPERTY(SettingsContentModel *contentModel READ contentModel NOTIFY contentModelChanged)
196 Q_PROPERTY(QQmlComponent *contentTitle READ contentTitle WRITE setContentTitle NOTIFY contentTitleChanged)
197 Q_PROPERTY(QQmlComponent *contentBackground READ contentBackground WRITE setContentBackground NOTIFY contentBackgroundChanged)
198 Q_PROPERTY(SettingsNavigationModel *navigationModel READ navigationModel NOTIFY navigationModelChanged)
199 Q_PROPERTY(QQmlComponent *navigationTitle READ navigationTitle WRITE setNavigationTitle NOTIFY navigationTitleChanged)
200 Q_CLASSINFO("DefaultProperty", "groups")
201#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
202 QML_NAMED_ELEMENT(SettingsContainer)
203#endif
204
205public:
206 explicit SettingsContainer(QObject *parent = nullptr);
207 virtual ~SettingsContainer() override;
208
209 QObject *config() const;
210 void setConfig(QObject *config);
211 QQmlListProperty<DTK_QUICK_NAMESPACE::SettingsGroup> groups();
212 SettingsContentModel *contentModel() const;
213 SettingsNavigationModel *navigationModel() const;
214 QQmlComponent *contentTitle() const;
215 void setContentTitle(QQmlComponent *delegate);
216 QQmlComponent *navigationTitle() const;
217 void setNavigationTitle(QQmlComponent *delegate);
218 void setContentBackground(QQmlComponent * contentBackground);
219 QQmlComponent *contentBackground() const;
220
221 QVector<SettingsGroup *> groupList() const;
222 QQmlContext *creationContext();
223
224 virtual void classBegin() override;
225 virtual void componentComplete() override;
226
227public Q_SLOTS:
228 void setGroupVisible(const QString &key, bool visible);
229 bool groupVisible(const QString &key) const;
230 void resetSettings();
231
232private Q_SLOTS:
233 void onGroupVisibleChanged(bool visible);
234
235Q_SIGNALS:
236 void groupsChanged();
237 void navigationTitleChanged();
238 void contentTitleChanged();
239 void contentModelChanged();
240 void navigationModelChanged();
241 void configChanged();
242 void contentBackgroundChanged();
243
244private:
245 QList<SettingsGroup*> m_groups;
246 SettingsNavigationModel *m_navigationModel = nullptr;
247 SettingsContentModel *m_contentModel = nullptr;
248 QQmlComponent *m_contentTitle = nullptr;
249 QQmlComponent *m_navigationTitle = nullptr;
250 QQmlComponent * m_contentBackground = nullptr;
251 QObject *m_config = nullptr;
252};
253
254DQUICK_END_NAMESPACE
255
256QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::SettingsOption, QML_HAS_ATTACHED_PROPERTIES)
257QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::SettingsGroup, QML_HAS_ATTACHED_PROPERTIES)
258
259#endif // DSETTINGSCONTAINER_P_H
Definition dsettingscontainer_p.h:190
Definition dsettingscontainer_p.h:162
Definition dsettingscontainer_p.h:68
Definition dsettingscontainer.cpp:635
Definition dsettingscontainer_p.h:133
Definition dsettingscontainer_p.h:177
Definition dsettingscontainer_p.h:17