diff --git a/containments/desktop/package/contents/ui/FolderItemDelegate.qml b/containments/desktop/package/contents/ui/FolderItemDelegate.qml --- a/containments/desktop/package/contents/ui/FolderItemDelegate.qml +++ b/containments/desktop/package/contents/ui/FolderItemDelegate.qml @@ -42,6 +42,7 @@ property Item hoverArea: loader.item ? loader.item.hoverArea : null property Item frame: loader.item ? loader.item.frame : null property Item toolTip: loader.item ? loader.item.toolTip : null + property bool touchTap: false Accessible.name: name Accessible.role: Accessible.Canvas @@ -158,7 +159,7 @@ location: root.useListViewMode ? (plasmoid.location === PlasmaCore.Types.LeftEdge ? PlasmaCore.Types.LeftEdge : PlasmaCore.Types.RightEdge) : plasmoid.location onContainsMouseChanged: { - if (containsMouse && !model.blank) { + if ((containsMouse || touchTap) && !model.blank) { if (toolTip.active) { toolTip.icon = model.decoration; toolTip.mainText = model.display; @@ -207,6 +208,67 @@ } } ] + + MouseArea { + id: mousearea + anchors.left: parent.left + width: parent.width + height: parent.height + hoverEnabled: true + acceptedButtons: Qt.LeftButton + property int pressX: -1 + property int pressY: -1 + property bool tapAndHold: false + + onPositionChanged: { + if (mouse.source == Qt.MouseEventSynthesizedByQt) { + if (pressX != -1 && root.isDrag(pressX, pressY, mouse.x, mouse.y) && tapAndHold) { + var startpos = mapToItem (popupDialog, pressX, pressY); + mouseListener.press(startpos.x, startpos.y, mouse.buttons, mouse.modifiers); + tapAndHold = false; + } + } + + } + + onPressAndHold: { + if (touchTap) { + tapAndHold = true; + parent.onContainsMouseChanged(); + } + } + + onPressed: { + if (mouse.source == Qt.MouseEventSynthesizedByQt) { + mouseListener.pressCanceled(); + tapAndHold = false; + touchTap = true; + pressX = mouse.x; + pressY = mouse.y; + } else { + touchTap = false; + } + } + + onReleased: { + if (mouse.source == Qt.MouseEventSynthesizedByQt) { + if (tapAndHold) { + var pos = mapToItem (popupDialog, mouse.x, mouse.y); + mouseListener.press(pos.x, pos.y, Qt.RightButton, mouse.modifiers); + tapAndHold = false; + } else { + parent.onContainsMouseChanged(); + var pos = mapToItem (popupDialog, mouse.x, mouse.y); + mouseListener.press(pos.x, pos.y, mouse.buttons, mouse.modifiers); + mouseListener.click(pos.x, pos.y, Qt.LeftButton); + } + } + touchTap = false; + tapAndHold = false; + pressX = -1; + pressY = -1; + } + } } Loader { @@ -398,6 +460,8 @@ id: selectionButtonComponent FolderItemActionButton { + visible: !touchTap + element: model.selected ? "remove" : "add" onClicked: dir.toggleSelected(positioner.map(index)) @@ -408,7 +472,7 @@ id: popupButtonComponent FolderItemActionButton { - visible: main.GridView.view.isRootView && (popupDialog == null) + visible: main.GridView.view.isRootView && (popupDialog == null) && !touchTap element: "open" diff --git a/containments/desktop/package/contents/ui/FolderView.qml b/containments/desktop/package/contents/ui/FolderView.qml --- a/containments/desktop/package/contents/ui/FolderView.qml +++ b/containments/desktop/package/contents/ui/FolderView.qml @@ -60,6 +60,7 @@ property alias scrollUp: gridView.scrollUp property alias scrollDown: gridView.scrollDown property alias hoveredItem: gridView.hoveredItem + property alias mouseListener: listener property var history: [] property var lastPosition: null property bool goingBack: false @@ -256,79 +257,7 @@ } onPressed: { - // Ignore press events outside the viewport (i.e. on scrollbars). - if (!scrollArea.viewport.contains(Qt.point(mouse.x,mouse.y))) { - return; - } - - scrollArea.focus = true; - - if (mouse.buttons & Qt.BackButton) { - if (root.isPopup && dir.resolvedUrl !== dir.resolve(plasmoid.configuration.url)) { - doBack(); - mouse.accepted = true; - } - - return; - } - - if (editor && childAt(mouse.x, mouse.y) !== editor) { - editor.commit(); - } - - pressX = mouse.x; - pressY = mouse.y; - - if (!hoveredItem || hoveredItem.blank) { - if (!gridView.ctrlPressed) { - gridView.currentIndex = -1; - dir.clearSelection(); - } - - if (mouse.buttons & Qt.RightButton) { - clearPressState(); - dir.openContextMenu(null, mouse.modifiers); - mouse.accepted = true; - } - } else { - pressedItem = hoveredItem; - - var pos = mapToItem(hoveredItem.actionsOverlay, mouse.x, mouse.y); - - if (!(pos.x <= hoveredItem.actionsOverlay.width && pos.y <= hoveredItem.actionsOverlay.height)) { - if (gridView.shiftPressed && gridView.currentIndex != -1) { - positioner.setRangeSelected(gridView.anchorIndex, hoveredItem.index); - } else { - // FIXME TODO: Clicking one item with others selected should deselect the others, - // which doesn't happen right now because initiating a drag after the press should - // still drag all of them: The deselect needs to happen on release instead so we - // can distinguish. - if (!gridView.ctrlPressed && !dir.isSelected(positioner.map(hoveredItem.index))) { - dir.clearSelection(); - } - - if (gridView.ctrlPressed) { - dir.toggleSelected(positioner.map(hoveredItem.index)); - } else { - dir.setSelected(positioner.map(hoveredItem.index)); - } - } - - gridView.currentIndex = hoveredItem.index; - - if (mouse.buttons & Qt.RightButton) { - if (pressedItem.toolTip && pressedItem.toolTip.active) { - pressedItem.toolTip.hideToolTip(); - } - - clearPressState(); - - dir.openContextMenu(null, mouse.modifiers); - mouse.accepted = true; - } - } - } - + mouse.accepted = press (mouse.x, mouse.y, mouse.buttons, mouse.modifiers); main.pressed(); } @@ -349,39 +278,9 @@ return; } - var pos = mapToItem(hoveredItem, mouse.x, mouse.y); - - // Moving from an item to its preview popup dialog doesn't unset hoveredItem - // even though the cursor has left it, so we need to check whether the click - // actually occurred inside the item we expect it in before going ahead. If it - // didn't, clean up (e.g. dismissing the dialog as a side-effect of unsetting - // hoveredItem) and abort. - if (pos.x < 0 || pos.x > hoveredItem.width || pos.y < 0 || pos.y > hoveredItem.height) { - hoveredItem = null; - dir.clearSelection(); - - return; - // If the hoveredItem is clicked while having a preview popup dialog open, - // only dismiss the dialog and abort. - } else if (hoveredItem.popupDialog) { - hoveredItem.closePopup(); - - return; - } - - pos = mapToItem(hoveredItem.actionsOverlay, mouse.x, mouse.y); - - if (!(pos.x <= hoveredItem.actionsOverlay.width && pos.y <= hoveredItem.actionsOverlay.height)) { - if (Qt.styleHints.singleClickActivation || doubleClickInProgress) { - var func = root.useListViewMode && (mouse.button === Qt.LeftButton) && hoveredItem.isDir ? doCd : dir.run; - func(positioner.map(gridView.currentIndex)); - - hoveredItem = null; - } else { - doubleClickInProgress = true; - doubleClickTimer.interval = Qt.styleHints.mouseDoubleClickInterval; - doubleClickTimer.start(); - } + //don't handle tap on touchscreen on this point, we call click direct from MouseArea on touch release + if (!hoveredItem.touchTap) { + click (mouse.x, mouse.y, mouse.button); } } @@ -447,6 +346,11 @@ return; } + //if touch, start drag only if touchpoint left item + if (hoveredItem ? hoveredItem.touchTap : false) { + return; + } + // Drag initiation. if (pressX != -1 && root.isDrag(pressX, pressY, mouse.x, mouse.y)) { if (pressedItem != null && dir.isSelected(positioner.map(pressedItem.index))) { @@ -512,6 +416,116 @@ pressY = -1; } + function press(mouseX, mouseY, mouseButtons, mouseModifiers) { + var mouseAccepted = false; + // Ignore press events outside the viewport (i.e. on scrollbars). + if (!scrollArea.viewport.contains(Qt.point(mouseX,mouseY))) { + return mouseAccepted; + } + + scrollArea.focus = true; + + if (mouseButtons & Qt.BackButton) { + if (root.isPopup && dir.resolvedUrl !== dir.resolve(plasmoid.configuration.url)) { + doBack(); + mouseAccepted = true; + } + + return mouseAccepted; + } + + if (editor && childAt(mouseX, mouseY) !== editor) { + editor.commit(); + } + + pressX = mouseX; + pressY = mouseY; + + if (!hoveredItem || hoveredItem.blank) { + if (!gridView.ctrlPressed) { + gridView.currentIndex = -1; + dir.clearSelection(); + } + + if (mouseButtons & Qt.RightButton) { + clearPressState(); + dir.openContextMenu(null, mouseModifiers); + mouseAccepted = true; + } + } else { + pressedItem = hoveredItem; + + var pos = mapToItem(hoveredItem.actionsOverlay, mouseX, mouseY); + + if (!(pos.x <= hoveredItem.actionsOverlay.width && pos.y <= hoveredItem.actionsOverlay.height)) { + + if (gridView.shiftPressed && gridView.currentIndex != -1) { + positioner.setRangeSelected(gridView.anchorIndex, hoveredItem.index); + } else { + // FIXME TODO: Clicking one item with others selected should deselect the others, + // which doesn't happen right now because initiating a drag after the press should + // still drag all of them: The deselect needs to happen on release instead so we + // can distinguish. + if (!gridView.ctrlPressed && !dir.isSelected(positioner.map(hoveredItem.index))) { + dir.clearSelection(); + } + + if (gridView.ctrlPressed) { + dir.toggleSelected(positioner.map(hoveredItem.index)); + } else { + dir.setSelected(positioner.map(hoveredItem.index)); + } + } + + gridView.currentIndex = hoveredItem.index; + + if (mouseButtons & Qt.RightButton) { + if (pressedItem.toolTip && pressedItem.toolTip.active) { + pressedItem.toolTip.hideToolTip(); + } + + clearPressState(); + + dir.openContextMenu(null, mouseModifiers); + mouseAccepted = true; + } + } + } + return mouseAccepted; + } + + function click (mouseX, mouseY, mouseButton) { + var pos = mapToItem(hoveredItem, mouseX, mouseY); + // Moving from an item to its preview popup dialog doesn't unset hoveredItem + // even though the cursor has left it, so we need to check whether the click + // actually occured inside the item we expect it in before going ahead. If it + // didn't, clean up (e.g. dismissing the dialog as a side-effect of unsetting + // hoveredItem) and abort. + if (pos.x < 0 || pos.x > hoveredItem.width || pos.y < 0 || pos.y > hoveredItem.height) { + hoveredItem = null; + dir.clearSelection(); + return; + // If the hoveredItem is clicked while having a preview popup dialog open, + // only dismiss the dialog and abort. + } else if (hoveredItem.popupDialog) { + hoveredItem.closePopup(); + return; + } + + pos = mapToItem(hoveredItem.actionsOverlay, mouseX, mouseY); + if (!(pos.x <= hoveredItem.actionsOverlay.width && pos.y <= hoveredItem.actionsOverlay.height)) { + if (Qt.styleHints.singleClickActivation || doubleClickInProgress || hoveredItem.touchTap) { + var func = root.useListViewMode && (mouseButton == Qt.LeftButton) && hoveredItem.isDir ? doCd : dir.run; + func(positioner.map(gridView.currentIndex)); + hoveredItem = null; + } else { + doubleClickInProgress = true; + doubleClickTimer.interval = Qt.styleHints.mouseDoubleClickInterval; + doubleClickTimer.start(); + } + } + } + Timer { id: doubleClickTimer