92 lines
2.5 KiB
QML
92 lines
2.5 KiB
QML
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
|
|
import QtQuick 2.12
|
|
|
|
FocusScope {
|
|
signal deselectAll()
|
|
signal dragStarted()
|
|
signal dragStopped()
|
|
signal dragPointChanged(var eventPoint)
|
|
|
|
|
|
property bool reversed: false
|
|
|
|
property bool selecting: false
|
|
property real selectionStart: -1
|
|
property real selectionEnd: -1
|
|
property point selectionStartPosition: Qt.point(-1, -1)
|
|
property point selectionEndPosition: Qt.point(-1, -1)
|
|
property var selectedTexts: ({})
|
|
|
|
readonly property var selectionInfo: [
|
|
selectionStart, selectionStartPosition,
|
|
selectionEnd, selectionEndPosition,
|
|
]
|
|
|
|
readonly property string joinedSelection: {
|
|
let toCopy = []
|
|
|
|
for (let key of Object.keys(selectedTexts).sort()) {
|
|
if (! selectedTexts[key]) continue
|
|
|
|
// For some dumb reason, Object.keys convert the floats to strings
|
|
toCopy.push(Number.isInteger(parseFloat(key)) ? "\n\n" : "\n")
|
|
toCopy.push(selectedTexts[key])
|
|
}
|
|
|
|
if (reversed) toCopy.reverse()
|
|
|
|
return toCopy.join("").trim()
|
|
}
|
|
|
|
|
|
onJoinedSelectionChanged:
|
|
if (joinedSelection) Clipboard.selection = joinedSelection
|
|
|
|
onDragStarted: {
|
|
draggedItem.Drag.active = true
|
|
}
|
|
onDragStopped: {
|
|
draggedItem.Drag.drop()
|
|
draggedItem.Drag.active = false
|
|
selecting = false
|
|
}
|
|
onDragPointChanged: {
|
|
let pos = mapFromItem(
|
|
mainUI, eventPoint.scenePosition.x, eventPoint.scenePosition.y,
|
|
)
|
|
draggedItem.x = pos.x
|
|
draggedItem.y = pos.y
|
|
}
|
|
|
|
|
|
function clearSelection() {
|
|
selecting = false
|
|
selectionStart = -1
|
|
selectionEnd = -1
|
|
selectionStartPosition = Qt.point(-1, -1)
|
|
selectionEndPosition = Qt.point(-1, -1)
|
|
deselectAll()
|
|
}
|
|
|
|
|
|
// PointHandler and TapHandler won't activate if the press occurs inside
|
|
// a label child, so we need a Point/TapHandler inside them too.
|
|
|
|
PointHandler {
|
|
// We don't use a DragHandler because they have an unchangable minimum
|
|
// drag distance before they activate.
|
|
id: pointHandler
|
|
onActiveChanged: active ? dragStarted() : dragStopped()
|
|
onPointChanged: dragPointChanged(point)
|
|
}
|
|
|
|
TapHandler {
|
|
acceptedButtons: Qt.LeftButton
|
|
onTapped: clearSelection()
|
|
}
|
|
|
|
// This item will trigger the children labels's DropAreas
|
|
Item { id: draggedItem }
|
|
}
|