From 2f492d9ed11e8d6a5524e60c0fa1dc1960215e48 Mon Sep 17 00:00:00 2001 From: pas2704 Date: Tue, 20 May 2025 17:09:29 -0400 Subject: [PATCH] Add interface for gui handling so plugins can determine if inputs are being blocked or if the mouse is being drawn (etc) --- CringeLauncher/ImGuiHandler.cs | 17 ++++++++++++----- CringePlugins/Abstractions/IGuiHandler.cs | 23 +++++++++++++++++++++++ CringePlugins/Render/RenderHandler.cs | 11 +++++++---- 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 CringePlugins/Abstractions/IGuiHandler.cs diff --git a/CringeLauncher/ImGuiHandler.cs b/CringeLauncher/ImGuiHandler.cs index decd8b5..97a9bbd 100644 --- a/CringeLauncher/ImGuiHandler.cs +++ b/CringeLauncher/ImGuiHandler.cs @@ -15,7 +15,7 @@ using Sandbox.Graphics.GUI; namespace CringeLauncher; -internal class ImGuiHandler : IDisposable +internal sealed class ImGuiHandler : IGuiHandler, IDisposable { private DeviceContext? _deviceContext; private int _blockKeysCounter; @@ -25,16 +25,23 @@ internal class ImGuiHandler : IDisposable public bool BlockKeys => _blockKeysCounter > 0; public bool DrawMouse { get; private set; } - internal bool MouseToggle { get; set; } - internal bool MouseKey { get; set; } + public bool MouseToggle { get; set; } + public bool MouseKey { get; set; } + + public bool Initialized => _init; public static ImGuiHandler? Instance; public static RenderTargetView? Rtv; - private readonly IRootRenderComponent _renderHandler = new RenderHandler(); + private readonly IRootRenderComponent _renderHandler; private static bool _init; + public ImGuiHandler() + { + _renderHandler = new RenderHandler(this); + } + public unsafe void Init(nint windowHandle, Device1 device, DeviceContext deviceContext) { _deviceContext = deviceContext; @@ -84,7 +91,7 @@ internal class ImGuiHandler : IDisposable else _blockKeysCounter--; - DrawMouse = io.MouseDrawCursor || MouseToggle || MouseKey; + DrawMouse = io.MouseDrawCursor || MouseToggle || MouseKey; var focusedScreen = MyScreenManager.GetScreenWithFocus(); //migrated logic from MyDX9Gui.Draw diff --git a/CringePlugins/Abstractions/IGuiHandler.cs b/CringePlugins/Abstractions/IGuiHandler.cs new file mode 100644 index 0000000..bb9d5e0 --- /dev/null +++ b/CringePlugins/Abstractions/IGuiHandler.cs @@ -0,0 +1,23 @@ +namespace CringePlugins.Abstractions; +public interface IGuiHandler +{ + /// + /// Whether or not the Gui Handler is blocking keys from the game's input system. + /// + bool BlockKeys { get; } + + /// + /// Whether or not the Gui Handler is blocking mouse input (excluding position) from the game's input system. + /// + bool BlockMouse { get; } + + /// + /// Whether or not the Gui Handler is drawing the mouse cursor via keybinds (does not include when the game is drawing the mouse cursor). + /// + bool DrawMouse { get; } + + /// + /// Whether or not the Gui Handler is initialized. + /// + bool Initialized { get; } +} diff --git a/CringePlugins/Render/RenderHandler.cs b/CringePlugins/Render/RenderHandler.cs index 9d800ef..5cb413c 100644 --- a/CringePlugins/Render/RenderHandler.cs +++ b/CringePlugins/Render/RenderHandler.cs @@ -8,15 +8,18 @@ namespace CringePlugins.Render; public sealed class RenderHandler : IRootRenderComponent { private static readonly Logger Log = LogManager.GetCurrentClassLogger(); - + private static RenderHandler? _current; + private static IGuiHandler? _guiHandler; public static RenderHandler Current => _current ?? throw new InvalidOperationException("Render is not yet initialized"); - + public static IGuiHandler GuiHandler => _guiHandler ?? throw new InvalidOperationException("Render is not yet initialized"); + private readonly ConcurrentBag _components = []; - internal RenderHandler() + internal RenderHandler(IGuiHandler guiHandler) { _current = this; + _guiHandler = guiHandler; } public void RegisterComponent(TComponent instance) where TComponent : IRenderComponent @@ -29,7 +32,7 @@ public sealed class RenderHandler : IRootRenderComponent #if DEBUG ImGui.ShowDemoWindow(); #endif - + foreach (var (instanceType, renderComponent) in _components) { try