From d1a4c8027f6dff7b722f38234f5da580ba625eec Mon Sep 17 00:00:00 2001 From: Arnaud Jamin Date: Wed, 29 Nov 2023 01:27:41 -0500 Subject: [PATCH] CogImGui: Rework input mangement. --- Content/Core/Hud/WBP_Menu.uasset | Bin 171719 -> 167421 bytes .../CogImgui/Private/CogImguiContext.cpp | 157 +++--------------- .../CogImgui/Private/CogImguiWidget.cpp | 124 +++----------- .../Source/CogImgui/Public/CogImguiContext.h | 14 +- .../Source/CogImgui/Public/CogImguiWidget.h | 8 +- .../CogWindow/Private/CogWindowManager.cpp | 2 +- .../CogWindow/Private/CogWindow_Settings.cpp | 51 +++--- 7 files changed, 77 insertions(+), 279 deletions(-) diff --git a/Content/Core/Hud/WBP_Menu.uasset b/Content/Core/Hud/WBP_Menu.uasset index 8970d13e62d102ea00e37dc8e8e4af1c98b9cec9..16a879574f9ddc1a6af3132f7893d4718de957a0 100644 GIT binary patch delta 4717 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 J7B45W;NSHSrBDC> diff --git a/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp b/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp index e391b59..6e7ce47 100644 --- a/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp +++ b/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp @@ -132,6 +132,8 @@ void FCogImguiContext::Shutdown() } } + GameViewport->RemoveViewportWidgetContent(MainWidget.ToSharedRef()); + if (PlotContext) { ImPlot::DestroyContext(PlotContext); @@ -223,7 +225,6 @@ void FCogImguiContext::BeginFrame(float InDeltaTime) if (ModifierKeys.IsAltDown() != IO.KeyAlt) { IO.AddKeyEvent(ImGuiMod_Alt, ModifierKeys.IsAltDown()); } if (ModifierKeys.IsCommandDown() != IO.KeySuper) { IO.AddKeyEvent(ImGuiMod_Super, ModifierKeys.IsCommandDown()); } - //------------------------------------------------------------------------------------------------------- // //------------------------------------------------------------------------------------------------------- @@ -236,8 +237,6 @@ void FCogImguiContext::BeginFrame(float InDeltaTime) IO.ConfigFlags |= ImGuiConfigFlags_NoMouse; } - TickFocus(); - //------------------------------------------------------------------------------------------------------- // //------------------------------------------------------------------------------------------------------- @@ -579,68 +578,39 @@ void FCogImguiContext::SetEnableInput(bool Value) { bEnableInput = Value; - FSlateThrottleManager::Get().DisableThrottle(bEnableInput); - - if (bEnableInput == false) + if (bEnableInput) { - TryGiveMouseCaptureBackToGame(); + FSlateThrottleManager::Get().DisableThrottle(true); + IsThrottleDisabled = true; + + FSlateApplication& SlateApp = FSlateApplication::Get(); + + if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) + { + LocalPlayer->GetSlateOperations() + .ReleaseMouseLock() + .ReleaseMouseCapture(); + } } else { + if (IsThrottleDisabled) + { + FSlateThrottleManager::Get().DisableThrottle(false); + } + + if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) + { + LocalPlayer->GetSlateOperations().CaptureMouse(GameViewport->GetGameViewportWidget().ToSharedRef()); + } } + } //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::SetShareMouse(bool Value) { - bShareMouse = Value; - - if (bEnableInput == false) - { - TryGiveMouseCaptureBackToGame(); - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogImguiContext::TryReleaseGameMouseCapture() -{ - if (bShareMouse) - { - return; - } - - if (TSharedPtr User = FSlateApplication::Get().GetCursorUser()) - { - if (User->HasCursorCapture()) - { - PreviousMouseCaptor = User->GetCursorCaptor(); - } - } - - if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) - { - LocalPlayer->GetSlateOperations() - .ReleaseMouseLock() - .ReleaseMouseCapture(); - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogImguiContext::TryGiveMouseCaptureBackToGame() -{ - if (PreviousMouseCaptor.IsValid() == false) - { - return; - } - - TSharedRef PreviousMouseCaptorRef = PreviousMouseCaptor.Pin().ToSharedRef(); - - if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) - { - LocalPlayer->GetSlateOperations().CaptureMouse(PreviousMouseCaptorRef); - } - - PreviousMouseCaptor.Reset(); + bShareMouse = Value; } //-------------------------------------------------------------------------------------------------------------------------- @@ -743,80 +713,3 @@ ULocalPlayer* FCogImguiContext::GetLocalPlayer() const ULocalPlayer* LocalPlayer = World->GetFirstLocalPlayerFromController(); return LocalPlayer; } - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogImguiContext::TickFocus() -{ - const bool bShouldEnableInput = bEnableInput; - if (bEnableInput != bShouldEnableInput) - { - bEnableInput = bShouldEnableInput; - - if (bEnableInput) - { - TakeFocus(); - } - else - { - ReturnFocus(); - } - } - else if (bEnableInput) - { - const auto& ViewportWidget = GameViewport->GetGameViewportWidget(); - if (!MainWidget->HasKeyboardFocus() && !IsConsoleOpened() && (ViewportWidget->HasKeyboardFocus() || ViewportWidget->HasFocusedDescendants())) - { - TakeFocus(); - } - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogImguiContext::TakeFocus() -{ - FSlateApplication& SlateApplication = FSlateApplication::Get(); - - PreviousMouseCaptor = SlateApplication.GetUserFocusedWidget(SlateApplication.GetUserIndexForKeyboard()); - - if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) - { - TSharedRef FocusWidget = MainWidget->AsShared(); - LocalPlayer->GetSlateOperations().CaptureMouse(FocusWidget); - LocalPlayer->GetSlateOperations().SetUserFocus(FocusWidget); - } - else - { - SlateApplication.SetKeyboardFocus(MainWidget->AsShared()); - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogImguiContext::ReturnFocus() -{ - //if (MainWidget->HasKeyboardFocus()) - //{ - // auto FocusWidgetPtr = PreviousMouseCaptor.IsValid() - // ? PreviousMouseCaptor.Pin() - // : GameViewport->GetGameViewportWidget(); - - // if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) - // { - // auto FocusWidgetRef = FocusWidgetPtr.ToSharedRef(); - - // if (FocusWidgetPtr == GameViewport->GetGameViewportWidget()) - // { - // LocalPlayer->GetSlateOperations().CaptureMouse(FocusWidgetRef); - // } - - // LocalPlayer->GetSlateOperations().SetUserFocus(FocusWidgetRef); - // } - // else - // { - // FSlateApplication& SlateApplication = FSlateApplication::Get(); - // SlateApplication.ResetToDefaultPointerInputSettings(); - // SlateApplication.SetUserFocus(SlateApplication.GetUserIndexForKeyboard(), FocusWidgetPtr); - // } - //} - - //PreviousMouseCaptor.Reset(); -} diff --git a/Plugins/Cog/Source/CogImgui/Private/CogImguiWidget.cpp b/Plugins/Cog/Source/CogImgui/Private/CogImguiWidget.cpp index 727790b..c3576c0 100644 --- a/Plugins/Cog/Source/CogImgui/Private/CogImguiWidget.cpp +++ b/Plugins/Cog/Source/CogImgui/Private/CogImguiWidget.cpp @@ -3,7 +3,6 @@ #include "CogImguiInputHelper.h" #include "CogImguiModule.h" #include "CogImguiWidget.h" - #include "CogImGuiContext.h" #include "imgui.h" #include "SlateOptMacros.h" @@ -14,8 +13,7 @@ void SCogImguiWidget::Construct(const FArguments& InArgs) { Context = InArgs._Context; - //SetVisibility(EVisibility::SelfHitTestInvisible); - SetVisibility(EVisibility::Visible); + RefreshVisibility(); } END_SLATE_FUNCTION_BUILD_OPTIMIZATION @@ -30,6 +28,13 @@ void SCogImguiWidget::SetDrawData(const ImDrawData* InDrawData) DrawData = FCogImguiDrawData(InDrawData); } +//-------------------------------------------------------------------------------------------------------------------------- +void SCogImguiWidget::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) +{ + Super::Tick(AllottedGeometry, InCurrentTime, InDeltaTime); + RefreshVisibility(); +} + //-------------------------------------------------------------------------------------------------------------------------- int32 SCogImguiWidget::OnPaint( const FPaintArgs& Args, @@ -104,21 +109,6 @@ FVector2D SCogImguiWidget::ComputeDesiredSize(float Scale) const return FVector2D::ZeroVector; } -////-------------------------------------------------------------------------------------------------------------------------- -//FReply SCogImguiWidget::OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& FocusEvent) -//{ -// if (bEnableInput == false) -// { -// return FReply::Unhandled(); -// } -// -// Super::OnFocusReceived(MyGeometry, FocusEvent); -// -// FSlateApplication::Get().ResetToDefaultPointerInputSettings(); -// -// return FReply::Handled(); -//} - //-------------------------------------------------------------------------------------------------------------------------- FReply SCogImguiWidget::OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& CharacterEvent) { @@ -189,13 +179,7 @@ FReply SCogImguiWidget::OnAnalogValueChanged(const FGeometry& MyGeometry, const return FReply::Unhandled(); } - else - { - //if (bShareKeyboard) - //{ - // return FReply::Unhandled(); - //} - } + return FReply::Handled(); } @@ -272,83 +256,15 @@ FReply SCogImguiWidget::OnFocusReceived(const FGeometry& MyGeometry, const FFocu return Super::OnFocusReceived(MyGeometry, FocusEvent); } - //-------------------------------------------------------------------------------------------------------------------------- -//void SCogImguiWidget::TickFocus() -//{ -// FCogImguiModule& Module = FCogImguiModule::Get(); -// -// const bool bShouldEnableInput = Module.GetEnableInput(); -// if (bEnableInput != bShouldEnableInput) -// { -// bEnableInput = bShouldEnableInput; -// -// if (bEnableInput) -// { -// TakeFocus(); -// } -// else -// { -// ReturnFocus(); -// } -// } -// else if (bEnableInput) -// { -// const auto& ViewportWidget = GameViewport->GetGameViewportWidget(); -// if (!HasKeyboardFocus() && !IsConsoleOpened() && (ViewportWidget->HasKeyboardFocus() || ViewportWidget->HasFocusedDescendants())) -// { -// TakeFocus(); -// } -// } -//} -// -// -////-------------------------------------------------------------------------------------------------------------------------- -//void SCogImguiWidget::TakeFocus() -//{ -// FSlateApplication& SlateApplication = FSlateApplication::Get(); -// -// PreviousUserFocusedWidget = SlateApplication.GetUserFocusedWidget(SlateApplication.GetUserIndexForKeyboard()); -// -// if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) -// { -// TSharedRef FocusWidget = SharedThis(this); -// LocalPlayer->GetSlateOperations().CaptureMouse(FocusWidget); -// LocalPlayer->GetSlateOperations().SetUserFocus(FocusWidget); -// } -// else -// { -// SlateApplication.SetKeyboardFocus(SharedThis(this)); -// } -//} -// -////-------------------------------------------------------------------------------------------------------------------------- -//void SCogImguiWidget::ReturnFocus() -//{ -// if (HasKeyboardFocus()) -// { -// auto FocusWidgetPtr = PreviousUserFocusedWidget.IsValid() -// ? PreviousUserFocusedWidget.Pin() -// : GameViewport->GetGameViewportWidget(); -// -// if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) -// { -// auto FocusWidgetRef = FocusWidgetPtr.ToSharedRef(); -// -// if (FocusWidgetPtr == GameViewport->GetGameViewportWidget()) -// { -// LocalPlayer->GetSlateOperations().CaptureMouse(FocusWidgetRef); -// } -// -// LocalPlayer->GetSlateOperations().SetUserFocus(FocusWidgetRef); -// } -// else -// { -// FSlateApplication& SlateApplication = FSlateApplication::Get(); -// SlateApplication.ResetToDefaultPointerInputSettings(); -// SlateApplication.SetUserFocus(SlateApplication.GetUserIndexForKeyboard(), FocusWidgetPtr); -// } -// } -// -// PreviousUserFocusedWidget.Reset(); -//} +void SCogImguiWidget::RefreshVisibility() +{ + if (Context->GetEnableInput()) + { + SetVisibility(EVisibility::Visible); + } + else + { + SetVisibility(EVisibility::SelfHitTestInvisible); + } +} diff --git a/Plugins/Cog/Source/CogImgui/Public/CogImguiContext.h b/Plugins/Cog/Source/CogImgui/Public/CogImguiContext.h index c722aba..e57018e 100644 --- a/Plugins/Cog/Source/CogImgui/Public/CogImguiContext.h +++ b/Plugins/Cog/Source/CogImgui/Public/CogImguiContext.h @@ -2,9 +2,9 @@ #include "CoreMinimal.h" #include "Engine/Texture2D.h" +#include "imgui.h" #include "Templates/SharedPointer.h" #include "UObject/StrongObjectPtr.h" -#include "imgui.h" class FCogImguiContext; class IInputProcessor; @@ -57,18 +57,8 @@ private: void DrawDebug(); - void TryGiveMouseCaptureBackToGame(); - - void TryReleaseGameMouseCapture(); - void BuildFont(); - void ReturnFocus(); - - void TickFocus(); - - void TakeFocus(); - ULocalPlayer* GetLocalPlayer() const; static void ImGui_CreateWindow(ImGuiViewport* Viewport); @@ -122,4 +112,6 @@ private: float DpiScale = 1.f; bool bRefreshDPIScale = false; + + bool IsThrottleDisabled = false; }; diff --git a/Plugins/Cog/Source/CogImgui/Public/CogImguiWidget.h b/Plugins/Cog/Source/CogImgui/Public/CogImguiWidget.h index 05c898d..9a361e0 100644 --- a/Plugins/Cog/Source/CogImgui/Public/CogImguiWidget.h +++ b/Plugins/Cog/Source/CogImgui/Public/CogImguiWidget.h @@ -26,6 +26,8 @@ public: ~SCogImguiWidget(); + virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override; + virtual int32 OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& WidgetStyle, bool bParentEnabled) const override; virtual bool SupportsKeyboardFocus() const override { return true; } @@ -53,11 +55,7 @@ protected: FReply HandleKeyEvent(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent); - void TickFocus(); - - void TakeFocus(); - - void ReturnFocus(); + void RefreshVisibility(); TObjectPtr Context = nullptr; diff --git a/Plugins/Cog/Source/CogWindow/Private/CogWindowManager.cpp b/Plugins/Cog/Source/CogWindow/Private/CogWindowManager.cpp index 7818efd..ad8f7f2 100644 --- a/Plugins/Cog/Source/CogWindow/Private/CogWindowManager.cpp +++ b/Plugins/Cog/Source/CogWindow/Private/CogWindowManager.cpp @@ -85,7 +85,7 @@ void UCogWindowManager::InitializeInternal() TEXT("Save the layout. Cog.SaveLayout "), FConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray& Args) { if (Args.Num() > 0) { SaveLayout(FCString::Atoi(*Args[0])); }}), ECVF_Cheat)); - + IsInitialized = true; } diff --git a/Plugins/Cog/Source/CogWindow/Private/CogWindow_Settings.cpp b/Plugins/Cog/Source/CogWindow/Private/CogWindow_Settings.cpp index 15ed0b6..abeba04 100644 --- a/Plugins/Cog/Source/CogWindow/Private/CogWindow_Settings.cpp +++ b/Plugins/Cog/Source/CogWindow/Private/CogWindow_Settings.cpp @@ -25,12 +25,12 @@ void FCogWindow_Settings::Initialize() FCogImguiContext& Context = GetOwner()->GetContext(); Context.SetEnableInput(Config->bEnableInput); - Context.SetShareMouse(Config->bShareMouse); + //Context.SetShareMouse(Config->bShareMouse); - FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard, Config->bNavEnableKeyboard); - FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad, Config->bNavEnableGamepad); - FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_NavNoCaptureKeyboard, Config->bNavNoCaptureInput); - FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange, Config->bNoMouseCursorChange); + //FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard, Config->bNavEnableKeyboard); + //FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad, Config->bNavEnableGamepad); + //FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_NavNoCaptureKeyboard, Config->bNavNoCaptureInput); + //FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange, Config->bNoMouseCursorChange); } //-------------------------------------------------------------------------------------------------------------------------- @@ -38,15 +38,15 @@ void FCogWindow_Settings::PreSaveConfig() { Super::PreSaveConfig(); - ImGuiIO& IO = ImGui::GetIO(); - Config->bNavEnableKeyboard = IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard; - Config->bNavEnableGamepad = IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad; - Config->bNavNoCaptureInput = IO.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard; - Config->bNoMouseCursorChange = IO.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange; + //ImGuiIO& IO = ImGui::GetIO(); + //Config->bNavEnableKeyboard = IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard; + //Config->bNavEnableGamepad = IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad; + //Config->bNavNoCaptureInput = IO.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard; + //Config->bNoMouseCursorChange = IO.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange; const FCogImguiContext& Context = GetOwner()->GetContext(); Config->bEnableInput = Context.GetEnableInput(); - Config->bShareMouse = Context.GetShareMouse(); + //Config->bShareMouse = Context.GetShareMouse(); } //-------------------------------------------------------------------------------------------------------------------------- @@ -86,8 +86,6 @@ void FCogWindow_Settings::RenderContent() ImGui::PopStyleColor(); } - ImGui::Separator(); - FCogWindowWidgets::SetNextItemToShortWidth(); ImGui::SliderFloat("DPI Scale", &Config->DPIScale, 0.5f, 2.0f, "%.1f"); if (ImGui::IsItemDeactivatedAfterEdit()) @@ -103,31 +101,32 @@ void FCogWindow_Settings::RenderContent() ImGui::EndTooltip(); } - ImGui::Separator(); - if (ImGui::Checkbox("Enable Viewports", &Config->bEnableViewports)) { FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_ViewportsEnable, Config->bEnableViewports); } + if (ImGui::IsItemHovered()) + { + ImGui::SetTooltip("Cog imgui viewport integration in Unreal is still experimental"); + } + ImGui::Checkbox("Compact Mode", &Config->bCompactMode); ImGui::Checkbox("Show Windows In Main Menu", &Config->bShowWindowsInMainMenu); ImGui::Checkbox("Show Window Help", &Config->bShowHelp); - ImGui::Separator(); + //bool bShareMouse = Context.GetShareMouse(); + //if (ImGui::Checkbox("Share Mouse", &bShareMouse)) + //{ + // Context.SetShareMouse(bShareMouse); + //} - bool bShareMouse = Context.GetShareMouse(); - if (ImGui::Checkbox("Share Mouse", &bShareMouse)) - { - Context.SetShareMouse(bShareMouse); - } - - ImGui::CheckboxFlags("Keyboard Navigation", &IO.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); - ImGui::CheckboxFlags("Gamepad Navigation", &IO.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad); - ImGui::CheckboxFlags("Navigation No Capture", &IO.ConfigFlags, ImGuiConfigFlags_NavNoCaptureKeyboard); - ImGui::CheckboxFlags("No Mouse Cursor Change", &IO.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange); + //ImGui::CheckboxFlags("Keyboard Navigation", &IO.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); + //ImGui::CheckboxFlags("Gamepad Navigation", &IO.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad); + //ImGui::CheckboxFlags("Navigation No Capture", &IO.ConfigFlags, ImGuiConfigFlags_NavNoCaptureKeyboard); + //ImGui::CheckboxFlags("No Mouse Cursor Change", &IO.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange); ImGui::Separator();