fix(ui): relocate + reword node auto-shield status; add chat-management FAQ entry
- Auto-shield status: the node's z_autoshieldstatus disabled_reason was echoed
verbatim ("HD seed origin is not known-recoverable; back the seed up and pass
-autoshield=1") and drawn INSIDE the Wallet OPTIONS checkbox grid, wedging a
full-width line between the checkboxes. Move it to a full-width note BELOW the
grid, and replace the raw daemon text with friendly, actionable wording keyed
on the seed_recoverable flag (back up your seed to enable it); the raw daemon
reason is kept on hover. Adds App::daemonAutoShieldSeedRecoverable().
- FAQ: add a Chat & Contacts entry ("How do I hide, delete, or block a
conversation?") covering the hide / delete-revive / delete-&-block actions and
the local-only caveat — data + i18n only, no UI code change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1193,29 +1193,6 @@ void RenderSettingsPage(App* app) {
|
||||
if (ImGui::IsItemHovered()) material::Tooltip("%s", TR("tt_save_ztx"));
|
||||
CB(TrId("auto_shield", "auto_shld"), &s_settingsState.auto_shield);
|
||||
if (ImGui::IsItemHovered()) material::Tooltip("%s", TR("tt_auto_shield"));
|
||||
// O1: when a v1.3.0+ node auto-shields coinbase itself, show its real state — the checkbox
|
||||
// above only governs the wallet's own fallback shielder (which defers to the node). Nothing
|
||||
// renders on pre-1.3.0 daemons (never probed), so their behaviour is unchanged.
|
||||
// This status must NOT flow with ImGui's cursor: the checkbox grid is absolutely positioned
|
||||
// (SetCursorScreenPos at rowY), so a normal-flow Text would land under the auto-shield checkbox
|
||||
// and the next grid row (Use Tor / Keep daemon) would draw on top of it. Instead, draw it on its
|
||||
// own full-width row at the grid's current rowY, wrapped to the card, then advance rowY past it.
|
||||
if (app && app->daemonAutoShieldProbed() &&
|
||||
(app->daemonAutoShieldActive() || !app->daemonAutoShieldDisabledReason().empty())) {
|
||||
ImGui::SetCursorScreenPos(ImVec2(cx, rowY));
|
||||
ImGui::PushTextWrapPos((cx + cw) - ImGui::GetWindowPos().x); // wrap to the card content width
|
||||
if (app->daemonAutoShieldActive()) {
|
||||
ImGui::TextColored(ImVec4(0.40f, 0.78f, 0.40f, 1.0f), " %s", TR("autoshield_by_node"));
|
||||
if (!app->daemonAutoShieldAddress().empty())
|
||||
ImGui::TextDisabled(" %s", app->daemonAutoShieldAddress().c_str());
|
||||
} else {
|
||||
ImGui::TextDisabled(" %s", app->daemonAutoShieldDisabledReason().c_str());
|
||||
}
|
||||
ImGui::PopTextWrapPos();
|
||||
last = ImGui::GetCursorScreenPos().y; // cursor is now below the status text
|
||||
rowY = last + gp; // next grid row starts below it
|
||||
c = 0;
|
||||
}
|
||||
CB(TrId("use_tor", "tor"), &s_settingsState.use_tor);
|
||||
if (ImGui::IsItemHovered()) material::Tooltip("%s", TR("tt_tor"));
|
||||
if (showDaemonOptions) {
|
||||
@@ -1232,6 +1209,30 @@ void RenderSettingsPage(App* app) {
|
||||
saveSettingsPageState(app->settings());
|
||||
}
|
||||
if (ImGui::IsItemHovered()) material::Tooltip("%s", TR("tt_verbose"));
|
||||
|
||||
// O1: node coinbase auto-shield status (v1.3.0+). Rendered as a full-width note BELOW the
|
||||
// checkbox grid (not wedged between checkboxes) with friendly wording — the daemon's raw
|
||||
// technical reason is available on hover. Nothing renders on pre-1.3.0 daemons (never probed).
|
||||
if (app && app->daemonAutoShieldProbed() &&
|
||||
(app->daemonAutoShieldActive() || !app->daemonAutoShieldDisabledReason().empty())) {
|
||||
ImGui::SetCursorScreenPos(ImVec2(cx, last + gp));
|
||||
ImGui::PushTextWrapPos((cx + cw) - ImGui::GetWindowPos().x); // wrap to the card content width
|
||||
if (app->daemonAutoShieldActive()) {
|
||||
ImGui::TextColored(ImVec4(0.40f, 0.78f, 0.40f, 1.0f), "%s", TR("autoshield_by_node"));
|
||||
if (!app->daemonAutoShieldAddress().empty())
|
||||
ImGui::TextDisabled(" %s", app->daemonAutoShieldAddress().c_str());
|
||||
} else {
|
||||
// Friendly, actionable wording. The seed-not-recoverable case is the common one and has a
|
||||
// clear fix (back up the seed); anything else gets a generic line. Raw daemon text on hover.
|
||||
ImGui::TextDisabled("%s", app->daemonAutoShieldSeedRecoverable()
|
||||
? TR("autoshield_off_generic")
|
||||
: TR("autoshield_off_backup_seed"));
|
||||
if (ImGui::IsItemHovered())
|
||||
material::Tooltip("%s", app->daemonAutoShieldDisabledReason().c_str());
|
||||
}
|
||||
ImGui::PopTextWrapPos();
|
||||
last = ImGui::GetCursorScreenPos().y; // grow the card to include the note
|
||||
}
|
||||
cardClose(0, last);
|
||||
}
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ const std::vector<FaqSubcategory>& walletFaq()
|
||||
{ "faq_w_chat_1_q", "faq_w_chat_1_a" },
|
||||
{ "faq_w_chat_2_q", "faq_w_chat_2_a" },
|
||||
{ "faq_w_chat_3_q", "faq_w_chat_3_a" },
|
||||
{ "faq_w_chat_4_q", "faq_w_chat_4_a" },
|
||||
}},
|
||||
{ "faq_w_set_title", {
|
||||
{ "faq_w_set_1_q", "faq_w_set_1_a" },
|
||||
|
||||
Reference in New Issue
Block a user