From 0e1957c5f9495b63f955764ba2d002ff33d9a39c Mon Sep 17 00:00:00 2001 From: DanS Date: Sun, 12 Jul 2026 15:22:56 -0500 Subject: [PATCH] feat(market): explain why the portfolio Save button is disabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hovering the disabled Save button now shows which requirement is missing (name / at least one address / a manual price above 0), mirroring the send-tab disabled-submit tooltip idiom (IsItemHovered(AllowWhenDisabled)). The hint only appears for a validation gap — not the self-evident "nothing changed" case. Adds portfolio_save_need_{name,address,price} to the English source and all eight translations; rebuilds the CJK subset font for the new JA/KO/ZH glyphs. Co-Authored-By: Claude Opus 4.8 (1M context) --- res/fonts/NotoSansCJK-Subset.ttf | Bin 619068 -> 619068 bytes res/lang/de.json | 3 +++ res/lang/es.json | 3 +++ res/lang/fr.json | 3 +++ res/lang/ja.json | 3 +++ res/lang/ko.json | 3 +++ res/lang/pt.json | 3 +++ res/lang/ru.json | 3 +++ res/lang/zh.json | 3 +++ src/ui/windows/market_tab.cpp | 7 +++++++ src/util/i18n.cpp | 3 +++ 11 files changed, 34 insertions(+) diff --git a/res/fonts/NotoSansCJK-Subset.ttf b/res/fonts/NotoSansCJK-Subset.ttf index 44b72f4aec7867de1134a7be56ed2d7f98b0e1d3..d39d622008f83b341707f151a983c33f9dd494d9 100644 GIT binary patch delta 82 zcmdnh0O|#?Fx(_%ml>D XK+FQftU$~L#Oy%Kv0Z_YQ>G9ASUDC& diff --git a/res/lang/de.json b/res/lang/de.json index d5ba97f..541ba05 100644 --- a/res/lang/de.json +++ b/res/lang/de.json @@ -829,6 +829,9 @@ "portfolio_remove_from": "Aus Portfolio entfernen", "portfolio_revert": "Zurücksetzen", "portfolio_save": "Speichern", + "portfolio_save_need_address": "Fügen Sie mindestens eine Adresse hinzu, um zu speichern.", + "portfolio_save_need_name": "Geben Sie einen Namen ein, um diese Gruppe zu speichern.", + "portfolio_save_need_price": "Geben Sie einen manuellen Preis über 0 ein, um zu speichern.", "portfolio_search": "Adressen durchsuchen…", "portfolio_search_icons": "Symbole suchen…", "portfolio_select_all": "Alle", diff --git a/res/lang/es.json b/res/lang/es.json index c4e5024..18cd551 100644 --- a/res/lang/es.json +++ b/res/lang/es.json @@ -829,6 +829,9 @@ "portfolio_remove_from": "Quitar del portafolio", "portfolio_revert": "Revertir", "portfolio_save": "Guardar", + "portfolio_save_need_address": "Añade al menos una dirección para guardar.", + "portfolio_save_need_name": "Introduce un nombre para guardar este grupo.", + "portfolio_save_need_price": "Introduce un precio manual mayor que 0 para guardar.", "portfolio_search": "Buscar direcciones…", "portfolio_search_icons": "Buscar iconos…", "portfolio_select_all": "Todos", diff --git a/res/lang/fr.json b/res/lang/fr.json index 4ec159e..0998639 100644 --- a/res/lang/fr.json +++ b/res/lang/fr.json @@ -829,6 +829,9 @@ "portfolio_remove_from": "Retirer du portefeuille d'actifs", "portfolio_revert": "Annuler", "portfolio_save": "Enregistrer", + "portfolio_save_need_address": "Ajoutez au moins une adresse pour enregistrer.", + "portfolio_save_need_name": "Saisissez un nom pour enregistrer ce groupe.", + "portfolio_save_need_price": "Saisissez un prix manuel supérieur à 0 pour enregistrer.", "portfolio_search": "Rechercher des adresses\\xE2\\x80\\xA6", "portfolio_search_icons": "Rechercher des icônes\\xE2\\x80\\xA6", "portfolio_select_all": "Tout", diff --git a/res/lang/ja.json b/res/lang/ja.json index f3c09f8..4579982 100644 --- a/res/lang/ja.json +++ b/res/lang/ja.json @@ -829,6 +829,9 @@ "portfolio_remove_from": "ポートフォリオから削除", "portfolio_revert": "元に戻す", "portfolio_save": "保存", + "portfolio_save_need_address": "保存するにはアドレスを1つ以上追加してください。", + "portfolio_save_need_name": "このグループを保存するには名前を入力してください。", + "portfolio_save_need_price": "保存するには0より大きい手動価格を入力してください。", "portfolio_search": "アドレスを検索…", "portfolio_search_icons": "アイコンを検索…", "portfolio_select_all": "すべて", diff --git a/res/lang/ko.json b/res/lang/ko.json index 5270867..8bd6128 100644 --- a/res/lang/ko.json +++ b/res/lang/ko.json @@ -829,6 +829,9 @@ "portfolio_remove_from": "포트폴리오에서 제거", "portfolio_revert": "되돌리기", "portfolio_save": "저장", + "portfolio_save_need_address": "저장하려면 주소를 하나 이상 추가하세요.", + "portfolio_save_need_name": "이 그룹을 저장하려면 이름을 입력하세요.", + "portfolio_save_need_price": "저장하려면 0보다 큰 수동 가격을 입력하세요.", "portfolio_search": "주소 검색…", "portfolio_search_icons": "아이콘 검색\\xE2\\x80\\xA6", "portfolio_select_all": "전체", diff --git a/res/lang/pt.json b/res/lang/pt.json index 92eb8b8..8a1c83a 100644 --- a/res/lang/pt.json +++ b/res/lang/pt.json @@ -829,6 +829,9 @@ "portfolio_remove_from": "Remover do portfólio", "portfolio_revert": "Reverter", "portfolio_save": "Salvar", + "portfolio_save_need_address": "Adicione pelo menos um endereço para salvar.", + "portfolio_save_need_name": "Insira um nome para salvar este grupo.", + "portfolio_save_need_price": "Insira um preço manual acima de 0 para salvar.", "portfolio_search": "Pesquisar endereços…", "portfolio_search_icons": "Pesquisar ícones\\xE2\\x80\\xA6", "portfolio_select_all": "Todos", diff --git a/res/lang/ru.json b/res/lang/ru.json index e16ee91..ae31aa8 100644 --- a/res/lang/ru.json +++ b/res/lang/ru.json @@ -829,6 +829,9 @@ "portfolio_remove_from": "Удалить из портфеля", "portfolio_revert": "Отменить изменения", "portfolio_save": "Сохранить", + "portfolio_save_need_address": "Добавьте хотя бы один адрес, чтобы сохранить.", + "portfolio_save_need_name": "Введите имя, чтобы сохранить эту группу.", + "portfolio_save_need_price": "Введите ручную цену больше 0, чтобы сохранить.", "portfolio_search": "Поиск адресов…", "portfolio_search_icons": "Поиск иконок…", "portfolio_select_all": "Все", diff --git a/res/lang/zh.json b/res/lang/zh.json index 9a42a8a..96b11d5 100644 --- a/res/lang/zh.json +++ b/res/lang/zh.json @@ -829,6 +829,9 @@ "portfolio_remove_from": "从投资组合中移除", "portfolio_revert": "还原", "portfolio_save": "保存", + "portfolio_save_need_address": "添加至少一个地址以保存。", + "portfolio_save_need_name": "输入名称以保存此分组。", + "portfolio_save_need_price": "输入大于 0 的手动价格以保存。", "portfolio_search": "搜索地址…", "portfolio_search_icons": "搜索图标…", "portfolio_select_all": "全部", diff --git a/src/ui/windows/market_tab.cpp b/src/ui/windows/market_tab.cpp index 5fc134c..425fb53 100644 --- a/src/ui/windows/market_tab.cpp +++ b/src/ui/windows/market_tab.cpp @@ -1042,6 +1042,13 @@ static void RenderPortfolioEditor(App* app) if (material::TactileButton(TR("portfolio_save"), ImVec2(bw, addH))) pfCommitIfNeeded(app); ImGui::EndDisabled(); ImGui::EndDisabled(); + // Explain why Save is disabled — but only for a validation gap, not the "nothing changed" + // (!selDirty) case, which is self-evident. Priority mirrors pfWorkingValid's checks. + if (!pfWorkingValid() && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + if (pfEditLabel().empty()) material::Tooltip("%s", TR("portfolio_save_need_name")); + else if (s_pfEdit.addrs.empty()) material::Tooltip("%s", TR("portfolio_save_need_address")); + else material::Tooltip("%s", TR("portfolio_save_need_price")); + } } } ImGui::EndChild(); // ##pfDetail diff --git a/src/util/i18n.cpp b/src/util/i18n.cpp index bd70570..28430db 100644 --- a/src/util/i18n.cpp +++ b/src/util/i18n.cpp @@ -1405,6 +1405,9 @@ void I18n::loadBuiltinEnglish() strings_["portfolio_cancel"] = "Cancel"; strings_["portfolio_revert"] = "Revert"; strings_["portfolio_close"] = "Close"; + strings_["portfolio_save_need_name"] = "Enter a name to save this group."; + strings_["portfolio_save_need_address"] = "Add at least one address to save."; + strings_["portfolio_save_need_price"] = "Enter a manual price above 0 to save."; strings_["portfolio_untitled"] = "Untitled"; strings_["portfolio_detail_empty"] = "Select a group on the left, or add one, to edit it."; strings_["portfolio_add_to"] = "Add to portfolio";