ktsu.ImGui.Styler 2.3.3
ImGuiStyler 🎨
A powerful, expressive styling library for ImGui.NET interfaces that simplifies theme management, provides scoped styling utilities, and offers advanced color manipulation with accessibility features.
✨ Features
🎨 Advanced Theme System
- 50+ Built-in Themes: Comprehensive collection including Catppuccin, Dracula, Gruvbox, Tokyo Night, Nord, and many more
- Interactive Theme Browser: Visual theme selection with live preview and categorization
- Semantic Theme Support: Leverages
ktsu.ThemeProviderfor consistent, semantic color theming - Scoped Theme Application: Apply themes to specific UI sections without affecting the global style
🎯 Precise Alignment Tools
- Automatic Content Centering: Center any content within containers or available regions
- Flexible Container Alignment: Align content within custom-sized containers
- Layout Integration: Seamlessly works with ImGui's existing layout system
🌈 Advanced Color Management
- Hex Color Support: Direct conversion from hex strings to ImGui colors
- Accessibility-First: Automatic contrast calculation and optimal text color selection
- Color Manipulation: Lighten, darken, and adjust colors programmatically
- Scoped Color Application: Apply colors to specific UI elements without side effects
🔧 Scoped Styling System
- Style Variables: Apply temporary style modifications with automatic cleanup
- Text Colors: Scoped text color changes with proper restoration
- Theme Colors: Apply theme-based colors to specific UI sections
- Memory Safe: Automatic resource management and style restoration
📦 Installation
Add ImGuiStyler to your project via NuGet:
<PackageReference Include="ktsu.ImGuiStyler" Version="1.3.10" />
Or via Package Manager Console:
Install-Package ktsu.ImGuiStyler
🚀 Quick Start
using ktsu.ImGuiStyler;
using Hexa.NET.ImGui;
// Apply a global theme
Theme.Apply("TokyoNight");
// Use scoped styling for specific elements
using (new ScopedColor(ImGuiCol.Text, Color.FromHex("#ff6b6b")))
{
ImGui.Text("This text is red!");
}
// Center content automatically
using (new Alignment.Center(ImGui.CalcTextSize("Centered!")))
{
ImGui.Text("Centered!");
}
📚 Comprehensive Usage Guide
🎨 Theme Management
Applying Global Themes
// Apply any of the 50+ built-in themes
Theme.Apply("Catppuccin.Mocha");
Theme.Apply("Gruvbox.Dark");
Theme.Apply("Tokyo Night");
// Get current theme information
string? currentTheme = Theme.CurrentThemeName;
bool isCurrentThemeDark = Theme.IsCurrentThemeDark;
// Reset to default ImGui theme
Theme.Reset();
Interactive Theme Browser
// Show the theme browser modal
if (ImGui.Button("Choose Theme"))
{
Theme.ShowThemeSelector("Select a Theme");
}
// Render the theme selector (call this in your main render loop)
if (Theme.RenderThemeSelector())
{
Console.WriteLine($"Theme changed to: {Theme.CurrentThemeName}");
}
Scoped Theme Application
using (new ScopedTheme("Dracula"))
{
ImGui.Text("This text uses Dracula theme");
ImGui.Button("Themed button");
using (new ScopedTheme("Nord"))
{
ImGui.Text("Nested Nord theme");
}
// Automatically reverts to Dracula
}
// Automatically reverts to previous theme
🌈 Color Management
Creating Colors
// From hex strings
ImColor red = Color.FromHex("#ff0000");
ImColor blueWithAlpha = Color.FromHex("#0066ffcc");
// From RGB values
ImColor green = Color.FromRGB(0, 255, 0);
ImColor customColor = Color.FromRGBA(255, 128, 64, 200);
// From HSV
ImColor rainbow = Color.FromHSV(0.83f, 1.0f, 1.0f); // Purple
Color Manipulation
ImColor baseColor = Color.FromHex("#3498db");
// Adjust brightness
ImColor lighter = Color.Lighten(baseColor, 0.3f);
ImColor darker = Color.Darken(baseColor, 0.2f);
// Accessibility-focused text colors
ImColor optimalText = Color.GetOptimalTextColor(baseColor);
ImColor contrastText = Color.GetContrastingTextColor(baseColor);
Scoped Color Application
// Scoped text color
using (new ScopedTextColor(Color.FromHex("#e74c3c")))
{
ImGui.Text("Red text");
}
// Scoped UI element color
using (new ScopedColor(ImGuiCol.Button, Color.FromHex("#2ecc71")))
{
ImGui.Button("Green button");
}
// Multiple scoped colors
using (new ScopedColor(ImGuiCol.Button, Color.FromHex("#9b59b6")))
using (new ScopedColor(ImGuiCol.ButtonHovered, Color.FromHex("#8e44ad")))
using (new ScopedColor(ImGuiCol.ButtonActive, Color.FromHex("#71368a")))
{
ImGui.Button("Fully styled button");
}
🎯 Alignment and Layout
Content Centering
// Center text
string text = "Perfectly centered!";
using (new Alignment.Center(ImGui.CalcTextSize(text)))
{
ImGui.Text(text);
}
// Center buttons
using (new Alignment.Center(new Vector2(120, 30)))
{
ImGui.Button("Centered Button", new Vector2(120, 30));
}
Custom Container Alignment
Vector2 containerSize = new(400, 200);
Vector2 contentSize = new(100, 50);
// Center content within a specific container
using (new Alignment.CenterWithin(contentSize, containerSize))
{
ImGui.Button("Centered in Container", contentSize);
}
🔧 Advanced Styling
Scoped Style Variables
// Rounded buttons
using (new ScopedStyleVar(ImGuiStyleVar.FrameRounding, 8.0f))
{
ImGui.Button("Rounded Button");
}
// Multiple style modifications
using (new ScopedStyleVar(ImGuiStyleVar.FrameRounding, 12.0f))
using (new ScopedStyleVar(ImGuiStyleVar.FramePadding, new Vector2(20, 10)))
using (new ScopedStyleVar(ImGuiStyleVar.ItemSpacing, new Vector2(10, 8)))
{
ImGui.Button("Highly Styled Button");
ImGui.Button("Another Styled Button");
}
Theme-Based Styling
// Use semantic colors from current theme
using (new ScopedThemeColor(Color.Primary))
{
ImGui.Text("Primary theme color");
}
using (new ScopedThemeColor(Color.Secondary))
{
ImGui.Button("Secondary theme button");
}
🎨 Available Themes
ImGuiStyler includes 50+ carefully crafted themes across multiple families:
🌙 Dark Themes
- Catppuccin: Mocha, Macchiato, Frappe
- Tokyo Night: Classic, Storm
- Gruvbox: Dark, Dark Hard, Dark Soft
- Dracula: Classic vampire theme
- Nord: Arctic, frost-inspired theme
- Nightfox: Carbonfox, Nightfox, Terafox
- OneDark: Popular dark theme
- Kanagawa: Wave, Dragon variants
- Everforest: Dark, Dark Hard, Dark Soft
☀️ Light Themes
- Catppuccin: Latte
- Tokyo Night: Day
- Gruvbox: Light, Light Hard, Light Soft
- Nord: Light variant
- Nightfox: Dawnfox, Dayfox
- PaperColor: Light
- Everforest: Light, Light Hard, Light Soft
- VSCode: Light theme
🎨 Specialty Themes
- Monokai: Classic editor theme
- Nightfly: Smooth dark theme
- VSCode: Dark theme recreation
🛠️ API Reference
Theme Class
Theme.Apply(string themeName)- Apply a global themeTheme.Apply(ISemanticTheme theme)- Apply a semantic themeTheme.Reset()- Reset to default ImGui themeTheme.ShowThemeSelector(string title)- Show theme browser modalTheme.RenderThemeSelector()- Render theme browser (returns true if theme changed)Theme.AllThemes- Get all available themesTheme.Families- Get all theme familiesTheme.CurrentThemeName- Get current theme nameTheme.IsCurrentThemeDark- Check if current theme is dark
Color Class
Color.FromHex(string hex)- Create color from hex stringColor.FromRGB(int r, int g, int b)- Create color from RGBColor.FromRGBA(int r, int g, int b, int a)- Create color from RGBAColor.GetOptimalTextColor(ImColor background)- Get accessible text colorColor.Lighten(ImColor color, float amount)- Lighten colorColor.Darken(ImColor color, float amount)- Darken color
Alignment Classes
new Alignment.Center(Vector2 contentSize)- Center in available regionnew Alignment.CenterWithin(Vector2 contentSize, Vector2 containerSize)- Center in container
Scoped Classes
new ScopedColor(ImGuiCol col, ImColor color)- Scoped color applicationnew ScopedTextColor(ImColor color)- Scoped text colornew ScopedStyleVar(ImGuiStyleVar var, float value)- Scoped style variablenew ScopedTheme(string themeName)- Scoped theme applicationnew ScopedThemeColor(Color semanticColor)- Scoped semantic color
🎯 Demo Application
The included demo application showcases all features:
cd ImGuiStylerDemo
dotnet run
Features demonstrated:
- Interactive theme browser with live preview
- All 50+ themes with family categorization
- Scoped styling examples
- Color manipulation demos
- Alignment showcases
- Accessibility features
🤝 Contributing
We welcome contributions! Please see our contributing guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Setup
git clone https://github.com/ktsu-dev/ImGuiStyler.git
cd ImGuiStyler
dotnet restore
dotnet build
📄 License
This project is licensed under the MIT License - see the LICENSE.md file for details.
🙏 Acknowledgments
- ImGui.NET - .NET bindings for Dear ImGui
- Hexa.NET.ImGui - Modern ImGui bindings
- Theme Inspirations: Catppuccin, Tokyo Night, Gruvbox, and other amazing color schemes
- Community Contributors - Thank you for your themes, bug reports, and improvements!
🔗 Related Projects
- ktsu.ThemeProvider - Semantic theming foundation
- ktsu.ImGuiPopups - Modal and popup utilities
- ktsu.Extensions - Utility extensions
Made with ❤️ by the ktsu.dev team
Showing the top 20 packages that depend on ktsu.ImGui.Styler.
| Packages | Downloads |
|---|---|
|
ktsu.ImGui.Widgets
Package Description
|
150 |
|
ktsu.ImGui.Widgets
Package Description
|
147 |
|
ktsu.ImGui.Widgets
Package Description
|
146 |
|
ktsu.ImGui.Widgets
Package Description
|
145 |
|
ktsu.ImGui.Widgets
Package Description
|
144 |
|
ktsu.ImGui.Widgets
Package Description
|
139 |
|
ktsu.ImGui.Widgets
Package Description
|
88 |
|
ktsu.ImGui.Widgets
Package Description
|
61 |
|
ktsu.ImGui.Widgets
Package Description
|
59 |
|
ktsu.ImGui.Widgets
Package Description
|
58 |
|
ktsu.ImGui.Widgets
Package Description
|
57 |
|
ktsu.ImGui.Widgets
A library of custom widgets using ImGui.NET and utilities to enhance ImGui-based applications.
|
56 |
|
ktsu.ImGui.Widgets
Package Description
|
55 |
## v2.3.3 (patch)
Changes since v2.3.2:
- Remove legacy build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.3.2 (patch)
Changes since v2.3.1:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync global.json ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.3.1 (patch)
Changes since v2.3.0:
- Increase MaxForce values in PhysicsSettings and demo to enhance simulation capabilities ([@matt-edmondson](https://github.com/matt-edmondson))
- Add directional bias setting and calculation for horizontal link forces ([@matt-edmondson](https://github.com/matt-edmondson))
- Update physics settings: adjust repulsion strength, origin anchor weight, damping factor, and link length for improved simulation dynamics ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance physics settings: add OriginAnchorWeight for gravity target blending and initialize world origin to centroid for improved simulation accuracy ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor gravity force calculation: simplify magnitude computation by removing distance factor ([@matt-edmondson](https://github.com/matt-edmondson))
- Update repulsion strength in physics settings for enhanced simulation performance ([@matt-edmondson](https://github.com/matt-edmondson))
- Adjust repulsion strength limits in physics settings for improved simulation accuracy ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor gravity calculations: update to use centroid for cohesion force and improve rendering of gravity center ([@matt-edmondson](https://github.com/matt-edmondson))
- Refine physics settings: adjust damping factor description and clamp minimum repulsion distance to prevent force explosions ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance physics simulation: add node pinning and stability detection features ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.3.0 (minor)
Changes since v2.2.0:
- [patch] Guard BeginFrame against calling native extensions without ImGui context ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add CleanImNodesDemo with physics simulation and attribute-based node editor ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add ImGuiNodeEditor with physics simulation and attribute-based node factory ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add NodeGraph test suite with 106 tests covering attributes, pins, type system, and validation ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add NodeGraph library with attribute-based node definitions ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Refactor demo app with modular tab-based architecture and extension demos ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add unit tests for ImGuiExtensionManager ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Integrate ImGuiExtensionManager into ImGuiController lifecycle ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add ImGuiExtensionManager for optional ImGuizmo, ImNodes, and ImPlot support ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add Hexa.NET.ImGuizmo, ImNodes, and ImPlot package references ([@matt-edmondson](https://github.com/matt-edmondson))
- Add visibility control for tabs in TabPanel ([@matt-edmondson](https://github.com/matt-edmondson))
- Exclude test projects from packaging and publishing processes in Invoke-DotNetPack and Invoke-DotNetPublish functions ([@matt-edmondson](https://github.com/matt-edmondson))
- Add compatibility suppressions for DefaultInterpolatedStringHandler in multiple modules ([@matt-edmondson](https://github.com/matt-edmondson))
- Add compatibility suppressions for DynamicallyAccessedMemberTypes and ExperimentalAttribute in ImGui.Popups, ImGui.Styler, and ImGui.Widgets for .NET 10.0 ([@matt-edmondson](https://github.com/matt-edmondson))
- Refine glyph area calculations and atlas fitting checks for improved memory management ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor null checks to use Ensure.NotNull for improved readability and consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance project name matching to handle variations in repository naming conventions ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance CalculateOptimalPixelSize to consider global accessibility scale for improved rendering ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor null argument checks to use Ensure.NotNull for improved readability ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve search box hint display logic based on available width ([@matt-edmondson](https://github.com/matt-edmondson))
- Add CLAUDE.md for project guidance and architecture overview ([@matt-edmondson](https://github.com/matt-edmondson))
- migrate to dotnet 10 ([@matt-edmondson](https://github.com/matt-edmondson))
- Dont show the close button on tabs inside a non-closable tab bar ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.12-pre.1 (prerelease)
Changes since v2.2.11:
- Fix all formatting errors to make build green ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Change default direction to clockwise and add StartAtBottom option ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Update README example function name to follow conventions ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Add input validation and optimize string allocation ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Fix clockwise/counter-clockwise logic and remove empty if block ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Add RadialProgressBar widget implementation and demo ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Initial plan ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
## v2.2.11 (patch)
Changes since v2.2.10:
- Add visibility control for tabs in TabPanel ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.11-pre.2 (prerelease)
Changes since v2.2.11-pre.1:
- Merge remote-tracking branch 'refs/remotes/origin/main' ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\update-winget-manifests.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.2.11-pre.1 (prerelease)
No significant changes detected since v2.2.11.
## v2.2.10 (patch)
Changes since v2.2.9:
- Exclude test projects from packaging and publishing processes in Invoke-DotNetPack and Invoke-DotNetPublish functions ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.10-pre.2 (prerelease)
Changes since v2.2.10-pre.1:
- Merge remote-tracking branch 'refs/remotes/origin/main' ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync global.json ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.2.10-pre.1 (prerelease)
No significant changes detected since v2.2.10.
## v2.2.9 (patch)
Changes since v2.2.8:
- Add compatibility suppressions for DefaultInterpolatedStringHandler in multiple modules ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.9-pre.2 (prerelease)
Changes since v2.2.9-pre.1:
- Merge remote-tracking branch 'refs/remotes/origin/main' ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync global.json ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync COPYRIGHT.md ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.2.9-pre.1 (prerelease)
No significant changes detected since v2.2.9.
## v2.2.8 (patch)
Changes since v2.2.7:
- Add compatibility suppressions for DynamicallyAccessedMemberTypes and ExperimentalAttribute in ImGui.Popups, ImGui.Styler, and ImGui.Widgets for .NET 10.0 ([@matt-edmondson](https://github.com/matt-edmondson))
- Refine glyph area calculations and atlas fitting checks for improved memory management ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor null checks to use Ensure.NotNull for improved readability and consistency ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.7 (patch)
Changes since v2.2.6:
- Remove .github\workflows\project.yml ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.6 (patch)
Changes since v2.2.5:
- Enhance project name matching to handle variations in repository naming conventions ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.5 (patch)
Changes since v2.2.4:
- Enhance CalculateOptimalPixelSize to consider global accessibility scale for improved rendering ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.4 (patch)
Changes since v2.2.3:
- Refactor null argument checks to use Ensure.NotNull for improved readability ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.3 (patch)
Changes since v2.2.2:
- Improve search box hint display logic based on available width ([@matt-edmondson](https://github.com/matt-edmondson))
- Add CLAUDE.md for project guidance and architecture overview ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.2 (patch)
Changes since v2.2.1:
- migrate to dotnet 10 ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.1 (patch)
Changes since v2.2.0:
- Dont show the close button on tabs inside a non-closable tab bar ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.1-pre.1 (prerelease)
No significant changes detected since v2.2.1.
## v2.2.0 (minor)
Changes since v2.1.0:
- Refactor glyph calculation for improved readability ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add dynamic atlas sizing and glyph limit calculation ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix gpu detection priority ([@matt-edmondson](https://github.com/matt-edmondson))
- Update tests/ImGui.App.Tests/FontMemoryGuardTests.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGui.App/FontMemoryGuard.cs to improve null checking ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGui.App/FontMemoryGuard.cs to have more specific matching criteria ([@matt-edmondson](https://github.com/matt-edmondson))
- Update variable name ImGui.App/ImGuiApp.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance font initialization with memory management features ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix missing package references ([@matt-edmondson](https://github.com/matt-edmondson))
- Increase timeout for build job to 20 minutes ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance project structure and testing: Added new dependencies in Directory.Packages.props, introduced a new Tests project in the solution, and updated project references. Refactored namespaces for consistency across multiple files. Updated test configurations and example projects to align with the new structure. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project structure and dependencies: Added new package versions in Directory.Packages.props, updated SDK versions in global.json, and refactored namespaces across multiple files for consistency. Removed the ImGui.Popups.Credential project and adjusted related references in the solution and project files. Enhanced test project configurations and updated example projects to reflect the new structure. ([@matt-edmondson](https://github.com/matt-edmondson))
- Initial combined commit ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix NuGet package source URL in Invoke-NuGetPublish function: Updated the source URL to ensure correct package publishing to packages.ktsu.dev. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Ktsu package key support in build configuration: Updated the .NET CI workflow and PowerShell script to include an optional Ktsu package key for publishing. Enhanced documentation for the new parameter and added conditional publishing logic for Ktsu.dev. ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement modern DPI awareness handling in Windows: Updated ForceDpiAware to utilize the latest DPI awareness APIs for better compatibility with windowing libraries. Added fallback mechanisms for older Windows versions and enhanced NativeMethods with new DPI awareness context functions. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance window position validation logic: Implemented performance optimizations to skip unnecessary checks when window position and size remain unchanged. Added methods for better multi-monitor support, ensuring windows are relocated when insufficiently visible. Updated tests to verify new behavior and performance improvements. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update package versions and clean up validation logic: Bump versions for Hexa.NET.ImGui, ktsu.ScopedAction, SixLabors.ImageSharp, System.Text.Json, and MSTest packages. Remove redundant validation checks from ImGuiApp configuration and corresponding tests. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiApp configuration handling: Introduced AdjustConfigForStartup method to automatically convert minimized window state to normal during startup, improving application reliability. Updated tests to validate this new behavior. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGuiApp configuration validation: Automatically convert minimized and fullscreen window states to normal during startup to prevent issues. Updated tests to reflect this change, ensuring proper state handling without exceptions. ([@matt-edmondson](https://github.com/matt-edmondson))
- Additional tests ([@matt-edmondson](https://github.com/matt-edmondson))
- Move debug logger into its own file and make it output to the appdata dir ([@matt-edmondson](https://github.com/matt-edmondson))
- Move debug logger into its own file and make it output to the appdata dir ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.10 (patch)
Changes since v2.1.9:
- Fix gpu detection priority ([@matt-edmondson](https://github.com/matt-edmondson))
- Update tests/ImGui.App.Tests/FontMemoryGuardTests.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGui.App/FontMemoryGuard.cs to improve null checking ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGui.App/FontMemoryGuard.cs to have more specific matching criteria ([@matt-edmondson](https://github.com/matt-edmondson))
- Update variable name ImGui.App/ImGuiApp.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance font initialization with memory management features ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.10-pre.2 (prerelease)
Changes since v2.1.10-pre.1:
- Sync scripts\PSBuild.psm1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\update-winget-manifests.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\update-sdks.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitattributes ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .runsettings ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.1.10-pre.1 (prerelease)
No significant changes detected since v2.1.10.
## v2.1.9 (patch)
Changes since v2.1.8:
- Fix missing package references ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.8 (patch)
Changes since v2.1.7:
- Increase timeout for build job to 20 minutes ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance project structure and testing: Added new dependencies in Directory.Packages.props, introduced a new Tests project in the solution, and updated project references. Refactored namespaces for consistency across multiple files. Updated test configurations and example projects to align with the new structure. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project structure and dependencies: Added new package versions in Directory.Packages.props, updated SDK versions in global.json, and refactored namespaces across multiple files for consistency. Removed the ImGui.Popups.Credential project and adjusted related references in the solution and project files. Enhanced test project configurations and updated example projects to reflect the new structure. ([@matt-edmondson](https://github.com/matt-edmondson))
- Initial combined commit ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.7 (patch)
Changes since v2.1.6:
- Fix NuGet package source URL in Invoke-NuGetPublish function: Updated the source URL to ensure correct package publishing to packages.ktsu.dev. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.6 (patch)
Changes since v2.1.5:
- Add Ktsu package key support in build configuration: Updated the .NET CI workflow and PowerShell script to include an optional Ktsu package key for publishing. Enhanced documentation for the new parameter and added conditional publishing logic for Ktsu.dev. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.5 (patch)
Changes since v2.1.4:
- Implement modern DPI awareness handling in Windows: Updated ForceDpiAware to utilize the latest DPI awareness APIs for better compatibility with windowing libraries. Added fallback mechanisms for older Windows versions and enhanced NativeMethods with new DPI awareness context functions. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.4 (patch)
Changes since v2.1.3:
- Enhance window position validation logic: Implemented performance optimizations to skip unnecessary checks when window position and size remain unchanged. Added methods for better multi-monitor support, ensuring windows are relocated when insufficiently visible. Updated tests to verify new behavior and performance improvements. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update package versions and clean up validation logic: Bump versions for Hexa.NET.ImGui, ktsu.ScopedAction, SixLabors.ImageSharp, System.Text.Json, and MSTest packages. Remove redundant validation checks from ImGuiApp configuration and corresponding tests. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.3 (patch)
Changes since v2.1.2:
- Add manual trigger support to GitHub Actions workflow: Enabled workflow_dispatch to allow manual execution of the .NET CI pipeline. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.2 (patch)
Changes since v2.1.1:
- Refactor ImGuiApp configuration handling: Introduced AdjustConfigForStartup method to automatically convert minimized window state to normal during startup, improving application reliability. Updated tests to validate this new behavior. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGuiApp configuration validation: Automatically convert minimized and fullscreen window states to normal during startup to prevent issues. Updated tests to reflect this change, ensuring proper state handling without exceptions. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.1 (patch)
Changes since v2.1.0:
- Additional tests ([@matt-edmondson](https://github.com/matt-edmondson))
- Move debug logger into its own file and make it output to the appdata dir ([@matt-edmondson](https://github.com/matt-edmondson))
- Move debug logger into its own file and make it output to the appdata dir ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.0 (minor)
Changes since v2.0.0:
- [minor] Implement PID-based frame limiting in ImGuiApp: Introduced a new PidFrameLimiter class for precise frame rate control, enhancing performance optimization. Updated documentation to reflect new features, including auto-tuning capabilities and real-time diagnostics. Adjusted rendering settings to disable VSync for improved frame limiting accuracy. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance ImGuiApp documentation and features: Updated project overview, added detailed descriptions for performance optimization, debug logging, and Unicode support. Introduced performance monitoring capabilities with real-time FPS tracking and throttling visualization. Improved font management and DPI handling. Refactored configuration settings for better usability. Updated demo application to showcase new features. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor performance settings: remove Ups, add NotVisibleFps and flags ([@Cursor Agent](https://github.com/Cursor Agent))
- Auto-commit pending changes before rebase - PR synchronize ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge remote-tracking branch 'origin/main' into cursor/increase-imguiapp-test-coverage-c9d4 ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix test paths using Path.GetFullPath for consistent texture testing ([@Cursor Agent](https://github.com/Cursor Agent))
- Add test for preventing multiple ImGuiApp starts ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance performance throttling with lowest-rate selection logic ([@Cursor Agent](https://github.com/Cursor Agent))
- Increase NotVisibleFps from 0.2 to 2.0 for better background performance ([@Cursor Agent](https://github.com/Cursor Agent))
- Add real-time FPS graph with throttling state visualization ([@Cursor Agent](https://github.com/Cursor Agent))
- Add NotVisibleFps setting for ultra-low frame rate when minimized ([@Cursor Agent](https://github.com/Cursor Agent))
- Adjust not visible frame rate to 0.2 FPS for better resource conservation ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor ImGuiApp tests to use Assert.ThrowsException method ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement sleep-based frame rate throttling and remove UPS settings ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Update ImGuiFontConfig test to allow empty font path ([@Cursor Agent](https://github.com/Cursor Agent))
- Use PackageReleaseNotesFile to handle changelog release notes more robustly ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve performance throttling with multi-condition rate selection ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove debug throttling properties and simplify focus handling ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix input focus detection and add throttling debug info ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Add comprehensive test coverage for ImGuiApp components and edge cases ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove focus checks from input event handlers ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix input focus detection to prevent incorrect idle state management ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve window focus detection and add debug logging for throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor test suite into focused, organized test classes ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement lowest frame rate throttling with comprehensive condition evaluation ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Add comprehensive unit tests for ImGuiApp and related classes ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Add window visibility throttling for ultra-low resource usage ([@Cursor Agent](https://github.com/Cursor Agent))
- Simplify performance update logic and remove unnecessary tracking ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove documentation for deferred FPS/UPS update fix. ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement deferred performance updates to prevent mid-cycle rate changes ([@Cursor Agent](https://github.com/Cursor Agent))
- Style cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix performance rate sync and update throttling to prevent ImGui crashes ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove blank lines ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove VSync throttling configuration and related code ([@Cursor Agent](https://github.com/Cursor Agent))
- Simplify VSync management and remove unnecessary context checks ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix VSync to prevent resource spikes when unfocused; update .NET SDK. ([@Cursor Agent](https://github.com/Cursor Agent))
- Add test coverage for ImGuiApp and related components ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync and resource management for unfocused application states ([@Cursor Agent](https://github.com/Cursor Agent))
- Update default font size check in ImGuiApp to use FontAppearance.DefaultFontPointSize for improved consistency in font handling. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper and ImGuiApp to simplify character addition and update default font key for compatibility. Removed unnecessary type checks in FontHelper for character ranges and adjusted font index storage in ImGuiApp to dynamically reflect the default font point size. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update default font point size in FontAppearance to 14 for improved readability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor font loading in ImGuiApp to utilize pre-allocated memory for both main and emoji fonts. This change improves memory management by reusing allocated handles, enhancing performance and reducing memory overhead during font loading. Updated related methods to reflect the new memory handling approach. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance FontHelper by adding support for extended Unicode and emoji glyph ranges. Introduced initialization flags and cleanup methods to manage memory more effectively. This refactor improves glyph range handling and prevents memory deallocation issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper to simplify glyph range additions by removing unnecessary type casting to ushort. This change enhances the handling of character ranges for emoji and Latin Extended characters, improving code clarity and maintainability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance emoji font support in ImGuiApp. Introduced LoadEmojiFont method to merge emoji fonts with main fonts, ensuring proper display of emojis. Updated FontHelper to manage emoji-specific glyph ranges separately, improving clarity and avoiding conflicts with main font symbols. Updated ImGuiAppDemo to showcase full emoji range support. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add NotoEmoji font support to ImGuiApp. Introduced NotoEmoji.ttf as a resource for emoji display and updated related resource files. Enhanced PowerShell script to preserve manually placed emoji fonts during Nerd Font installation, ensuring full emoji support in the application. ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace RobotoMonoNerdFont with NerdFont in ImGuiApp configuration. Add PowerShell script for interactive Nerd Font installation and management, including backup and recovery features. Update resource files to reflect new font integration. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Nerd Font tab to ImGuiAppDemo, showcasing various icon sets including Powerline, Font Awesome, Material Design, Weather, Devicons, Octicons, and Brand Logos. Enhanced user guidance for using Nerd Fonts effectively. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add support for Nerd Font icon ranges in FontHelper. Introduced AddNerdFontRanges method to include various icon sets such as Font Awesome, Material Design Icons, and Weather Icons, enhancing glyph range management. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper to modularize glyph range additions for Latin Extended and emoji characters. Updated ImGuiApp to utilize the new methods for improved clarity and maintainability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper to streamline Unicode and emoji range handling. Removed unused methods and improved memory management for glyph ranges. Updated ImGuiApp to utilize FontHelper for extended Unicode support. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiFontConfig to enhance Unicode support by consolidating glyph range additions and improving code clarity. Removed redundant comments and streamlined the builder initialization process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiAppDemo to streamline tab rendering and remove redundant performance tab code ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve font memory management with custom font handle tracking ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge remote-tracking branch 'origin/main' into cursor/address-question-mark-glyphs-d05e ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Reset method tests and reset performance-related state fields ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix scissor rectangle calculations in ImGuiController to ensure non-negative dimensions, preventing potential rendering issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add launch settings for ImGuiAppDemo with native debugging enabled ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance ImGuiApp configuration with debugging options ([@matt-edmondson](https://github.com/matt-edmondson))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor ImGuiController for improved code clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve rendering precision and pixel-perfect techniques in ImGui rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync handling during frame rate throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor Performance tab into separate method and reorder tabs ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix merge conflict in performance tab text and update FPS description ([@Cursor Agent](https://github.com/Cursor Agent))
- Changes from background agent bc-34f5e701-6497-49ba-b614-0b4bc857f398 ([@Cursor Agent](https://github.com/Cursor Agent))
- Add performance throttling with configurable rendering and idle detection ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor demo app with tabbed interface and improved Unicode/emoji display ([@Cursor Agent](https://github.com/Cursor Agent))
- Add Unicode and emoji support with configurable font rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- Enable Unicode and emoji support by default in ImGuiApp ([@Cursor Agent](https://github.com/Cursor Agent))
- Add Reset method tests and reset performance-related state fields ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge main into feature branch and integrate performance tab ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync handling during frame rate throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Add emoji support to Unicode character ranges in ImGuiApp ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix scissor rectangle calculations in ImGuiController to ensure non-negative dimensions, preventing potential rendering issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add launch settings for ImGuiAppDemo with native debugging enabled ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance ImGuiApp configuration with debugging options ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper for flexible Unicode support with user-configured fonts ([@Cursor Agent](https://github.com/Cursor Agent))
- Add Unicode and emoji font support with cross-platform detection ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance ImGuiAppDemo with new features and UI updates ([@matt-edmondson](https://github.com/matt-edmondson))
- Update default performance settings for better resource efficiency ([@Cursor Agent](https://github.com/Cursor Agent))
- Add performance throttling with configurable rendering and idle detection ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor ImGuiController for improved code clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve rendering precision and pixel-perfect techniques in ImGui rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix NuGet version retrieval and update package versions ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Directory.Packages.props and global.json for centralized package management ([@matt-edmondson](https://github.com/matt-edmondson))
- Update CLAUDE.md with additional testing and build instructions; enhance PSBuild script to improve release notes truncation logic for compliance with NuGet character limits, including detailed logging for better traceability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Invoke-DotNetPack function in PSBuild script to improve handling of release notes. Updated logic to create a temporary file for truncated content exceeding NuGet's 35,000 character limit, ensuring compliance and enhancing logging for better traceability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Invoke-DotNetPack function in PSBuild script to handle release notes exceeding NuGet's 35,000 character limit. Added logic to truncate long release notes and create a temporary file for compliance, with appropriate logging and cleanup of temporary files after packaging. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Test-IsLibraryOnlyProject function in update-winget-manifests.ps1 ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance New-Changelog function in PSBuild script to truncate release no... (truncated due to NuGet length limits)
.NET 8.0
- ktsu.ImGui.Popups (>= 2.3.3)
- ktsu.ThemeProvider.ImGui (>= 1.0.11)
- ktsu.ThemeProvider (>= 1.0.11)
- ktsu.ScopedAction (>= 1.1.6)
- Polyfill (>= 9.7.7)
- Microsoft.SourceLink.GitHub (>= 10.0.102)
- Microsoft.SourceLink.AzureRepos.Git (>= 10.0.102)
- Hexa.NET.ImGui (>= 2.2.9)
.NET 10.0
- ktsu.ThemeProvider.ImGui (>= 1.0.11)
- ktsu.ThemeProvider (>= 1.0.11)
- ktsu.ScopedAction (>= 1.1.6)
- Polyfill (>= 9.7.7)
- Microsoft.SourceLink.GitHub (>= 10.0.102)
- Microsoft.SourceLink.AzureRepos.Git (>= 10.0.102)
- Hexa.NET.ImGui (>= 2.2.9)
- ktsu.ImGui.Popups (>= 2.3.3)
.NET 9.0
- ktsu.ThemeProvider.ImGui (>= 1.0.11)
- ktsu.ThemeProvider (>= 1.0.11)
- Polyfill (>= 9.7.7)
- ktsu.ScopedAction (>= 1.1.6)
- Microsoft.SourceLink.AzureRepos.Git (>= 10.0.102)
- Hexa.NET.ImGui (>= 2.2.9)
- ktsu.ImGui.Popups (>= 2.3.3)
- Microsoft.SourceLink.GitHub (>= 10.0.102)
| Version | Downloads | Last updated |
|---|---|---|
| 2.3.3 | 15 | 02/14/2026 |
| 2.3.2 | 15 | 02/14/2026 |
| 2.3.1 | 53 | 02/10/2026 |
| 2.3.0 | 52 | 02/10/2026 |
| 2.2.12-pre.1 | 52 | 02/10/2026 |
| 2.2.11 | 52 | 02/10/2026 |
| 2.2.11-pre.2 | 56 | 02/06/2026 |
| 2.2.11-pre.1 | 57 | 02/05/2026 |
| 2.2.10 | 58 | 02/03/2026 |
| 2.2.10-pre.2 | 59 | 02/01/2026 |
| 2.2.10-pre.1 | 58 | 01/31/2026 |
| 2.2.9 | 56 | 01/31/2026 |
| 2.2.9-pre.2 | 56 | 01/31/2026 |
| 2.2.9-pre.1 | 57 | 01/31/2026 |
| 2.2.8 | 60 | 01/31/2026 |
| 2.2.7 | 61 | 01/30/2026 |
| 2.2.6 | 59 | 01/29/2026 |
| 2.2.5 | 55 | 01/29/2026 |
| 2.2.4 | 57 | 01/29/2026 |
| 2.2.3 | 61 | 01/27/2026 |
| 2.2.2 | 56 | 01/27/2026 |
| 2.2.1 | 89 | 01/09/2026 |
| 2.2.1-pre.1 | 142 | 11/24/2025 |
| 2.2.0 | 145 | 11/23/2025 |
| 2.1.10 | 150 | 11/23/2025 |
| 2.1.10-pre.2 | 147 | 11/23/2025 |
| 2.1.10-pre.1 | 143 | 11/19/2025 |
| 2.1.9 | 147 | 09/09/2025 |
| 2.1.8 | 150 | 09/08/2025 |