feat: blockchain rescan via daemon restart + status bar progress

- Fix z_importwallet to use full path instead of filename only
- Add rescanBlockchain() method that restarts daemon with -rescan flag
- Track rescan progress via daemon output parsing and getrescaninfo RPC
- Display rescan progress in status bar with animated indicator when starting
- Improve dark theme card contrast: lighter surface-variant, tinted borders, stronger rim-light
This commit is contained in:
dan_s
2026-02-28 15:06:35 -06:00
parent f5378a55ed
commit 4b815fc9d1
42 changed files with 1113 additions and 687 deletions

View File

@@ -668,20 +668,13 @@ void RenderSendConfirmPopup(App* app) {
double total = s_amount + s_fee;
ImVec2 center = ImGui::GetMainViewport()->GetCenter();
ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
float popupAvailW = ImGui::GetMainViewport()->Size.x * S.drawElement("tabs.send", "confirm-popup-width-ratio").size;
float popupW = std::min(schema::UI().drawElement("tabs.send", "confirm-popup-max-width").size, popupAvailW);
float popVs = Layout::vScale();
ImGui::SetNextWindowSize(ImVec2(popupW, 0), ImGuiCond_Always);
const auto& acrylicTheme = GetCurrentAcrylicTheme();
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(Layout::spacingXl(), Layout::spacingLg()));
if (effects::ImGuiAcrylic::BeginAcrylicPopupModal(TR("confirm_send"), nullptr,
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize, acrylicTheme.popup)) {
if (material::BeginOverlayDialog(TR("confirm_send"), nullptr, popupW, 0.94f)) {
if (ImGui::IsKeyPressed(ImGuiKey_Escape) && !s_sending) {
s_show_confirm = false;
ImGui::CloseCurrentPopup();
}
float popW = ImGui::GetContentRegionAvail().x;
@@ -825,21 +818,15 @@ void RenderSendConfirmPopup(App* app) {
}
);
s_show_confirm = false;
ImGui::CloseCurrentPopup();
}
ImGui::SameLine();
if (TactileButton("Cancel", ImVec2(S.button("tabs.send", "cancel-button").width, std::max(schema::UI().drawElement("tabs.send", "confirm-btn-min-height").size, schema::UI().drawElement("tabs.send", "confirm-btn-base-height").size * popVs)), S.resolveFont(S.button("tabs.send", "cancel-button").font))) {
s_show_confirm = false;
ImGui::CloseCurrentPopup();
}
}
effects::ImGuiAcrylic::EndAcrylicPopup();
} else {
// BeginPopupModal returned false — popup was closed externally
s_show_confirm = false;
material::EndOverlayDialog();
}
ImGui::PopStyleVar();
}
// ============================================================================