From 22638b094cefcc6ff771aa518797a92ee0e7baa3 Mon Sep 17 00:00:00 2001 From: DanS Date: Mon, 13 Jul 2026 21:37:58 -0500 Subject: [PATCH] feat(settings): migrate Backup Wallet modal to the reference design MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1. Struct-form BlurFloat overlay (was the legacy positional overload); DialogWarningHeader care header; centered DialogActionFooter (Create Backup + Close) replacing the StyledButtons + separator; full i18n — title/destination/ button reuse existing backup_* keys, plus two new keys (backup_warn one-line care line, backup_overwrite_confirm) added in en + 8 langs. No change to backupWallet. Co-Authored-By: Claude Opus 4.8 (1M context) --- res/fonts/NotoSansCJK-Subset.ttf | Bin 625236 -> 625404 bytes res/lang/de.json | 2 + res/lang/es.json | 2 + res/lang/fr.json | 2 + res/lang/ja.json | 2 + res/lang/ko.json | 2 + res/lang/pt.json | 2 + res/lang/ru.json | 2 + res/lang/zh.json | 2 + src/app.cpp | 66 +++++++++++++++---------------- src/util/i18n.cpp | 2 + 11 files changed, 49 insertions(+), 35 deletions(-) diff --git a/res/fonts/NotoSansCJK-Subset.ttf b/res/fonts/NotoSansCJK-Subset.ttf index d9c0cfadea1b7c145b9d8b935984f8fd77b25e2b..9f05a8804a19d72bc8519f4f4e1ca174768a2770 100644 GIT binary patch delta 9150 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 In9s=n15?#tMgRZ+ delta 9041 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 WYgum%VQ+0;=zOl7^?WMtlm83a@L1RY diff --git a/res/lang/de.json b/res/lang/de.json index b91f739..6ff00a3 100644 --- a/res/lang/de.json +++ b/res/lang/de.json @@ -62,6 +62,7 @@ "backup_data": "SICHERUNG & DATEN", "backup_description": "Erstellen Sie eine Sicherung Ihrer wallet.dat-Datei. Diese Datei enthält alle Ihre privaten Schlüssel und den Transaktionsverlauf. Bewahren Sie die Sicherung an einem sicheren Ort auf.", "backup_destination": "Sicherungsziel:", + "backup_overwrite_confirm": "Dort existiert bereits eine Datei — erneut speichern, um sie zu überschreiben.", "backup_source": "Quelle: %s", "backup_tip_external": "Speichern Sie Sicherungen auf externen Laufwerken oder Cloud-Speicher", "backup_tip_multiple": "Erstellen Sie mehrere Sicherungen an verschiedenen Orten", @@ -70,6 +71,7 @@ "backup_title": "Wallet sichern", "backup_wallet": "Wallet sichern...", "backup_wallet_not_found": "Warnung: wallet.dat nicht am erwarteten Speicherort gefunden", + "backup_warn": "Diese Datei enthält alle Ihre privaten Schlüssel — bewahren Sie sie sicher auf.", "balance": "Guthaben", "balance_history_collecting": "Guthabenverlauf — Daten werden gesammelt...", "balance_layout": "Guthaben-Layout", diff --git a/res/lang/es.json b/res/lang/es.json index 9ae6c20..b54ecfa 100644 --- a/res/lang/es.json +++ b/res/lang/es.json @@ -62,6 +62,7 @@ "backup_data": "RESPALDO Y DATOS", "backup_description": "Crea un respaldo de tu archivo wallet.dat. Este archivo contiene todas tus claves privadas e historial de transacciones. Guarda el respaldo en un lugar seguro.", "backup_destination": "Destino del respaldo:", + "backup_overwrite_confirm": "Ya existe un archivo ahí: guarda de nuevo para sobrescribirlo.", "backup_source": "Origen: %s", "backup_tip_external": "Guarda respaldos en unidades externas o almacenamiento en la nube", "backup_tip_multiple": "Crea múltiples respaldos en diferentes ubicaciones", @@ -70,6 +71,7 @@ "backup_title": "Respaldar Cartera", "backup_wallet": "Respaldar Cartera...", "backup_wallet_not_found": "Advertencia: wallet.dat no encontrado en la ubicación esperada", + "backup_warn": "Este archivo contiene todas tus claves privadas: guárdalo en un lugar seguro.", "balance": "Saldo", "balance_history_collecting": "Historial de saldo — recopilando datos...", "balance_layout": "Diseño de Saldo", diff --git a/res/lang/fr.json b/res/lang/fr.json index 06017f0..00ff346 100644 --- a/res/lang/fr.json +++ b/res/lang/fr.json @@ -62,6 +62,7 @@ "backup_data": "SAUVEGARDE & DONNÉES", "backup_description": "Créez une sauvegarde de votre fichier wallet.dat. Ce fichier contient toutes vos clés privées et l'historique des transactions. Conservez la sauvegarde dans un endroit sûr.", "backup_destination": "Destination de sauvegarde :", + "backup_overwrite_confirm": "Un fichier existe déjà là — enregistrez à nouveau pour l'écraser.", "backup_source": "Source : %s", "backup_tip_external": "Stockez les sauvegardes sur des disques externes ou un stockage cloud", "backup_tip_multiple": "Créez plusieurs sauvegardes à différents endroits", @@ -70,6 +71,7 @@ "backup_title": "Sauvegarder le portefeuille", "backup_wallet": "Sauvegarder le portefeuille...", "backup_wallet_not_found": "Attention : wallet.dat introuvable à l'emplacement prévu", + "backup_warn": "Ce fichier contient toutes vos clés privées — conservez-le en lieu sûr.", "balance": "Solde", "balance_history_collecting": "Historique du solde — collecte des données...", "balance_layout": "Disposition du solde", diff --git a/res/lang/ja.json b/res/lang/ja.json index 016bc39..3260680 100644 --- a/res/lang/ja.json +++ b/res/lang/ja.json @@ -62,6 +62,7 @@ "backup_data": "バックアップとデータ", "backup_description": "wallet.datファイルのバックアップを作成します。このファイルにはすべての秘密鍵と取引履歴が含まれています。バックアップは安全な場所に保管してください。", "backup_destination": "バックアップ先:", + "backup_overwrite_confirm": "そこには既にファイルがあります。もう一度保存すると上書きされます。", "backup_source": "ソース:%s", "backup_tip_external": "外部ドライブまたはクラウドストレージにバックアップを保存", "backup_tip_multiple": "異なる場所に複数のバックアップを作成", @@ -70,6 +71,7 @@ "backup_title": "ウォレットのバックアップ", "backup_wallet": "ウォレットをバックアップ...", "backup_wallet_not_found": "警告:予想される場所にwallet.datが見つかりません", + "backup_warn": "このファイルにはすべての秘密鍵が含まれています。安全な場所に保管してください。", "balance": "残高", "balance_history_collecting": "残高履歴 — データを収集中...", "balance_layout": "残高レイアウト", diff --git a/res/lang/ko.json b/res/lang/ko.json index d543e76..7bc70cf 100644 --- a/res/lang/ko.json +++ b/res/lang/ko.json @@ -62,6 +62,7 @@ "backup_data": "백업 및 데이터", "backup_description": "wallet.dat 파일의 백업을 생성합니다. 이 파일에는 모든 개인 키와 거래 내역이 포함되어 있습니다. 백업을 안전한 곳에 보관하세요.", "backup_destination": "백업 위치:", + "backup_overwrite_confirm": "그곳에 이미 파일이 있습니다. 다시 저장하면 덮어씁니다.", "backup_source": "소스: %s", "backup_tip_external": "외장 드라이브 또는 클라우드 스토리지에 백업 저장", "backup_tip_multiple": "서로 다른 위치에 여러 백업 생성", @@ -70,6 +71,7 @@ "backup_title": "지갑 백업", "backup_wallet": "지갑 백업...", "backup_wallet_not_found": "경고: 예상 위치에서 wallet.dat를 찾을 수 없습니다", + "backup_warn": "이 파일에는 모든 개인 키가 들어 있습니다. 안전한 곳에 보관하세요.", "balance": "잔액", "balance_history_collecting": "잔액 내역 — 데이터 수집 중...", "balance_layout": "잔액 레이아웃", diff --git a/res/lang/pt.json b/res/lang/pt.json index b094d16..5dff42c 100644 --- a/res/lang/pt.json +++ b/res/lang/pt.json @@ -62,6 +62,7 @@ "backup_data": "BACKUP & DADOS", "backup_description": "Crie um backup do seu arquivo wallet.dat. Este arquivo contém todas as suas chaves privadas e histórico de transações. Guarde o backup em um local seguro.", "backup_destination": "Destino do backup:", + "backup_overwrite_confirm": "Já existe um arquivo ali — salve novamente para sobrescrevê-lo.", "backup_source": "Origem: %s", "backup_tip_external": "Armazene backups em unidades externas ou armazenamento em nuvem", "backup_tip_multiple": "Crie múltiplos backups em diferentes locais", @@ -70,6 +71,7 @@ "backup_title": "Backup da Carteira", "backup_wallet": "Fazer Backup da Carteira...", "backup_wallet_not_found": "Aviso: wallet.dat não encontrado no local esperado", + "backup_warn": "Este arquivo contém todas as suas chaves privadas — guarde-o em local seguro.", "balance": "Saldo", "balance_history_collecting": "Histórico de saldo — coletando dados...", "balance_layout": "Layout do Saldo", diff --git a/res/lang/ru.json b/res/lang/ru.json index 1e75716..0ff7901 100644 --- a/res/lang/ru.json +++ b/res/lang/ru.json @@ -62,6 +62,7 @@ "backup_data": "РЕЗЕРВНОЕ КОПИРОВАНИЕ И ДАННЫЕ", "backup_description": "Создайте резервную копию файла wallet.dat. Этот файл содержит все ваши приватные ключи и историю транзакций. Храните копию в безопасном месте.", "backup_destination": "Место сохранения:", + "backup_overwrite_confirm": "Там уже есть файл — сохраните ещё раз, чтобы перезаписать его.", "backup_source": "Источник: %s", "backup_tip_external": "Храните резервные копии на внешних дисках или в облаке", "backup_tip_multiple": "Создавайте несколько копий в разных местах", @@ -70,6 +71,7 @@ "backup_title": "Резервное копирование кошелька", "backup_wallet": "Создать резервную копию...", "backup_wallet_not_found": "Предупреждение: wallet.dat не найден в ожидаемом расположении", + "backup_warn": "Этот файл содержит все ваши приватные ключи — храните его в надёжном месте.", "balance": "Баланс", "balance_history_collecting": "История баланса — сбор данных...", "balance_layout": "Макет баланса", diff --git a/res/lang/zh.json b/res/lang/zh.json index 4f34c0d..de8a4b7 100644 --- a/res/lang/zh.json +++ b/res/lang/zh.json @@ -62,6 +62,7 @@ "backup_data": "备份与数据", "backup_description": "创建 wallet.dat 文件的备份。此文件包含您所有的私钥和交易历史。请将备份存放在安全的地方。", "backup_destination": "备份目标:", + "backup_overwrite_confirm": "该位置已存在文件,再次保存将覆盖它。", "backup_source": "来源:%s", "backup_tip_external": "将备份存储在外部驱动器或云存储中", "backup_tip_multiple": "在不同位置创建多个备份", @@ -70,6 +71,7 @@ "backup_title": "备份钱包", "backup_wallet": "备份钱包...", "backup_wallet_not_found": "警告:在预期位置未找到 wallet.dat", + "backup_warn": "此文件包含您的所有私钥,请妥善保管。", "balance": "余额", "balance_history_collecting": "余额历史——正在收集数据…", "balance_layout": "余额布局", diff --git a/src/app.cpp b/src/app.cpp index 6e4b0f1..bc42625 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -3271,42 +3271,44 @@ void App::renderExportKeyDialog() void App::renderBackupDialog() { - auto dlg = ui::schema::UI().drawElement("inline-dialogs", "backup"); - auto dlgF = [&](const char* key, float fb) -> float { - auto it = dlg.extraFloats.find(key); - return it != dlg.extraFloats.end() ? it->second : fb; - }; - int btnFont = (int)dlgF("button-font", 1); - float btnW = dlgF("button-width", 120.0f); - - if (!ui::material::BeginOverlayDialog("Backup Wallet", &show_backup_, dlgF("width", 500.0f), 0.94f)) { - return; - } - - ImGui::TextWrapped("Export all private keys to a file. Keep this file secure!"); + namespace m = ui::material; + + m::OverlayDialogSpec ov; + ov.title = TR("backup_title"); + ov.p_open = &show_backup_; + ov.style = m::OverlayStyle::BlurFloat; + ov.cardWidth = 560.0f; + ov.idSuffix = "backup"; + if (!m::BeginOverlayDialog(ov)) return; + + m::DialogWarningHeader(TR("backup_warn")); ImGui::Spacing(); - - ImGui::Text("Backup File Path:"); + static char backup_path[512] = "dragonx-backup.txt"; static bool s_backup_confirm_overwrite = false; + ImGui::TextUnformatted(TR("backup_destination")); ImGui::SetNextItemWidth(-1); if (ImGui::InputText("##backuppath", backup_path, sizeof(backup_path))) s_backup_confirm_overwrite = false; // path edited — re-check overwrite on next Save - - ImGui::Spacing(); - + if (!backup_status_.empty()) { - if (backup_success_) { - ImGui::TextColored(ui::material::SuccessVec4(), "%s", backup_status_.c_str()); - } else { - ImGui::TextColored(ImVec4(0.8f, 0.3f, 0.3f, 1.0f), "%s", backup_status_.c_str()); - } + ImGui::Spacing(); + ImGui::PushTextWrapPos(0.0f); + ImGui::TextColored(backup_success_ ? m::SuccessVec4() : ImVec4(0.8f, 0.3f, 0.3f, 1.0f), + "%s", backup_status_.c_str()); + ImGui::PopTextWrapPos(); } - + ImGui::Spacing(); - ImGui::Separator(); - - if (ui::material::StyledButton("Save Backup", ImVec2(btnW, 0), ui::material::resolveButtonFont(btnFont))) { + + bool doSave = false, doClose = false; + m::DialogActionFooter(TR("backup_create"), true, TR("close"), doSave, doClose); + if (doClose) { + show_backup_ = false; + backup_status_.clear(); + s_backup_confirm_overwrite = false; + } + if (doSave) { std::string path(backup_path); // Trim surrounding whitespace (a pasted path can carry a trailing newline). while (!path.empty() && (path.front()==' '||path.front()=='\t'||path.front()=='\n'||path.front()=='\r')) path.erase(path.begin()); @@ -3317,7 +3319,7 @@ void App::renderBackupDialog() // Don't clobber an existing file (possibly a good earlier backup) without confirmation. s_backup_confirm_overwrite = true; backup_success_ = false; - backup_status_ = "A file already exists there — click Save Backup again to overwrite it."; + backup_status_ = TR("backup_overwrite_confirm"); } else { s_backup_confirm_overwrite = false; backupWallet(path, [this](bool success, const std::string& msg) { @@ -3327,14 +3329,8 @@ void App::renderBackupDialog() } } } - ImGui::SameLine(); - if (ui::material::StyledButton("Close", ImVec2(btnW, 0), ui::material::resolveButtonFont(btnFont))) { - show_backup_ = false; - backup_status_.clear(); - s_backup_confirm_overwrite = false; - } - ui::material::EndOverlayDialog(); + m::EndOverlayDialog(); } void App::maybeOfferDaemonUpdate() diff --git a/src/util/i18n.cpp b/src/util/i18n.cpp index af2e00b..5ce8a88 100644 --- a/src/util/i18n.cpp +++ b/src/util/i18n.cpp @@ -1202,6 +1202,8 @@ void I18n::loadBuiltinEnglish() strings_["backup_created"] = "Wallet backup created"; strings_["backup_description"] = "Create a backup of your wallet.dat file. This file contains all your private keys and transaction history. Store the backup in a secure location."; strings_["backup_destination"] = "Backup destination:"; + strings_["backup_warn"] = "This file holds all your private keys \xE2\x80\x94 keep it somewhere safe."; + strings_["backup_overwrite_confirm"] = "A file already exists there \xE2\x80\x94 Save again to overwrite it."; strings_["backup_tip_external"] = "Store backups on external drives or cloud storage"; strings_["backup_tip_multiple"] = "Create multiple backups in different locations"; strings_["backup_tip_test"] = "Test restoring from backup periodically";