Warning, /plasma/plasma-mobile/shell/contents/configuration/AppletConfiguration.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org> 0002 // SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org> 0003 // SPDX-License-Identifier: GPL-2.0-or-later 0004 0005 import QtQuick 2.15 0006 import QtQuick.Controls 2.15 as QQC2 0007 import QtQuick.Layouts 1.15 0008 import QtQuick.Window 2.15 0009 0010 import org.kde.kirigami 2.19 as Kirigami 0011 import org.kde.plasma.configuration 2.0 0012 import org.kde.kitemmodels 1.0 as KItemModels 0013 0014 Rectangle { 0015 id: root 0016 LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft 0017 LayoutMirroring.childrenInherit: true 0018 0019 color: "transparent" 0020 0021 //BEGIN properties 0022 0023 property bool isContainment: false 0024 property alias app: appLoader.item 0025 property bool loadApp: true 0026 0027 signal appLoaded() 0028 0029 //END properties 0030 0031 //BEGIN model 0032 0033 property ConfigModel globalConfigModel: globalAppletConfigModel 0034 0035 ConfigModel { 0036 id: globalAppletConfigModel 0037 } 0038 0039 KItemModels.KSortFilterProxyModel { 0040 id: configDialogFilterModel 0041 sourceModel: configDialog.configModel 0042 filterRowCallback: (row, parent) => { 0043 return sourceModel.data(sourceModel.index(row, 0), ConfigModel.VisibleRole); 0044 } 0045 } 0046 0047 //END model 0048 0049 //BEGIN functions 0050 0051 function saveConfig() { 0052 if (app.pageStack.currentItem.saveConfig) { 0053 app.pageStack.currentItem.saveConfig() 0054 } 0055 for (var key in plasmoid.configuration) { 0056 if (app.pageStack.currentItem["cfg_"+key] !== undefined) { 0057 plasmoid.configuration[key] = app.pageStack.currentItem["cfg_"+key] 0058 } 0059 } 0060 } 0061 0062 function configurationHasChanged() { 0063 for (var key in plasmoid.configuration) { 0064 if (app.pageStack.currentItem["cfg_"+key] !== undefined) { 0065 //for objects == doesn't work 0066 if (typeof plasmoid.configuration[key] == 'object') { 0067 for (var i in plasmoid.configuration[key]) { 0068 if (plasmoid.configuration[key][i] != app.pageStack.currentItem["cfg_"+key][i]) { 0069 return true; 0070 } 0071 } 0072 return false; 0073 } else if (app.pageStack.currentItem["cfg_"+key] != plasmoid.configuration[key]) { 0074 return true; 0075 } 0076 } 0077 } 0078 return false; 0079 } 0080 0081 0082 function settingValueChanged() { 0083 if (app.pageStack.currentItem.saveConfig !== undefined) { 0084 app.pageStack.currentItem.saveConfig(); 0085 } else { 0086 root.saveConfig(); 0087 } 0088 } 0089 0090 function pushReplace(item, config) { 0091 let page; 0092 if (app.pageStack.depth === 0) { 0093 page = app.pageStack.push(item, config); 0094 } else { 0095 page = app.pageStack.replace(item, config); 0096 } 0097 app.currentConfigPage = page; 0098 } 0099 0100 function open(item) { 0101 app.isAboutPage = false; 0102 if (item.source) { 0103 app.isAboutPage = item.source === "AboutPlugin.qml"; 0104 pushReplace(Qt.resolvedUrl("ConfigurationAppletPage.qml"), {configItem: item, title: item.name}); 0105 } else if (item.kcm) { 0106 pushReplace(configurationKcmPageComponent, {kcm: item.kcm, internalPage: item.kcm.mainUi}); 0107 } else { 0108 app.pageStack.pop(); 0109 } 0110 } 0111 0112 //END functions 0113 0114 0115 //BEGIN connections 0116 0117 Connections { 0118 target: root.Window.window 0119 function onVisibleChanged() { 0120 if (root.Window.window.visible) { 0121 root.Window.window.showMaximized(); 0122 } 0123 } 0124 } 0125 0126 //END connections 0127 0128 //BEGIN UI components 0129 0130 Component { 0131 id: configurationKcmPageComponent 0132 ConfigurationKcmPage {} 0133 } 0134 0135 Loader { 0136 id: appLoader 0137 anchors.fill: parent 0138 asynchronous: true 0139 active: root.loadApp 0140 onLoaded: { 0141 // if we are a containment then the first item will be ConfigurationContainmentAppearance 0142 // if the applet does not have own configs then the first item will be Shortcuts 0143 if (isContainment || !configDialog.configModel || configDialog.configModel.count === 0) { 0144 root.open(root.globalConfigModel.get(0)) 0145 } else { 0146 root.open(configDialog.configModel.get(0)) 0147 } 0148 0149 root.appLoaded(); 0150 } 0151 0152 sourceComponent: Kirigami.ApplicationItem { 0153 id: app 0154 anchors.fill: parent 0155 0156 // animation on show 0157 opacity: 0 0158 NumberAnimation on opacity { 0159 to: 1 0160 running: true 0161 duration: Kirigami.Units.longDuration 0162 easing.type: Easing.InOutQuad 0163 } 0164 0165 pageStack.globalToolBar.canContainHandles: true 0166 pageStack.globalToolBar.style: Kirigami.ApplicationHeaderStyle.ToolBar 0167 pageStack.globalToolBar.showNavigationButtons: Kirigami.ApplicationHeaderStyle.ShowBackButton; 0168 0169 property var currentConfigPage: null 0170 property bool isAboutPage: false 0171 0172 // pop pages when not in use 0173 Connections { 0174 target: app.pageStack 0175 function onCurrentIndexChanged() { 0176 // wait for animation to finish before popping pages 0177 timer.restart(); 0178 } 0179 } 0180 0181 Timer { 0182 id: timer 0183 interval: 300 0184 onTriggered: { 0185 let currentIndex = app.pageStack.currentIndex; 0186 while (app.pageStack.depth > (currentIndex + 1) && currentIndex >= 0) { 0187 app.pageStack.pop(); 0188 } 0189 } 0190 } 0191 0192 footer: Kirigami.NavigationTabBar { 0193 id: footerBar 0194 visible: count > 1 0195 height: visible ? implicitHeight : 0 0196 Repeater { 0197 model: root.isContainment ? globalConfigModel : undefined 0198 delegate: configCategoryDelegate 0199 } 0200 Repeater { 0201 model: configDialogFilterModel 0202 delegate: configCategoryDelegate 0203 } 0204 Repeater { 0205 model: !root.isContainment ? globalConfigModel : undefined 0206 delegate: configCategoryDelegate 0207 } 0208 } 0209 0210 Component { 0211 id: configCategoryDelegate 0212 Kirigami.NavigationTabButton { 0213 icon.name: model.icon 0214 text: model.name 0215 width: footerBar.buttonWidth 0216 recolorIcon: false 0217 QQC2.ButtonGroup.group: footerBar.tabGroup 0218 0219 onClicked: { 0220 if (checked) { 0221 root.open(model); 0222 } 0223 } 0224 0225 checked: { 0226 if (app.pageStack.currentItem) { 0227 if (model.kcm && app.pageStack.currentItem.kcm) { 0228 return model.kcm == app.pageStack.currentItem.kcm; 0229 } else if (app.pageStack.currentItem.configItem) { 0230 return model.source == app.pageStack.currentItem.configItem.source; 0231 } else { 0232 return app.pageStack.currentItem.source == Qt.resolvedUrl(model.source); 0233 } 0234 } 0235 return false; 0236 } 0237 } 0238 } 0239 } 0240 } 0241 //END UI components 0242 } 0243