From b3d57a7d89863104f68660ff72a763d3231d4db3 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 30 Oct 2026 20:43:06 +0100 Subject: monitors: keep the drag, freeze the cards while pending The page's ScrollView took a vertical drag and cancelled the MouseArea, leaving the monitor drawn at its offset with nothing written; it now prevents stealing and clears the offset on cancel. A click without movement no longer snaps. The cards are disabled while an Apply waits for Keep, which writes the draft and so must not write untried edits. The mode list comes from orig, which set() leaves alone, so an edit to another field does not hand the ComboBox a new model. Co-Authored-By: Claude Opus 5.5 --- desktop/modules/monitors/MonitorsPage.qml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'desktop/modules') diff --git a/desktop/modules/monitors/MonitorsPage.qml b/desktop/modules/monitors/MonitorsPage.qml index df13d92..06fc182 100644 --- a/desktop/modules/monitors/MonitorsPage.qml +++ b/desktop/modules/monitors/MonitorsPage.qml @@ -127,6 +127,8 @@ Column { id: drag anchors.fill: parent enabled: !page.mod.pending + // The page's ScrollView would take a vertical drag. + preventStealing: true cursorShape: pressed ? Qt.ClosedHandCursor : Qt.OpenHandCursor property point start onPressed: m => start = mapToItem(canvas, m.x, m.y) @@ -135,7 +137,10 @@ Column { mon.dx = p.x - start.x; mon.dy = p.y - start.y; } + onCanceled: { mon.dx = 0; mon.dy = 0; } onReleased: { + // A click is not a move: it would snap, and make an auto position exact. + if (Math.hypot(mon.dx, mon.dy) < 4) { mon.dx = 0; mon.dy = 0; return; } const moved = { x: mon.r.x + mon.dx / canvas.k, y: mon.r.y + mon.dy / canvas.k, w: mon.r.w, h: mon.r.h }; const others = canvas.rects.filter((o, i) => i !== mon.index); const s = M.snap(moved, others, 64); @@ -169,6 +174,8 @@ Column { Column { id: rows anchors { fill: parent; margins: 14 } + // Keep writes the draft, so it may not change from what was tried. + enabled: !page.mod.pending spacing: 8 Text { @@ -182,7 +189,9 @@ Column { Label { text: "Mode" } Combo { width: 220 - model: card.d ? card.d.modes.map(m => m.replace("@", " @ ") + " Hz") : [] + // From orig, which set() leaves alone: a new model on every edit + // could reset the shown index. + model: page.mod.orig[card.index] ? page.mod.orig[card.index].modes.map(m => m.replace("@", " @ ") + " Hz") : [] currentIndex: card.d ? card.d.modes.indexOf(card.d.mode) : -1 onActivated: i => page.mod.set(card.index, "mode", card.d.modes[i]) } -- cgit v1.2.3