Skip to content

fix(gui): DX spot tooltip blocked by passband hit-test (#3887)#3903

Merged
ten9876 merged 1 commit into
aethersdr:mainfrom
M7HNF-Ian:fix/spot-tooltip-in-passband
Jun 30, 2026
Merged

fix(gui): DX spot tooltip blocked by passband hit-test (#3887)#3903
ten9876 merged 1 commit into
aethersdr:mainfrom
M7HNF-Ian:fix/spot-tooltip-in-passband

Conversation

@M7HNF-Ian

Copy link
Copy Markdown
Contributor

Summary

  • Hovering over a DX spot inside the active slice passband showed no
    tooltip because sliceCursorShapeAt (passband body → OpenHandCursor)
    set foundCursor = true before the spot rect loop had a chance to run.
  • Fix: move m_spotClickRects check ahead of sliceCursorShapeAt in
    mouseMoveEvent. 7-line block reorder, zero logic changes.
  • Mirrors the existing press path (spectrumDefaultsToCrosshairAt,
    line 5578) which already returns false early for spot rects —
    click and hover now behave consistently.

Test plan

  • Enable SpotHub; tune a spot fully inside the active slice passband — tooltip appears on hover
  • Same spot moved outside the passband — tooltip still works
  • Filter edge resize zones (kFilterEdgeGrabPx grab strips) still respond correctly
  • Spot cluster indicators inside passband show PointingHandCursor
  • Tested: macOS 15, FLEX-6600, v26.6.5 build

Fixes #3887
Closes #3901

…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).

@aethersdr-agent aethersdr-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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, mouseMoveEvent checks spots (m_spotClickRects / m_spotClusters) before sliceCursorShapeAt.
  • mousePressEvent already dispatches spot clicks firstSpectrumWidget.cpp:5634-5670 runs the m_spotClickRects loop, emits spotTriggered / frequencyClicked, and ev->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

@jensenpat

jensenpat commented Jun 30, 2026

Copy link
Copy Markdown
Collaborator

@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 ten9876 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@ten9876 ten9876 merged commit 5b57ea9 into aethersdr:main Jun 30, 2026
6 checks passed
ten9876 added a commit that referenced this pull request Jul 2, 2026
#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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants