Kirigami-addons

ConfigMobilePage.qml
1/*
2 * SPDX-FileCopyrightText: 2011-2014 Sebastian Kügler <sebas@kde.org>
3 * SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
4 * SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7import QtQuick
8import QtQuick.Layouts
9import QtQuick.Controls as Controls
10import org.kde.kirigami as Kirigami
11import org.kde.kirigamiaddons.formcard as FormCard
12import org.kde.kirigamiaddons.settings
13
14FormCard.FormCardPage {
15 id: root
16
17 required property string defaultModule
18 required property list<ConfigurationModule> modules
19 required property Kirigami.ApplicationWindow window
20
21 // Do not use Map, it crashes very frequently
22 property var pageCache: Object.create(null)
23
24 title: i18ndc("kirigami-addons6", "@title", "Settings")
25
26 // search bar
28 Layout.fillWidth: true
29 Layout.topMargin: Kirigami.Units.gridUnit
30
31 FormCard.AbstractFormDelegate {
32 Layout.fillWidth: true
33 background: null
34
35 topPadding: Kirigami.Units.smallSpacing
36 bottomPadding: Kirigami.Units.smallSpacing
37
38 contentItem: Kirigami.SearchField {
39 id: searchField
40 Layout.fillWidth: true
41 autoAccept: true
42 onTextChanged: repeater.filterText = text.toLowerCase();
43 background: null
44 }
45 }
46 }
47
48 Repeater {
49 id: repeater
50
51 property string filterText: ""
52
53 model: {
54 const isFiltering = filterText.length !== 0;
55 let filteredCategories = new Array();
56
57 for (let i in root.modules) {
58 const module = modules[i];
59 const modulePassesFilter = module.text.toLowerCase().includes(filterText);
60 if (module.visible && (isFiltering ? modulePassesFilter : true)) {
61 const category = filteredCategories.find((category) => category.name === module.category);
62 if (category) {
63 category.modules.push(module);
64 } else {
65 filteredCategories.push({
66 name: module.category,
67 modules: [module],
68 });
69 }
70 }
71 }
72 return filteredCategories;
73 }
74
75 ColumnLayout {
76 id: categoryDelegate
77
78 required property var modelData
79
80 spacing: 0
81
82 FormCard.FormHeader {
83 title: categoryDelegate.modelData.name === "_main_category" ? i18ndc("kirigami-addons6", "@title:group", "Settings") : modelData.name
84 }
85
86 // settings categories
88 id: settingsCard
89
90 Repeater {
91 id: repeater
92
93 model: categoryDelegate.modelData.modules
94 delegate: ColumnLayout {
95 id: moduleDelegate
96
97 required property int index
98 required property ConfigurationModule modelData
99
100 Layout.fillWidth: true
101
103 visible: moduleDelegate.index !== 0
104 }
105
107 id: delegateItem
108
109 onClicked: {
110 root.window.pageStack.layers.push(pageForModule(modelData));
111 }
112
113 contentItem: RowLayout {
114 Kirigami.Icon {
115 source: moduleDelegate.modelData.icon.name
116 Layout.rightMargin: Kirigami.Units.largeSpacing
117 implicitWidth: Kirigami.Units.iconSizes.medium
118 implicitHeight: Kirigami.Units.iconSizes.medium
119 }
120
121 Controls.Label {
122 Layout.fillWidth: true
123 text: moduleDelegate.modelData.text
124 elide: Text.ElideRight
125 }
126
127 Kirigami.Icon {
128 Layout.alignment: Qt.AlignRight
129 source: "arrow-right"
130 implicitWidth: Math.round(Kirigami.Units.iconSizes.small * 0.75)
131 implicitHeight: Math.round(Kirigami.Units.iconSizes.small * 0.75)
132 }
133 }
134 }
135 }
136 }
137 }
138
139 }
140 }
141
142 function pageForModule(module: ConfigurationModule) {
143 if (pageCache[module.moduleId]) {
144 return pageCache[module.moduleId];
145 } else {
146 const component = module.page();
147 if (component.status === Component.Error) {
148 console.error(component.errorString());
149 }
150 const page = component.createObject(root, module.initialProperties());
151 if (page.title.length === 0) {
152 page.title = module.text;
153 }
154 pageCache[module.moduleId] = page;
155 return page;
156 }
157 }
158
159 function getModuleByName(moduleId: string): ConfigurationModule {
160 return modules.find(module => module.moduleId == moduleId) ?? null;
161 }
162}
A base item for delegates to be used in a FormCard.
This object holds the information of configuration module.
A single card that follows a form style.
Definition FormCard.qml:35
A context-aware separator.
QString i18ndc(const char *domain, const char *context, const char *text, const TYPE &arg...)
QString name(GameStandardAction id)
QWidget * window(QObject *job)
KGuiItem find()
Category category(StandardShortcut id)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri Jul 26 2024 11:54:39 by doxygen 1.11.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.