Accumulate sub-threshold movement so slow motion with a flat acceleration profile updates selection. Sample pointer state on row entry and carry pointer intent through subordinate menus while preserving predictable keyboard selection.
55 lines
1.5 KiB
QML
55 lines
1.5 KiB
QML
import QtQuick
|
|
|
|
// Filters synthetic hover churn from moving delegates under a stationary
|
|
// pointer. Call reset() after keyboard/list mutations, then moved() from a
|
|
// row MouseArea's onPositionChanged before changing cursor selection. A
|
|
// transition known to originate from the pointer can call allowInitialSample()
|
|
// so the item under the stationary pointer remains selected.
|
|
QtObject {
|
|
id: root
|
|
|
|
property Item referenceItem: null
|
|
property real threshold: 1
|
|
property bool primed: false
|
|
property bool initialSampleAllowed: false
|
|
property real lastX: 0
|
|
property real lastY: 0
|
|
|
|
function reset() {
|
|
root.primed = false
|
|
root.initialSampleAllowed = false
|
|
root.lastX = 0
|
|
root.lastY = 0
|
|
}
|
|
|
|
function allowInitialSample() {
|
|
root.reset()
|
|
root.initialSampleAllowed = true
|
|
}
|
|
|
|
function moved(item, mouse) {
|
|
if (!item || !mouse) {
|
|
root.reset()
|
|
return false
|
|
}
|
|
|
|
var target = root.referenceItem || item
|
|
var point = item.mapToItem(target, mouse.x, mouse.y)
|
|
var firstSample = !root.primed
|
|
var didMove = !firstSample
|
|
? Math.abs(point.x - root.lastX) > root.threshold || Math.abs(point.y - root.lastY) > root.threshold
|
|
: root.initialSampleAllowed
|
|
|
|
// Keep the previous accepted position while filtering jitter so slow,
|
|
// sub-threshold steps accumulate into deliberate pointer movement.
|
|
if (firstSample || didMove) {
|
|
root.lastX = point.x
|
|
root.lastY = point.y
|
|
}
|
|
root.primed = true
|
|
root.initialSampleAllowed = false
|
|
|
|
return didMove
|
|
}
|
|
}
|