Fix pointer navigation in Quattro launcher menus (#6343)
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.
This commit is contained in:
@@ -2,22 +2,31 @@ 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.
|
||||
// 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()
|
||||
@@ -26,12 +35,19 @@ QtObject {
|
||||
|
||||
var target = root.referenceItem || item
|
||||
var point = item.mapToItem(target, mouse.x, mouse.y)
|
||||
var didMove = root.primed
|
||||
&& (Math.abs(point.x - root.lastX) > root.threshold || Math.abs(point.y - root.lastY) > root.threshold)
|
||||
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
|
||||
|
||||
root.lastX = point.x
|
||||
root.lastY = point.y
|
||||
// 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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user