/* SPDX-FileCopyrightText: 2013 Marco Martin SPDX-License-Identifier: GPL-2.0-or-later */ import QtQuick 2.15 import org.kde.plasma.configuration 2.0 import QtQuick.Controls 2.3 as QQC2 import QtQuick.Layouts 1.1 import QtQml 2.15 import org.kde.newstuff 1.62 as NewStuff import org.kde.kirigami 2.20 as Kirigami import org.kde.kcmutils import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.configuration 2.0 Item { id: appearanceRoot signal configurationChanged property int formAlignment: wallpaperComboBox.Kirigami.ScenePosition.x - appearanceRoot.Kirigami.ScenePosition.x + Kirigami.Units.smallSpacing property string currentWallpaper: "" property string containmentPlugin: "" property alias parentLayout: parentLayout function saveConfig() { if (main.currentItem.saveConfig) { main.currentItem.saveConfig() } configDialog.currentWallpaper = appearanceRoot.currentWallpaper; for (var key in configDialog.wallpaperConfiguration) { if (main.currentItem["cfg_"+key] !== undefined) { configDialog.wallpaperConfiguration[key] = main.currentItem["cfg_"+key] } } configDialog.applyWallpaper() configDialog.containmentPlugin = appearanceRoot.containmentPlugin } ColumnLayout { width: root.availableWidth height: Math.max(implicitHeight, root.availableHeight) spacing: 0 // unless it's 0 there will be an additional gap between two FormLayouts Component.onCompleted: { for (var i = 0; i < configDialog.containmentPluginsConfigModel.count; ++i) { var pluginName = configDialog.containmentPluginsConfigModel.data(configDialog.containmentPluginsConfigModel.index(i, 0), ConfigModel.PluginNameRole); if (configDialog.containmentPlugin === pluginName) { pluginComboBox.currentIndex = i pluginComboBox.activated(i); break; } } for (var i = 0; i < configDialog.wallpaperConfigModel.count; ++i) { var pluginName = configDialog.wallpaperConfigModel.data(configDialog.wallpaperConfigModel.index(i, 0), ConfigModel.PluginNameRole); if (configDialog.currentWallpaper === pluginName) { wallpaperComboBox.currentIndex = i wallpaperComboBox.activated(i); break; } } } Kirigami.InlineMessage { visible: Plasmoid.immutable || animating text: i18nd("plasma_shell_org.kde.plasma.desktop", "Layout changes have been restricted by the system administrator") showCloseButton: true Layout.fillWidth: true Layout.leftMargin: Kirigami.Units.smallSpacing Layout.rightMargin: Kirigami.Units.smallSpacing Layout.bottomMargin: Kirigami.Units.smallSpacing * 2 // we need this because ColumnLayout's spacing is 0 } Kirigami.FormLayout { id: parentLayout // needed for twinFormLayouts to work in wallpaper plugins twinFormLayouts: main.currentItem.formLayout || [] Layout.fillWidth: true QQC2.ComboBox { id: pluginComboBox Layout.preferredWidth: Math.max(implicitWidth, wallpaperComboBox.implicitWidth) Kirigami.FormData.label: i18nd("plasma_shell_org.kde.plasma.desktop", "Layout:") enabled: !Plasmoid.immutable model: configDialog.containmentPluginsConfigModel textRole: "name" onActivated: { var model = configDialog.containmentPluginsConfigModel.get(currentIndex) appearanceRoot.containmentPlugin = model.pluginName appearanceRoot.configurationChanged() } } RowLayout { Layout.fillWidth: true enabled: main.currentItem.objectName !== "switchContainmentWarningItem" Kirigami.FormData.label: i18nd("plasma_shell_org.kde.plasma.desktop", "Wallpaper type:") QQC2.ComboBox { id: wallpaperComboBox Layout.preferredWidth: Math.max(implicitWidth, pluginComboBox.implicitWidth) model: configDialog.wallpaperConfigModel textRole: "name" onActivated: { var idx = configDialog.wallpaperConfigModel.index(currentIndex, 0) var pluginName = configDialog.wallpaperConfigModel.data(idx, ConfigModel.PluginNameRole) if (appearanceRoot.currentWallpaper === pluginName) { return; } appearanceRoot.currentWallpaper = pluginName configDialog.currentWallpaper = pluginName main.sourceFile = configDialog.wallpaperConfigModel.data(idx, ConfigModel.SourceRole) appearanceRoot.configurationChanged() } } NewStuff.Button { configFile: "wallpaperplugin.knsrc" text: i18nd("plasma_shell_org.kde.plasma.desktop", "Get New Plugins…") visibleWhenDisabled: true // don't hide on disabled Layout.preferredHeight: wallpaperComboBox.height } } } Item { id: emptyConfig } QQC2.StackView { id: main implicitHeight: main.empty ? 0 : currentItem.implicitHeight Layout.fillHeight: true; Layout.fillWidth: true; // Bug 360862: if wallpaper has no config, sourceFile will be "" // so we wouldn't load emptyConfig and break all over the place // hence set it to some random value initially property string sourceFile: "tbd" onSourceFileChanged: loadSourceFile() function loadSourceFile() { const wallpaperConfig = configDialog.wallpaperConfiguration // BUG 407619: wallpaperConfig can be null before calling `ContainmentItem::loadWallpaper()` if (wallpaperConfig && sourceFile) { var props = { "configDialog": configDialog } for (var key in wallpaperConfig) { props["cfg_" + key] = wallpaperConfig[key] } var newItem = replace(Qt.resolvedUrl(sourceFile), props) for (var key in wallpaperConfig) { var changedSignal = newItem["cfg_" + key + "Changed"] if (changedSignal) { changedSignal.connect(appearanceRoot.configurationChanged) } } const configurationChangedSignal = newItem.configurationChanged if (configurationChangedSignal) { configurationChangedSignal.connect(appearanceRoot.configurationChanged) } } else { replace(emptyConfig) } } } Kirigami.Separator { Layout.fillWidth: true } } Component { id: switchContainmentWarning Item { objectName: "switchContainmentWarningItem" Kirigami.PlaceholderMessage { id: message width: parent.width - Kirigami.Units.largeSpacing * 8 anchors.centerIn: parent icon.name: "documentinfo" text: i18nd("plasma_shell_org.kde.plasma.desktop", "Layout changes must be applied before other changes can be made") helpfulAction: QQC2.Action { icon.name: "dialog-ok-apply" text: i18nd("plasma_shell_org.kde.plasma.desktop", "Apply Now") onTriggered: saveConfig() } } } } onContainmentPluginChanged: { if (configDialog.containmentPlugin !== appearanceRoot.containmentPlugin) { main.push(switchContainmentWarning); categoriesScroll.enabled = false; } else if (main.currentItem.objectName === "switchContainmentWarningItem") { main.pop(); categoriesScroll.enabled = true; } } }