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 }