Warning, /plasma/latte-dock/plasmoid/package/contents/ui/taskslayout/MouseHandler.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2016 Smith AR <audoban@openmailbox.org>
0003     SPDX-FileCopyrightText: 2016 Michail Vourlakos <mvourlakos@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 
0008 import QtQuick 2.0
0009 
0010 import org.kde.plasma.plasmoid 2.0
0011 import org.kde.draganddrop 2.0
0012 
0013 import org.kde.taskmanager 0.1 as TaskManager
0014 
0015 import "../../code/tools.js" as TaskTools
0016 
0017 Item {
0018     // signal urlDropped(url url)
0019     id: dArea
0020     signal urlsDropped(var urls)
0021 
0022     property Item target
0023     property Item ignoredItem
0024     property bool moved: false
0025     property bool containsDrag: false
0026 
0027     property alias hoveredItem: dropHandler.hoveredItem
0028 
0029     readonly property alias isMovingTask: dropHandler.inMovingTask
0030     readonly property alias isDroppingFiles: dropHandler.inDroppingFiles
0031     readonly property alias isDroppingOnlyLaunchers: dropHandler.inDroppingOnlyLaunchers
0032     readonly property alias isDroppingSeparator: dropHandler.inDroppingSeparator
0033 
0034     Timer {
0035         id: ignoreItemTimer
0036 
0037         repeat: false
0038         interval: 200
0039 
0040         onTriggered: {
0041             ignoredItem = null;
0042         }
0043     }
0044 
0045     Connections {
0046         target: root
0047         onDragSourceChanged: {
0048             if (!dragSource) {
0049                 ignoredItem = null;
0050                 ignoreItemTimer.stop();
0051             }
0052         }
0053     }
0054 
0055     DropArea {
0056         id: dropHandler
0057         anchors.fill: parent
0058         preventStealing: true
0059 
0060         property bool inDroppingOnlyLaunchers: false
0061         property bool inDroppingSeparator: false
0062         property bool inMovingTask: false
0063         property bool inDroppingFiles: false
0064 
0065         readonly property bool eventIsAccepted: inMovingTask || inDroppingSeparator || inDroppingOnlyLaunchers || inDroppingFiles
0066 
0067         property int droppedPosition: -1;
0068         property Item hoveredItem
0069 
0070         function isDroppingSeparator(event) {
0071             var appletName = String(event.mimeData.getDataAsByteArray("text/x-plasmoidservicename"));
0072             var isSeparator = (appletName === "audoban.applet.separator" || appletName === "org.kde.latte.separator");
0073 
0074             return ((event.mimeData.formats.indexOf("text/x-plasmoidservicename") === 0) && isSeparator);
0075         }
0076 
0077         function isDroppingOnlyLaunchers(event) {
0078             if (event.mimeData.hasUrls || (event.mimeData.formats.indexOf("text/x-plasmoidservicename") !== 0)) {
0079                 var onlyLaunchers = event.mimeData.urls.every(function (item) {
0080                     return backend.isApplication(item)
0081                 });
0082 
0083                 return onlyLaunchers;
0084             }
0085 
0086             return false;
0087         }
0088 
0089         function isMovingTask(event) {
0090             return event.mimeData.formats.indexOf("application/x-orgkdeplasmataskmanager_taskbuttonitem") >= 0;
0091         }
0092 
0093         function clearDroppingFlags() {
0094             inDroppingFiles = false;
0095             inDroppingOnlyLaunchers = false;
0096             inDroppingSeparator = false;
0097             inMovingTask = false;
0098         }
0099 
0100         onHoveredItemChanged: {
0101             if (hoveredItem && windowsPreviewDlg.activeItem && hoveredItem !== windowsPreviewDlg.activeItem ) {
0102                 windowsPreviewDlg.hide(6.7);
0103             }
0104         }
0105 
0106         onDragEnter:{          
0107             inMovingTask = isMovingTask(event);
0108             inDroppingOnlyLaunchers = !inMovingTask && isDroppingOnlyLaunchers(event);
0109             inDroppingSeparator = !inMovingTask && isDroppingSeparator(event);
0110             inDroppingFiles = !inDroppingOnlyLaunchers && event.mimeData.hasUrls;
0111 
0112             /*console.log(" tasks moving task :: " + inMovingTask);
0113             console.log(" tasks only launchers :: " + inDroppingOnlyLaunchers);
0114             console.log(" tasks separator :: " + inDroppingSeparator);
0115             console.log(" tasks only files :: " + inDroppingFiles);
0116             console.log(" tasks event accepted :: " + eventIsAccepted);*/
0117 
0118             if (!eventIsAccepted) {
0119                 clearDroppingFlags();
0120                 event.ignore();
0121                 return;
0122             }
0123 
0124             dArea.containsDrag = true;
0125         }
0126 
0127         onDragMove: {
0128             if (!eventIsAccepted) {
0129                 clearDroppingFlags();
0130                 event.ignore();
0131                 return;
0132             }
0133 
0134             dArea.containsDrag = true;
0135 
0136             if (target.animating) {
0137                 return;
0138             }
0139 
0140             var eventToTarget = mapToItem(target, event.x, event.y);
0141 
0142             var above = target.childAtPos(eventToTarget.x, eventToTarget.y);
0143 
0144             // If we're mixing launcher tasks with other tasks and are moving
0145             // a (small) launcher task across a non-launcher task, don't allow
0146             // the latter to be the move target twice in a row for a while, as
0147             // it will naturally be moved underneath the cursor as result of the
0148             // initial move, due to being far larger than the launcher delegate.
0149             // TODO: This restriction (minus the timer, which improves things)
0150             // has been proven out in the EITM fork, but could be improved later
0151             // by tracking the cursor movement vector and allowing the drag if
0152             // the movement direction has reversed, establishing user intent to
0153             // move back.
0154             if (root.dragSource == null
0155                     && ignoredItem == above)
0156                 return;
0157 
0158             if (root.dragSource != null
0159                     && root.dragSource.m.IsLauncher === true && above != null
0160                     && above.m != null
0161                     && above.m.IsLauncher !== true && above == ignoredItem) {
0162                 return;
0163             } else {
0164                 //ignoredItem = null;
0165             }
0166 
0167             //at some point it was needed the following  && above != ignoredItem
0168             //but know not... strange... && above != ignoredItem
0169             //I use the ignoredItem in order to reduce the move calls as much
0170             //as possible
0171             if (tasksModel.sortMode == TaskManager.TasksModel.SortManual && root.dragSource && ignoredItem == null) {
0172                 var insertAt = TaskTools.insertIndexAt(above, eventToTarget.x, eventToTarget.y);
0173 
0174                 if (root.dragSource != above && root.dragSource.itemIndex != insertAt) {
0175                     //      console.log(root.dragSource.itemIndex + " - "+insertAt);
0176                     root.dragSource.z = 100;
0177                     ignoredItem = above;
0178 
0179                     var pos = root.dragSource.itemIndex;
0180                     tasksModel.move(pos, insertAt);
0181 
0182                     ignoreItemTimer.restart();
0183                 }
0184             } else if (!root.dragSource && above && hoveredItem != above) {
0185                 hoveredItem = above;
0186                 activationTimer.restart();
0187             } else if (!above) {
0188                 hoveredItem = null;
0189                 activationTimer.stop();
0190             }
0191 
0192             if (hoveredItem && windowsPreviewDlg.visible && toolTipDelegate.rootIndex !== hoveredItem.modelIndex() ) {
0193                 windowsPreviewDlg.hide(6);
0194             }
0195         }
0196 
0197         onDragLeave: {
0198             dArea.containsDrag = false;
0199             hoveredItem = null;
0200             clearDroppingFlags();
0201 
0202             activationTimer.stop();
0203         }
0204 
0205         onDrop: {
0206             if (!eventIsAccepted) {
0207                 clearDroppingFlags();
0208                 event.ignore();
0209                 return;
0210             }
0211 
0212             // Reject internal drops.
0213             dArea.containsDrag = false;
0214 
0215             if (inDroppingSeparator) {
0216                 if (hoveredItem && hoveredItem.itemIndex >=0){
0217                     appletAbilities.launchers.addInternalSeparatorAtPos(hoveredItem.itemIndex);
0218                 } else {
0219                     appletAbilities.launchers.addInternalSeparatorAtPos(0);
0220                 }
0221             } else if (inDroppingOnlyLaunchers || inDroppingFiles) {
0222                 parent.urlsDropped(event.mimeData.urls);
0223             }
0224 
0225             clearDroppingFlags();
0226         }
0227 
0228         Timer {
0229             id: activationTimer
0230 
0231             interval: 250
0232             repeat: false
0233 
0234             onTriggered: {
0235                 if (dropHandler.inDroppingOnlyLaunchers || dropHandler.inDroppingSeparator) {
0236                     return;
0237                 }
0238 
0239                 if (parent.hoveredItem.m.IsGroupParent === true) {
0240                     root.showPreviewForTasks(parent.hoveredItem);
0241                     // groupDialog.visualParent = parent.hoveredItem;
0242                     // groupDialog.visible = true;
0243                 } else if (parent.hoveredItem.m.IsLauncher !== true) {
0244                     if(windowsPreviewDlg.visible && toolTipDelegate.currentItem !==parent.hoveredItem.itemIndex ) {
0245                         windowsPreviewDlg.hide(5);
0246                         toolTipDelegate.currentItem=-1;
0247                     }
0248 
0249                     tasksModel.requestActivate(parent.hoveredItem.modelIndex());
0250                 }
0251             }
0252         }
0253     }
0254     /*
0255     MouseArea {
0256         id: wheelHandler
0257 
0258         anchors.fill: parent
0259         property int wheelDelta: 0;
0260         enabled: plasmoid.configuration.wheelEnabled
0261 
0262         onWheel: wheelDelta = TaskTools.wheelActivateNextPrevTask(wheelDelta, wheel.angleDelta.y);
0263     } */
0264 }