ObsidianDragon - DragonX ImGui Wallet

Full-node GUI wallet for DragonX cryptocurrency.
Built with Dear ImGui, SDL3, and OpenGL3/DX11.

Features:
- Send/receive shielded and transparent transactions
- Autoshield with merged transaction display
- Built-in CPU mining (xmrig)
- Peer management and network monitoring
- Wallet encryption with PIN lock
- QR code generation for receive addresses
- Transaction history with pagination
- Console for direct RPC commands
- Cross-platform (Linux, Windows)
This commit is contained in:
2026-02-26 02:31:52 -06:00
commit 3aee55b49c
306 changed files with 177789 additions and 0 deletions

263
src/config/settings.h Normal file
View File

@@ -0,0 +1,263 @@
// DragonX Wallet - ImGui Edition
// Copyright 2024-2026 The Hush Developers
// Released under the GPLv3
#pragma once
#include <string>
#include <set>
namespace dragonx {
namespace config {
/**
* @brief Application settings manager
*
* Handles loading and saving of user preferences.
*/
class Settings {
public:
Settings();
~Settings();
/**
* @brief Load settings from default location
* @return true if loaded successfully
*/
bool load();
/**
* @brief Load settings from specific path
* @param path Path to settings file
* @return true if loaded successfully
*/
bool load(const std::string& path);
/**
* @brief Save settings to default location
* @return true if saved successfully
*/
bool save();
/**
* @brief Save settings to specific path
* @param path Path to settings file
* @return true if saved successfully
*/
bool save(const std::string& path);
/**
* @brief Get default settings file path
*/
static std::string getDefaultPath();
// Theme
std::string getTheme() const { return theme_; }
void setTheme(const std::string& theme) { theme_ = theme; }
// Unified skin
std::string getSkinId() const { return skin_id_; }
void setSkinId(const std::string& id) { skin_id_ = id; }
// Privacy
bool getSaveZtxs() const { return save_ztxs_; }
void setSaveZtxs(bool save) { save_ztxs_ = save; }
bool getAutoShield() const { return auto_shield_; }
void setAutoShield(bool shield) { auto_shield_ = shield; }
bool getUseTor() const { return use_tor_; }
void setUseTor(bool tor) { use_tor_ = tor; }
// Fees
bool getAllowCustomFees() const { return allow_custom_fees_; }
void setAllowCustomFees(bool allow) { allow_custom_fees_ = allow; }
double getDefaultFee() const { return default_fee_; }
void setDefaultFee(double fee) { default_fee_ = fee; }
// Price
bool getFetchPrices() const { return fetch_prices_; }
void setFetchPrices(bool fetch) { fetch_prices_ = fetch; }
// Explorer URLs
std::string getTxExplorerUrl() const { return tx_explorer_url_; }
void setTxExplorerUrl(const std::string& url) { tx_explorer_url_ = url; }
std::string getAddressExplorerUrl() const { return address_explorer_url_; }
void setAddressExplorerUrl(const std::string& url) { address_explorer_url_ = url; }
// Language
std::string getLanguage() const { return language_; }
void setLanguage(const std::string& lang) { language_ = lang; }
// Visual effects
bool getAcrylicEnabled() const { return acrylic_enabled_; }
void setAcrylicEnabled(bool v) { acrylic_enabled_ = v; }
int getAcrylicQuality() const { return acrylic_quality_; }
void setAcrylicQuality(int v) { acrylic_quality_ = v; }
float getBlurMultiplier() const { return blur_multiplier_; }
void setBlurMultiplier(float v) { blur_multiplier_ = v; }
bool getReducedTransparency() const { return ui_opacity_ >= 0.99f; }
void setReducedTransparency(bool v) { if (v) ui_opacity_ = 1.0f; }
float getUIOpacity() const { return ui_opacity_; }
void setUIOpacity(float v) { ui_opacity_ = std::max(0.3f, std::min(1.0f, v)); }
float getWindowOpacity() const { return window_opacity_; }
void setWindowOpacity(float v) { window_opacity_ = std::max(0.3f, std::min(1.0f, v)); }
float getNoiseOpacity() const { return noise_opacity_; }
void setNoiseOpacity(float v) { noise_opacity_ = v; }
// Gradient background mode (use gradient variant of theme background)
bool getGradientBackground() const { return gradient_background_; }
void setGradientBackground(bool v) { gradient_background_ = v; }
// Balance layout (string ID, e.g. "classic", "donut")
std::string getBalanceLayout() const { return balance_layout_; }
void setBalanceLayout(const std::string& v) { balance_layout_ = v; }
// Console scanline effect
bool getScanlineEnabled() const { return scanline_enabled_; }
void setScanlineEnabled(bool v) { scanline_enabled_ = v; }
// Hidden addresses (addresses hidden from the UI by the user)
const std::set<std::string>& getHiddenAddresses() const { return hidden_addresses_; }
bool isAddressHidden(const std::string& addr) const { return hidden_addresses_.count(addr) > 0; }
void hideAddress(const std::string& addr) { hidden_addresses_.insert(addr); }
void unhideAddress(const std::string& addr) { hidden_addresses_.erase(addr); }
int getHiddenAddressCount() const { return (int)hidden_addresses_.size(); }
// Favorite addresses (pinned to top of address list)
const std::set<std::string>& getFavoriteAddresses() const { return favorite_addresses_; }
bool isAddressFavorite(const std::string& addr) const { return favorite_addresses_.count(addr) > 0; }
void favoriteAddress(const std::string& addr) { favorite_addresses_.insert(addr); }
void unfavoriteAddress(const std::string& addr) { favorite_addresses_.erase(addr); }
int getFavoriteAddressCount() const { return (int)favorite_addresses_.size(); }
// First-run wizard
bool getWizardCompleted() const { return wizard_completed_; }
void setWizardCompleted(bool v) { wizard_completed_ = v; }
// Security — auto-lock timeout (seconds; 0 = disabled)
int getAutoLockTimeout() const { return auto_lock_timeout_; }
void setAutoLockTimeout(int seconds) { auto_lock_timeout_ = seconds; }
// Security — unlock duration (seconds) for walletpassphrase
int getUnlockDuration() const { return unlock_duration_; }
void setUnlockDuration(int seconds) { unlock_duration_ = seconds; }
// Security — PIN unlock enabled
bool getPinEnabled() const { return pin_enabled_; }
void setPinEnabled(bool v) { pin_enabled_ = v; }
// Daemon — keep running in background when closing the app
bool getKeepDaemonRunning() const { return keep_daemon_running_; }
void setKeepDaemonRunning(bool v) { keep_daemon_running_ = v; }
// Daemon — stop externally-started daemons on exit (default: false)
bool getStopExternalDaemon() const { return stop_external_daemon_; }
void setStopExternalDaemon(bool v) { stop_external_daemon_ = v; }
// Daemon — debug logging categories
const std::set<std::string>& getDebugCategories() const { return debug_categories_; }
void setDebugCategories(const std::set<std::string>& cats) { debug_categories_ = cats; }
bool hasDebugCategory(const std::string& cat) const { return debug_categories_.count(cat) > 0; }
void toggleDebugCategory(const std::string& cat) {
if (debug_categories_.count(cat)) debug_categories_.erase(cat);
else debug_categories_.insert(cat);
}
// Visual effects — animated theme effects (hue cycling, shimmer, glow, etc.)
bool getThemeEffectsEnabled() const { return theme_effects_enabled_; }
void setThemeEffectsEnabled(bool v) { theme_effects_enabled_ = v; }
// Low-spec mode — disables heavy visual effects for better performance
bool getLowSpecMode() const { return low_spec_mode_; }
void setLowSpecMode(bool v) { low_spec_mode_ = v; }
// Market — last selected exchange + pair
std::string getSelectedExchange() const { return selected_exchange_; }
void setSelectedExchange(const std::string& v) { selected_exchange_ = v; }
std::string getSelectedPair() const { return selected_pair_; }
void setSelectedPair(const std::string& v) { selected_pair_ = v; }
// Pool mining
std::string getPoolUrl() const { return pool_url_; }
void setPoolUrl(const std::string& v) { pool_url_ = v; }
std::string getPoolAlgo() const { return pool_algo_; }
void setPoolAlgo(const std::string& v) { pool_algo_ = v; }
std::string getPoolWorker() const { return pool_worker_; }
void setPoolWorker(const std::string& v) { pool_worker_ = v; }
int getPoolThreads() const { return pool_threads_; }
void setPoolThreads(int v) { pool_threads_ = v; }
bool getPoolTls() const { return pool_tls_; }
void setPoolTls(bool v) { pool_tls_ = v; }
bool getPoolHugepages() const { return pool_hugepages_; }
void setPoolHugepages(bool v) { pool_hugepages_ = v; }
bool getPoolMode() const { return pool_mode_; }
void setPoolMode(bool v) { pool_mode_ = v; }
// Window size persistence (logical pixels at 1x scale)
int getWindowWidth() const { return window_width_; }
int getWindowHeight() const { return window_height_; }
void setWindowSize(int w, int h) { window_width_ = w; window_height_ = h; }
private:
std::string settings_path_;
// Settings values
std::string theme_ = "dragonx";
std::string skin_id_ = "dragonx";
bool save_ztxs_ = true;
bool auto_shield_ = true;
bool use_tor_ = false;
bool allow_custom_fees_ = false;
double default_fee_ = 0.0001;
bool fetch_prices_ = true;
std::string tx_explorer_url_ = "https://explorer.dragonx.is/tx/";
std::string address_explorer_url_ = "https://explorer.dragonx.is/address/";
std::string language_ = "en";
bool acrylic_enabled_ = true;
int acrylic_quality_ = 2;
float blur_multiplier_ = 0.10f;
float noise_opacity_ = 0.5f;
bool gradient_background_ = false;
float ui_opacity_ = 0.50f; // Card/sidebar opacity (0.31.0, 1.0 = opaque)
float window_opacity_ = 0.75f; // Background alpha (0.31.0, <1 = desktop visible)
std::string balance_layout_ = "classic";
bool scanline_enabled_ = true;
std::set<std::string> hidden_addresses_;
std::set<std::string> favorite_addresses_;
bool wizard_completed_ = false;
int auto_lock_timeout_ = 900; // 15 minutes
int unlock_duration_ = 600; // 10 minutes
bool pin_enabled_ = false;
bool keep_daemon_running_ = false;
bool stop_external_daemon_ = false;
std::set<std::string> debug_categories_;
bool theme_effects_enabled_ = true;
bool low_spec_mode_ = false;
std::string selected_exchange_ = "TradeOgre";
std::string selected_pair_ = "DRGX/BTC";
// Pool mining
std::string pool_url_ = "pool.dragonx.is";
std::string pool_algo_ = "rx/hush";
std::string pool_worker_ = "x";
int pool_threads_ = 0;
bool pool_tls_ = false;
bool pool_hugepages_ = true;
bool pool_mode_ = false; // false=solo, true=pool
// Window size (logical pixels at 1x scale; 0 = use default 1200×775)
int window_width_ = 0;
int window_height_ = 0;
};
} // namespace config
} // namespace dragonx