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:
381
src/ui/effects/imgui_acrylic.h
Normal file
381
src/ui/effects/imgui_acrylic.h
Normal file
@@ -0,0 +1,381 @@
|
||||
// DragonX Wallet - ImGui Edition
|
||||
// Copyright 2024-2026 The Hush Developers
|
||||
// Released under the GPLv3
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "acrylic.h"
|
||||
#include "imgui.h"
|
||||
|
||||
namespace dragonx {
|
||||
namespace ui {
|
||||
namespace effects {
|
||||
|
||||
/**
|
||||
* @brief ImGui integration for acrylic effects
|
||||
*
|
||||
* Provides convenient wrappers around AcrylicMaterial for use with
|
||||
* standard ImGui rendering patterns.
|
||||
*/
|
||||
namespace ImGuiAcrylic {
|
||||
|
||||
// ============================================================================
|
||||
// Initialization
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Initialize the acrylic system
|
||||
*
|
||||
* Call once at application startup, after OpenGL context is created.
|
||||
* @return true if successful
|
||||
*/
|
||||
bool Init();
|
||||
|
||||
/**
|
||||
* @brief Shutdown the acrylic system
|
||||
*
|
||||
* Call at application shutdown before destroying OpenGL context.
|
||||
*/
|
||||
void Shutdown();
|
||||
|
||||
/**
|
||||
* @brief Check if acrylic is available and initialized
|
||||
*/
|
||||
bool IsAvailable();
|
||||
|
||||
// ============================================================================
|
||||
// Frame Operations
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Begin a new frame for acrylic rendering
|
||||
*
|
||||
* Call this at the start of your render loop, before any ImGui rendering.
|
||||
* This captures the current screen content for blur source.
|
||||
*
|
||||
* @param width Viewport width
|
||||
* @param height Viewport height
|
||||
*/
|
||||
void BeginFrame(int width, int height);
|
||||
|
||||
/**
|
||||
* @brief End the acrylic frame
|
||||
*
|
||||
* Call this after all regular content is rendered but before acrylic overlays.
|
||||
* Captures the current framebuffer content for blur.
|
||||
*/
|
||||
void CaptureBackground();
|
||||
|
||||
/**
|
||||
* @brief Invalidate the acrylic capture so the next frame re-captures
|
||||
* and re-blurs. Call after theme/skin changes that alter the
|
||||
* background gradient, image, or colors.
|
||||
*/
|
||||
void InvalidateCapture();
|
||||
|
||||
/**
|
||||
* @brief Get a draw callback for background capture.
|
||||
*
|
||||
* Insert this callback at the end of the BackgroundDrawList (after all
|
||||
* background commands). During RenderDrawData() it fires right after
|
||||
* the background is rasterized — before any UI windows — and blits
|
||||
* the clean background into the acrylic capture buffer.
|
||||
*
|
||||
* Usage in main.cpp:
|
||||
* @code
|
||||
* bgDL->AddCallback(ImGuiAcrylic::GetBackgroundCaptureCallback(), nullptr);
|
||||
* bgDL->AddCallback(ImDrawCallback_ResetRenderState, nullptr);
|
||||
* @endcode
|
||||
*/
|
||||
ImDrawCallback GetBackgroundCaptureCallback();
|
||||
|
||||
// ============================================================================
|
||||
// Drawing Functions
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Draw an acrylic-filled rectangle
|
||||
*
|
||||
* @param drawList ImGui draw list to add the rectangle to
|
||||
* @param pMin Top-left corner (screen coordinates)
|
||||
* @param pMax Bottom-right corner (screen coordinates)
|
||||
* @param params Acrylic appearance parameters
|
||||
* @param rounding Corner rounding radius
|
||||
*/
|
||||
void DrawAcrylicRect(ImDrawList* drawList,
|
||||
const ImVec2& pMin, const ImVec2& pMax,
|
||||
const AcrylicParams& params,
|
||||
float rounding = 0.0f);
|
||||
|
||||
/**
|
||||
* @brief Draw an acrylic-filled rectangle with default preset
|
||||
*/
|
||||
void DrawAcrylicRect(ImDrawList* drawList,
|
||||
const ImVec2& pMin, const ImVec2& pMax,
|
||||
float rounding = 0.0f);
|
||||
|
||||
// ============================================================================
|
||||
// Window Wrappers
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Begin an acrylic-background window
|
||||
*
|
||||
* Works like ImGui::Begin but with acrylic background.
|
||||
* Must be paired with EndAcrylicWindow().
|
||||
*
|
||||
* @param name Window name/ID
|
||||
* @param p_open Optional close button flag
|
||||
* @param flags ImGui window flags
|
||||
* @param params Acrylic appearance parameters
|
||||
* @return true if window is visible
|
||||
*/
|
||||
bool BeginAcrylicWindow(const char* name, bool* p_open = nullptr,
|
||||
ImGuiWindowFlags flags = 0,
|
||||
const AcrylicParams& params = AcrylicMaterial::getPopupPreset());
|
||||
|
||||
/**
|
||||
* @brief End an acrylic window
|
||||
*/
|
||||
void EndAcrylicWindow();
|
||||
|
||||
// ============================================================================
|
||||
// Child Region Wrappers
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Begin an acrylic child region
|
||||
*
|
||||
* Works like ImGui::BeginChild but with acrylic background.
|
||||
* Must be paired with EndAcrylicChild().
|
||||
*
|
||||
* @param str_id Child region ID
|
||||
* @param size Child region size (0,0 = auto)
|
||||
* @param params Acrylic appearance parameters
|
||||
* @param child_flags ImGui child flags
|
||||
* @param window_flags ImGui window flags for the child
|
||||
* @return true if child is visible
|
||||
*/
|
||||
bool BeginAcrylicChild(const char* str_id,
|
||||
const ImVec2& size = ImVec2(0, 0),
|
||||
const AcrylicParams& params = AcrylicMaterial::getDarkPreset(),
|
||||
ImGuiChildFlags child_flags = 0,
|
||||
ImGuiWindowFlags window_flags = 0);
|
||||
|
||||
/**
|
||||
* @brief End an acrylic child region
|
||||
*/
|
||||
void EndAcrylicChild();
|
||||
|
||||
// ============================================================================
|
||||
// Popup Wrappers
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Begin an acrylic popup
|
||||
*
|
||||
* Works like ImGui::BeginPopup but with acrylic background.
|
||||
* Must be paired with EndAcrylicPopup().
|
||||
*
|
||||
* @param str_id Popup ID
|
||||
* @param flags ImGui window flags
|
||||
* @param params Acrylic appearance parameters
|
||||
* @return true if popup is open
|
||||
*/
|
||||
bool BeginAcrylicPopup(const char* str_id,
|
||||
ImGuiWindowFlags flags = 0,
|
||||
const AcrylicParams& params = AcrylicMaterial::getPopupPreset());
|
||||
|
||||
/**
|
||||
* @brief End an acrylic popup
|
||||
*/
|
||||
void EndAcrylicPopup();
|
||||
|
||||
/**
|
||||
* @brief Begin an acrylic modal popup
|
||||
*
|
||||
* Works like ImGui::BeginPopupModal but with acrylic background.
|
||||
* Must be paired with EndAcrylicPopup().
|
||||
*/
|
||||
bool BeginAcrylicPopupModal(const char* name, bool* p_open = nullptr,
|
||||
ImGuiWindowFlags flags = 0,
|
||||
const AcrylicParams& params = AcrylicMaterial::getPopupPreset());
|
||||
|
||||
// ============================================================================
|
||||
// Context Menu Helpers
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Begin an acrylic context menu for the last item
|
||||
*
|
||||
* Works like ImGui::BeginPopupContextItem but with acrylic background.
|
||||
* Must be paired with EndAcrylicPopup().
|
||||
*
|
||||
* @param str_id Popup ID (nullptr to use last item ID)
|
||||
* @param popup_flags ImGui popup flags
|
||||
* @param params Acrylic appearance parameters
|
||||
* @return true if context menu is open
|
||||
*/
|
||||
bool BeginAcrylicContextItem(const char* str_id = nullptr,
|
||||
ImGuiPopupFlags popup_flags = 0,
|
||||
const AcrylicParams& params = AcrylicMaterial::getPopupPreset());
|
||||
|
||||
/**
|
||||
* @brief Begin an acrylic context menu for the current window
|
||||
*
|
||||
* Works like ImGui::BeginPopupContextWindow but with acrylic background.
|
||||
* Must be paired with EndAcrylicPopup().
|
||||
*/
|
||||
bool BeginAcrylicContextWindow(const char* str_id = nullptr,
|
||||
ImGuiPopupFlags popup_flags = 0,
|
||||
const AcrylicParams& params = AcrylicMaterial::getPopupPreset());
|
||||
|
||||
// ============================================================================
|
||||
// Sidebar Helper
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Draw an acrylic sidebar background
|
||||
*
|
||||
* Convenience function for drawing sidebar with DragonX branded acrylic.
|
||||
*
|
||||
* @param width Sidebar width
|
||||
* @param params Optional custom parameters (default: sidebar preset)
|
||||
*/
|
||||
void DrawSidebarBackground(float width,
|
||||
const AcrylicParams& params = AcrylicMaterial::getSidebarPreset());
|
||||
|
||||
// ============================================================================
|
||||
// Settings
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief Set global acrylic quality
|
||||
*/
|
||||
void SetQuality(AcrylicQuality quality);
|
||||
|
||||
/**
|
||||
* @brief Get current quality setting
|
||||
*/
|
||||
AcrylicQuality GetQuality();
|
||||
|
||||
/**
|
||||
* @brief Enable/disable acrylic globally
|
||||
*
|
||||
* When disabled, all acrylic functions fall back to solid colors.
|
||||
*/
|
||||
void SetEnabled(bool enabled);
|
||||
|
||||
/**
|
||||
* @brief Check if acrylic is enabled
|
||||
*/
|
||||
bool IsEnabled();
|
||||
|
||||
/**
|
||||
* @brief Set blur radius multiplier (scales all blur radii)
|
||||
* @param multiplier Value from 0.5 to 2.0 (1.0 = default)
|
||||
*/
|
||||
void SetBlurMultiplier(float multiplier);
|
||||
|
||||
/**
|
||||
* @brief Get current blur multiplier
|
||||
*/
|
||||
float GetBlurMultiplier();
|
||||
|
||||
/**
|
||||
* @brief Set reduced transparency mode (accessibility)
|
||||
*
|
||||
* When enabled, uses solid fallback colors instead of blur effects.
|
||||
*/
|
||||
void SetReducedTransparency(bool reduced);
|
||||
|
||||
/**
|
||||
* @brief Check if reduced transparency mode is active
|
||||
*/
|
||||
bool GetReducedTransparency();
|
||||
|
||||
/**
|
||||
* @brief Set UI opacity multiplier for cards/sidebar (0.3–1.0, 1=opaque)
|
||||
*/
|
||||
void SetUIOpacity(float opacity);
|
||||
|
||||
/**
|
||||
* @brief Get UI opacity multiplier
|
||||
*/
|
||||
float GetUIOpacity();
|
||||
|
||||
/**
|
||||
* @brief Set noise opacity multiplier (0.0 = no noise, 1.0 = default, 2.0 = max)
|
||||
*/
|
||||
void SetNoiseOpacity(float multiplier);
|
||||
|
||||
/**
|
||||
* @brief Get noise opacity multiplier
|
||||
*/
|
||||
float GetNoiseOpacity();
|
||||
|
||||
/**
|
||||
* @brief Get full acrylic settings
|
||||
*/
|
||||
const AcrylicSettings& GetSettings();
|
||||
|
||||
/**
|
||||
* @brief Set full acrylic settings
|
||||
*/
|
||||
void SetSettings(const AcrylicSettings& settings);
|
||||
|
||||
// ============================================================================
|
||||
// Presets — combined quality + blur amount
|
||||
// ============================================================================
|
||||
|
||||
/// Number of built-in presets (Off … Frosted)
|
||||
constexpr int kPresetCount = 6;
|
||||
|
||||
/**
|
||||
* @brief Apply a preset that sets both quality and blur multiplier.
|
||||
* @param preset Index 0–5 (Off, Subtle, Light, Standard, Strong, Frosted)
|
||||
*/
|
||||
void SetPreset(int preset);
|
||||
|
||||
/**
|
||||
* @brief Derive the closest preset index from current quality + blur.
|
||||
*/
|
||||
int GetPreset();
|
||||
|
||||
/**
|
||||
* @brief Human-readable label for a preset index.
|
||||
*/
|
||||
const char* GetPresetLabel(int preset);
|
||||
|
||||
/**
|
||||
* @brief Get the quality enum for a given preset index.
|
||||
*/
|
||||
AcrylicQuality PresetQuality(int preset);
|
||||
|
||||
/**
|
||||
* @brief Get the blur multiplier for a given preset index.
|
||||
*/
|
||||
float PresetBlur(int preset);
|
||||
|
||||
/**
|
||||
* @brief Find closest preset matching a quality + blur pair.
|
||||
* Useful for migrating from legacy separate settings.
|
||||
*/
|
||||
int MatchPreset(AcrylicQuality quality, float blur);
|
||||
|
||||
/**
|
||||
* @brief Apply a continuous blur amount.
|
||||
*
|
||||
* Uses Low quality (like the old "Subtle" preset) at any non-zero blur
|
||||
* level, giving fine-grained control without stepped presets.
|
||||
* When blur is near zero the effect is disabled entirely.
|
||||
*
|
||||
* @param blur Blur multiplier (0.0 = off, up to 4.0 = maximum)
|
||||
*/
|
||||
void ApplyBlurAmount(float blur);
|
||||
|
||||
} // namespace ImGuiAcrylic
|
||||
|
||||
} // namespace effects
|
||||
} // namespace ui
|
||||
} // namespace dragonx
|
||||
Reference in New Issue
Block a user