fix(ui): every tooltip answers the pointer, through one class handler - #337
Merged
Merged
Conversation
A TextBlock or panel with no background is not hit-testable, glyphs included, so a tooltip on one never opens: the pointer reaches the list item, card or column header behind it. #332 patched the status bar with two transparent backgrounds. A walk of every scenario window found the same defect in about 50 more places: history and saved-query rows, connection endpoints, the Activity and Slow Queries query text, Database Overview's cache-hit tiles, the Security window's "connected as", raw filter chips, the schema tree's column types, and every results-grid column header. Nimbus.Ui.Controls.ToolTipHitTesting (installed from App.Initialize) gives any panel, text block, border, presenter or templated control that gets a tooltip a transparent background as a current value. A background the markup or a style sets still wins, and one that goes back to null is filled again. Renders of every scenario are byte-identical before and after, except the windows whose tab animation differs between any two renders. TextBlock.statusMessage and CutTextTip move to nimbusUi too (DESIGN.md rule 21), and the per-site backgrounds from #332 go, so the handler is the only mechanism. TooltipReachTests walks every window in Scenarios.All and hit-tests each tooltip-bearing element's text (203 failures without the handler), hovers a history row for real, and pins the handler's priority. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kubeNimbus's wide and narrow grids put probe points inside the window but outside a scroll viewport, which read as dead tooltips. Same probe in both apps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
#332 found that a
TextBlockor panel with noBackgroundis not hit-testable, glyphs included: 0 of 4,536 points over the status text reached the text block, so its tooltip never opened. It patched the status bar only.A new headless walk (
TooltipReachTests) hit-tests every tooltip-bearing element in everyScenarios.Allwindow. Onmainit finds 203 failures, about 50 distinct elements:CreateColumnHeader)The pointer landed on the list item, card or header border behind each one. The schema tree's function, index, role and extension rows, NotifyMonitor's error lines, the conflict dialog's cut cells and the lock icon are the same shape; the fixtures don't show them, but the fix covers them by construction.
One mechanism, not a patch per site.
Nimbus.Ui.Controls.ToolTipHitTesting, installed fromApp.Initialize, is a class handler. AnyPanel,TextBlock,Border,ContentPresenteror templated control that gets a tooltip and has no background getsBrushes.Transparentas a current value:ToolTip.ShowOnDisabledis the opt-in#332's two per-site
Background="Transparent"setters are removed.TextBlock.statusMessageandCutTextTipmove to nimbusUi, since nothing about them is Postgres-specific, and become DESIGN.md rule 21. CLAUDE.md records the evidence.Paired PRs: Shman4ik/nimbusUi#6 (this subtree, plus the backlog nimbusUi had missed since 2026-09-28); Shman4ik/kubeNimbus#127 (the same handler there: 189 dead tooltips in 130 of 186 scenarios before, none after).
Verified
dotnet build PgNimbus.slnx -t:Rebuild, anddotnet build src/PgNimbus.App -c Release -t:Rebuild: 0 warnings (trim/AOT analyzers on)PgNimbus.Core.Tests: not run; nothing in Core changedPgNimbus.App.Tests: 763 total, 749 passed, 14 skipped (the ones gated on a live database)TooltipReachTestsgoes red without the handler: 3 of 3 fail (the walk lists 203 dead elements)mainand on this branch, Windows, Release. 83 of 100 frames are byte-identical. The other 17 (security ×8, activity ×3, overview ×2, slow queries ×4) differ just as much between two renders ofmain, from their animated tab strips. The harness's own--baselinecomparison passes.Anything left unverified: hovering in the real app on Windows/macOS by hand. The test hovers a history row with real pointer input on the headless platform, and the tooltip opens.
Checklist
shared/nimbusUi: Take pgNimbus's copy (rules 16, 18–20), and tooltips that answer the pointer (rule 21) nimbusUi#6, and a paired kubeNimbus PR🤖 Generated with Claude Code