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

0001 /*
0002     SPDX-FileCopyrightText: 2014 Marco Martin <mart@kde.org>
0003     SPDX-FileCopyrightText: 2016 David Rosca <nowrep@gmail.com>
0004     SPDX-FileCopyrightText: 2018 Kai Uwe Broulik <kde@privat.broulik.de>
0005     SPDX-FileCopyrightText: 2019 Kevin Ottens <kevin.ottens@enioka.com>
0006 
0007     SPDX-License-Identifier: LGPL-2.0-only
0008 */
0009 
0010 import QtCore
0011 import QtQuick 2.1
0012 import QtQuick.Layouts 1.1
0013 import QtQuick.Dialogs 6.3
0014 import QtQuick.Controls 2.3 as QtControls
0015 import QtQml 2.15
0016 
0017 import org.kde.kirigami 2.8 as Kirigami
0018 import org.kde.newstuff 1.81 as NewStuff
0019 import org.kde.kcmutils as KCM
0020 import org.kde.private.kcms.desktoptheme 1.0 as Private
0021 
0022 
0023 KCM.GridViewKCM {
0024     id: root
0025 
0026     view.model: kcm.filteredModel
0027     view.currentIndex: kcm.filteredModel.selectedThemeIndex
0028 
0029     Binding {
0030         target: kcm.filteredModel
0031         property: "query"
0032         value: searchField.text
0033         restoreMode: Binding.RestoreBinding
0034     }
0035 
0036     Binding {
0037         target: kcm.filteredModel
0038         property: "filter"
0039         value:  filterCombo.model[filterCombo.currentIndex].filter
0040         restoreMode: Binding.RestoreBinding
0041     }
0042 
0043     KCM.SettingStateBinding {
0044         configObject: kcm.desktopThemeSettings
0045         settingName: "name"
0046         extraEnabledConditions: !kcm.downloadingFile
0047     }
0048 
0049     DropArea {
0050         anchors.fill: parent
0051         onEntered: {
0052             if (!drag.hasUrls) {
0053                 drag.accepted = false;
0054             }
0055         }
0056         onDropped: kcm.installThemeFromFile(drop.urls[0])
0057     }
0058      header: RowLayout {
0059         Layout.fillWidth: true
0060 
0061         Kirigami.SearchField {
0062             id: searchField
0063             Layout.fillWidth: true
0064         }
0065         QtControls.ComboBox {
0066             id: filterCombo
0067             textRole: "text"
0068             model: [
0069                 {text: i18n("All Themes"), filter: Private.FilterProxyModel.AllThemes},
0070                 {text: i18n("Light Themes"), filter: Private.FilterProxyModel.LightThemes},
0071                 {text: i18n("Dark Themes"), filter: Private.FilterProxyModel.DarkThemes},
0072                 {text: i18n("Color scheme compatible"), filter: Private.FilterProxyModel.ThemesFollowingColors}
0073             ]
0074 
0075             // HACK QQC2 doesn't support icons, so we just tamper with the desktop style ComboBox's background
0076             // and inject a nice little filter icon.
0077             Component.onCompleted: {
0078                 if (!background || !background.hasOwnProperty("properties")) {
0079                     // not a KQuickStyleItem
0080                     return;
0081                 }
0082 
0083                 var props = background.properties || {};
0084 
0085                 background.properties = Qt.binding(function() {
0086                     var newProps = props;
0087                     newProps.currentIcon = "view-filter";
0088                     newProps.iconColor = Kirigami.Theme.textColor;
0089                     return newProps;
0090                 });
0091             }
0092         }
0093     }
0094 
0095     actions: [
0096         Kirigami.Action {
0097             text: i18n("Install from File…")
0098             icon.name: "document-import"
0099             onTriggered: fileDialogLoader.active = true
0100         },
0101         NewStuff.Action {
0102             text: i18n("Get New…")
0103             configFile: "plasma-themes.knsrc"
0104             onEntryEvent: function (entry, event) {
0105                 kcm.load();
0106             }
0107         }
0108     ]
0109 
0110     view.delegate: KCM.GridDelegate {
0111         id: delegate
0112 
0113         text: model.display
0114         subtitle: model.colorType == Private.ThemesModel.FollowsColorTheme
0115             && view.model.filter != Private.FilterProxyModel.ThemesFollowingColors ? i18n("Follows color scheme") : ""
0116         toolTip: model.description || model.display
0117 
0118         opacity: model.pendingDeletion ? 0.3 : 1
0119         Behavior on opacity {
0120             NumberAnimation { duration: Kirigami.Units.longDuration }
0121         }
0122 
0123         thumbnailAvailable: true
0124         thumbnail: ThemePreview {
0125             id: preview
0126             anchors.fill: parent
0127             themeName: model.pluginName
0128         }
0129 
0130         actions: [
0131             Kirigami.Action {
0132                 icon.name: "document-edit"
0133                 tooltip: i18n("Edit Theme…")
0134                 enabled: !model.pendingDeletion
0135                 visible: kcm.canEditThemes
0136                 onTriggered: kcm.editTheme(model.pluginName)
0137             },
0138             Kirigami.Action {
0139                 icon.name: "edit-delete"
0140                 tooltip: i18n("Remove Theme")
0141                 enabled: model.isLocal
0142                 visible: !model.pendingDeletion
0143                 onTriggered: model.pendingDeletion = true;
0144             },
0145             Kirigami.Action {
0146                 icon.name: "edit-undo"
0147                 tooltip: i18n("Restore Theme")
0148                 visible: model.pendingDeletion
0149                 onTriggered: model.pendingDeletion = false;
0150             }
0151         ]
0152 
0153         onClicked: {
0154             kcm.desktopThemeSettings.name = model.pluginName;
0155             view.forceActiveFocus();
0156         }
0157         onDoubleClicked: {
0158             kcm.save();
0159         }
0160     }
0161 
0162     footer: ColumnLayout {
0163         Kirigami.InlineMessage {
0164             id: infoLabel
0165             Layout.fillWidth: true
0166 
0167             showCloseButton: true
0168 
0169             Connections {
0170                 target: kcm
0171                 function onShowSuccessMessage(message) {
0172                     infoLabel.type = Kirigami.MessageType.Positive;
0173                     infoLabel.text = message;
0174                     infoLabel.visible = true;
0175                 }
0176                 function onShowErrorMessage(message) {
0177                     infoLabel.type = Kirigami.MessageType.Error;
0178                     infoLabel.text = message;
0179                     infoLabel.visible = true;
0180                 }
0181             }
0182         }
0183     }
0184 
0185     Loader {
0186         id: fileDialogLoader
0187         active: false
0188         sourceComponent: FileDialog {
0189             title: i18n("Open Theme")
0190             currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
0191             nameFilters: [ i18n("Theme Files (*.zip *.tar.gz *.tar.bz2)") ]
0192             Component.onCompleted: open()
0193             onAccepted: {
0194                 kcm.installThemeFromFile(selectedFile)
0195                 fileDialogLoader.active = false
0196             }
0197             onRejected: {
0198                 fileDialogLoader.active = false
0199             }
0200         }
0201     }
0202 }