Warning, /frameworks/kcmutils/src/qml/components/PluginSelector.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2022 Alexander Lohnau <alexander.lohnau@gmx.de>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 import QtQuick
0007 import QtQuick.Controls 2.5 as QQC2
0008 import QtQuick.Layouts 1.1
0009 
0010 import org.kde.kirigami 2.19 as Kirigami
0011 
0012 import org.kde.kcmutils.private as KCMUtilsPrivate
0013 import "private" as Private
0014 
0015 /**
0016  * ListView for showing plugins with their info and configuration.
0017  * If extra butons should be added, a custom KPluginDelegate with the additionalActions
0018  * property should be defined.
0019  *
0020  * @since 6.0, this got renamed from KPluginSelector to PluginSelector
0021  */
0022 ListView {
0023     id: pluginSelector
0024     // KPluginModel which contains the plugins that should be displayed
0025     required property QtObject sourceModel
0026     // Query that is typed into the search field. Ideally, this is part of the KCM header
0027     property var query
0028 
0029     clip: true
0030 
0031     // Don't select anything by default as selection is not used here
0032     currentIndex: -1
0033 
0034     model: KCMUtilsPrivate.ProxyModel {
0035         id: proxyModel
0036         model: pluginSelector.sourceModel
0037         query: pluginSelector.query ?? ""
0038     }
0039 
0040     delegate: PluginDelegate {
0041     }
0042 
0043     section.property: "category"
0044     section.delegate: Kirigami.ListSectionHeader {
0045         width: pluginSelector.width
0046         text: section
0047     }
0048 
0049     Kirigami.OverlaySheet {
0050         id: internalAboutDialog
0051         parent: pluginSelector.Window.window?.contentItem ?? null
0052         property var metaDataInfo
0053 
0054         Loader {
0055             active: internalAboutDialog.metaDataInfo !== undefined
0056             sourceComponent: ColumnLayout {
0057                 Private.AboutPlugin {
0058                     metaData: internalAboutDialog.metaDataInfo
0059                     Layout.maximumWidth: Math.min(Kirigami.Units.gridUnit * 30, Math.round(pluginSelector.width * 0.8))
0060                 }
0061             }
0062         }
0063     }
0064     // Only for internal usage in KPluginDelegate!
0065     property var __aboutDialog: internalAboutDialog
0066 
0067     Loader {
0068         anchors.centerIn: parent
0069         width: parent.width - (Kirigami.Units.gridUnit * 8)
0070         active: pluginSelector.count === 0 && !startupTimer.running
0071         opacity: active && status === Loader.Ready ? 1 : 0
0072         visible: opacity > 0
0073         Behavior on opacity {
0074             OpacityAnimator {
0075                 duration: Kirigami.Units.longDuration
0076                 easing.type: Easing.InOutQuad
0077             }
0078         }
0079         sourceComponent: Kirigami.PlaceholderMessage {
0080             icon.name: "edit-none"
0081             text: pluginSelector.query && pluginSelector.query.length > 0 ? i18n("No matches") : i18n("No plugins found")
0082         }
0083     }
0084 
0085     // The view can take a bit of time to initialize itself when the KCM first
0086     // loads, during which time count is 0, which would cause the placeholder
0087     // message to appear for a moment and then disappear. To prevent this, let's
0088     // suppress it appearing for a moment after the KCM loads.
0089     Timer {
0090         id: startupTimer
0091         interval: Kirigami.Units.humanMoment
0092         running: false
0093     }
0094     Component.onCompleted: {
0095         startupTimer.start()
0096     }
0097 }