fix: Tier-2 quick mediums — view-only guard, memo counter, updater/close guards

- Send: block Review from a view-only source (no spending key) with a tooltip,
  instead of failing at submit; label the memo counter as bytes and warn in
  colour once the field hits its cap (Sapling memos are byte-limited).
- Shield: show "No shielded (z) address yet — create one on the Receive tab
  first" when the destination combo is empty, instead of an empty dropdown.
- Updater dialogs (xmrig/daemon): suppress the window X during an active
  download/verify/extract so closing can't orphan/block on the worker — the
  in-dialog Cancel is the way to abort.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-05 13:54:55 -05:00
parent 65bb98cd09
commit b2a8c4487e
4 changed files with 30 additions and 9 deletions

View File

@@ -62,12 +62,14 @@ public:
}
using namespace material;
const float dp = Layout::dpiScale();
const auto p = s_updater->getProgress();
// No window X during an active download/verify/extract — closing would orphan/block on the
// worker; the in-dialog Cancel is the intended way to abort.
const bool active = (p.state == St::Downloading || p.state == St::Verifying || p.state == St::Extracting);
OverlayDialogSpec ov;
ov.title = TR("daemon_update_title"); ov.p_open = &s_open;
ov.title = TR("daemon_update_title"); ov.p_open = active ? nullptr : &s_open;
ov.style = OverlayStyle::BlurFloat; ov.cardWidth = 480.0f; ov.cardBottomViewportRatio = 0.94f;
if (BeginOverlayDialog(ov)) {
const auto p = s_updater->getProgress();
using St = util::DaemonUpdater::State;
switch (p.state) {
case St::Checking: renderChecking(dp, p); break;
case St::UpToDate: