fix(gui): DX spot tooltip blocked by passband hit-test (#3887)#3903
Conversation
…rsdr#3887) In mouseMoveEvent, sliceCursorShapeAt ran before the spot click-rect loop. The passband-body branch sets foundCursor, which gated the spot tooltip entirely for any spot whose frequency fell inside the active filter. Fix: test m_spotClickRects before calling sliceCursorShapeAt. Spot markers are drawn on top of passband shading so they win hover too — consistent with spectrumDefaultsToCrosshairAt which already defers to spots before returning true. Closes aethersdr#3901 (duplicate report).
There was a problem hiding this comment.
Thanks for this, @M7HNF-Ian — I traced the full hit-test path and the fix is correct.
Verified against the press path. The change makes the hover cursor priority match the actual click dispatch:
- After the reorder,
mouseMoveEventchecks spots (m_spotClickRects/m_spotClusters) beforesliceCursorShapeAt. mousePressEventalready dispatches spot clicks first —SpectrumWidget.cpp:5634-5670runs them_spotClickRectsloop, emitsspotTriggered/frequencyClicked, andev->accept(); return;before the passband VFO-drag logic at:6085/:6124.
So before this PR a spot sitting inside the active passband showed OpenHandCursor on hover, yet a click on it actually triggered the spot. The reorder fixes that inconsistency — the cursor now predicts what the click will do. Good, minimal change.
Filter-edge grab strips are unaffected in practice. I checked the concern that moving sliceCursorShapeAt later could mask the kFilterEdgeGrabPx resize cursor. In the rare case where a spot label rect overlaps an 8px filter-edge strip, the hover would now show PointingHandCursor instead of SizeHorCursor — but a click in that overlap already goes to the spot (the press-path spot block at :5634 wins over the edge logic at :6110), so the new cursor is still the correct prediction. No real regression.
One nit on the description, not the code: the cited precedent (spectrumDefaultsToCrosshairAt, line 5578) is the cursor-default helper, not the press dispatcher. The actual behavioral precedent for "spots take priority" is the spot-click block at :5634. Worth pointing the commit/PR text at that line so the symmetry argument lands on the load-bearing code — no change required.
No AppSettings/RAII/lifetime concerns; it's a pure 7-line reorder within one else branch. LGTM.
🤖 aethersdr-agent · cost: $6.3434 · model: claude-opus-4-8
|
@M7HNF-Ian Ian, can you do me a favor on this one can you ask your agent: "Please use the agent automation bridge for testing, and include a test summary in the PR. Include any potential new verbs in the test summary.". |
ten9876
left a comment
There was a problem hiding this comment.
Clean, minimal fix — gives DX spot hover priority over the slice passband body, matching what the click handler (mousePressEvent checks spots first) and spectrumDefaultsToCrosshairAt already do. Verified: the relocated sliceCursorShapeAt block is byte-identical, the function is const/pure (safe to skip when a spot is hovered), and hover/click are now consistent. CI green on all platforms.
#3961) ## Release documentation prep for **v26.7.1** (2026-07-02) 29 commits since v26.6.5. Docs-only + version bump — no code behavior change. ### Version bump 26.6.5 → 26.7.1 The three canonical locations (per `AGENTS.md`): - `CMakeLists.txt:2` — `project(AetherSDR VERSION 26.7.1)` → `AETHERSDR_VERSION` (the app's version string) - `README.md` — Current version line - `AGENTS.md` — Current version line ### `CHANGELOG.md` Promoted `[Unreleased]` → **`## [v26.7.1] — 2026-07-02`** in house style (v-prefix, em-dash, "N commits since…" opener + headline), authored from all merged PRs and categorized: - **Added:** 3D stacked-trace spectrum (#3899), 3D dBm scale (#3937), in-process NVIDIA BNR + AFX download-on-demand (#3902), TX meter mouse-over readouts (#3936), SWR manual sweep range (#3885), CW sidetone capture (#3895), KiwiSDR metadata scaffolding (#3898), bridge verbs (#3920) - **Changed:** BNR container/NIM backend removed, 60 fps + per-pixel GPU FFT trace (#3958), FlexLib-sourced model capabilities (#3954/#2177), RX speaker-latency cut (#3897), Display pane sections (#3935) - **Fixed:** #3922, #3926, #3941, #3940, #3942, #3921, #3903, #3892, #3924, #3891, #3890, #3900, #3947 - Fresh empty `[Unreleased]` restored above the release block. Internal/CI/docs/self-fix PRs (#3931/#3916/#3934/#3929) omitted per house style. ### `ROADMAP.md` - Cycle header → "post-v26.7.1" - NVIDIA BNR removed from **In flight** (shipped this cycle) - Five v26.7.1 highlights prepended to **Recently shipped** ### `README.md` - Highlights: GPU spectrum bullet now notes the **per-pixel FFT trace at up to 60 fps** and the **3D stacked-trace** spectrum mode ### Reviewer notes - Touches protected paths (`*.md` + `AGENTS.md` Tier-1 + `CMakeLists.txt`) — needs `@aethersdr/infrastructure` sign-off. - Tagging `v26.7.1` and cutting the release build are **not** part of this PR (docs prep only). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Summary
tooltip because
sliceCursorShapeAt(passband body →OpenHandCursor)set
foundCursor = truebefore the spot rect loop had a chance to run.m_spotClickRectscheck ahead ofsliceCursorShapeAtinmouseMoveEvent. 7-line block reorder, zero logic changes.spectrumDefaultsToCrosshairAt,line 5578) which already returns
falseearly for spot rects —click and hover now behave consistently.
Test plan
kFilterEdgeGrabPxgrab strips) still respond correctlyPointingHandCursorFixes #3887
Closes #3901