Warning, /plasma/plasma-desktop/desktoppackage/contents/configuration/ConfigurationContainmentAppearance.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 import QtQuick 2.15
0008 import org.kde.plasma.configuration 2.0
0009 import QtQuick.Controls 2.3 as QQC2
0010 import QtQuick.Layouts 1.1
0011 import QtQml 2.15
0012 
0013 import org.kde.newstuff 1.62 as NewStuff
0014 import org.kde.kirigami 2.20 as Kirigami
0015 import org.kde.kcmutils
0016 import org.kde.plasma.plasmoid 2.0
0017 import org.kde.plasma.configuration 2.0
0018 
0019 Item {
0020     id: appearanceRoot
0021     signal configurationChanged
0022 
0023     property int formAlignment: wallpaperComboBox.Kirigami.ScenePosition.x - appearanceRoot.Kirigami.ScenePosition.x + Kirigami.Units.smallSpacing
0024     property string currentWallpaper: ""
0025     property string containmentPlugin: ""
0026     property alias parentLayout: parentLayout
0027 
0028     function saveConfig() {
0029         if (main.currentItem.saveConfig) {
0030             main.currentItem.saveConfig()
0031         }
0032         configDialog.currentWallpaper = appearanceRoot.currentWallpaper;
0033         for (var key in configDialog.wallpaperConfiguration) {
0034             if (main.currentItem["cfg_"+key] !== undefined) {
0035                 configDialog.wallpaperConfiguration[key] = main.currentItem["cfg_"+key]
0036             }
0037         }
0038         configDialog.applyWallpaper()
0039         configDialog.containmentPlugin = appearanceRoot.containmentPlugin
0040     }
0041 
0042     ColumnLayout {
0043         width: root.availableWidth
0044         height: Math.max(implicitHeight, root.availableHeight)
0045         spacing: 0 // unless it's 0 there will be an additional gap between two FormLayouts
0046 
0047         Component.onCompleted: {
0048             for (var i = 0; i < configDialog.containmentPluginsConfigModel.count; ++i) {
0049                 var pluginName = configDialog.containmentPluginsConfigModel.data(configDialog.containmentPluginsConfigModel.index(i, 0), ConfigModel.PluginNameRole);
0050                 if (configDialog.containmentPlugin === pluginName) {
0051                     pluginComboBox.currentIndex = i
0052                     pluginComboBox.activated(i);
0053                     break;
0054                 }
0055             }
0056 
0057             for (var i = 0; i < configDialog.wallpaperConfigModel.count; ++i) {
0058                 var pluginName = configDialog.wallpaperConfigModel.data(configDialog.wallpaperConfigModel.index(i, 0), ConfigModel.PluginNameRole);
0059                 if (configDialog.currentWallpaper === pluginName) {
0060                     wallpaperComboBox.currentIndex = i
0061                     wallpaperComboBox.activated(i);
0062                     break;
0063                 }
0064             }
0065         }
0066 
0067         Kirigami.InlineMessage {
0068             visible: Plasmoid.immutable || animating
0069             text: i18nd("plasma_shell_org.kde.plasma.desktop", "Layout changes have been restricted by the system administrator")
0070             showCloseButton: true
0071             Layout.fillWidth: true
0072             Layout.leftMargin: Kirigami.Units.smallSpacing
0073             Layout.rightMargin: Kirigami.Units.smallSpacing
0074             Layout.bottomMargin: Kirigami.Units.smallSpacing * 2 // we need this because ColumnLayout's spacing is 0
0075         }
0076 
0077         Kirigami.FormLayout {
0078             id: parentLayout // needed for twinFormLayouts to work in wallpaper plugins
0079             twinFormLayouts: main.currentItem.formLayout || []
0080             Layout.fillWidth: true
0081             QQC2.ComboBox {
0082                 id: pluginComboBox
0083                 Layout.preferredWidth: Math.max(implicitWidth, wallpaperComboBox.implicitWidth)
0084                 Kirigami.FormData.label: i18nd("plasma_shell_org.kde.plasma.desktop", "Layout:")
0085                 enabled: !Plasmoid.immutable
0086                 model: configDialog.containmentPluginsConfigModel
0087                 textRole: "name"
0088                 onActivated: {
0089                     var model = configDialog.containmentPluginsConfigModel.get(currentIndex)
0090                     appearanceRoot.containmentPlugin = model.pluginName
0091                     appearanceRoot.configurationChanged()
0092                 }
0093             }
0094 
0095             RowLayout {
0096                 Layout.fillWidth: true
0097                 enabled: main.currentItem.objectName !== "switchContainmentWarningItem"
0098                 Kirigami.FormData.label: i18nd("plasma_shell_org.kde.plasma.desktop", "Wallpaper type:")
0099 
0100                 QQC2.ComboBox {
0101                     id: wallpaperComboBox
0102                     Layout.preferredWidth: Math.max(implicitWidth, pluginComboBox.implicitWidth)
0103                     model: configDialog.wallpaperConfigModel
0104                     textRole: "name"
0105                     onActivated: {
0106                         var idx = configDialog.wallpaperConfigModel.index(currentIndex, 0)
0107                         var pluginName = configDialog.wallpaperConfigModel.data(idx, ConfigModel.PluginNameRole)
0108                         if (appearanceRoot.currentWallpaper === pluginName) {
0109                             return;
0110                         }
0111                         appearanceRoot.currentWallpaper = pluginName
0112                         configDialog.currentWallpaper = pluginName
0113                         main.sourceFile = configDialog.wallpaperConfigModel.data(idx, ConfigModel.SourceRole)
0114                         appearanceRoot.configurationChanged()
0115                     }
0116                 }
0117                 NewStuff.Button {
0118                     configFile: "wallpaperplugin.knsrc"
0119                     text: i18nd("plasma_shell_org.kde.plasma.desktop", "Get New Plugins…")
0120                     visibleWhenDisabled: true // don't hide on disabled
0121                     Layout.preferredHeight: wallpaperComboBox.height
0122                 }
0123             }
0124         }
0125 
0126         Item {
0127             id: emptyConfig
0128         }
0129 
0130         QQC2.StackView {
0131             id: main
0132 
0133             implicitHeight: main.empty ? 0 : currentItem.implicitHeight
0134 
0135             Layout.fillHeight: true;
0136             Layout.fillWidth: true;
0137 
0138             // Bug 360862: if wallpaper has no config, sourceFile will be ""
0139             // so we wouldn't load emptyConfig and break all over the place
0140             // hence set it to some random value initially
0141             property string sourceFile: "tbd"
0142 
0143             onSourceFileChanged: loadSourceFile()
0144 
0145             function loadSourceFile() {
0146                 const wallpaperConfig = configDialog.wallpaperConfiguration
0147                 // BUG 407619: wallpaperConfig can be null before calling `ContainmentItem::loadWallpaper()`
0148                 if (wallpaperConfig && sourceFile) {
0149                     var props = {
0150                         "configDialog": configDialog
0151                     }
0152 
0153                     for (var key in wallpaperConfig) {
0154                         props["cfg_" + key] = wallpaperConfig[key]
0155                     }
0156 
0157                     var newItem = replace(Qt.resolvedUrl(sourceFile), props)
0158 
0159                     for (var key in wallpaperConfig) {
0160                         var changedSignal = newItem["cfg_" + key + "Changed"]
0161                         if (changedSignal) {
0162                             changedSignal.connect(appearanceRoot.configurationChanged)
0163                         }
0164                     }
0165 
0166                     const configurationChangedSignal = newItem.configurationChanged
0167                     if (configurationChangedSignal) {
0168                         configurationChangedSignal.connect(appearanceRoot.configurationChanged)
0169                     }
0170                 } else {
0171                     replace(emptyConfig)
0172                 }
0173             }
0174         }
0175     }
0176 
0177     Component {
0178         id: switchContainmentWarning
0179 
0180         Item {
0181             objectName: "switchContainmentWarningItem"
0182 
0183             Kirigami.PlaceholderMessage {
0184                 id: message
0185                 width: parent.width - Kirigami.Units.largeSpacing * 8
0186                 anchors.centerIn: parent
0187 
0188                 icon.name: "documentinfo"
0189                 text: i18nd("plasma_shell_org.kde.plasma.desktop", "Layout changes must be applied before other changes can be made")
0190 
0191                 helpfulAction: QQC2.Action {
0192                     icon.name: "dialog-ok-apply"
0193                     text: i18nd("plasma_shell_org.kde.plasma.desktop", "Apply Now")
0194                     onTriggered: saveConfig()
0195                 }
0196             }
0197         }
0198     }
0199 
0200     onContainmentPluginChanged: {
0201         if (configDialog.containmentPlugin !== appearanceRoot.containmentPlugin) {
0202             main.push(switchContainmentWarning);
0203             categoriesScroll.enabled = false;
0204         } else if (main.currentItem.objectName === "switchContainmentWarningItem") {
0205             main.pop();
0206             categoriesScroll.enabled = true;
0207         }
0208     }
0209 }