Warning, /plasma/plasma-systemmonitor/src/page/PageSortDialog.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * SPDX-FileCopyrightText: 2020 David Redondo <kde@david-redondo.de>
0003  * SPDX-FileCopyrightText: 2023 Nate Graham <nate@kde.org>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 import QtQuick
0009 import QtQuick.Controls
0010 import QtQuick.Layouts
0011 
0012 import org.kde.kirigami as Kirigami
0013 
0014 
0015 import org.kde.ksysguard.page as Page
0016 
0017 Kirigami.Dialog {
0018     id: dialog
0019 
0020     property alias model : sortModel.sourceModel
0021     property string startPage
0022     property string newStartPage
0023     property bool startPageWasChanged: false
0024 
0025     preferredWidth: parent ? parent.width * 0.5 : -1
0026     preferredHeight: parent ? parent.height * 0.5 : -1
0027 
0028     focus: true
0029 
0030     // We already have a cancel button in the footer
0031     showCloseButton: false
0032 
0033     standardButtons: Dialog.Ok | Dialog.Cancel
0034 
0035     onAboutToShow: {
0036         sortModel.sourceModel = model
0037     }
0038 
0039     onAccepted: {
0040         if (dialog.startPageWasChanged) {
0041             startPage = newStartPage;
0042         }
0043         sortModel.applyChangesToSourceModel()
0044     }
0045 
0046     ListView {
0047         id: pageList
0048 
0049         reuseItems: true
0050         clip: true
0051 
0052         model: Page.PageSortModel {
0053             id: sortModel
0054         }
0055         delegate: ItemDelegate {
0056             id: listItem
0057             readonly property string title: model ? model.title : ""
0058             //Using directly model.hidden below doesn't work for some reason
0059             readonly property bool hidden: model ? model.hidden : false
0060             readonly property var filesWritable: model ? model.filesWriteable : false
0061             readonly property bool shouldRemoveFiles: model ? model.shouldRemoveFiles : false
0062 
0063             width: pageList.width - pageList.leftMargin - pageList.rightMargin
0064 
0065             activeFocusOnTab: false
0066 
0067             // We don't want visual interactivity for the background
0068             highlighted: false
0069             hoverEnabled: false
0070             down: false
0071 
0072             contentItem: RowLayout {
0073                 spacing: Kirigami.Units.smallSpacing
0074 
0075                 Kirigami.ListItemDragHandle {
0076                     id: handle
0077                     Layout.fillHeight: true
0078                     Layout.rowSpan: 2
0079                     listItem: listItem
0080                     listView: pageList
0081                     onMoveRequested: (oldIndex, newIndex) => {
0082                         sortModel.move(oldIndex, newIndex)
0083                     }
0084                 }
0085                 CheckBox {
0086                     checked: !listItem.hidden
0087                     onToggled: pageList.model.setData(pageList.model.index(index, 0), !listItem.hidden, Page.PagesModel.HiddenRole)
0088                     ToolTip.text: listItem.hidden ? i18nc("@info:tooltip", "Show Page")
0089                                                     : i18nc("@info:tooltip", "Hide Page")
0090                     ToolTip.delay: Kirigami.Units.toolTipDelay
0091                     ToolTip.visible: hovered
0092                 }
0093                 Kirigami.Icon {
0094                     Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium
0095                     Layout.preferredHeight: Layout.preferredWidth
0096                     source: model ? model.icon : ""
0097                     opacity: listItem.hidden ? 0.3 : 1
0098                 }
0099                 ColumnLayout {
0100                     Layout.fillWidth: true
0101                     Layout.alignment: Qt.AlignVCenter
0102                     spacing: 0
0103                     Label {
0104                         Layout.fillWidth: true
0105                         text: listItem.title
0106                         opacity: listItem.hidden ? 0.3 : 1
0107                     }
0108                     Label {
0109                         id: subtitle
0110                         Layout.fillWidth: true
0111                         font: Kirigami.Theme.smallFont
0112                         opacity: 0.7
0113                         visible: text.length > 0
0114                     }
0115                 }
0116                 Button {
0117                     id: removeButton
0118                     onClicked: pageList.model.setData(pageList.model.index(index, 0), !listItem.shouldRemoveFiles, Page.PageSortModel.ShouldRemoveFilesRole)
0119                     ToolTip.delay: Kirigami.Units.toolTipDelay
0120                     ToolTip.visible: hovered
0121                 }
0122 
0123                 states: [
0124                     State {
0125                         name: "noChanges"
0126                         extend: "localChanges"
0127                         when: listItem.filesWritable == Page.PagesModel.NotWriteable
0128                         PropertyChanges {
0129                             target: removeButton;
0130                             enabled: false;
0131                         }
0132                     },
0133                     State {
0134                         name: "removeLocalChanges"
0135                         when:  listItem.filesWritable == Page.PagesModel.LocalChanges && listItem.shouldRemoveFiles
0136                         PropertyChanges {
0137                             target: removeButton
0138                             icon.name: "edit-redo"
0139                             ToolTip.text: i18nc("@info:tooltip", "Do not reset the page")
0140                         }
0141                         PropertyChanges {
0142                             target: subtitle
0143                             text: i18nc("@item:intable", "The page will be reset to its default state")
0144                         }
0145                     },
0146                     State {
0147                         name: "localChanges"
0148                         when: listItem.filesWritable == Page.PagesModel.LocalChanges
0149                         PropertyChanges {
0150                             target: removeButton
0151                             icon.name: "edit-reset"
0152                             ToolTip.text: i18nc("@info:tooltip", "Reset the page to its default state")
0153                         }
0154                     },
0155                     State {
0156                         name: "remove"
0157                         when: listItem.filesWritable == Page.PagesModel.AllWriteable && listItem.shouldRemoveFiles
0158                         PropertyChanges {
0159                             target: removeButton
0160                             icon.name: "edit-undo"
0161                             ToolTip.text: i18nc("@info:tooltip", "Do not remove this page")
0162                         }
0163                         PropertyChanges {
0164                             target: subtitle
0165                             text: i18nc("@item:intable", "The page will be removed")
0166                         }
0167                         PropertyChanges {
0168                             target: listItem
0169                             backgroundColor: Kirigami.Theme.negativeBackgroundColor
0170                         }
0171                     },
0172                     State {
0173                         name: "removeable"
0174                         when: listItem.filesWritable == Page.PagesModel.AllWriteable
0175                         PropertyChanges {
0176                             target: removeButton
0177                             icon.name: "edit-delete"
0178                             ToolTip.text: i18nc("@info:tooltip", "Remove this page")
0179                         }
0180                     }
0181                 ]
0182             }
0183         }
0184     }
0185 
0186     footerLeadingComponent: RowLayout {
0187         spacing: Kirigami.Units.smallSpacing
0188 
0189         Label {
0190             leftPadding: Kirigami.Units.largeSpacing
0191             text: i18nc("@label:listbox", "Start with:")
0192         }
0193         ComboBox {
0194             id: startPageBox
0195             textRole: "title"
0196             valueRole: "fileName"
0197             model: createModel()
0198 
0199             function createModel() {
0200                 var result = [{fileName: "", title: i18n("Last Visited Page"), icon: "clock"}];
0201                 for (var i = 0; i < sortModel.rowCount(); ++i) {
0202                     const index = sortModel.index(i, 0)
0203                     if (sortModel.data(index, Page.PagesModel.HiddenRole)) {
0204                         continue
0205                     }
0206                     if (sortModel.data(index, Page.PageSortModel.ShouldRemoveFilesRole)
0207                         && sortModel.data(index, Page.PagesModel.FilesWriteableRole) == Page.PagesModel.AllWriteable) {
0208                         continue
0209                     }
0210                     result.push({fileName: sortModel.data(index, Page.PagesModel.FileNameRole),
0211                                 title: sortModel.data(index, Page.PagesModel.TitleRole),
0212                                 icon: sortModel.data(index, Page.PagesModel.IconRole)})
0213                 }
0214                 return result
0215             }
0216 
0217             Connections {
0218                 target: sortModel
0219                 function onDataChanged() { refreshModel() }
0220                 function onRowsMoved() { refreshModel() }
0221                 function refreshModel() {
0222                     const value = startPageBox.currentValue
0223                     startPageBox.model = startPageBox.createModel()
0224                     startPageBox.currentIndex = startPageBox.indexOfValue(value)
0225                 }
0226             }
0227 
0228             delegate: ItemDelegate {
0229                 width: parent.width
0230                 highlighted: startPageBox.highlightedIndex == index
0231                 contentItem: RowLayout {
0232                     Kirigami.Icon {
0233                         color: highlighted ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor
0234                         source: modelData.icon
0235                         Layout.preferredHeight: Kirigami.Units.iconSizes.small
0236                         Layout.preferredWidth: Kirigami.Units.iconSizes.small
0237                     }
0238                     Label {
0239                         text: modelData.title
0240                         color: highlighted ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor
0241                         Layout.fillWidth: true
0242                     }
0243                 }
0244             }
0245 
0246             onActivated: {
0247                 dialog.startPageWasChanged = true;
0248                 dialog.newStartPage = currentValue;
0249             }
0250 
0251             Component.onCompleted: {
0252                 currentIndex = indexOfValue(startPage);
0253             }
0254         }
0255     }
0256 }