From 6a014114c2bb4eb94f1e8c0109ed4698434f629e Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Mon, 27 Jul 2026 04:46:30 -0400 Subject: [PATCH] refactor(bank_panel): factor resetDragState() helper; fix WM_CAPTURECHANGED missing instrumentDropTrack reset All eight drag-state fields cleared through one canonical helper. WM_CAPTURECHANGED now resets instrumentDropTrack (was missing per doc-contract). WM_DESTROY and closePanel gain dropKind/dropBankId resets (inert on teardown; correct for symmetry). --- src/bank_panel.cpp | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/bank_panel.cpp b/src/bank_panel.cpp index 3ddbc35..dc39592 100644 --- a/src/bank_panel.cpp +++ b/src/bank_panel.cpp @@ -3035,6 +3035,20 @@ void doReplaceDrop(const std::string& newId, const std::string& oldId, invalidatePanel(); } +// Clears all drag-state fields to their resting values. Called from every exit path +// (button-up, WM_CAPTURECHANGED, WM_DESTROY, closePanel) so the set of cleared fields +// stays consistent across all four sites. +void resetDragState() { + g_panel.dragArmed = false; + g_panel.dragging = false; + g_panel.dropKind = DropKind::None; + g_panel.dropBankId.clear(); + g_panel.cardGesture = CardGesture::None; + g_panel.dragTargetSlot = -1; + g_panel.dragPrimaryId.clear(); + g_panel.instrumentDropTrack = nullptr; +} + // Commits (or abandons) a drag on button-up. The resolved pure CardGesture decides: // * Reorder / Replace -> in-grid, within the source bank (L7); one Ctrl-Z each. // * Move / Copy -> the EXISTING cross-bank transfer (unchanged; Ctrl = copy). @@ -3095,14 +3109,7 @@ void onLBtnUp(int x, int y) { if (focus >= 0) g_panel.selection = applyClick(g_panel.selection, focus, false, false, count); } - g_panel.dragArmed = false; - g_panel.dragging = false; - g_panel.dropKind = DropKind::None; - g_panel.dropBankId.clear(); - g_panel.cardGesture = CardGesture::None; - g_panel.dragTargetSlot = -1; - g_panel.dragPrimaryId.clear(); - g_panel.instrumentDropTrack = nullptr; // S17: clear the FX hotspot after the release + resetDragState(); invalidatePanel(); } @@ -3199,13 +3206,7 @@ WDL_DLGRET dlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { // state lingers, mirroring onLBtnUp's reset (peer-path symmetry). Nothing is // mutated on a cancel; the cursor is restored to the arrow. if (g_panel.dragArmed || g_panel.dragging) { - g_panel.dragArmed = false; - g_panel.dragging = false; - g_panel.dropKind = DropKind::None; - g_panel.dropBankId.clear(); - g_panel.cardGesture = CardGesture::None; - g_panel.dragTargetSlot = -1; - g_panel.dragPrimaryId.clear(); + resetDragState(); SetCursor(LoadCursor(nullptr, IDC_ARROW)); invalidatePanel(); } @@ -3227,11 +3228,7 @@ WDL_DLGRET dlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (GetCapture() == hwnd) ReleaseCapture(); stopAudition(); g_panel.selection = Selection{}; - g_panel.dragArmed = g_panel.dragging = false; - g_panel.cardGesture = CardGesture::None; - g_panel.dragTargetSlot = -1; - g_panel.dragPrimaryId.clear(); - g_panel.instrumentDropTrack = nullptr; // S17: drop the FX hotspot on teardown + resetDragState(); g_panel.hovered = Hover{}; g_panel.tooltipShown = false; g_panel.hwnd = nullptr; @@ -3288,8 +3285,7 @@ void closePanel() { if (GetCapture() == g_panel.hwnd) ReleaseCapture(); stopAudition(); g_panel.selection = Selection{}; - g_panel.dragArmed = g_panel.dragging = false; - g_panel.instrumentDropTrack = nullptr; // S17: drop the FX hotspot on close + resetDragState(); unregisterAccel(); if (g_panel.hwnd) { DockWindowRemove(g_panel.hwnd);