Warning, /plasma/plasma-desktop/desktoppackage/contents/explorer/WidgetExplorer.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 import QtQuick 2.7
0008 import QtQuick.Controls 2.5 as QQC2
0009 
0010 import org.kde.plasma.components 3.0 as PC3
0011 import org.kde.plasma.core as PlasmaCore
0012 import org.kde.plasma.extras 2.0 as PlasmaExtras
0013 import org.kde.kquickcontrolsaddons 2.0
0014 import org.kde.kwindowsystem 1.0
0015 import org.kde.kirigami 2.20 as Kirigami
0016 
0017 import QtQuick.Window 2.1
0018 import QtQuick.Layouts 1.1
0019 
0020 import org.kde.plasma.private.shell 2.0
0021 
0022 PC3.Page {
0023     id: main
0024 
0025     width: Math.max(heading.paintedWidth, Kirigami.Units.iconSizes.enormous * 3 + Kirigami.Units.smallSpacing * 4 + Kirigami.Units.gridUnit * 2)
0026     height: 800//Screen.height
0027 
0028     opacity: draggingWidget ? 0.3 : 1
0029 
0030     property QtObject containment
0031 
0032     property PlasmaCore.Dialog sidePanel
0033 
0034     //external drop events can cause a raise event causing us to lose focus and
0035     //therefore get deleted whilst we are still in a drag exec()
0036     //this is a clue to the owning dialog that hideOnWindowDeactivate should be deleted
0037     //See https://bugs.kde.org/show_bug.cgi?id=332733
0038     property bool preventWindowHide: draggingWidget || categoriesDialog.status !== PlasmaExtras.Menu.Closed
0039                                   || getWidgetsDialog.status !== PlasmaExtras.Menu.Closed
0040 
0041     property bool outputOnly: draggingWidget
0042 
0043     property Item categoryButton
0044 
0045     property bool draggingWidget: false
0046 
0047     signal closed()
0048 
0049     onVisibleChanged: {
0050         if (!visible) {
0051             KWindowSystem.showingDesktop = false
0052         }
0053     }
0054 
0055     Component.onCompleted: {
0056         if (!root.widgetExplorer) {
0057             root.widgetExplorer = widgetExplorerComponent.createObject(root)
0058         }
0059         root.widgetExplorer.containment = main.containment
0060     }
0061 
0062     Component.onDestruction: {
0063         if (pendingUninstallTimer.running) {
0064             // we're not being destroyed so at least reset the filters
0065             widgetExplorer.widgetsModel.filterQuery = ""
0066             widgetExplorer.widgetsModel.filterType = ""
0067             widgetExplorer.widgetsModel.searchTerm = ""
0068         } else {
0069             root.widgetExplorer.destroy()
0070             root.widgetExplorer = null
0071         }
0072     }
0073 
0074     function addCurrentApplet() {
0075         var pluginName = list.currentItem ? list.currentItem.pluginName : ""
0076         if (pluginName) {
0077             widgetExplorer.addApplet(pluginName)
0078         }
0079     }
0080 
0081     QQC2.Action {
0082         shortcut: "Escape"
0083         onTriggered: {
0084             if (searchInput.length > 0) {
0085                 searchInput.text = ""
0086             } else {
0087                 main.closed()
0088             }
0089         }
0090     }
0091 
0092     QQC2.Action {
0093         shortcut: "Enter"
0094         onTriggered: addCurrentApplet()
0095     }
0096     QQC2.Action {
0097         shortcut: "Return"
0098         onTriggered: addCurrentApplet()
0099     }
0100 
0101     Component {
0102         id: widgetExplorerComponent
0103 
0104         WidgetExplorer {
0105             //view: desktop
0106             onShouldClose: main.closed();
0107         }
0108     }
0109 
0110     PlasmaExtras.ModelContextMenu {
0111         id: categoriesDialog
0112         visualParent: categoryButton
0113         // model set on first invocation
0114 
0115         onClicked: {
0116             list.contentX = 0
0117             list.contentY = 0
0118             categoryButton.text = (model.filterData ? model.display : i18nd("plasma_shell_org.kde.plasma.desktop", "All Widgets"))
0119             widgetExplorer.widgetsModel.filterQuery = model.filterData
0120             widgetExplorer.widgetsModel.filterType = model.filterType
0121         }
0122     }
0123 
0124     PlasmaExtras.ModelContextMenu {
0125         id: getWidgetsDialog
0126         visualParent: getWidgetsButton
0127         placement: PlasmaExtras.Menu.TopPosedLeftAlignedPopup
0128         // model set on first invocation
0129         onClicked: model.trigger()
0130     }
0131 
0132     header: PlasmaExtras.PlasmoidHeading {
0133         ColumnLayout {
0134             id: header
0135             anchors.fill: parent
0136 
0137             spacing: Kirigami.Units.smallSpacing
0138 
0139             RowLayout {
0140                 spacing: Kirigami.Units.smallSpacing
0141                 Kirigami.Heading {
0142                     id: heading
0143                     level: 1
0144                     text: i18nd("plasma_shell_org.kde.plasma.desktop", "Widgets")
0145                     textFormat: Text.PlainText
0146                     elide: Text.ElideRight
0147 
0148                     Layout.fillWidth: true
0149                 }
0150                 PC3.ToolButton {
0151                     id: getWidgetsButton
0152                     icon.name: "get-hot-new-stuff"
0153                     text: i18nd("plasma_shell_org.kde.plasma.desktop", "Get New Widgets…")
0154 
0155                     KeyNavigation.right: closeButton
0156                     KeyNavigation.down: searchInput
0157 
0158                     onClicked: {
0159                         getWidgetsDialog.model = widgetExplorer.widgetsMenuActions
0160                         getWidgetsDialog.openRelative()
0161                     }
0162                 }
0163                 PC3.ToolButton {
0164                     id: closeButton
0165                     icon.name: "window-close"
0166 
0167                     KeyNavigation.down: categoryButton
0168 
0169                     onClicked: main.closed()
0170                 }
0171             }
0172 
0173             RowLayout {
0174                 spacing: Kirigami.Units.smallSpacing
0175 
0176                 PlasmaExtras.SearchField {
0177                     id: searchInput
0178                     Layout.fillWidth: true
0179 
0180                     KeyNavigation.down: list
0181                     KeyNavigation.right: categoryButton
0182 
0183                     onTextChanged: {
0184                         list.positionViewAtBeginning()
0185                         list.currentIndex = -1
0186                         widgetExplorer.widgetsModel.searchTerm = text
0187                     }
0188 
0189                     Component.onCompleted: if (!Kirigami.InputMethod.willShowOnActive) { forceActiveFocus() }
0190                 }
0191                 PC3.ToolButton {
0192                     id: categoryButton
0193                     text: i18nd("plasma_shell_org.kde.plasma.desktop", "All Widgets")
0194                     icon.name: "view-filter"
0195 
0196                     KeyNavigation.down: list
0197 
0198                     onClicked: {
0199                         categoriesDialog.model = widgetExplorer.filterModel
0200                         categoriesDialog.open(0, categoryButton.height)
0201                     }
0202 
0203                     PC3.ToolTip {
0204                         text: i18nd("plasma_shell_org.kde.plasma.desktop", "Categories")
0205                     }
0206                 }
0207             }
0208         }
0209     }
0210 
0211     footer: PlasmaExtras.PlasmoidHeading {
0212         position: PC3.ToolBar.Footer
0213         visible: pendingUninstallTimer.applets.length > 0
0214         contentItem: PC3.Button {
0215             text: i18ndp("plasma_shell_org.kde.plasma.desktop", "Confirm Removal Of One Widget", "Confirm Removal Of %1 Widgets", pendingUninstallTimer.applets.length)
0216             onClicked: pendingUninstallTimer.uninstall()
0217         }
0218     }
0219 
0220     Timer {
0221         id: setModelTimer
0222         interval: 20
0223         running: true
0224         onTriggered: list.model = widgetExplorer.widgetsModel
0225     }
0226 
0227     PC3.ScrollView {
0228         anchors.fill: parent
0229         anchors.rightMargin: - main.sidePanel.margins.right
0230 
0231         // hide the flickering by fading in nicely
0232         opacity: setModelTimer.running ? 0 : 1
0233         Behavior on opacity {
0234             OpacityAnimator {
0235                 duration: Kirigami.Units.longDuration
0236                 easing.type: Easing.InOutQuad
0237             }
0238         }
0239 
0240         GridView {
0241             id: list
0242 
0243             // model set delayed by Timer above
0244 
0245             activeFocusOnTab: true
0246             cellWidth: Math.floor(width / 3)
0247             cellHeight: cellWidth + Kirigami.Units.gridUnit * 4 + Kirigami.Units.smallSpacing * 2
0248 
0249             delegate: AppletDelegate {}
0250             highlight: PlasmaExtras.Highlight {
0251                 pressed: list.currentItem && list.currentItem.pressed
0252             }
0253             highlightMoveDuration: 0
0254             //highlightResizeDuration: 0
0255 
0256             //slide in to view from the left
0257             add: Transition {
0258                 NumberAnimation {
0259                     properties: "x"
0260                     from: -list.width
0261                     duration: Kirigami.Units.shortDuration
0262                 }
0263             }
0264 
0265             //slide out of view to the right
0266             remove: Transition {
0267                 NumberAnimation {
0268                     properties: "x"
0269                     to: list.width
0270                     duration: Kirigami.Units.shortDuration
0271                 }
0272             }
0273 
0274             //if we are adding other items into the view use the same animation as normal adding
0275             //this makes everything slide in together
0276             //if we make it move everything ends up weird
0277             addDisplaced: list.add
0278 
0279             //moved due to filtering
0280             displaced: Transition {
0281                 NumberAnimation {
0282                     properties: "x,y"
0283                     duration: Kirigami.Units.shortDuration
0284                 }
0285             }
0286 
0287             KeyNavigation.up: searchInput
0288         }
0289     }
0290 
0291     PlasmaExtras.PlaceholderMessage {
0292         anchors.centerIn: parent
0293         width: parent.width - (Kirigami.Units.gridUnit * 4)
0294         iconName: "edit-none"
0295         text: searchInput.text.length > 0 ? i18nd("plasma_shell_org.kde.plasma.desktop", "No widgets matched the search terms") : i18nd("plasma_shell_org.kde.plasma.desktop", "No widgets available")
0296         visible: list.count == 0 && !setModelTimer.running
0297     }
0298 }