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

0001 /*
0002     SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 import QtCore
0008 import QtQuick 2.7
0009 import QtQuick.Window 2.2 // for Screen
0010 import QtQuick.Layouts 1.1
0011 import QtQuick.Controls 2.2 as QtControls
0012 import QtQuick.Dialogs 6.3 as QtDialogs
0013 import org.kde.kirigami 2.5 as Kirigami
0014 import org.kde.kwindowsystem 1.0 // for isPlatformWayland
0015 import org.kde.newstuff 1.91 as NewStuff
0016 import org.kde.kcmutils as KCM
0017 
0018 import org.kde.private.kcm_cursortheme 1.0
0019 
0020 KCM.GridViewKCM {
0021     id: root
0022 
0023     property LaunchFeedbackDialog launchFeedbackDialog: null as LaunchFeedbackDialog
0024 
0025     view.model: kcm.cursorsModel
0026     view.delegate: Delegate {}
0027     view.currentIndex: kcm.cursorThemeIndex(kcm.cursorThemeSettings.cursorTheme);
0028 
0029     view.onCurrentIndexChanged: {
0030         kcm.cursorThemeSettings.cursorTheme = kcm.cursorThemeFromIndex(view.currentIndex)
0031         view.positionViewAtIndex(view.currentIndex, view.GridView.Beginning);
0032     }
0033 
0034     Component.onCompleted: {
0035         view.positionViewAtIndex(view.currentIndex, GridView.Beginning);
0036     }
0037 
0038     KCM.SettingStateBinding {
0039         configObject: kcm.cursorThemeSettings
0040         settingName: "cursorTheme"
0041         extraEnabledConditions: !kcm.downloadingFile
0042     }
0043 
0044     DropArea {
0045         anchors.fill: parent
0046         onEntered: {
0047             if (!drag.hasUrls) {
0048                 drag.accepted = false;
0049             }
0050         }
0051         onDropped: kcm.installThemeFromFile(drop.urls[0])
0052     }
0053 
0054     actions: [
0055         Kirigami.Action {
0056             displayComponent: QtControls.ComboBox {
0057                 id: sizeCombo
0058 
0059                 property int maxContentWidth: implicitContentWidth
0060                 popup.width: Math.max(availableWidth, maxContentWidth)
0061 
0062                 model: kcm.sizesModel
0063                 textRole: "display"
0064                 displayText: i18n("Size: %1", currentText)
0065                 currentIndex: kcm.cursorSizeIndex(kcm.cursorThemeSettings.cursorSize);
0066                 onActivated: {
0067                     kcm.cursorThemeSettings.cursorSize = kcm.cursorSizeFromIndex(sizeCombo.currentIndex);
0068                     kcm.preferredSize = kcm.cursorSizeFromIndex(sizeCombo.currentIndex);
0069                 }
0070                 flat: true
0071 
0072                 KCM.SettingStateBinding {
0073                 configObject: kcm.cursorThemeSettings
0074                     settingName: "cursorSize"
0075                     extraEnabledConditions: kcm.canResize
0076                 }
0077 
0078                 delegate: QtControls.ItemDelegate {
0079                     id: sizeComboDelegate
0080 
0081                     readonly property int size: parseInt(model.display)
0082 
0083                     width: parent.width
0084                     highlighted: ListView.isCurrentItem
0085 
0086                     contentItem: RowLayout {
0087                         Kirigami.Icon {
0088                             source: model.decoration
0089                             smooth: true
0090                             // On wayland the cursor size is logical pixels, and on X11 it's physical pixels.
0091                             property real devicePixelRatio: KWindowSystem.isPlatformWayland ? 1 : Screen.devicePixelRatio
0092                             property size iconSize: kcm.iconSizeFromIndex(index)
0093                             Layout.preferredWidth: iconSize.width / devicePixelRatio
0094                             Layout.preferredHeight: iconSize.height / devicePixelRatio
0095                             visible: valid && sizeComboDelegate.size > 0
0096                             roundToIconSize: false
0097                         }
0098 
0099                         QtControls.Label {
0100                             Layout.alignment: Qt.AlignRight
0101                             color: sizeComboDelegate.highlighted ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor
0102                             text: i18n("Size: %1", model[sizeCombo.textRole])
0103                             textFormat: Text.PlainText
0104                             elide: Text.ElideRight
0105                         }
0106                     }
0107                     Binding {
0108                         target: sizeCombo
0109                         property: "maxContentWidth"
0110                         value: implicitWidth
0111                         when: index == sizeCombo.count - 1
0112                     }
0113                 }
0114             }
0115         },
0116         Kirigami.Action {
0117             text: i18nc("@action:button", "&Configure Launch Feedback…")
0118             icon.name: "preferences-desktop-launch-feedback"
0119             onTriggered: {
0120                 if (root.launchFeedbackDialog === null) {
0121                     const component = Qt.createComponent("LaunchFeedbackDialog.qml");
0122                     root.launchFeedbackDialog = component.createObject(root, {
0123                         "parent": root,
0124                     });
0125                     component.destroy();
0126                 }
0127                 root.launchFeedbackDialog.open();
0128             }
0129         },
0130         Kirigami.Action {
0131             text: i18n("&Install from File…")
0132             icon.name: "document-import"
0133             onTriggered: fileDialogLoader.active = true
0134             enabled: kcm.canInstall
0135         },
0136         NewStuff.Action {
0137             text: i18n("&Get New…")
0138             configFile: "xcursor.knsrc"
0139             onEntryEvent: function (entry, event) {
0140                 if (event == NewStuff.Entry.StatusChangedEvent) {
0141                     kcm.ghnsEntryChanged(entry);
0142                 }
0143             }
0144         }
0145     ]
0146 
0147     footer: ColumnLayout {
0148         id: footerLayout
0149 
0150         Kirigami.InlineMessage {
0151             id: infoLabel
0152             Layout.fillWidth: true
0153 
0154             showCloseButton: true
0155 
0156             Connections {
0157                 target: kcm
0158                 function onShowSuccessMessage(message) {
0159                     infoLabel.type = Kirigami.MessageType.Positive;
0160                     infoLabel.text = message;
0161                     infoLabel.visible = true;
0162                 }
0163                 function onShowInfoMessage(message) {
0164                     infoLabel.type = Kirigami.MessageType.Information;
0165                     infoLabel.text = message;
0166                     infoLabel.visible = true;
0167                 }
0168                 function onShowErrorMessage(message) {
0169                     infoLabel.type = Kirigami.MessageType.Error;
0170                     infoLabel.text = message;
0171                     infoLabel.visible = true;
0172                 }
0173             }
0174         }
0175     }
0176 
0177     Loader {
0178         id: fileDialogLoader
0179         active: false
0180         sourceComponent: QtDialogs.FileDialog {
0181             title: i18n("Open Theme")
0182             currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
0183             nameFilters: [ i18n("Cursor Theme Files (*.tar.gz *.tar.bz2)") ]
0184             Component.onCompleted: open()
0185             onAccepted: {
0186                 kcm.installThemeFromFile(selectedFile)
0187                 fileDialogLoader.active = false
0188             }
0189             onRejected: {
0190                 fileDialogLoader.active = false
0191             }
0192         }
0193     }
0194 }
0195