Warning, /plasma/latte-dock/containment/package/contents/ui/DragDropArea.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2019 Michail Vourlakos <mvourlakos@gmail.com>
0003 SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005
0006 import QtQuick 2.7
0007
0008 import org.kde.plasma.core 2.0 as PlasmaCore
0009 import org.kde.draganddrop 2.0 as DragDrop
0010
0011 import org.kde.latte.core 0.2 as LatteCore
0012
0013 DragDrop.DropArea {
0014 id: dragArea
0015
0016 property bool containsDrag: false
0017
0018 readonly property Item dragInfo: Item {
0019 readonly property bool entered: latteView && latteView.containsDrag
0020 property bool isTask: false
0021 property bool isPlasmoid: false
0022 property bool isSeparator: false
0023 property bool isLatteTasks: false
0024 property bool onlyLaunchers: false
0025
0026 property bool computationsAreValid: false
0027 }
0028
0029 Connections{
0030 target: root.dragInfo
0031
0032 onEnteredChanged: {
0033 if(!root.dragInfo.entered) {
0034 dragArea.clearInfo();
0035 }
0036 }
0037 }
0038
0039 Connections{
0040 target: latteView
0041
0042 onContainsDragChanged: {
0043 if(!latteView.containsDrag) {
0044 dragArea.clearInfo();
0045 }
0046 }
0047 }
0048
0049 function clearInfo() {
0050 clearInfoTimer.restart();
0051 }
0052
0053 function isDroppingOnlyLaunchers(event) {
0054 if (!latteView) {
0055 return
0056 }
0057
0058 if (event.mimeData.hasUrls || (event.mimeData.formats.indexOf("text/x-plasmoidservicename") !== 0)) {
0059 var onlyLaunchers = event.mimeData.urls.every(function (item) {
0060 return latteView.extendedInterface.isApplication(item);
0061 });
0062
0063 return onlyLaunchers;
0064 }
0065
0066 return false;
0067 }
0068
0069 //! Give the time when an applet is dropped to be positioned properly
0070 Timer {
0071 id: clearInfoTimer
0072 interval: 100
0073
0074 onTriggered: {
0075 dragArea.dragInfo.computationsAreValid = false;
0076
0077 dragArea.dragInfo.isTask = false;
0078 dragArea.dragInfo.isPlasmoid = false;
0079 dragArea.dragInfo.isSeparator = false;
0080 dragArea.dragInfo.isLatteTasks = false;
0081 dragArea.dragInfo.onlyLaunchers = false;
0082
0083 dndSpacer.parent = root;
0084 dndSpacer.opacity = 0;
0085 }
0086 }
0087
0088 onDragEnter: {
0089 containsDrag = true;
0090 clearInfoTimer.stop();
0091 var isTask = event !== undefined
0092 && event.mimeData !== undefined
0093 && event.mimeData.formats !== undefined
0094 && event.mimeData.formats.indexOf("application/x-orgkdeplasmataskmanager_taskbuttonitem") >= 0;
0095
0096 var isSeparator = event !== undefined
0097 && event.mimeData !== undefined
0098 && ( latteView.mimeContainsPlasmoid(event.mimeData, "audoban.applet.separator")
0099 || latteView.mimeContainsPlasmoid(event.mimeData, "org.kde.latte.separator") );
0100
0101 var isLatteTasks = event !== undefined
0102 && event.mimeData !== undefined
0103 && latteView.mimeContainsPlasmoid(event.mimeData, "org.kde.latte.plasmoid");
0104
0105 var isPlasmoid = event !== undefined
0106 && event.mimeData !== undefined
0107 && event.mimeData.formats !== undefined
0108 && !event.mimeData.hasUrls
0109 && event.mimeData.formats.indexOf("text/x-plasmoidservicename") === 0;
0110
0111 dragInfo.isTask = isTask;
0112 dragInfo.isPlasmoid = isPlasmoid;
0113 dragInfo.isSeparator = isSeparator;
0114 dragInfo.isLatteTasks = isLatteTasks;
0115 dragInfo.onlyLaunchers = isDroppingOnlyLaunchers(event);
0116 dragInfo.computationsAreValid = true;
0117
0118 if (dragInfo.isTask || plasmoid.immutable || !root.myView.isShownFully) {
0119 event.ignore();
0120 clearInfo();
0121 return;
0122 }
0123
0124 //! Send signal AFTER the dragging is confirmed otherwise the restore mask signal from animations
0125 //! may not be triggered #408926
0126 animations.needLength.addEvent(dragArea);
0127
0128 if (root.launchers.hasStealingApplet && dragInfo.onlyLaunchers) {
0129 root.launchers.showAddLaunchersMessageInStealingApplet();
0130 dndSpacer.opacity = 0;
0131 dndSpacer.parent = root;
0132 return;
0133 }
0134
0135 fastLayoutManager.insertAtCoordinates(dndSpacer, event.x, event.y);
0136 dndSpacer.opacity = 1;
0137 }
0138
0139 onDragMove: {
0140 containsDrag = true;
0141 clearInfoTimer.stop();
0142 if (dragInfo.isTask) {
0143 return;
0144 }
0145
0146 if (root.launchers.hasStealingApplet && dragInfo.onlyLaunchers) {
0147 root.launchers.showAddLaunchersMessageInStealingApplet();
0148 dndSpacer.opacity = 0;
0149 dndSpacer.parent = root;
0150 return;
0151 }
0152
0153 fastLayoutManager.insertAtCoordinates(dndSpacer, event.x, event.y);
0154 dndSpacer.opacity = 1;
0155 }
0156
0157 onDragLeave: {
0158 containsDrag = false;
0159 animations.needLength.removeEvent(dragArea);
0160
0161 if (root.launchers.hasStealingApplet) {
0162 root.launchers.hideAddLaunchersMessageInStealingApplet();
0163 }
0164
0165 dndSpacer.opacity = 0;
0166 dndSpacer.parent = root;
0167 }
0168
0169 onDrop: {
0170 containsDrag = false;
0171 animations.needLength.removeEvent(dragArea);
0172
0173 if (root.launchers.hasStealingApplet) {
0174 root.launchers.hideAddLaunchersMessageInStealingApplet();
0175 }
0176
0177 if (dragInfo.isTask || !root.myView.isShownFully) {
0178 return;
0179 }
0180
0181 if (root.launchers.hasStealingApplet && dragInfo.onlyLaunchers) {
0182 root.launchers.addDroppedLaunchersInStealingApplet(event.mimeData.urls);
0183 } else {
0184 var dndindex = fastLayoutManager.dndSpacerIndex();
0185 var eventx = event.x;
0186 var eventy = event.y;
0187
0188 if (dndindex >= 0) {
0189 var masquearadedIndexFromPoint = fastLayoutManager.indexToMasquearadedPoint(fastLayoutManager.dndSpacerIndex());
0190 eventx = masquearadedIndexFromPoint.x;
0191 eventy = masquearadedIndexFromPoint.y;
0192 }
0193
0194 plasmoid.processMimeData(event.mimeData, eventx, eventy);
0195 //! inform others what plasmoid was drag n' dropped to be added
0196 latteView.extendedInterface.appletDropped(event.mimeData, eventx, eventy);
0197 event.accept(event.proposedAction);
0198 }
0199
0200 dndSpacer.opacity = 0;
0201 }
0202 }