moment/src/gui/Base/HSelectableLabelContainer.qml

92 lines
2.5 KiB
QML
Raw Normal View History

2019-12-19 22:46:16 +11:00
// SPDX-License-Identifier: LGPL-3.0-or-later
import QtQuick 2.12
FocusScope {
signal deselectAll()
2019-09-12 05:25:57 +10:00
signal dragStarted()
signal dragStopped()
signal dragPointChanged(var eventPoint)
property bool reversed: false
property bool selecting: false
2019-09-01 17:40:48 +10:00
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()) {
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])
}
if (reversed) toCopy.reverse()
2019-09-01 17:40:48 +10:00
return toCopy.join("").trim()
}
2019-09-12 05:25:57 +10:00
onJoinedSelectionChanged:
if (joinedSelection) Clipboard.selection = joinedSelection
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
}
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.
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.
id: pointHandler
2019-09-12 05:25:57 +10:00
onActiveChanged: active ? dragStarted() : dragStopped()
onPointChanged: dragPointChanged(point)
}
TapHandler {
acceptedButtons: Qt.LeftButton
onTapped: clearSelection()
}
2019-09-12 05:25:57 +10:00
// This item will trigger the children labels's DropAreas
2019-09-12 05:25:57 +10:00
Item { id: draggedItem }
}