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

0001 /*
0002     SPDX-FileCopyrightText: 2018 Tomaz Canabrava <tcanabrava@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 import QtCore 6.5
0008 import QtQuick 2.15
0009 import QtQuick.Layouts 1.1
0010 import QtQuick.Controls 2.15 as QQC2
0011 import QtQuick.Dialogs 6.3 as QtDialogs
0012 import org.kde.baloo.experimental 0.1 as Baloo
0013 import org.kde.kirigami 2.20 as Kirigami
0014 import org.kde.kcmutils as KCM
0015 
0016 KCM.ScrollViewKCM {
0017     id: root
0018 
0019     implicitWidth: Kirigami.Units.gridUnit * 42
0020     implicitHeight: Kirigami.Units.gridUnit * 25
0021 
0022     Baloo.Monitor {
0023         id: monitor
0024 
0025         readonly property bool currentlyIndexing: switch(state) {
0026             case Baloo.Global.FirstRun:
0027             case Baloo.Global.NewFiles:
0028             case Baloo.Global.ModifiedFiles:
0029             case Baloo.Global.XAttrFiles:
0030             case Baloo.Global.ContentIndexing:
0031             case Baloo.Global.UnindexedFileCheck:
0032             case Baloo.Global.StaleIndexEntriesClean:
0033                 return true;
0034             default:
0035                 return false;
0036         }
0037 
0038         readonly property int completionPercentage: Math.floor(filesIndexed / totalFiles * 100)
0039     }
0040 
0041     actions: [
0042         Kirigami.Action {
0043             icon.name: monitor.state !== Baloo.Global.Suspended ? "media-playback-pause" : "media-playback-start"
0044             text: monitor.state !== Baloo.Global.Suspended ? i18n("Pause Indexer") : i18n("Resume Indexer")
0045             visible: kcm.balooSettings.indexingEnabled
0046             onTriggered: monitor.toggleSuspendState()
0047         }
0048     ]
0049 
0050     header: Item {
0051         implicitHeight: headerColumn.implicitHeight + headerColumn.anchors.topMargin + Kirigami.Units.smallSpacing
0052 
0053         ColumnLayout {
0054             id: headerColumn
0055 
0056             anchors {
0057                 top: parent.top
0058                 topMargin: Kirigami.Units.largeSpacing
0059                 left: parent.left
0060                 leftMargin: Kirigami.Units.largeSpacing
0061                 right: parent.right
0062                 rightMargin: Kirigami.Units.largeSpacing
0063             }
0064 
0065             spacing: Kirigami.Units.smallSpacing
0066 
0067             Kirigami.InlineMessage {
0068                 Layout.fillWidth: true
0069                 visible: !fileSearchEnabled.checked && kcm.needsSave
0070                 type: Kirigami.MessageType.Warning
0071                 showCloseButton: true
0072                 text: i18n("This will disable file searching in KRunner and launcher menus, and remove extended metadata display from all KDE applications.");
0073             }
0074 
0075             Kirigami.InlineMessage {
0076                 id: indexingDisabledWarning
0077                 Layout.fillWidth: true
0078                 visible: !kcm.balooSettings.indexingEnabled && !kcm.needsSave && kcm.rawIndexFileSize() > 0
0079                 type: Kirigami.MessageType.Warning
0080                 showCloseButton: true
0081                 text: i18n("Do you want to delete the saved index data? %1 of space will be freed, but if indexing is re-enabled later, the entire index will have to be re-created from scratch. This may take some time, depending on how many files you have.", kcm.prettyIndexFileSize());
0082                 actions: Kirigami.Action {
0083                     text: i18n("Delete Index Data")
0084                     icon.name: "edit-delete"
0085                     onTriggered: {
0086                         kcm.deleteIndex();
0087                         indexingDisabledWarning.visible = false;
0088                     }
0089                 }
0090             }
0091 
0092             QQC2.Label {
0093                 text: i18n("File Search helps you quickly locate your files. You can choose which folders and what types of file data are indexed.")
0094                 textFormat: Text.PlainText
0095                 Layout.fillWidth: true
0096                 Layout.maximumWidth: Kirigami.Units.gridUnit * 24
0097                 Layout.alignment: Qt.AlignHCenter
0098                 Layout.bottomMargin: Kirigami.Units.largeSpacing
0099                 horizontalAlignment: Text.AlignHCenter
0100                 wrapMode: Text.WordWrap
0101             }
0102 
0103 
0104             Kirigami.FormLayout {
0105                 id: indexingForm
0106 
0107                 QQC2.CheckBox {
0108                     id: fileSearchEnabled
0109                     Kirigami.FormData.label: i18nc("@title:group", "File indexing:")
0110                     text: i18nc("@action:check", "Enabled")
0111                     checked: kcm.balooSettings.indexingEnabled
0112                     onCheckStateChanged: {
0113                         kcm.balooSettings.indexingEnabled = checked
0114                     }
0115 
0116                     KCM.SettingStateBinding {
0117                         configObject: kcm.balooSettings
0118                         settingName: "indexingEnabled"
0119                     }
0120                 }
0121 
0122                 // Current status
0123                 QQC2.Label {
0124                     Kirigami.FormData.label: i18nc("@label indexing status", "Status:")
0125                     Layout.fillWidth: true
0126                     leftPadding: fileSearchEnabled.indicator.width
0127                     visible: fileSearchEnabled.checked
0128                     text: i18nc("State and a percentage of progress", "%1, %2% complete", monitor.stateString, monitor.completionPercentage)
0129                     textFormat: Text.PlainText
0130                     elide: Text.ElideLeft
0131                 }
0132             }
0133 
0134             Item {
0135                 visible: fileBeingIndexed.visible
0136                 implicitHeight: Kirigami.Units.smallSpacing
0137             }
0138 
0139             // Current file being indexed
0140             QQC2.Label {
0141                 Layout.fillWidth: true
0142                 text: i18nc("@label file currently being indexed", "Currently indexing:")
0143                 textFormat: Text.PlainText
0144                 horizontalAlignment: Text.AlignHCenter
0145                 visible: fileBeingIndexed.visible
0146             }
0147 
0148             // File being indexed, if indexing
0149             Kirigami.SelectableLabel {
0150                 id: fileBeingIndexed
0151                 Layout.fillWidth: true
0152                 visible: fileSearchEnabled.checked && monitor.currentlyIndexing && monitor.completionPercentage !== 100 && monitor.filePath.length > 0
0153                 text: xi18nc("@info Currently Indexing", "<filename>%1</filename>", monitor.filePath)
0154             }
0155 
0156             Item {
0157                 implicitHeight: Kirigami.Units.smallSpacing
0158             }
0159 
0160             Kirigami.FormLayout {
0161                 twinFormLayouts: indexingForm
0162 
0163                 Layout.bottomMargin: Kirigami.Units.largeSpacing * 2
0164 
0165                 QQC2.ButtonGroup {
0166                     id: indexingStyleGroup
0167                 }
0168                 QQC2.RadioButton {
0169                     Kirigami.FormData.label: i18nc("@title:group", "Data to index:")
0170 
0171                     text: i18n("File names and contents")
0172                     checked: !kcm.balooSettings.onlyBasicIndexing
0173                     onToggled: kcm.balooSettings.onlyBasicIndexing = !checked
0174 
0175                     QQC2.ButtonGroup.group: indexingStyleGroup
0176 
0177                     KCM.SettingStateBinding {
0178                         configObject: kcm.balooSettings
0179                         settingName: "onlyBasicIndexing"
0180                         extraEnabledConditions: fileSearchEnabled.checked
0181                     }
0182                 }
0183                 QQC2.RadioButton {
0184                     text: i18n("File names only")
0185                     checked: kcm.balooSettings.onlyBasicIndexing
0186                     onToggled: kcm.balooSettings.onlyBasicIndexing = checked
0187 
0188                     QQC2.ButtonGroup.group: indexingStyleGroup
0189 
0190                     KCM.SettingStateBinding {
0191                         configObject: kcm.balooSettings
0192                         settingName: "onlyBasicIndexing"
0193                         extraEnabledConditions: fileSearchEnabled.checked
0194                     }
0195                 }
0196 
0197                 Item {
0198                     implicitHeight: Kirigami.Units.smallSpacing
0199                 }
0200 
0201                 QQC2.CheckBox {
0202                     id: indexHiddenFolders
0203                     text: i18n("Hidden files and folders")
0204                     checked: kcm.balooSettings.indexHiddenFolders
0205                     onCheckStateChanged: kcm.balooSettings.indexHiddenFolders = checked
0206 
0207                     KCM.SettingStateBinding {
0208                         configObject: kcm.balooSettings
0209                         settingName: "indexHiddenFolders"
0210                         extraEnabledConditions: fileSearchEnabled.checked
0211                     }
0212                 }
0213             }
0214         }
0215     }
0216 
0217     view: ListView {
0218         id: directoryConfigList
0219         enabled: fileSearchEnabled.checked
0220         clip: true
0221         currentIndex: -1
0222 
0223         model: kcm.filteredModel
0224         delegate: directoryConfigDelegate
0225 
0226         headerPositioning: ListView.OverlayHeader
0227         header: Kirigami.InlineViewHeader {
0228             width: directoryConfigList.width
0229             text: i18nc("@title:table Locations to include or exclude from indexing", "Locations")
0230             actions: [
0231                 Kirigami.Action {
0232                     text: i18nc("@action:button", "Start Indexing a Folder…")
0233                     icon.name: "list-add-symbolic"
0234                     onTriggered: {
0235                         fileDialogLoader.included = true
0236                         fileDialogLoader.active = true
0237                     }
0238                 },
0239                 Kirigami.Action {
0240                     text: i18nc("@action:button", "Stop Indexing a Folder…")
0241                     icon.name: "list-remove-symbolic"
0242                     onTriggered: {
0243                         fileDialogLoader.included = false
0244                         fileDialogLoader.active = true
0245                     }
0246                 }
0247             ]
0248         }
0249     }
0250 
0251     Component {
0252         id: directoryConfigDelegate
0253         QQC2.ItemDelegate {
0254             id: listItem
0255 
0256             // Store this as a property so we can access it within the combobox,
0257             // which also has a `model` property
0258             property var indexingModel: model
0259 
0260             width: directoryConfigList.width
0261 
0262             // There's no need for a list item to ever be selected
0263             down: false
0264             highlighted: false
0265             hoverEnabled: false
0266             // ... and because of that, use alternating backgrounds to visually
0267             // connect list items' left and right side content elements
0268             Kirigami.Theme.useAlternateBackgroundColor: true
0269 
0270             contentItem: RowLayout {
0271                 spacing: Kirigami.Units.smallSpacing
0272 
0273                 // The folder's icon
0274                 Kirigami.Icon {
0275                     source: indexingModel.decoration
0276 
0277                     Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium
0278                     Layout.preferredWidth: Layout.preferredHeight
0279                 }
0280 
0281                 // The folder's path
0282                 QQC2.Label {
0283                     text: indexingModel.folder
0284                     textFormat: Text.PlainText
0285                     elide: Text.ElideRight
0286 
0287                     Layout.fillWidth: true
0288                 }
0289 
0290                 // What kind of indexing to do for the folder
0291                 QQC2.ComboBox {
0292                     id: indexingOptionsCombobox
0293 
0294                     property bool indexingDisabled: !indexingModel.enableIndex
0295                     property bool fullContentIndexing: indexingModel.enableIndex
0296 
0297                     flat: true
0298 
0299                     model: [
0300                         i18n("Not indexed"),
0301                         i18n("Indexed"),
0302                     ]
0303 
0304                     // Intentionally not a simple ternary to facilitate adding
0305                     // more conditions in the future
0306                     currentIndex: {
0307                         if (indexingDisabled) return 0
0308                         if (fullContentIndexing) return 1
0309                     }
0310 
0311                     onActivated: {
0312                         // New value is "Not indexed"
0313                         if (indexingOptionsCombobox.currentIndex === 0 && fullContentIndexing) {
0314                             indexingModel.enableIndex = false
0315                         // New value is "Full content indexing"
0316                         } else if (indexingOptionsCombobox.currentIndex === 1 && indexingDisabled) {
0317                             indexingModel.enableIndex = true
0318                         }
0319                     }
0320                 }
0321 
0322                 // Delete button to remove this folder entry
0323                 QQC2.ToolButton {
0324                     enabled: model.deletable
0325 
0326                     icon.name: "edit-delete"
0327 
0328                     onClicked: kcm.filteredModel.removeFolder(index)
0329 
0330                     QQC2.ToolTip {
0331                         text: i18n("Delete entry")
0332                     }
0333                 }
0334             }
0335         }
0336     }
0337 
0338     Loader {
0339         id: fileDialogLoader
0340 
0341         property bool included: false
0342 
0343         active: false
0344 
0345         sourceComponent: QtDialogs.FolderDialog {
0346             title: fileDialogLoader.included ? i18n("Select a folder to include") : i18n("Select a folder to exclude")
0347             currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
0348 
0349             onAccepted: {
0350                 kcm.filteredModel.addFolder(selectedFolder, fileDialogLoader.included)
0351                 fileDialogLoader.active = false
0352             }
0353 
0354             onRejected: {
0355                 fileDialogLoader.active = false
0356             }
0357 
0358             Component.onCompleted: open()
0359         }
0360     }
0361 }