diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_LogCategories.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_LogCategories.cpp index fc19829..f2d535e 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_LogCategories.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_LogCategories.cpp @@ -20,8 +20,8 @@ void FCogEngineWindow_LogCategories::Initialize() void FCogEngineWindow_LogCategories::RenderHelp() { ImGui::Text( - "This window can be used to activate and deactivate log categories." - "Activating a log category set its verbosity to VeryVerbose. " + "This window can be used to activate and deactivate log categories. " + "Activating a log category set its verbosity to Verbose, or VeryVerbose when CTRL is pressed. " "Deactivating a log category set its verbosity to Warning. " "The detailed verbosity of each log category can shown by using the Option menu. " "On a client, both the client and the server verbosity can be modified. " diff --git a/Plugins/Cog/Source/CogImgui/Private/CogImGuiInputProcessor.cpp b/Plugins/Cog/Source/CogImgui/Private/CogImGuiInputProcessor.cpp deleted file mode 100644 index 74e5192..0000000 --- a/Plugins/Cog/Source/CogImgui/Private/CogImGuiInputProcessor.cpp +++ /dev/null @@ -1,236 +0,0 @@ -#include "CogImGuiInputProcessor.h" - -#include "CogImguiHelper.h" -#include "CogImguiInputHelper.h" -#include "CogImguiWidget.h" -#include "CogImguiContext.h" -#include "imgui.h" -#include "Framework/Application/SlateApplication.h" - -//-------------------------------------------------------------------------------------------------------------------------- -FCogImGuiInputProcessor::FCogImGuiInputProcessor(UPlayerInput* InPlayerInput, FCogImguiContext* InContext, SCogImguiWidget* InMainWidget) -{ - PlayerInput = InPlayerInput; - Context = InContext; - MainWidget = InMainWidget; -} - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogImGuiInputProcessor::Tick(const float DeltaTime, FSlateApplication& SlateApp, TSharedRef SlateCursor) -{ - ImGuiIO& IO = ImGui::GetIO(); - - const bool bHasGamepad = (IO.BackendFlags & ImGuiBackendFlags_HasGamepad); - if (bHasGamepad != SlateApp.IsGamepadAttached()) - { - IO.BackendFlags ^= ImGuiBackendFlags_HasGamepad; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::Tick | HasGamePad Changed")); - } - - AddMousePosEvent(SlateApp.GetCursorPos()); - - const bool bHasMouse = (IO.ConfigFlags & ImGuiConfigFlags_NoMouse) == 0; - const bool bUpdateMouseMouseCursor = (IO.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) == 0; - if (bHasMouse && bUpdateMouseMouseCursor) - { - SlateCursor->SetType(FCogImguiInputHelper::ToSlateMouseCursor(ImGui::GetMouseCursor())); - } - - if (IO.WantSetMousePos) - { - SlateApp.SetCursorPos(FCogImguiHelper::ToFVector2D(IO.MousePos)); - //UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::Tick | SetCursorPos")); - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleKeyDownEvent(FSlateApplication& SlateApp, const FKeyEvent& Event) -{ - return HandleKeyEvent(SlateApp, Event, true); -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleKeyUpEvent(FSlateApplication& SlateApp, const FKeyEvent& Event) -{ - return HandleKeyEvent(SlateApp, Event, false); -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleKeyEvent(FSlateApplication& SlateApp, const FKeyEvent& Event, bool IsKeyDown) -{ - //------------------------------------------------------------------------------------------------ - // We want the user to be able to open the console command when imgui has the input. - //------------------------------------------------------------------------------------------------ - if (FCogImguiInputHelper::IsConsoleEvent(Event)) - { - const bool Result = ForwardEvent; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::HandleKeyEvent | Key:%s | IsKeyDown:%d | TerminateEvent:%d | ConsoleEvent"), *Event.GetKey().ToString(), IsKeyDown, Result); - return Result; - } - - //------------------------------------------------------------------------------------------------ - // We want the user to be able to stop its session by pressing Esc, even when imgui has the input - //------------------------------------------------------------------------------------------------ - if (FCogImguiInputHelper::IsStopPlaySessionEvent(Event)) - { - const bool Result = ForwardEvent; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::HandleKeyEvent | Key:%s | IsKeyDown:%d | TerminateEvent:%d | StopPlaySessionEvent"), *Event.GetKey().ToString(), IsKeyDown, Result); - return Result; - } - - //------------------------------------------------------------------------------------------------ - // We want the user to be able to use command bingings, even when imgui has the input. - // We actually use a console command to toggle the input from the game to imgui, and other - // windows command such as LoadLayout. - //------------------------------------------------------------------------------------------------ - if (FCogImguiInputHelper::IsKeyBoundToCommand(PlayerInput, Event)) - { - const bool Result = ForwardEvent; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::HandleKeyEvent | Key:%s | IsKeyDown:%d | TerminateEvent:%d | KeyBoundToCommand"), *Event.GetKey().ToString(), IsKeyDown, Result); - return Result; - } - - ImGuiIO& IO = ImGui::GetIO(); - - IO.AddKeyEvent(FCogImguiInputHelper::ToImKey(Event.GetKey()), IsKeyDown); - - const FModifierKeysState& ModifierKeys = Event.GetModifierKeys(); - IO.AddKeyEvent(ImGuiMod_Ctrl, ModifierKeys.IsControlDown()); - IO.AddKeyEvent(ImGuiMod_Shift, ModifierKeys.IsShiftDown()); - IO.AddKeyEvent(ImGuiMod_Alt, ModifierKeys.IsAltDown()); - IO.AddKeyEvent(ImGuiMod_Super, ModifierKeys.IsCommandDown()); - - //------------------------------------------------------------------------------------------------ - // If we receive a key modifier, we want to let others systems know about it. - // Otherwise, the console command bindings that are bound to something like CTRL+Key - // won't work, even if we let the KeyEvent pass with 'IsKeyBoundToCommand' below. - // It seems the command binings system needs to know about the modifier key press event itself, - // and not the Key+Modifier event. - //------------------------------------------------------------------------------------------------ - const bool IsModifierKey = Event.GetKey().IsModifierKey(); - if (IsModifierKey) - { - const bool Result = ForwardEvent; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::HandleKeyEvent | Key:%s | IsKeyDown:%d | TerminateEvent:%d | IsModifierKey"), *Event.GetKey().ToString(), IsKeyDown, Result); - return Result; - } - - if (Event.GetKey().IsGamepadKey()) - { - if (IO.WantCaptureKeyboard && (IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad)) - { - const bool Result = TerminateEvent; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::HandleKeyEvent | Key:%s | IsKeyDown:%d | TerminateEvent:%d | NavEnableGamepad"), *Event.GetKey().ToString(), IsKeyDown, Result); - return Result; - } - } - - const bool Result = IO.WantCaptureKeyboard ? TerminateEvent : ForwardEvent; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::HandleKeyEvent | Key:%s | IsKeyDown:%d | WantCaptureKeyboard:%d | TerminateEvent:%d"), *Event.GetKey().ToString(), IsKeyDown, IO.WantCaptureKeyboard, Result); - return Result; -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleAnalogInputEvent(FSlateApplication& SlateApp, const FAnalogInputEvent& Event) -{ - const float Value = Event.GetAnalogValue(); - - ImGuiIO& IO = ImGui::GetIO(); - IO.AddKeyAnalogEvent(FCogImguiInputHelper::ToImKey(Event.GetKey()), FMath::Abs(Value) > 0.0f, Value); - - if (Event.GetKey().IsGamepadKey()) - { - if (IO.WantCaptureKeyboard && (IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad)) - { - return TerminateEvent; - } - - return ForwardEvent; - } - else - { - if (IO.WantCaptureKeyboard) - { - return TerminateEvent; - } - - return ForwardEvent; - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleMouseMoveEvent(FSlateApplication& SlateApp, const FPointerEvent& Event) -{ - AddMousePosEvent(Event.GetScreenSpacePosition()); - - if (Context->GetEnableInput() && Context->GetShareMouse() == false && FCogImguiInputHelper::IsMouseInsideMainViewport()) - { - return TerminateEvent; - } - - ImGuiIO& IO = ImGui::GetIO(); - const bool Result = IO.WantCaptureMouse ? TerminateEvent : ForwardEvent; - return Result; -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleMouseButtonDownEvent(FSlateApplication& SlateApp, const FPointerEvent& Event) -{ - return HandleMouseButtonEvent(SlateApp, Event, true); -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleMouseButtonUpEvent(FSlateApplication& SlateApp, const FPointerEvent& Event) -{ - return HandleMouseButtonEvent(SlateApp, Event, false); -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleMouseButtonDoubleClickEvent(FSlateApplication& SlateApp, const FPointerEvent& Event) -{ - return HandleMouseButtonEvent(SlateApp, Event, true); -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleMouseButtonEvent(FSlateApplication& SlateApp, const FPointerEvent& Event, bool IsButtonDown) -{ - ImGuiIO& IO = ImGui::GetIO(); - - const uint32 Button = FCogImguiInputHelper::ToImGuiMouseButton(Event.GetEffectingButton()); - IO.AddMouseButtonEvent(Button, IsButtonDown); - - if (Context->GetEnableInput() && Context->GetShareMouse() == false && FCogImguiInputHelper::IsMouseInsideMainViewport()) - { - const bool Result = TerminateEvent; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::HandleMouseButtonEvent | Button:%d | IsButtonDown:%d | WantCaptureMouse:%d | TerminateEvent:%d | ShareMouse == false"), Button, IsButtonDown, IO.WantCaptureMouse, Result); - return Result; - } - - const bool Result = IO.WantCaptureMouse ? TerminateEvent : ForwardEvent; - UE_LOG(LogCogImGui, VeryVerbose, TEXT("FCogImGuiInputProcessor::HandleMouseButtonEvent | Button:%d | IsButtonDown:%d | WantCaptureMouse:%d | TerminateEvent:%d"), Button, IsButtonDown, IO.WantCaptureMouse, Result); - return Result; -} -//-------------------------------------------------------------------------------------------------------------------------- -void FCogImGuiInputProcessor::AddMousePosEvent(const FVector2D& MousePosition) const -{ - ImGuiIO& IO = ImGui::GetIO(); - if (IO.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) - { - IO.AddMousePosEvent(MousePosition.X, MousePosition.Y); - } - else - { - const FVector2D TransformedMousePosition = MousePosition - MainWidget->GetTickSpaceGeometry().GetAbsolutePosition(); - IO.AddMousePosEvent(TransformedMousePosition.X, TransformedMousePosition.Y); - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogImGuiInputProcessor::HandleMouseWheelOrGestureEvent(FSlateApplication& SlateApp, const FPointerEvent& Event, const FPointerEvent* GestureEvent) -{ - ImGuiIO& IO = ImGui::GetIO(); - - IO.AddMouseWheelEvent(0.0f, Event.GetWheelDelta()); - - return IO.WantCaptureMouse; -} diff --git a/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp b/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp index 5605880..f4fdc15 100644 --- a/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp +++ b/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp @@ -2,6 +2,7 @@ #include "Application/ThrottleManager.h" #include "CogImguiHelper.h" +#include "CogImguiInputCatcherWidget.h" #include "CogImguiInputHelper.h" #include "CogImguiWidget.h" #include "Engine/Console.h" @@ -31,23 +32,16 @@ void FCogImguiContext::Initialize() { return; } + FSlateApplication& SlateApp = FSlateApplication::Get(); GameViewport = GEngine->GameViewport; - SAssignNew(MainWidget, SCogImguiWidget) - .Context(this); + SAssignNew(MainWidget, SCogImguiWidget).Context(this); GameViewport->AddViewportWidgetContent(MainWidget.ToSharedRef(), TNumericLimits::Max()); - //-------------------------------------------------------------------- - // Register input processor to forward input events to imgui - //-------------------------------------------------------------------- - //if (FSlateApplication::IsInitialized()) - //{ - // UPlayerInput* PlayerInput = FCogImguiInputHelper::GetPlayerInput(*GameViewport->GetWorld()); - // InputProcessor = MakeShared(PlayerInput, this, MainWidget.Get()); - // FSlateApplication::Get().RegisterInputPreProcessor(InputProcessor.ToSharedRef(), 0); - //} + SAssignNew(InputCatcherWidget, SCogImguiInputCatcherWidget).Context(this); + GameViewport->AddViewportWidgetContent(InputCatcherWidget.ToSharedRef(), -TNumericLimits::Max()); ImGuiContext = ImGui::CreateContext(); PlotContext = ImPlot::CreateContext(); @@ -74,7 +68,7 @@ void FCogImguiContext::Initialize() // //-------------------------------------------------------------------- ImGuiViewport* MainViewport = ImGui::GetMainViewport(); - FImGuiViewportData* ViewportData = new FImGuiViewportData(); + FCogImGuiViewportData* ViewportData = new FCogImGuiViewportData(); MainViewport->PlatformUserData = ViewportData; ViewportData->Window = SlateApp.GetActiveTopLevelWindow(); ViewportData->Context = this; @@ -113,7 +107,7 @@ void FCogImguiContext::Initialize() void FCogImguiContext::Shutdown() { ImGuiViewport* MainViewport = ImGui::GetMainViewport(); - if (const FImGuiViewportData* ViewportData = static_cast(MainViewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(MainViewport->PlatformUserData)) { delete ViewportData; MainViewport->PlatformUserData = nullptr; @@ -122,12 +116,6 @@ void FCogImguiContext::Shutdown() if (FSlateApplication::IsInitialized()) { FSlateApplication& SlateApp = FSlateApplication::Get(); - - //if (InputProcessor.IsValid()) - //{ - // SlateApp.UnregisterInputPreProcessor(InputProcessor); - //} - if (const TSharedPtr PlatformApplication = SlateApp.GetPlatformApplication()) { PlatformApplication->OnDisplayMetricsChanged().RemoveAll(this); @@ -274,7 +262,7 @@ bool FCogImguiContext::BeginFrame(float InDeltaTime) IO.AddMousePosEvent(TransformedMousePosition.X, TransformedMousePosition.Y); } - bWantCaptureMouse = ImGui::GetIO().WantCaptureMouse || (CaptureMouseCount > 0); + bWantCaptureMouse = ImGui::GetIO().WantCaptureMouse; //------------------------------------------------------------------------------------------------------- // @@ -321,7 +309,7 @@ void FCogImguiContext::ImGui_CreateWindow(ImGuiViewport* Viewport) return; } - const FImGuiViewportData* ParentViewportData = static_cast(ParentViewport->PlatformUserData); + const FCogImGuiViewportData* ParentViewportData = static_cast(ParentViewport->PlatformUserData); if (ParentViewportData == nullptr) { return; @@ -378,7 +366,7 @@ void FCogImguiContext::ImGui_CreateWindow(ImGuiViewport* Viewport) Widget->SetWindow(Window); - FImGuiViewportData* ViewportData = new FImGuiViewportData(); + FCogImGuiViewportData* ViewportData = new FCogImGuiViewportData(); Viewport->PlatformUserData = ViewportData; ViewportData->Context = ParentViewportData->Context; ViewportData->Widget = Widget; @@ -392,7 +380,7 @@ void FCogImguiContext::ImGui_CreateWindow(ImGuiViewport* Viewport) //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_DestroyWindow(ImGuiViewport* Viewport) { - FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData); + FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData); if (ViewportData == nullptr) { return; @@ -417,7 +405,7 @@ void FCogImguiContext::ImGui_DestroyWindow(ImGuiViewport* Viewport) //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_ShowWindow(ImGuiViewport* Viewport) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Window = ViewportData->Window.Pin()) { @@ -429,7 +417,7 @@ void FCogImguiContext::ImGui_ShowWindow(ImGuiViewport* Viewport) //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_SetWindowPos(ImGuiViewport* Viewport, ImVec2 Pos) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Window = ViewportData->Window.Pin()) { @@ -441,7 +429,7 @@ void FCogImguiContext::ImGui_SetWindowPos(ImGuiViewport* Viewport, ImVec2 Pos) //-------------------------------------------------------------------------------------------------------------------------- ImVec2 FCogImguiContext::ImGui_GetWindowPos(ImGuiViewport* Viewport) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Widget = ViewportData->Widget.Pin()) { @@ -455,7 +443,7 @@ ImVec2 FCogImguiContext::ImGui_GetWindowPos(ImGuiViewport* Viewport) //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_SetWindowSize(ImGuiViewport* Viewport, ImVec2 Size) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Window = ViewportData->Window.Pin()) { @@ -467,7 +455,7 @@ void FCogImguiContext::ImGui_SetWindowSize(ImGuiViewport* Viewport, ImVec2 Size) //-------------------------------------------------------------------------------------------------------------------------- ImVec2 FCogImguiContext::ImGui_GetWindowSize(ImGuiViewport* Viewport) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Widget = ViewportData->Widget.Pin()) { @@ -481,7 +469,7 @@ ImVec2 FCogImguiContext::ImGui_GetWindowSize(ImGuiViewport* Viewport) //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_SetWindowFocus(ImGuiViewport* Viewport) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Window = ViewportData->Window.Pin()) { @@ -497,7 +485,7 @@ void FCogImguiContext::ImGui_SetWindowFocus(ImGuiViewport* Viewport) //-------------------------------------------------------------------------------------------------------------------------- bool FCogImguiContext::ImGui_GetWindowFocus(ImGuiViewport* Viewport) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Window = ViewportData->Window.Pin()) { @@ -514,7 +502,7 @@ bool FCogImguiContext::ImGui_GetWindowFocus(ImGuiViewport* Viewport) //-------------------------------------------------------------------------------------------------------------------------- bool FCogImguiContext::ImGui_GetWindowMinimized(ImGuiViewport* Viewport) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Window = ViewportData->Window.Pin()) { @@ -528,7 +516,7 @@ bool FCogImguiContext::ImGui_GetWindowMinimized(ImGuiViewport* Viewport) //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_SetWindowTitle(ImGuiViewport* Viewport, const char* TitleAnsi) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Window = ViewportData->Window.Pin()) { @@ -540,7 +528,7 @@ void FCogImguiContext::ImGui_SetWindowTitle(ImGuiViewport* Viewport, const char* //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_SetWindowAlpha(ImGuiViewport* Viewport, float Alpha) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Window = ViewportData->Window.Pin()) { @@ -552,7 +540,7 @@ void FCogImguiContext::ImGui_SetWindowAlpha(ImGuiViewport* Viewport, float Alpha //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_RenderWindow(ImGuiViewport* Viewport, void* Data) { - if (const FImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) + if (const FCogImGuiViewportData* ViewportData = static_cast(Viewport->PlatformUserData)) { if (const TSharedPtr Widget = ViewportData->Widget.Pin()) { @@ -636,41 +624,37 @@ void FCogImguiContext::SetEnableInput(bool Value) } //-------------------------------------------------------------------------------------------------------------------------- -void FCogImguiContext::SetShowCursorWhenSharingMouse(bool Value) +void FCogImguiContext::SetShareMouse(bool Value) { - bShowCursorWhenSharingMouse = Value; + bShareMouse = Value; RefreshMouseCursor(); } //-------------------------------------------------------------------------------------------------------------------------- -void FCogImguiContext::SetShareMouse(bool Value) +void FCogImguiContext::SetShareMouseWithGameplay(bool Value) { - bShareMouse = Value; + bShareMouseWithGameplay = Value; RefreshMouseCursor(); } //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::RefreshMouseCursor() { - if (bEnableInput) + if (APlayerController* PlayerController = GetLocalPlayerController(GameViewport->GetWorld())) { - if (bShareMouse && bShowCursorWhenSharingMouse) + if (bHasSavedInitialCursorVisibility == false) { - if (APlayerController* PlayerController = GetLocalPlayerController(GameViewport->GetWorld())) - { - bPlayerControllerShowMouse = PlayerController->ShouldShowMouseCursor(); - PlayerController->SetShowMouseCursor(true); - } + bIsCursorInitiallyVisible = PlayerController->ShouldShowMouseCursor(); + bHasSavedInitialCursorVisibility = true; } - } - else - { - if (bShareMouse && bShowCursorWhenSharingMouse) + + if (bEnableInput && bShareMouse && bShareMouseWithGameplay) { - if (APlayerController* PlayerController = GetLocalPlayerController(GameViewport->GetWorld())) - { - PlayerController->SetShowMouseCursor(bPlayerControllerShowMouse); - } + PlayerController->SetShowMouseCursor(true); + } + else + { + PlayerController->SetShowMouseCursor(bIsCursorInitiallyVisible); } } } diff --git a/Plugins/Cog/Source/CogImgui/Private/CogImguiInputCatcherWidget.cpp b/Plugins/Cog/Source/CogImgui/Private/CogImguiInputCatcherWidget.cpp new file mode 100644 index 0000000..f1b5f06 --- /dev/null +++ b/Plugins/Cog/Source/CogImgui/Private/CogImguiInputCatcherWidget.cpp @@ -0,0 +1,146 @@ +#include "CogImguiInputCatcherWidget.h" + +#include "CogImguiContext.h" +#include "CogImguiInputHelper.h" +#include "Engine/GameViewportClient.h" +#include "imgui.h" +#include "SlateOptMacros.h" +#include "Widgets/SWindow.h" + +//-------------------------------------------------------------------------------------------------------------------------- +BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION +void SCogImguiInputCatcherWidget::Construct(const FArguments& InArgs) +{ + Context = InArgs._Context; + + RefreshVisibility(); +} +END_SLATE_FUNCTION_BUILD_OPTIMIZATION + +//-------------------------------------------------------------------------------------------------------------------------- +SCogImguiInputCatcherWidget::~SCogImguiInputCatcherWidget() +{ +} + +//-------------------------------------------------------------------------------------------------------------------------- +void SCogImguiInputCatcherWidget::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) +{ + Super::Tick(AllottedGeometry, InCurrentTime, InDeltaTime); + RefreshVisibility(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +int32 SCogImguiInputCatcherWidget::OnPaint( + const FPaintArgs& Args, + const FGeometry& AllottedGeometry, + const FSlateRect& MyClippingRect, + FSlateWindowElementList& OutDrawElements, + int32 LayerId, + const FWidgetStyle& WidgetStyle, + bool bParentEnabled) const +{ + return LayerId; +} + +//-------------------------------------------------------------------------------------------------------------------------- +FVector2D SCogImguiInputCatcherWidget::ComputeDesiredSize(float Scale) const +{ + return FVector2D::ZeroVector; +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& CharacterEvent) +{ + return FReply::Unhandled(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) +{ + return FReply::Unhandled(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) +{ + return FReply::Unhandled(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnAnalogValueChanged(const FGeometry& MyGeometry, const FAnalogInputEvent& AnalogInputEvent) +{ + return FReply::Handled(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) +{ + return HandleMouseButtonEvent(MouseEvent, true); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnMouseButtonDoubleClick(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) +{ + return HandleMouseButtonEvent(MouseEvent, true); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) +{ + return HandleMouseButtonEvent(MouseEvent, false); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::HandleMouseButtonEvent(const FPointerEvent& MouseEvent, bool Down) +{ + if (Context->GetEnableInput() == false) + { + UE_LOG(LogCogImGui, VeryVerbose, TEXT("SCogImguiInputCatcherWidget::HandleMouseButtonEvent | Window:%s | Unhandled | EnableInput == false | Down:%d"), Window.IsValid() ? *Window->GetTitle().ToString() : *FString("None"), Down); + return FReply::Unhandled(); + } + + const uint32 MouseButton = FCogImguiInputHelper::ToImGuiMouseButton(MouseEvent.GetEffectingButton()); + ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse); + ImGui::GetIO().AddMouseButtonEvent(MouseButton, Down); + + UE_LOG(LogCogImGui, VeryVerbose, TEXT("SCogImguiInputCatcherWidget::HandleMouseButtonEvent | Window:%s | Handled | Down:%d"), Window.IsValid() ? *Window->GetTitle().ToString() : *FString("None"), Down); + return FReply::Handled(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnMouseWheel(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) +{ + if (Context->GetEnableInput() == false) + { + return FReply::Unhandled(); + } + ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse); + ImGui::GetIO().AddMouseWheelEvent(0, MouseEvent.GetWheelDelta()); + return FReply::Handled(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +FReply SCogImguiInputCatcherWidget::OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) +{ + return FReply::Unhandled(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void SCogImguiInputCatcherWidget::RefreshVisibility() +{ + EVisibility DesiredVisiblity = EVisibility::SelfHitTestInvisible; + + if (Context->GetEnableInput() && Context->GetShareMouseWithGameplay() == false) + { + DesiredVisiblity = EVisibility::Visible; + } + else + { + DesiredVisiblity = EVisibility::SelfHitTestInvisible; + } + + if (DesiredVisiblity != GetVisibility()) + { + SetVisibility(DesiredVisiblity); + } +} diff --git a/Plugins/Cog/Source/CogImgui/Private/CogImguiInputHelper.cpp b/Plugins/Cog/Source/CogImgui/Private/CogImguiInputHelper.cpp index 4525057..fd7e593 100644 --- a/Plugins/Cog/Source/CogImgui/Private/CogImguiInputHelper.cpp +++ b/Plugins/Cog/Source/CogImgui/Private/CogImguiInputHelper.cpp @@ -1,6 +1,5 @@ #include "CogImguiInputHelper.h" -#include "CogImGuiInputProcessor.h" #include "CogImguiKeyInfo.h" #include "Engine/World.h" #include "Framework/Application/SlateApplication.h" diff --git a/Plugins/Cog/Source/CogImgui/Public/CogImGuiInputProcessor.h b/Plugins/Cog/Source/CogImgui/Public/CogImGuiInputProcessor.h deleted file mode 100644 index 828afd8..0000000 --- a/Plugins/Cog/Source/CogImgui/Public/CogImGuiInputProcessor.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "Framework/Application/IInputProcessor.h" -#include "CogImguiContext.h" - -class FCogImguiContext; -class SCogImguiWidget; -class UPlayerInput; -enum ImGuiKey : int; -struct FKeyBind; - -class FCogImGuiInputProcessor : public IInputProcessor -{ -public: - - FCogImGuiInputProcessor(UPlayerInput* InPlayerInput, FCogImguiContext* InContext, SCogImguiWidget* InWidget); - - virtual void Tick(const float DeltaTime, FSlateApplication& SlateApp, TSharedRef SlateCursor) override; - - virtual bool HandleKeyDownEvent(FSlateApplication& SlateApp, const FKeyEvent& Event) override; - - virtual bool HandleKeyUpEvent(FSlateApplication& SlateApp, const FKeyEvent& Event) override; - - virtual bool HandleAnalogInputEvent(FSlateApplication& SlateApp, const FAnalogInputEvent& Event) override; - - virtual bool HandleMouseMoveEvent(FSlateApplication& SlateApp, const FPointerEvent& Event) override; - - virtual bool HandleMouseButtonDownEvent(FSlateApplication& SlateApp, const FPointerEvent& Event) override; - - virtual bool HandleMouseButtonUpEvent(FSlateApplication& SlateApp, const FPointerEvent& Event) override; - - virtual bool HandleMouseButtonDoubleClickEvent(FSlateApplication& SlateApp, const FPointerEvent& Event) override; - - virtual bool HandleMouseWheelOrGestureEvent(FSlateApplication& SlateApp, const FPointerEvent& Event, const FPointerEvent* GestureEvent) override; - -protected: - - bool HandleKeyEvent(FSlateApplication& SlateApp, const FKeyEvent& Event, bool IsKeyDown); - - bool HandleMouseButtonEvent(FSlateApplication& SlateApp, const FPointerEvent& Event, bool IsButtonDown); - - void AddMousePosEvent(const FVector2D& MousePosition) const; - - FCogImguiContext* Context = nullptr; - - TObjectPtr PlayerInput; - - TObjectPtr MainWidget; -}; diff --git a/Plugins/Cog/Source/CogImgui/Public/CogImguiContext.h b/Plugins/Cog/Source/CogImgui/Public/CogImguiContext.h index c79b295..c8d7b85 100644 --- a/Plugins/Cog/Source/CogImgui/Public/CogImguiContext.h +++ b/Plugins/Cog/Source/CogImgui/Public/CogImguiContext.h @@ -18,7 +18,7 @@ class ULocalPlayer; struct FDisplayMetrics; struct ImPlotContext; -struct COGIMGUI_API FImGuiViewportData +struct COGIMGUI_API FCogImGuiViewportData { TWeakPtr Window = nullptr; FCogImguiContext* Context = nullptr; @@ -43,9 +43,9 @@ public: void SetShareMouse(bool Value); - bool GetShowCursorWhenSharingMouse() const { return bShowCursorWhenSharingMouse; } + bool GetShareMouseWithGameplay() const { return bShareMouseWithGameplay; } - void SetShowCursorWhenSharingMouse(bool Value); + void SetShareMouseWithGameplay(bool Value); bool GetShareKeyboard() const { return bShareKeyboard; } @@ -59,10 +59,6 @@ public: void SetDPIScale(float Value); - void PushCaptureMouse(); - - void PopCaptureMouse(); - TObjectPtr GetGameViewport() const { return GameViewport; } TSharedPtr GetMainWidget() const { return MainWidget; } @@ -134,9 +130,11 @@ private: bool bShareMouse = false; - bool bShowCursorWhenSharingMouse = false; + bool bShareMouseWithGameplay = false; - bool bPlayerControllerShowMouse = false; + bool bHasSavedInitialCursorVisibility = false; + + bool bIsCursorInitiallyVisible = false; bool bShareKeyboard = false; @@ -148,7 +146,5 @@ private: bool bWantCaptureMouse = false; - int32 CaptureMouseCount = 0; - float DpiScale = 1.f; }; diff --git a/Plugins/Cog/Source/CogImgui/Public/CogImguiInputCatcherWidget.h b/Plugins/Cog/Source/CogImgui/Public/CogImguiInputCatcherWidget.h new file mode 100644 index 0000000..7e54002 --- /dev/null +++ b/Plugins/Cog/Source/CogImgui/Public/CogImguiInputCatcherWidget.h @@ -0,0 +1,70 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CogImguiDrawList.h" +#include "Rendering/RenderingCommon.h" +#include "UObject/WeakObjectPtr.h" +#include "Widgets/DeclarativeSyntaxSupport.h" +#include "Widgets/SLeafWidget.h" + +class FCogImguiContext; +class SWindow; +class UGameViewportClient; + +//-------------------------------------------------------------------------------------------------------------------------- +class COGIMGUI_API SCogImguiInputCatcherWidget : public SLeafWidget +{ + typedef SLeafWidget Super; + +public: + + SLATE_BEGIN_ARGS(SCogImguiInputCatcherWidget) {} + SLATE_ARGUMENT(FCogImguiContext*, Context) + SLATE_END_ARGS() + + void Construct(const FArguments& InArgs); + + ~SCogImguiInputCatcherWidget(); + + 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; } + + virtual FReply OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& CharacterEvent) override; + + virtual FVector2D ComputeDesiredSize(float Scale) const override; + + virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) override; + + virtual FReply OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) override; + + virtual FReply OnAnalogValueChanged(const FGeometry& MyGeometry, const FAnalogInputEvent& AnalogInputEvent) override; + + virtual FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + + virtual FReply OnMouseButtonDoubleClick(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + + virtual FReply OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + + virtual FReply OnMouseWheel(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + + virtual FReply OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + + TSharedPtr GetWindow() const { return Window; } + + void SetWindow(TSharedPtr Value) { Window = Value; } + +protected: + + FReply HandleKeyEvent(const FKeyEvent& KeyEvent, bool Down); + + FReply HandleMouseButtonEvent(const FPointerEvent& MouseEvent, bool Down); + + void RefreshVisibility(); + + FCogImguiContext* Context = nullptr; + + TSharedPtr Window = nullptr; +}; diff --git a/Plugins/Cog/Source/CogImgui/Public/CogImguiWidget.h b/Plugins/Cog/Source/CogImgui/Public/CogImguiWidget.h index f1a1fd8..8ae187e 100644 --- a/Plugins/Cog/Source/CogImgui/Public/CogImguiWidget.h +++ b/Plugins/Cog/Source/CogImgui/Public/CogImguiWidget.h @@ -37,13 +37,21 @@ public: virtual FVector2D ComputeDesiredSize(float Scale) const override; virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) override; + virtual FReply OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) override; + virtual FReply OnAnalogValueChanged(const FGeometry& MyGeometry, const FAnalogInputEvent& AnalogInputEvent) override; + virtual FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + virtual FReply OnMouseButtonDoubleClick(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + virtual FReply OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + virtual FReply OnMouseWheel(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + virtual FReply OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; + virtual FReply OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& FocusEvent) override; void SetDrawData(const ImDrawData* InDrawData); @@ -55,6 +63,7 @@ public: protected: FReply HandleKeyEvent(const FKeyEvent& KeyEvent, bool Down); + FReply HandleMouseButtonEvent(const FPointerEvent& MouseEvent, bool Down); void RefreshVisibility(); @@ -63,11 +72,5 @@ protected: TSharedPtr Window = nullptr; - FSlateRenderTransform ImGuiRenderTransform; - - mutable TArray VertexBuffer; - - mutable TArray IndexBuffer; - FCogImguiDrawData DrawData; }; diff --git a/Plugins/Cog/Source/CogWindow/Private/CogWindow_Settings.cpp b/Plugins/Cog/Source/CogWindow/Private/CogWindow_Settings.cpp index c4dfc77..c89c31c 100644 --- a/Plugins/Cog/Source/CogWindow/Private/CogWindow_Settings.cpp +++ b/Plugins/Cog/Source/CogWindow/Private/CogWindow_Settings.cpp @@ -28,9 +28,7 @@ void FCogWindow_Settings::Initialize() Context.SetEnableInput(Config->bEnableInput); Context.SetShareKeyboard(Config->bShareKeyboard); Context.SetShareMouse(Config->bShareMouse); - Context.SetShowCursorWhenSharingMouse(Config->bShowCursorWhenSharingMouse); - - + Context.SetShareMouseWithGameplay(Config->bShareMouseWithGameplay); } //-------------------------------------------------------------------------------------------------------------------------- @@ -47,7 +45,7 @@ void FCogWindow_Settings::PreSaveConfig() Config->bEnableInput = Context.GetEnableInput(); Config->bShareKeyboard = Context.GetShareKeyboard(); Config->bShareMouse = Context.GetShareMouse(); - Config->bShowCursorWhenSharingMouse = Context.GetShowCursorWhenSharingMouse(); + Config->bShareMouseWithGameplay = Context.GetShareMouseWithGameplay(); } //-------------------------------------------------------------------------------------------------------------------------- @@ -68,132 +66,119 @@ void FCogWindow_Settings::RenderContent() } ImGuiIO& IO = ImGui::GetIO(); - FCogImguiContext& Context = GetOwner()->GetContext(); - //----------------------------- - // bEnableInput - //----------------------------- - bool bEnableInput = Context.GetEnableInput(); - if (ImGui::Checkbox("Enable Input", &bEnableInput)) + //------------------------------------------------------------------------------------------- + if (ImGui::CollapsingHeader("Input", ImGuiTreeNodeFlags_DefaultOpen)) { - Context.SetEnableInput(bEnableInput); - } - ImGui::SetItemTooltip("Enable ImGui inputs. When enabled the ImGui menu is shown and inputs are forwarded to ImGui."); + bool bEnableInput = Context.GetEnableInput(); + if (ImGui::Checkbox("Enable Input", &bEnableInput)) + { + Context.SetEnableInput(bEnableInput); + } + ImGui::SetItemTooltip("Enable ImGui inputs. When enabled the ImGui menu is shown and inputs are forwarded to ImGui."); - const auto ShortcutText = StringCast(*FCogImguiInputHelper::CommandToString(PlayerInput, UCogWindowManager::ToggleInputCommand)); - const float ShortcutWidth = (ShortcutText.Get() != nullptr && ShortcutText.Get()[0]) ? ImGui::CalcTextSize(ShortcutText.Get(), NULL).x : 0.0f; - if (ShortcutWidth > 0.0f) - { - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetWindowContentRegionMax().x - ShortcutWidth); - ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]); - ImGui::Text("%s", ShortcutText.Get()); - ImGui::PopStyleColor(); + const auto ShortcutText = StringCast(*FCogImguiInputHelper::CommandToString(PlayerInput, UCogWindowManager::ToggleInputCommand)); + const float ShortcutWidth = (ShortcutText.Get() != nullptr && ShortcutText.Get()[0]) ? ImGui::CalcTextSize(ShortcutText.Get(), NULL).x : 0.0f; + if (ShortcutWidth > 0.0f) + { + ImGui::SameLine(); + ImGui::SetCursorPosX(ImGui::GetWindowContentRegionMax().x - ShortcutWidth); + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]); + ImGui::Text("%s", ShortcutText.Get()); + ImGui::PopStyleColor(); + } + + //------------------------------------------------------------------------------------------- + bool bShareKeyboard = Context.GetShareKeyboard(); + if (ImGui::Checkbox("Share Keyboard", &bShareKeyboard)) + { + Context.SetShareKeyboard(bShareKeyboard); + } + ImGui::SetItemTooltip("Forward the keyboard inputs to the game when ImGui does not need them."); + + //------------------------------------------------------------------------------------------- + bool bShareMouse = Context.GetShareMouse(); + if (ImGui::Checkbox("Share Mouse", &bShareMouse)) + { + Context.SetShareMouse(bShareMouse); + } + ImGui::SetItemTooltip("Forward mouse inputs to the game when ImGui does not need them."); + + //------------------------------------------------------------------------------------------- + if (bShareMouse == false) + { + ImGui::BeginDisabled(); + } + + bool bShareMouseWithGameplay = Context.GetShareMouseWithGameplay(); + if (ImGui::Checkbox("Share Mouse With Gameplay", &bShareMouseWithGameplay)) + { + Context.SetShareMouseWithGameplay(bShareMouseWithGameplay); + } + ImGui::SetItemTooltip("When disabled, mouse inputs are only forwarded to game menus. " + "When enabled, mouse inputs are also forwarded to the gameplay. Note that this mode: \n" + " - Force the cursor to be visible.\n" + " - Prevent the interaction of Cog's transform gizmos.\n" + ); + + if (bShareMouse == false) + { + ImGui::EndDisabled(); + } + + //------------------------------------------------------------------------------------------- + ImGui::CheckboxFlags("Keyboard Navigation", &IO.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); + ImGui::SetItemTooltip("Use the keyboard to navigate in ImGui windows with the following keys : Tab, Directional Arrows, Space, Enter."); } - //----------------------------- - // ShareKeyboard - //----------------------------- - bool bShareKeyboard = Context.GetShareKeyboard(); - if (ImGui::Checkbox("Share Keyboard", &bShareKeyboard)) - { - Context.SetShareKeyboard(bShareKeyboard); - } - ImGui::SetItemTooltip("Forward the keyboard inputs to the game when ImGui does not need them."); - - //----------------------------- - // ShareMouse - //----------------------------- - bool bShareMouse = Context.GetShareMouse(); - if (ImGui::Checkbox("Share Mouse", &bShareMouse)) - { - Context.SetShareMouse(bShareMouse); - } - ImGui::SetItemTooltip("Forward mouse inputs to the game when ImGui does not need them."); - - //----------------------------- - // ShowCursorWhenSharingMouse - //----------------------------- - if (bShareMouse == false) - { - ImGui::BeginDisabled(); - } - - bool bShowCursorWhenSharingMouse = Context.GetShowCursorWhenSharingMouse(); - if (ImGui::Checkbox("Show Cursor When Sharing Mouse", &bShowCursorWhenSharingMouse)) - { - Context.SetShowCursorWhenSharingMouse(bShowCursorWhenSharingMouse); - } - ImGui::SetItemTooltip("Show the mouse cursor when ImGui share the mouse with the game. Useful for games that require the cursor to be hidden."); - - if (bShareMouse == false) - { - ImGui::EndDisabled(); - } - - //----------------------------- - // NavEnableKeyboard - //----------------------------- - ImGui::CheckboxFlags("Keyboard Navigation", &IO.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); - ImGui::SetItemTooltip("Use the keyboard to navigate in ImGui windows with the following keys : Tab, Directional Arrows, Space, Enter."); - - //----------------------------- - // NavEnableGamepad - //----------------------------- + //------------------------------------------------------------------------------------------- //ImGui::CheckboxFlags("Gamepad Navigation", &IO.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad); //ImGui::SetItemTooltip("Use the gamepad to navigate in ImGui windows."); - ImGui::Separator(); - - //----------------------------- - // DPI - //----------------------------- - FCogWindowWidgets::SetNextItemToShortWidth(); - ImGui::SliderFloat("DPI Scale", &Config->DPIScale, 0.5f, 2.0f, "%.1f"); - if (ImGui::IsItemDeactivatedAfterEdit()) + //------------------------------------------------------------------------------------------- + if (ImGui::CollapsingHeader("Window", ImGuiTreeNodeFlags_DefaultOpen)) { - SetDPIScale(Config->DPIScale); - } - if (ImGui::BeginItemTooltip()) - { - ImGui::TextUnformatted("Change DPi Scale [Mouse Wheel]"); - ImGui::TextUnformatted("Reset DPi Scale [Middle Mouse]"); - ImGui::EndTooltip(); - } + if (ImGui::Checkbox("Enable Viewports", &Config->bEnableViewports)) + { + FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_ViewportsEnable, Config->bEnableViewports); + } + ImGui::SetItemTooltip("Enable moving ImGui windows outside of the main viewport."); - //----------------------------- - // EnableViewports - //----------------------------- - if (ImGui::Checkbox("Enable Viewports", &Config->bEnableViewports)) - { - FCogImguiHelper::SetFlags(IO.ConfigFlags, ImGuiConfigFlags_ViewportsEnable, Config->bEnableViewports); - } - ImGui::SetItemTooltip("Enable moving ImGui windows outside of the main viewport."); - - //----------------------------- - // CompactMode - //----------------------------- - ImGui::Checkbox("Compact Mode", &Config->bCompactMode); - ImGui::SetItemTooltip("Enable compact mode."); + //------------------------------------------------------------------------------------------- + ImGui::Checkbox("Compact Mode", &Config->bCompactMode); + ImGui::SetItemTooltip("Enable compact mode."); - //----------------------------- - // ShowWindowsInMainMenu - //----------------------------- - ImGui::Checkbox("Show Windows In Main Menu", &Config->bShowWindowsInMainMenu); - ImGui::SetItemTooltip("Show the content of the windows when hovering the window menu item."); + //------------------------------------------------------------------------------------------- + ImGui::Checkbox("Show Windows In Main Menu", &Config->bShowWindowsInMainMenu); + ImGui::SetItemTooltip("Show the content of the windows when hovering the window menu item."); - //----------------------------- - // ShowHelp - //----------------------------- - ImGui::Checkbox("Show Help", &Config->bShowHelp); - ImGui::SetItemTooltip("Show windows help on the window menu items."); + //------------------------------------------------------------------------------------------- + ImGui::Checkbox("Show Help", &Config->bShowHelp); + ImGui::SetItemTooltip("Show windows help on the window menu items."); - ImGui::Separator(); + //------------------------------------------------------------------------------------------- + FCogWindowWidgets::SetNextItemToShortWidth(); + ImGui::SliderFloat("DPI Scale", &Config->DPIScale, 0.5f, 2.0f, "%.1f"); + if (ImGui::IsItemDeactivatedAfterEdit()) + { + SetDPIScale(Config->DPIScale); + } + if (ImGui::BeginItemTooltip()) + { + ImGui::TextUnformatted("Change DPi Scale [Mouse Wheel]"); + ImGui::TextUnformatted("Reset DPi Scale [Middle Mouse]"); + ImGui::EndTooltip(); + } + } - if (ImGui::Button("Reset All Windows Config", ImVec2(-1.0f, 0.0f))) + //------------------------------------------------------------------------------------------- + if (ImGui::CollapsingHeader("Config")) { - GetOwner()->ResetAllWindowsConfig(); + if (ImGui::Button("Reset All Windows Config", ImVec2(-1.0f, 0.0f))) + { + GetOwner()->ResetAllWindowsConfig(); + } } } diff --git a/Plugins/Cog/Source/CogWindow/Public/CogWindow_Settings.h b/Plugins/Cog/Source/CogWindow/Public/CogWindow_Settings.h index e4fba1f..80468cc 100644 --- a/Plugins/Cog/Source/CogWindow/Public/CogWindow_Settings.h +++ b/Plugins/Cog/Source/CogWindow/Public/CogWindow_Settings.h @@ -67,7 +67,7 @@ public: bool bShareMouse = false; UPROPERTY(Config) - bool bShowCursorWhenSharingMouse = false; + bool bShareMouseWithGameplay = false; UPROPERTY(Config) bool bShareKeyboard = false; @@ -75,14 +75,11 @@ public: UPROPERTY(Config) bool bNavEnableKeyboard = false; - UPROPERTY(Config) - bool bNavEnableGamepad = false; + //UPROPERTY(Config) + //bool bNavEnableGamepad = false; - UPROPERTY(Config) - bool bNavNoCaptureInput = true; - - UPROPERTY(Config) - bool bNoMouseCursorChange = false; + //UPROPERTY(Config) + //bool bNavNoCaptureInput = true; virtual void Reset() override {