feat(daemon-update): two-pane version picker (versions left, detail right)

Redesign the Update Node dialog to mirror the Manage-Portfolio editor: the list
of node versions on the LEFT (with latest / installed / pre-release badges +
date), the selected version's detail on the RIGHT — status vs installed, release
notes (checksum table + markdown heading markers stripped), the verify/downgrade
note, and the install action (Download & install / Install this version /
Reinstall). One Close in the footer.

The dialog now fetches the full release list up front (startListReleases) so the
picker is populated immediately; Downloading/Verifying/Done/Failed render in the
right pane with the list still visible. Layout is GetContentRegionAvail-based so
it adapts to a viewport-capped card (verified 100% + 150%, dark + light).

Adds a sweep seam (sweepSeed/sweepClose) + a modal-daemon-update sweep surface
seeded with fake releases for offline visual verification. Adversarially
reviewed (3 lenses); fixed the real findings — live list was never populated
from getReleases() (only the sweep seeded it), defensive s_rows bounds in the
detail pane, notes box dropped when the pane is too short so the install button
stays visible, and a badge-overrun guard for long tags. DPI "findings" were the
recurring false positives (LegacySize/spacing/GetFrameHeight are all dp-scaled).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-10 16:28:33 -05:00
parent e6bea8eb04
commit c6624913de
3 changed files with 343 additions and 101 deletions

View File

@@ -1481,6 +1481,13 @@ void I18n::loadBuiltinEnglish()
strings_["daemon_update_browse"] = "Browse all releases…";
strings_["daemon_update_loading"] = "Loading releases…";
strings_["daemon_update_downgrade_note"] = "Older versions may be incompatible with your current chain data. Installing a different version takes effect after a daemon restart.";
strings_["daemon_update_latest_badge"] = "latest";
strings_["daemon_update_status_current"] = "This version is installed";
strings_["daemon_update_status_latest"] = "Latest version";
strings_["daemon_update_status_older"] = "Older than your installed version";
strings_["daemon_update_released"] = "Released:";
strings_["daemon_update_no_notes"] = "No release notes for this version.";
strings_["daemon_update_install_this"] = "Install this version";
// --- Lite Network tab (server browser) ---
strings_["lite_net_title"] = "Lite Servers";