From f0243307f1205097e6b223cba486e5db8c6f2ee9 Mon Sep 17 00:00:00 2001 From: DanS Date: Wed, 1 Jul 2026 22:44:04 -0500 Subject: [PATCH] feat(portfolio): Overview right-click to add/remove an address to a portfolio Add a "Portfolio" submenu to the Overview address-list context menu: it lists each Market-tab portfolio entry with a checkmark showing whether this address is in it, and clicking toggles membership (add/remove), persisting immediately. If no entries exist yet, a disabled hint points to creating one. Full-node + lite build clean; ctest green; source hygiene clean. Completes the Market configurable-portfolio item (last of the todo.md batch). Co-Authored-By: Claude Opus 4.8 (1M context) --- src/ui/windows/balance_components.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/ui/windows/balance_components.cpp b/src/ui/windows/balance_components.cpp index 3bd0565..89cfcca 100644 --- a/src/ui/windows/balance_components.cpp +++ b/src/ui/windows/balance_components.cpp @@ -15,6 +15,7 @@ #include "../../app.h" #include "../../config/settings.h" +#include "../../data/portfolio.h" #include "../../config/version.h" #include "../../util/i18n.h" #include "../../util/text_format.h" @@ -677,6 +678,25 @@ void RenderSharedAddressList(App* app, float listH, float availW, if (ImGui::MenuItem(TR("favorite_address"))) app->favoriteAddress(addr.address); } + // Portfolio membership — toggle this address in each Market-tab portfolio entry. + ImGui::Separator(); + if (ImGui::BeginMenu(TR("portfolio_add_to"))) { + const auto& pf = app->settings()->getPortfolioEntries(); + if (pf.empty()) { + ImGui::MenuItem(TR("portfolio_no_entries"), nullptr, false, false); + } + for (int pi = 0; pi < (int)pf.size(); pi++) { + bool inSet = dragonx::data::PortfolioEntryContains(pf[pi].addresses, addr.address); + if (ImGui::MenuItem(pf[pi].label.c_str(), nullptr, inSet)) { + auto entries = pf; // copy, mutate, persist + if (inSet) dragonx::data::PortfolioEntryRemove(entries[pi].addresses, addr.address); + else dragonx::data::PortfolioEntryAdd(entries[pi].addresses, addr.address); + app->settings()->setPortfolioEntries(entries); + app->settings()->save(); + } + } + ImGui::EndMenu(); + } effects::ImGuiAcrylic::EndAcrylicPopup(); } ImGui::PopID();