polish(lite): lite-appropriate wording for no-wallet/connection states
In lite builds there is no daemon, and isConnected() now tracks the lite wallet, so the full-node "not connected / waiting for daemon" wording was misleading when no wallet is open. Add two strings (lite_no_wallet, lite_no_wallet_short; English built-ins, so other languages fall back until translated) and use them in lite: - receive/send address preview + receive empty-state overlay + send "can't send" tooltip + transactions empty state -> "No wallet open [— create or open one in Settings]" instead of daemon wording. - Status bar: the red indicator shows "No wallet open" (not "Disconnected") in lite; the P2P peer count is skipped (lite has no peers); and the redundant full-node connection-detail line is suppressed (connection_status_ set to "Connected"/"" from the lite wallet state). Full-node wording unchanged (all gated on isLiteBuild()). Build + run clean (no RPC noise), tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -418,6 +418,9 @@ void App::update()
|
|||||||
// A wallet is open only after a successful backend init against the lite server, so this
|
// A wallet is open only after a successful backend init against the lite server, so this
|
||||||
// is a non-blocking proxy for "lite backend operational".
|
// is a non-blocking proxy for "lite backend operational".
|
||||||
state_.connected = lite_wallet_->walletOpen();
|
state_.connected = lite_wallet_->walletOpen();
|
||||||
|
// Suppress the status bar's full-node connection-detail line in lite ("" and "Connected"
|
||||||
|
// are both hidden); the connected/no-wallet indicator + sync status convey lite state.
|
||||||
|
connection_status_ = state_.connected ? "Connected" : "";
|
||||||
|
|
||||||
wallet::LiteWalletAppRefreshModel liteModel;
|
wallet::LiteWalletAppRefreshModel liteModel;
|
||||||
if (lite_wallet_->takeRefreshedModel(liteModel)) {
|
if (lite_wallet_->takeRefreshedModel(liteModel)) {
|
||||||
@@ -1551,7 +1554,8 @@ void App::renderStatusBar()
|
|||||||
ImGui::TextColored(ImVec4(0.8f, 0.2f, 0.2f, dotOpacity), ICON_MD_CIRCLE);
|
ImGui::TextColored(ImVec4(0.8f, 0.2f, 0.2f, dotOpacity), ICON_MD_CIRCLE);
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
ImGui::SameLine(0, sbIconTextGap);
|
ImGui::SameLine(0, sbIconTextGap);
|
||||||
ImGui::Text("%s", TR("disconnected"));
|
// Lite has no daemon connection; "disconnected" here means no wallet is open.
|
||||||
|
ImGui::Text("%s", TR(isLiteBuild() ? "lite_no_wallet_short" : "disconnected"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Block height
|
// Block height
|
||||||
@@ -1622,7 +1626,8 @@ void App::renderStatusBar()
|
|||||||
ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), TR("sb_syncing_basic"),
|
ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), TR("sb_syncing_basic"),
|
||||||
state_.sync.verification_progress * 100.0, blocksLeft);
|
state_.sync.verification_progress * 100.0, blocksLeft);
|
||||||
}
|
}
|
||||||
} else if (state_.connected) {
|
} else if (state_.connected && !isLiteBuild()) {
|
||||||
|
// Lite has no P2P peers (the lite server isn't a peer set); skip the peer count.
|
||||||
ImGui::Text(TR("sb_peers"), state_.peers.size());
|
ImGui::Text(TR("sb_peers"), state_.peers.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ static void RenderAddressDropdown(App* app, float width) {
|
|||||||
|
|
||||||
// Build preview string
|
// Build preview string
|
||||||
if (!app->isConnected()) {
|
if (!app->isConnected()) {
|
||||||
s_source_preview = TR("not_connected");
|
s_source_preview = TR(app->isLiteBuild() ? "lite_no_wallet_short" : "not_connected");
|
||||||
} else if (s_selected_address_idx >= 0 &&
|
} else if (s_selected_address_idx >= 0 &&
|
||||||
s_selected_address_idx < (int)state.addresses.size()) {
|
s_selected_address_idx < (int)state.addresses.size()) {
|
||||||
const auto& addr = state.addresses[s_selected_address_idx];
|
const auto& addr = state.addresses[s_selected_address_idx];
|
||||||
@@ -509,7 +509,7 @@ void RenderReceiveTab(App* app)
|
|||||||
DrawGlassPanel(dl, emptyMin, emptyMax, glassSpec);
|
DrawGlassPanel(dl, emptyMin, emptyMax, glassSpec);
|
||||||
dl->AddText(sub1, sub1->LegacySize,
|
dl->AddText(sub1, sub1->LegacySize,
|
||||||
ImVec2(emptyMin.x + Layout::spacingXl(), emptyMin.y + Layout::spacingXl()),
|
ImVec2(emptyMin.x + Layout::spacingXl(), emptyMin.y + Layout::spacingXl()),
|
||||||
OnSurfaceDisabled(), TR("waiting_for_daemon"));
|
OnSurfaceDisabled(), TR(app->isLiteBuild() ? "lite_no_wallet" : "waiting_for_daemon"));
|
||||||
dl->AddText(capFont, capFont->LegacySize,
|
dl->AddText(capFont, capFont->LegacySize,
|
||||||
ImVec2(emptyMin.x + Layout::spacingXl(), emptyMin.y + Layout::spacingXl() + sub1->LegacySize + S.drawElement("tabs.receive", "empty-state-subtitle-gap").size),
|
ImVec2(emptyMin.x + Layout::spacingXl(), emptyMin.y + Layout::spacingXl() + sub1->LegacySize + S.drawElement("tabs.receive", "empty-state-subtitle-gap").size),
|
||||||
OnSurfaceDisabled(), TR("addresses_appear_here"));
|
OnSurfaceDisabled(), TR("addresses_appear_here"));
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ static void RenderSourceDropdown(App* app, float width) {
|
|||||||
|
|
||||||
// Build preview string for selected address
|
// Build preview string for selected address
|
||||||
if (!app->isConnected()) {
|
if (!app->isConnected()) {
|
||||||
s_source_preview = TR("not_connected");
|
s_source_preview = TR(app->isLiteBuild() ? "lite_no_wallet_short" : "not_connected");
|
||||||
} else if (s_selected_from_idx >= 0 &&
|
} else if (s_selected_from_idx >= 0 &&
|
||||||
s_selected_from_idx < (int)state.addresses.size()) {
|
s_selected_from_idx < (int)state.addresses.size()) {
|
||||||
const auto& addr = state.addresses[s_selected_from_idx];
|
const auto& addr = state.addresses[s_selected_from_idx];
|
||||||
@@ -890,7 +890,7 @@ static void RenderActionButtons(App* app, float width, float vScale,
|
|||||||
|
|
||||||
if (!can_send && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) {
|
if (!can_send && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) {
|
||||||
if (!app->isConnected())
|
if (!app->isConnected())
|
||||||
ImGui::SetTooltip("%s", TR("send_tooltip_not_connected"));
|
ImGui::SetTooltip("%s", TR(app->isLiteBuild() ? "lite_no_wallet_short" : "send_tooltip_not_connected"));
|
||||||
else if (state.sync.syncing)
|
else if (state.sync.syncing)
|
||||||
ImGui::SetTooltip("%s", TR("send_tooltip_syncing"));
|
ImGui::SetTooltip("%s", TR("send_tooltip_syncing"));
|
||||||
else if (s_from_address[0] == '\0')
|
else if (s_from_address[0] == '\0')
|
||||||
|
|||||||
@@ -578,7 +578,8 @@ void RenderTransactionsTab(App* app)
|
|||||||
{
|
{
|
||||||
if (!app->isConnected()) {
|
if (!app->isConnected()) {
|
||||||
ImGui::Dummy(ImVec2(0, 20));
|
ImGui::Dummy(ImVec2(0, 20));
|
||||||
Type().textColored(TypeStyle::Caption, OnSurfaceDisabled(), TR("not_connected"));
|
Type().textColored(TypeStyle::Caption, OnSurfaceDisabled(),
|
||||||
|
TR(app->isLiteBuild() ? "lite_no_wallet" : "not_connected"));
|
||||||
} else if (state.transactions.empty()) {
|
} else if (state.transactions.empty()) {
|
||||||
ImGui::Dummy(ImVec2(0, 20));
|
ImGui::Dummy(ImVec2(0, 20));
|
||||||
if (txLoading) {
|
if (txLoading) {
|
||||||
|
|||||||
@@ -575,6 +575,10 @@ void I18n::loadBuiltinEnglish()
|
|||||||
strings_["export_viewing_key"] = "Export Viewing Key";
|
strings_["export_viewing_key"] = "Export Viewing Key";
|
||||||
strings_["show_qr_code"] = "Show QR Code";
|
strings_["show_qr_code"] = "Show QR Code";
|
||||||
strings_["not_connected"] = "Not connected to daemon...";
|
strings_["not_connected"] = "Not connected to daemon...";
|
||||||
|
// Lite build: there is no daemon — these replace the daemon-centric "not connected"
|
||||||
|
// strings when no wallet is open (isConnected() tracks the lite wallet in lite builds).
|
||||||
|
strings_["lite_no_wallet"] = "No wallet open — create or open one in Settings";
|
||||||
|
strings_["lite_no_wallet_short"] = "No wallet open";
|
||||||
|
|
||||||
// Send Tab
|
// Send Tab
|
||||||
strings_["pay_from"] = "Pay From";
|
strings_["pay_from"] = "Pay From";
|
||||||
|
|||||||
Reference in New Issue
Block a user