diff --git a/src/config/settings.cpp b/src/config/settings.cpp index 13f108b..009f8a2 100644 --- a/src/config/settings.cpp +++ b/src/config/settings.cpp @@ -242,6 +242,18 @@ bool Settings::load(const std::string& path) for (const auto& a : j["favorite_addresses"]) if (a.is_string()) favorite_addresses_.insert(a.get()); } + if (j.contains("earnings_addresses") && j["earnings_addresses"].is_array()) { + earnings_addresses_.clear(); + for (const auto& a : j["earnings_addresses"]) + if (a.is_string()) earnings_addresses_.insert(a.get()); + } + loadScalar(j, "earnings_interval", earnings_interval_); + earnings_interval_ = std::clamp(earnings_interval_, 0, 3); + loadScalar(j, "earnings_mode", earnings_mode_); + earnings_mode_ = std::clamp(earnings_mode_, 0, 1); + loadScalar(j, "earnings_format", earnings_format_); + earnings_format_ = std::clamp(earnings_format_, 0, 2); + loadScalar(j, "earnings_show_all", earnings_show_all_); if (j.contains("address_meta") && j["address_meta"].is_object()) { address_meta_.clear(); for (auto& [addr, meta] : j["address_meta"].items()) { @@ -562,6 +574,13 @@ bool Settings::save(const std::string& path) j["favorite_addresses"] = json::array(); for (const auto& addr : favorite_addresses_) j["favorite_addresses"].push_back(addr); + j["earnings_addresses"] = json::array(); + for (const auto& addr : earnings_addresses_) + j["earnings_addresses"].push_back(addr); + j["earnings_interval"] = earnings_interval_; + j["earnings_mode"] = earnings_mode_; + j["earnings_format"] = earnings_format_; + j["earnings_show_all"] = earnings_show_all_; { json meta_obj = json::object(); for (const auto& [addr, m] : address_meta_) { diff --git a/src/config/settings.h b/src/config/settings.h index f078bd2..ca11604 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -321,6 +321,22 @@ public: void unfavoriteAddress(const std::string& addr) { favorite_addresses_.erase(addr); } int getFavoriteAddressCount() const { return (int)favorite_addresses_.size(); } + // Inline period-earnings (Balance tab). interval: 0=Hour 1=Day 2=Month 3=Year; mode: 0=Inflows + // 1=Net; format: 0=DRGX 1=DRGX+fiat 2=Fiat. show-all toggles the per-address earnings column for + // every address at once; earnings_addresses_ is the opt-in set shown when show-all is off. + int getEarningsInterval() const { return earnings_interval_; } + void setEarningsInterval(int v) { earnings_interval_ = (v < 0 ? 0 : (v > 3 ? 3 : v)); } + int getEarningsMode() const { return earnings_mode_; } + void setEarningsMode(int v) { earnings_mode_ = (v < 0 ? 0 : (v > 1 ? 1 : v)); } + int getEarningsFormat() const { return earnings_format_; } + void setEarningsFormat(int v) { earnings_format_ = (v < 0 ? 0 : (v > 2 ? 2 : v)); } + bool getEarningsShowAll() const { return earnings_show_all_; } + void setEarningsShowAll(bool v) { earnings_show_all_ = v; } + const std::set& getEarningsAddresses() const { return earnings_addresses_; } + bool isAddressEarningsShown(const std::string& addr) const { return earnings_addresses_.count(addr) > 0; } + void showAddressEarnings(const std::string& addr) { earnings_addresses_.insert(addr); } + void hideAddressEarnings(const std::string& addr) { earnings_addresses_.erase(addr); } + // Address metadata (labels, icons, custom ordering) struct AddressMeta { std::string label; @@ -712,6 +728,11 @@ private: bool console_auto_focus_ = false; // focus the command input when the Console tab is opened (opt-in) std::set hidden_addresses_; std::set favorite_addresses_; + std::set earnings_addresses_; // per-address earnings column opt-in (when show-all off) + int earnings_interval_ = 1; // 0=Hour 1=Day 2=Month 3=Year + int earnings_mode_ = 0; // 0=Inflows 1=Net + int earnings_format_ = 1; // 0=DRGX 1=DRGX+fiat 2=Fiat + bool earnings_show_all_ = false; std::map address_meta_; bool wizard_completed_ = false; bool seed_backup_reminded_ = false;