2019-12-19 22:46:16 +11:00
|
|
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
|
|
|
2019-08-31 01:17:13 +10:00
|
|
|
import QtQuick 2.12
|
|
|
|
|
2019-09-01 14:27:42 +10:00
|
|
|
FocusScope {
|
2019-08-31 01:17:13 +10:00
|
|
|
signal deselectAll()
|
2019-09-12 05:25:57 +10:00
|
|
|
signal dragStarted()
|
|
|
|
signal dragStopped()
|
|
|
|
signal dragPointChanged(var eventPoint)
|
2019-08-31 01:17:13 +10:00
|
|
|
|
|
|
|
|
|
|
|
property bool reversed: false
|
|
|
|
|
|
|
|
property bool selecting: false
|
2019-09-01 17:40:48 +10:00
|
|
|
property real selectionStart: -1
|
|
|
|
property real selectionEnd: -1
|
2019-08-31 01:17:13 +10:00
|
|
|
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,
|
|
|
|
]
|
|
|
|
|
2019-09-01 13:58:51 +10:00
|
|
|
readonly property string joinedSelection: {
|
|
|
|
let toCopy = []
|
|
|
|
|
|
|
|
for (let key of Object.keys(selectedTexts).sort()) {
|
2019-09-01 17:40:48 +10:00
|
|
|
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])
|
2019-09-01 13:58:51 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
if (reversed) toCopy.reverse()
|
|
|
|
|
2019-09-01 17:40:48 +10:00
|
|
|
return toCopy.join("").trim()
|
2019-09-01 13:58:51 +10:00
|
|
|
}
|
|
|
|
|
2019-09-12 05:25:57 +10:00
|
|
|
|
2019-10-26 00:02:21 +11:00
|
|
|
onJoinedSelectionChanged:
|
|
|
|
if (joinedSelection) Clipboard.selection = joinedSelection
|
2019-10-25 23:49:19 +11:00
|
|
|
|
2019-09-12 05:25:57 +10:00
|
|
|
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
|
|
|
|
}
|
2019-08-31 01:17:13 +10:00
|
|
|
|
|
|
|
|
|
|
|
function clearSelection() {
|
|
|
|
selecting = false
|
|
|
|
selectionStart = -1
|
|
|
|
selectionEnd = -1
|
|
|
|
selectionStartPosition = Qt.point(-1, -1)
|
|
|
|
selectionEndPosition = Qt.point(-1, -1)
|
|
|
|
deselectAll()
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-09-12 05:25:57 +10:00
|
|
|
// PointHandler and TapHandler won't activate if the press occurs inside
|
|
|
|
// a label child, so we need a Point/TapHandler inside them too.
|
2019-08-31 01:17:13 +10:00
|
|
|
|
2019-09-01 13:58:51 +10:00
|
|
|
PointHandler {
|
2019-09-12 05:25:57 +10:00
|
|
|
// We don't use a DragHandler because they have an unchangable minimum
|
|
|
|
// drag distance before they activate.
|
2019-09-01 13:58:51 +10:00
|
|
|
id: pointHandler
|
2019-09-12 05:25:57 +10:00
|
|
|
onActiveChanged: active ? dragStarted() : dragStopped()
|
|
|
|
onPointChanged: dragPointChanged(point)
|
2019-09-01 13:58:51 +10:00
|
|
|
}
|
|
|
|
|
2019-08-31 01:17:13 +10:00
|
|
|
TapHandler {
|
|
|
|
acceptedButtons: Qt.LeftButton
|
|
|
|
onTapped: clearSelection()
|
|
|
|
}
|
2019-09-12 05:25:57 +10:00
|
|
|
|
2019-09-12 05:42:48 +10:00
|
|
|
// This item will trigger the children labels's DropAreas
|
2019-09-12 05:25:57 +10:00
|
|
|
Item { id: draggedItem }
|
2019-08-31 01:17:13 +10:00
|
|
|
}
|