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 }