Warning, /plasma/plasma-desktop/desktoppackage/contents/explorer/AppletDelegate.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
0003 SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
0004
0005 SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007
0008 import QtQuick 2.15
0009 import QtQuick.Layouts 1.1
0010
0011 import org.kde.plasma.components 3.0 as PlasmaComponents
0012 import org.kde.plasma.core as PlasmaCore
0013 import org.kde.kwindowsystem
0014 import org.kde.kirigami 2.20 as Kirigami
0015 import org.kde.graphicaleffects as KGraphicalEffects
0016
0017 Item {
0018 id: delegate
0019
0020 readonly property string pluginName: model.pluginName
0021 readonly property bool pendingUninstall: pendingUninstallTimer.applets.indexOf(pluginName) > -1
0022 readonly property bool pressed: tapHandler.pressed
0023
0024 width: list.cellWidth
0025 height: list.cellHeight
0026
0027 HoverHandler {
0028 id: hoverHandler
0029 onHoveredChanged: if (hovered) delegate.GridView.view.currentIndex = index
0030 }
0031
0032 TapHandler {
0033 id: tapHandler
0034 enabled: !delegate.pendingUninstall && model.isSupported
0035 onTapped: widgetExplorer.addApplet(delegate.pluginName)
0036 }
0037
0038 PlasmaCore.ToolTipArea {
0039 anchors.fill: parent
0040 visible: !model.isSupported
0041 mainText: i18n("Unsupported Widget")
0042 subText: model.unsupportedMessage
0043 }
0044
0045 // Avoid repositioning delegate item after dragFinished
0046 Item {
0047 anchors.fill: parent
0048 enabled: model.isSupported
0049
0050 Drag.dragType: Drag.Automatic
0051 Drag.supportedActions: Qt.MoveAction | Qt.LinkAction
0052 Drag.mimeData: {
0053 "text/x-plasmoidservicename" : delegate.pluginName,
0054 }
0055 Drag.onDragStarted: {
0056 KWindowSystem.showingDesktop = true;
0057 main.draggingWidget = true;
0058 }
0059 Drag.onDragFinished: {
0060 main.draggingWidget = false;
0061 }
0062
0063 DragHandler {
0064 id: dragHandler
0065 enabled: !delegate.pendingUninstall && model.isSupported
0066
0067 onActiveChanged: if (active) {
0068 iconContainer.grabToImage(function(result) {
0069 if (!dragHandler.active) {
0070 return;
0071 }
0072 parent.Drag.imageSource = result.url;
0073 parent.Drag.active = dragHandler.active;
0074 }, Qt.size(Kirigami.Units.iconSizes.huge, Kirigami.Units.iconSizes.huge));
0075 } else {
0076 parent.Drag.active = false;
0077 parent.Drag.imageSource = "";
0078 }
0079 }
0080 }
0081
0082 ColumnLayout {
0083 id: mainLayout
0084
0085 readonly property color textColor: tapHandler.pressed ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor
0086
0087 spacing: Kirigami.Units.smallSpacing
0088 anchors {
0089 left: parent.left
0090 right: parent.right
0091 //bottom: parent.bottom
0092 margins: Kirigami.Units.smallSpacing * 2
0093 rightMargin: Kirigami.Units.smallSpacing * 2 // don't cram the text to the border too much
0094 top: parent.top
0095 }
0096
0097 Item {
0098 id: iconContainer
0099 width: Kirigami.Units.iconSizes.enormous
0100 height: width
0101 Layout.alignment: Qt.AlignHCenter
0102 opacity: delegate.pendingUninstall ? 0.6 : 1
0103 Behavior on opacity {
0104 OpacityAnimator {
0105 duration: Kirigami.Units.longDuration
0106 easing.type: Easing.InOutQuad
0107 }
0108 }
0109
0110 Item {
0111 id: iconWidget
0112 anchors.fill: parent
0113 Kirigami.Icon {
0114 anchors.fill: parent
0115 source: model.decoration
0116 visible: model.screenshot === ""
0117 selected: tapHandler.pressed
0118 enabled: model.isSupported
0119 }
0120 Image {
0121 width: Kirigami.Units.iconSizes.enormous
0122 height: width
0123 anchors.fill: parent
0124 fillMode: Image.PreserveAspectFit
0125 source: model.screenshot
0126 }
0127 }
0128
0129 Item {
0130 id: badgeMask
0131 anchors.fill: parent
0132
0133 Rectangle {
0134 x: Math.round(-Kirigami.Units.smallSpacing * 1.5 / 2)
0135 y: x
0136 width: runningBadge.width + Math.round(Kirigami.Units.smallSpacing * 1.5)
0137 height: width
0138 radius: height
0139 visible: running && delegate.GridView.isCurrentItem
0140 }
0141 }
0142
0143 KGraphicalEffects.BadgeEffect {
0144 anchors.fill: parent
0145 source: ShaderEffectSource {
0146 sourceItem: iconWidget
0147 hideSource: true
0148 live: false
0149 }
0150 mask: ShaderEffectSource {
0151 id: maskShaderSource
0152 sourceItem: badgeMask
0153 hideSource: true
0154 live: false
0155 }
0156 }
0157
0158 Rectangle {
0159 id: runningBadge
0160 width: height
0161 height: Math.round(Kirigami.Units.iconSizes.sizeForLabels * 1.3)
0162 radius: height
0163 color: Kirigami.Theme.highlightColor
0164 visible: running && delegate.GridView.isCurrentItem
0165 onVisibleChanged: maskShaderSource.scheduleUpdate()
0166
0167 PlasmaComponents.Label {
0168 id: countLabel
0169 anchors.fill: parent
0170 horizontalAlignment: Text.AlignHCenter
0171 verticalAlignment: Text.AlignVCenter
0172 text: running
0173 textFormat: Text.PlainText
0174 }
0175 }
0176
0177
0178 PlasmaComponents.ToolButton {
0179 id: uninstallButton
0180 anchors {
0181 top: parent.top
0182 right: parent.right
0183 }
0184 icon.name: delegate.pendingUninstall ? "edit-undo" : "edit-delete"
0185 // we don't really "undo" anything but we'll pretend to the user that we do
0186 PlasmaComponents.ToolTip.delay: Kirigami.Units.toolTipDelay
0187 PlasmaComponents.ToolTip.visible: hovered
0188 PlasmaComponents.ToolTip.text: delegate.pendingUninstall ? i18nd("plasma_shell_org.kde.plasma.desktop", "Undo uninstall")
0189 : i18nd("plasma_shell_org.kde.plasma.desktop", "Uninstall widget")
0190 flat: false
0191 visible: model.local && delegate.GridView.isCurrentItem && !dragHandler.active
0192
0193 onHoveredChanged: {
0194 if (hovered) {
0195 // hovering the uninstall button triggers onExited of the main mousearea
0196 delegate.GridView.view.currentIndex = index
0197 }
0198 }
0199
0200 onClicked: {
0201 var pending = pendingUninstallTimer.applets
0202 if (delegate.pendingUninstall) {
0203 var index = pending.indexOf(pluginName)
0204 if (index > -1) {
0205 pending.splice(index, 1)
0206 }
0207 } else {
0208 pending.push(pluginName)
0209 }
0210 pendingUninstallTimer.applets = pending
0211
0212 if (pending.length) {
0213 pendingUninstallTimer.restart()
0214 } else {
0215 pendingUninstallTimer.stop()
0216 }
0217 }
0218 }
0219 }
0220 Kirigami.Heading {
0221 id: heading
0222 Layout.fillWidth: true
0223 level: 4
0224 text: model.name
0225 textFormat: Text.PlainText
0226 elide: Text.ElideRight
0227 wrapMode: Text.WordWrap
0228 maximumLineCount: 2
0229 lineHeight: 0.95
0230 horizontalAlignment: Text.AlignHCenter
0231 color: mainLayout.textColor
0232 }
0233 PlasmaComponents.Label {
0234 Layout.fillWidth: true
0235 // otherwise causes binding loop due to the way the Plasma sets the height
0236 height: implicitHeight
0237 text: model.description
0238 textFormat: Text.PlainText
0239 font: Kirigami.Theme.smallFont
0240 wrapMode: Text.WordWrap
0241 elide: Text.ElideRight
0242 maximumLineCount: heading.lineCount === 1 ? 3 : 2
0243 horizontalAlignment: Text.AlignHCenter
0244 color: mainLayout.textColor
0245 }
0246 }
0247 }