Warning, /plasma/plasma-workspace/kcms/wallpaper/ui/main.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
0003     SPDX-FileCopyrightText: 2014 Kai Uwe Broulik <kde@privat.broulik.de>
0004     SPDX-FileCopyrightText: 2019 David Redondo <kde@david-redondo.de>
0005     SPDX-FileCopyrightText: 2023 MĂ©ven Car <meven@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 import QtQuick
0011 import QtQuick.Controls as QQC2
0012 import QtQuick.Layouts
0013 import QtQml
0014 
0015 import org.kde.newstuff as NewStuff
0016 import org.kde.kirigami as Kirigami
0017 
0018 import org.kde.kcmutils as KCM
0019 
0020 import org.kde.plasma.kcm.wallpaper
0021 import org.kde.plasma.configuration 2.0
0022 
0023 KCM.SimpleKCM {
0024     id: appearanceRoot
0025     
0026     signal configurationChanged
0027     
0028     property alias parentLayout: parentLayout
0029     
0030     implicitWidth: Kirigami.Units.gridUnit * 15
0031     implicitHeight: Kirigami.Units.gridUnit * 30
0032 
0033     actions: [
0034         Kirigami.Action {
0035             id: allScreensAction
0036             text: i18nc("@option:check Set the wallpaper for all screens","Set for all screens")
0037             visible: kcm.screens.length > 1
0038             checkable: true
0039             checked: kcm.allScreens
0040             onTriggered: kcm.allScreens = checked
0041             displayComponent: QQC2.Switch {
0042                 text: allScreensAction.text
0043                 checked: allScreensAction.checked
0044                 visible: allScreensAction.visible
0045                 onToggled: allScreensAction.trigger()
0046             }
0047         }
0048     ]
0049     
0050     function onConfigurationChanged() {
0051         for (var key in kcm.configuration) {
0052             const cfgKey = "cfg_" + key;
0053             if (main.currentItem[cfgKey] !== undefined) {
0054                 kcm.configuration[key] = main.currentItem[cfgKey]
0055             }
0056         }
0057     }
0058 
0059     ColumnLayout {
0060         anchors.fill: parent
0061         
0062         ScreenView {
0063             visible: !kcm.allScreens && kcm.screens.length > 1
0064             
0065             Layout.fillWidth: true;
0066             implicitHeight: Kirigami.Units.gridUnit * 10
0067             
0068             outputs: kcm.screens
0069             selectedScreen: kcm.selectedScreen
0070             
0071             onScreenSelected: (screenName) => { kcm.setSelectedScreen(screenName) }
0072         }
0073 
0074         Kirigami.FormLayout {
0075             id: parentLayout // needed for twinFormLayouts to work in wallpaper plugins
0076             Layout.fillWidth: true
0077                     
0078             RowLayout {
0079                 Layout.fillWidth: true
0080                 Kirigami.FormData.label: i18nd("plasma_shell_org.kde.plasma.desktop", "Wallpaper type:")
0081 
0082                 QQC2.ComboBox {
0083                     id: wallpaperComboBox
0084                     model: kcm.wallpaperConfigModel
0085                     textRole: "name"
0086                     onActivated: {
0087                         var pluginName = kcm.wallpaperConfigModel.data(kcm.wallpaperConfigModel.index(currentIndex, 0), ConfigModel.PluginNameRole)
0088                         if (appearanceRoot.currentWallpaper === pluginName) {
0089                             return;
0090                         }
0091                         kcm.currentWallpaper = pluginName
0092                     }
0093                     
0094                     KCM.SettingHighlighter {
0095                         highlight: kcm.currentWallpaper !== "org.kde.image"
0096                     }
0097                 }
0098                 NewStuff.Button {
0099                     configFile: "wallpaperplugin.knsrc"
0100                     text: i18nd("plasma_shell_org.kde.plasma.desktop", "Get New Plugins…")
0101                     visibleWhenDisabled: true // don't hide on disabled
0102                     Layout.preferredHeight: wallpaperComboBox.height
0103                 }
0104             }
0105         }
0106         
0107         Item {
0108             id: emptyConfig
0109         }
0110         
0111         QQC2.StackView {
0112             id: main
0113 
0114             Layout.fillHeight: true;
0115             Layout.fillWidth: true;
0116                      
0117             Connections {
0118                 target: kcm
0119                 function onCurrentWallpaperChanged () { main.loadSourceFile() }
0120                 function onSelectedScreenChanged () { main.onScreenChanged() }
0121                 
0122                 function onConfigurationChanged() { main.onWallpaperConfigurationChanged() }
0123 
0124                 function onSettingsSaved() { main.currentItem.saveConfig(); }
0125             }
0126             
0127             function onWallpaperConfigurationChanged() {
0128                 let wallpaperConfig = kcm.configuration
0129                 wallpaperConfig.keys().forEach(key => {
0130                     const cfgKey = "cfg_" + key;
0131                     if (cfgKey in main.currentItem) {
0132                         
0133                         var changedSignal = main.currentItem[cfgKey + "Changed"]
0134                         if (changedSignal) {
0135                             changedSignal.disconnect(appearanceRoot.onConfigurationChanged);
0136                         }
0137                         main.currentItem[cfgKey] = wallpaperConfig[key];
0138                         
0139                         changedSignal = main.currentItem[cfgKey + "Changed"]
0140                         if (changedSignal) {
0141                             changedSignal.connect(appearanceRoot.onConfigurationChanged)
0142                         }
0143                     }                    
0144                 })
0145             }                
0146             
0147             function onScreenChanged() {
0148                 if (!main.currentItem) {
0149                     main.loadSourceFile();
0150                     return ;
0151                 }
0152                 main.currentItem.screen = kcm.selectedScreen;
0153             }
0154             
0155             function loadSourceFile() {
0156                 for (var i = 0; i < kcm.wallpaperConfigModel.count; ++i) {
0157                     var pluginName = kcm.wallpaperConfigModel.data(kcm.wallpaperConfigModel.index(i, 0), ConfigModel.PluginNameRole)
0158                     if (kcm.currentWallpaper === pluginName) {
0159                         wallpaperComboBox.currentIndex = i;
0160                         break;
0161                     }
0162                 }
0163                 
0164                 const wallpaperConfig = kcm.configuration;
0165                 const wallpaperPluginSource = kcm.wallpaperPluginSource
0166                 // BUG 407619: wallpaperConfig can be null before calling `ContainmentItem::loadWallpaper()`
0167                 if (wallpaperConfig && wallpaperPluginSource) {
0168                     var props = {
0169                         "configDialog": kcm,
0170                         "screen": kcm.selectedScreen,
0171                         "wallpaperConfiguration": wallpaperConfig
0172                     };
0173                                             
0174                     wallpaperConfig.keys().forEach(key => {
0175                         // Preview is not part of the config, only of the WallpaperObject
0176                         if (!key.startsWith("Preview")) {
0177                             props["cfg_" + key] = wallpaperConfig[key];
0178                         }
0179                     });
0180                     
0181                     var newItem = replace(Qt.resolvedUrl(wallpaperPluginSource), props)
0182                         
0183                     wallpaperConfig.keys().forEach(key => {
0184                         const cfgKey = "cfg_" + key;
0185                         if (cfgKey in main.currentItem) {
0186                             var changedSignal = main.currentItem[cfgKey + "Changed"]
0187                             if (changedSignal) {
0188                                 changedSignal.connect(appearanceRoot.onConfigurationChanged)
0189                             }
0190                         }
0191                     });
0192 
0193                     const configurationChangedSignal = newItem.configurationChanged
0194                     if (configurationChangedSignal) {
0195                         configurationChangedSignal.connect(appearanceRoot.onConfigurationChanged)
0196                     }
0197                 } else {
0198                     replace(emptyConfig)
0199                 }
0200             }
0201         }
0202     }
0203     
0204 }