From fe40d38f0d9dec78ff51482a114db982723ff9c0 Mon Sep 17 00:00:00 2001 From: DanS Date: Sat, 11 Jul 2026 17:01:51 -0500 Subject: [PATCH] feat(wallets): segmented sort control (like the Receive all/z/t toggle) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the sort dropdown with a material::SegmentedControl — Created / Addresses / Txs / Size — matching the Receive tab's address-type toggle, with the asc/desc arrow beside it. Shorten the four sort labels to fit the segments (updated across all eight languages + the back-fill script). The direction arrow is positioned explicitly on the segment's baseline (the control is draw-list based and doesn't advance the layout cursor). Co-Authored-By: Claude Opus 4.8 (1M context) --- res/lang/de.json | 8 ++++---- res/lang/es.json | 8 ++++---- res/lang/fr.json | 8 ++++---- res/lang/ja.json | 8 ++++---- res/lang/ko.json | 8 ++++---- res/lang/pt.json | 8 ++++---- res/lang/ru.json | 8 ++++---- res/lang/zh.json | 8 ++++---- scripts/add_missing_translations.py | 16 ++++++++-------- src/ui/windows/wallets_dialog.h | 26 ++++++++++++++++++-------- src/util/i18n.cpp | 8 ++++---- 11 files changed, 62 insertions(+), 52 deletions(-) diff --git a/res/lang/de.json b/res/lang/de.json index dba691f..c04b261 100644 --- a/res/lang/de.json +++ b/res/lang/de.json @@ -1359,13 +1359,13 @@ "wallets_new_label": "Eine neue Wallet erstellen:", "wallets_open": "Öffnen", "wallets_reveal": "Ordner anzeigen", - "wallets_sort_addresses": "Adressanzahl", + "wallets_sort_addresses": "Adressen", "wallets_sort_asc": "Aufsteigend (ältestes / wenigste / kleinstes zuerst)", "wallets_sort_by": "Sortieren:", - "wallets_sort_created": "Erstellungsdatum", + "wallets_sort_created": "Erstellt", "wallets_sort_desc": "Absteigend (neuestes / meiste / größtes zuerst)", - "wallets_sort_size": "Wallet-Größe", - "wallets_sort_txs": "Transaktionsanzahl", + "wallets_sort_size": "Größe", + "wallets_sort_txs": "Txs", "wallets_title": "Wallets", "warning": "Warnung", "warning_upper": "WARNUNG!", diff --git a/res/lang/es.json b/res/lang/es.json index 66ef591..5bca138 100644 --- a/res/lang/es.json +++ b/res/lang/es.json @@ -1359,13 +1359,13 @@ "wallets_new_label": "Crear una nueva cartera:", "wallets_open": "Abrir", "wallets_reveal": "Mostrar carpeta", - "wallets_sort_addresses": "Número de direcciones", + "wallets_sort_addresses": "Direcciones", "wallets_sort_asc": "Ascendente (más antiguo / menos / más pequeño primero)", "wallets_sort_by": "Ordenar:", - "wallets_sort_created": "Fecha de creación", + "wallets_sort_created": "Creado", "wallets_sort_desc": "Descendente (más reciente / más / más grande primero)", - "wallets_sort_size": "Tamaño de billetera", - "wallets_sort_txs": "Número de transacciones", + "wallets_sort_size": "Tamaño", + "wallets_sort_txs": "Txs", "wallets_title": "Carteras", "warning": "Advertencia", "warning_upper": "¡ADVERTENCIA!", diff --git a/res/lang/fr.json b/res/lang/fr.json index 4aceb2f..f3b9d13 100644 --- a/res/lang/fr.json +++ b/res/lang/fr.json @@ -1359,13 +1359,13 @@ "wallets_new_label": "Créer un nouveau portefeuille :", "wallets_open": "Ouvrir", "wallets_reveal": "Afficher le dossier", - "wallets_sort_addresses": "Nombre d'adresses", + "wallets_sort_addresses": "Adresses", "wallets_sort_asc": "Croissant (plus ancien / moins / plus petit d'abord)", "wallets_sort_by": "Trier :", - "wallets_sort_created": "Date de création", + "wallets_sort_created": "Créé", "wallets_sort_desc": "Décroissant (plus récent / plus / plus grand d'abord)", - "wallets_sort_size": "Taille du portefeuille", - "wallets_sort_txs": "Nombre de transactions", + "wallets_sort_size": "Taille", + "wallets_sort_txs": "Txs", "wallets_title": "Portefeuilles", "warning": "Attention", "warning_upper": "ATTENTION !", diff --git a/res/lang/ja.json b/res/lang/ja.json index 531acc9..1b70563 100644 --- a/res/lang/ja.json +++ b/res/lang/ja.json @@ -1359,13 +1359,13 @@ "wallets_new_label": "新しいウォレットを作成:", "wallets_open": "開く", "wallets_reveal": "フォルダを開く", - "wallets_sort_addresses": "アドレス数", + "wallets_sort_addresses": "アドレス", "wallets_sort_asc": "昇順(古い/少ない/小さい順)", "wallets_sort_by": "並べ替え:", - "wallets_sort_created": "作成日", + "wallets_sort_created": "作成", "wallets_sort_desc": "降順(新しい/多い/大きい順)", - "wallets_sort_size": "ウォレットサイズ", - "wallets_sort_txs": "取引数", + "wallets_sort_size": "サイズ", + "wallets_sort_txs": "取引", "wallets_title": "ウォレット", "warning": "警告", "warning_upper": "警告!", diff --git a/res/lang/ko.json b/res/lang/ko.json index 787451e..0f7848b 100644 --- a/res/lang/ko.json +++ b/res/lang/ko.json @@ -1359,13 +1359,13 @@ "wallets_new_label": "새 지갑 만들기:", "wallets_open": "열기", "wallets_reveal": "폴더 열기", - "wallets_sort_addresses": "주소 수", + "wallets_sort_addresses": "주소", "wallets_sort_asc": "오름차순 (오래된/적은/작은 순)", "wallets_sort_by": "정렬:", - "wallets_sort_created": "생성 날짜", + "wallets_sort_created": "생성", "wallets_sort_desc": "내림차순 (최신/많은/큰 순)", - "wallets_sort_size": "지갑 크기", - "wallets_sort_txs": "거래 수", + "wallets_sort_size": "크기", + "wallets_sort_txs": "거래", "wallets_title": "지갑", "warning": "경고", "warning_upper": "경고!", diff --git a/res/lang/pt.json b/res/lang/pt.json index 7c6e6c7..7d2ad74 100644 --- a/res/lang/pt.json +++ b/res/lang/pt.json @@ -1359,13 +1359,13 @@ "wallets_new_label": "Criar uma nova carteira:", "wallets_open": "Abrir", "wallets_reveal": "Mostrar pasta", - "wallets_sort_addresses": "Número de endereços", + "wallets_sort_addresses": "Endereços", "wallets_sort_asc": "Crescente (mais antigo / menos / menor primeiro)", "wallets_sort_by": "Ordenar:", - "wallets_sort_created": "Data de criação", + "wallets_sort_created": "Criado", "wallets_sort_desc": "Decrescente (mais recente / mais / maior primeiro)", - "wallets_sort_size": "Tamanho da carteira", - "wallets_sort_txs": "Número de transações", + "wallets_sort_size": "Tamanho", + "wallets_sort_txs": "Txs", "wallets_title": "Carteiras", "warning": "Aviso", "warning_upper": "AVISO!", diff --git a/res/lang/ru.json b/res/lang/ru.json index b4fc3c1..2c1e5a3 100644 --- a/res/lang/ru.json +++ b/res/lang/ru.json @@ -1359,13 +1359,13 @@ "wallets_new_label": "Создать новый кошелёк:", "wallets_open": "Открыть", "wallets_reveal": "Открыть папку", - "wallets_sort_addresses": "Число адресов", + "wallets_sort_addresses": "Адреса", "wallets_sort_asc": "По возрастанию (сначала старые / меньше / меньший)", "wallets_sort_by": "Сортировка:", - "wallets_sort_created": "Дата создания", + "wallets_sort_created": "Создан", "wallets_sort_desc": "По убыванию (сначала новые / больше / больший)", - "wallets_sort_size": "Размер кошелька", - "wallets_sort_txs": "Число транзакций", + "wallets_sort_size": "Размер", + "wallets_sort_txs": "Транз.", "wallets_title": "Кошельки", "warning": "Предупреждение", "warning_upper": "ПРЕДУПРЕЖДЕНИЕ!", diff --git a/res/lang/zh.json b/res/lang/zh.json index 7c4ba29..8c40624 100644 --- a/res/lang/zh.json +++ b/res/lang/zh.json @@ -1359,13 +1359,13 @@ "wallets_new_label": "创建新钱包:", "wallets_open": "打开", "wallets_reveal": "打开文件夹", - "wallets_sort_addresses": "地址数量", + "wallets_sort_addresses": "地址", "wallets_sort_asc": "升序(最早/最少/最小优先)", "wallets_sort_by": "排序:", - "wallets_sort_created": "创建日期", + "wallets_sort_created": "创建", "wallets_sort_desc": "降序(最新/最多/最大优先)", - "wallets_sort_size": "钱包大小", - "wallets_sort_txs": "交易数量", + "wallets_sort_size": "大小", + "wallets_sort_txs": "交易", "wallets_title": "钱包", "warning": "警告", "warning_upper": "警告!", diff --git a/scripts/add_missing_translations.py b/scripts/add_missing_translations.py index 5e7787e..ea15147 100644 --- a/scripts/add_missing_translations.py +++ b/scripts/add_missing_translations.py @@ -2165,20 +2165,20 @@ TRANSLATIONS = { "ru": "Сортировка:", "zh": "排序:", "ja": "並べ替え:", "ko": "정렬:" }, "wallets_sort_created": { - "es": "Fecha de creación", "de": "Erstellungsdatum", "fr": "Date de création", "pt": "Data de criação", - "ru": "Дата создания", "zh": "创建日期", "ja": "作成日", "ko": "생성 날짜" + "es": "Creado", "de": "Erstellt", "fr": "Créé", "pt": "Criado", + "ru": "Создан", "zh": "创建", "ja": "作成", "ko": "생성" }, "wallets_sort_addresses": { - "es": "Número de direcciones", "de": "Adressanzahl", "fr": "Nombre d'adresses", "pt": "Número de endereços", - "ru": "Число адресов", "zh": "地址数量", "ja": "アドレス数", "ko": "주소 수" + "es": "Direcciones", "de": "Adressen", "fr": "Adresses", "pt": "Endereços", + "ru": "Адреса", "zh": "地址", "ja": "アドレス", "ko": "주소" }, "wallets_sort_txs": { - "es": "Número de transacciones", "de": "Transaktionsanzahl", "fr": "Nombre de transactions", - "pt": "Número de transações", "ru": "Число транзакций", "zh": "交易数量", "ja": "取引数", "ko": "거래 수" + "es": "Txs", "de": "Txs", "fr": "Txs", "pt": "Txs", + "ru": "Транз.", "zh": "交易", "ja": "取引", "ko": "거래" }, "wallets_sort_size": { - "es": "Tamaño de billetera", "de": "Wallet-Größe", "fr": "Taille du portefeuille", "pt": "Tamanho da carteira", - "ru": "Размер кошелька", "zh": "钱包大小", "ja": "ウォレットサイズ", "ko": "지갑 크기" + "es": "Tamaño", "de": "Größe", "fr": "Taille", "pt": "Tamanho", + "ru": "Размер", "zh": "大小", "ja": "サイズ", "ko": "크기" }, "wallets_sort_asc": { "es": "Ascendente (más antiguo / menos / más pequeño primero)", diff --git a/src/ui/windows/wallets_dialog.h b/src/ui/windows/wallets_dialog.h index 9666759..02c0e13 100644 --- a/src/ui/windows/wallets_dialog.h +++ b/src/ui/windows/wallets_dialog.h @@ -120,19 +120,29 @@ public: return idx < probeSnap.size() ? probeSnap[idx] : ProbeResult{}; }; - // ---- Sort controls: pick the key; the arrow flips ascending/descending ----------------- + // ---- Sort controls: a segmented key picker + an arrow that flips ascending/descending ---- { ImGui::AlignTextToFramePadding(); Type().textColored(TypeStyle::Caption, OnSurfaceMedium(), TR("wallets_sort_by")); ImGui::SameLine(); - const char* items[] = { TR("wallets_sort_created"), TR("wallets_sort_addresses"), - TR("wallets_sort_txs"), TR("wallets_sort_size") }; - ImGui::SetNextItemWidth(190.0f * dp); - ImGui::Combo("##walletSort", &s_sortMode, items, IM_ARRAYSIZE(items)); - ImGui::SameLine(); - const float dbH = ImGui::GetFrameHeight(); + ImFont* segFont = Type().caption(); + const char* segLabels[] = { TR("wallets_sort_created"), TR("wallets_sort_addresses"), + TR("wallets_sort_txs"), TR("wallets_sort_size") }; + float maxLW = 0.0f; + for (const char* l : segLabels) + maxLW = std::max(maxLW, segFont->CalcTextSizeA(segFont->LegacySize, FLT_MAX, 0, l).x); + const float segH = ImGui::GetFrameHeight(); + const float segTW = (maxLW + 20.0f * dp) * 4.0f; + const ImVec2 segOrigin = ImGui::GetCursorScreenPos(); + const int clk = material::SegmentedControl(ImGui::GetWindowDrawList(), segOrigin, segTW, segH, + segLabels, 4, s_sortMode, segFont, "##walletSortSeg", dp); + if (clk >= 0) s_sortMode = clk; + // SegmentedControl is draw-list based and doesn't move the layout cursor, so place the + // direction arrow explicitly just to its right on the same baseline (a real item advances + // the cursor past this row for the list below). + ImGui::SetCursorScreenPos(ImVec2(segOrigin.x + segTW + Layout::spacingSm(), segOrigin.y)); if (StyledButton(s_sortDesc ? ICON_MD_ARROW_DOWNWARD : ICON_MD_ARROW_UPWARD, - ImVec2(dbH, dbH), Type().iconSmall())) + ImVec2(segH, segH), Type().iconSmall())) s_sortDesc = !s_sortDesc; if (ImGui::IsItemHovered()) Tooltip("%s", TR(s_sortDesc ? "wallets_sort_desc" : "wallets_sort_asc")); } diff --git a/src/util/i18n.cpp b/src/util/i18n.cpp index 4052b58..e79a50d 100644 --- a/src/util/i18n.cpp +++ b/src/util/i18n.cpp @@ -262,10 +262,10 @@ void I18n::loadBuiltinEnglish() strings_["wallets_col_keys"] = "keys"; strings_["wallets_created"] = "created"; strings_["wallets_sort_by"] = "Sort:"; - strings_["wallets_sort_created"] = "Date created"; - strings_["wallets_sort_addresses"] = "Address count"; - strings_["wallets_sort_txs"] = "Transaction count"; - strings_["wallets_sort_size"] = "Wallet size"; + strings_["wallets_sort_created"] = "Created"; + strings_["wallets_sort_addresses"] = "Addresses"; + strings_["wallets_sort_txs"] = "Txs"; + strings_["wallets_sort_size"] = "Size"; strings_["wallets_sort_asc"] = "Ascending (oldest / fewest / smallest first)"; strings_["wallets_sort_desc"] = "Descending (newest / most / largest first)"; strings_["wallets_col_balance"] = "Balance";