mirror of
https://github.com/Ed94/Cog.git
synced 2026-08-04 06:38:45 +00:00
Start to implement input sharing (mouse not supported yet)
This commit is contained in:
Binary file not shown.
@@ -136,8 +136,8 @@ void FCogEngineWindow_Selection::ToggleSelectionMode()
|
|||||||
void FCogEngineWindow_Selection::ActivateSelectionMode()
|
void FCogEngineWindow_Selection::ActivateSelectionMode()
|
||||||
{
|
{
|
||||||
bSelectionModeActive = true;
|
bSelectionModeActive = true;
|
||||||
bImGuiHadInputBeforeEnteringSelectionMode = FCogImguiModule::Get().GetEnableInput();
|
bIsInputEnabledBeforeEnteringSelectionMode = GetOwner()->GetImGuiWidget()->GetEnableInput();
|
||||||
FCogImguiModule::Get().SetEnableInput(true);
|
GetOwner()->GetImGuiWidget()->SetEnableInput(true);
|
||||||
GetOwner()->SetHideAllWindows(true);
|
GetOwner()->SetHideAllWindows(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,10 +158,7 @@ void FCogEngineWindow_Selection::DeactivateSelectionMode()
|
|||||||
// When in selection mode we need imgui to have the input focus
|
// When in selection mode we need imgui to have the input focus
|
||||||
// When leaving selection mode we want to leave it as is was before
|
// When leaving selection mode we want to leave it as is was before
|
||||||
//--------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------
|
||||||
if (bImGuiHadInputBeforeEnteringSelectionMode == false)
|
GetOwner()->GetImGuiWidget()->SetEnableInput(bIsInputEnabledBeforeEnteringSelectionMode);
|
||||||
{
|
|
||||||
FCogImguiModule::Get().SetEnableInput(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
GetOwner()->SetHideAllWindows(false);
|
GetOwner()->SetHideAllWindows(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
class IConsoleObject;
|
class IConsoleObject;
|
||||||
class UCogEngineConfig_Selection;
|
class UCogEngineConfig_Selection;
|
||||||
|
enum class ECogImGuiInputMode : uint8;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
class COGENGINE_API FCogEngineWindow_Selection : public FCogWindow
|
class COGENGINE_API FCogEngineWindow_Selection : public FCogWindow
|
||||||
@@ -82,7 +83,7 @@ protected:
|
|||||||
|
|
||||||
bool bSelectionModeActive = false;
|
bool bSelectionModeActive = false;
|
||||||
|
|
||||||
bool bImGuiHadInputBeforeEnteringSelectionMode = false;
|
bool bIsInputEnabledBeforeEnteringSelectionMode;
|
||||||
|
|
||||||
int32 WaitInputReleased = 0;
|
int32 WaitInputReleased = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -47,22 +47,6 @@ UPlayerInput* FCogImguiInputHelper::GetPlayerInput(const UWorld& World)
|
|||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
bool FCogImguiInputHelper::IsKeyEventHandled(UWorld* World, const FKeyEvent& KeyEvent)
|
bool FCogImguiInputHelper::IsKeyEventHandled(UWorld* World, const FKeyEvent& KeyEvent)
|
||||||
{
|
{
|
||||||
//------------------------------------------------------------------------------------------------
|
|
||||||
// Do not handle the input if imgui input is disabled
|
|
||||||
//------------------------------------------------------------------------------------------------
|
|
||||||
if (FCogImguiModule::Get().GetEnableInput() == false)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
|
||||||
// We want the user to control the character with its gamepad even when imgui has the input.
|
|
||||||
//------------------------------------------------------------------------------------------------
|
|
||||||
if (KeyEvent.GetKey().IsGamepadKey())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
// We want the user to be able to open the console command when imgui has the input.
|
// We want the user to be able to open the console command when imgui has the input.
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -30,10 +30,7 @@ void SCogImguiWidget::Construct(const FArguments& InArgs)
|
|||||||
FontAtlas = InArgs._FontAtlas;
|
FontAtlas = InArgs._FontAtlas;
|
||||||
Render = InArgs._Render;
|
Render = InArgs._Render;
|
||||||
|
|
||||||
if (FCogImguiModule::Get().GetEnableInput() == false)
|
RefreshVisibility();
|
||||||
{
|
|
||||||
SetVisibility(EVisibility::SelfHitTestInvisible);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGuiContext = ImGui::CreateContext(FontAtlas);
|
ImGuiContext = ImGui::CreateContext(FontAtlas);
|
||||||
ImPlotContext = ImPlot::CreateContext();
|
ImPlotContext = ImPlot::CreateContext();
|
||||||
@@ -139,23 +136,7 @@ void SCogImguiWidget::TickImGui(float InDeltaTime)
|
|||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void SCogImguiWidget::TickFocus()
|
void SCogImguiWidget::TickFocus()
|
||||||
{
|
{
|
||||||
FCogImguiModule& Module = FCogImguiModule::Get();
|
if (bEnableInput)
|
||||||
|
|
||||||
const bool bShouldEnableInput = Module.GetEnableInput();
|
|
||||||
if (bEnableInput != bShouldEnableInput)
|
|
||||||
{
|
|
||||||
bEnableInput = bShouldEnableInput;
|
|
||||||
|
|
||||||
if (bEnableInput)
|
|
||||||
{
|
|
||||||
TakeFocus();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ReturnFocus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (bEnableInput)
|
|
||||||
{
|
{
|
||||||
const auto& ViewportWidget = GameViewport->GetGameViewportWidget();
|
const auto& ViewportWidget = GameViewport->GetGameViewportWidget();
|
||||||
if (!HasKeyboardFocus() && !IsConsoleOpened() && (ViewportWidget->HasKeyboardFocus() || ViewportWidget->HasFocusedDescendants()))
|
if (!HasKeyboardFocus() && !IsConsoleOpened() && (ViewportWidget->HasKeyboardFocus() || ViewportWidget->HasFocusedDescendants()))
|
||||||
@@ -168,8 +149,6 @@ void SCogImguiWidget::TickFocus()
|
|||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void SCogImguiWidget::TakeFocus()
|
void SCogImguiWidget::TakeFocus()
|
||||||
{
|
{
|
||||||
SetVisibility(EVisibility::Visible);
|
|
||||||
|
|
||||||
FSlateApplication& SlateApplication = FSlateApplication::Get();
|
FSlateApplication& SlateApplication = FSlateApplication::Get();
|
||||||
|
|
||||||
PreviousUserFocusedWidget = SlateApplication.GetUserFocusedWidget(SlateApplication.GetUserIndexForKeyboard());
|
PreviousUserFocusedWidget = SlateApplication.GetUserFocusedWidget(SlateApplication.GetUserIndexForKeyboard());
|
||||||
@@ -189,8 +168,6 @@ void SCogImguiWidget::TakeFocus()
|
|||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void SCogImguiWidget::ReturnFocus()
|
void SCogImguiWidget::ReturnFocus()
|
||||||
{
|
{
|
||||||
SetVisibility(EVisibility::SelfHitTestInvisible);
|
|
||||||
|
|
||||||
if (HasKeyboardFocus())
|
if (HasKeyboardFocus())
|
||||||
{
|
{
|
||||||
auto FocusWidgetPtr = PreviousUserFocusedWidget.IsValid()
|
auto FocusWidgetPtr = PreviousUserFocusedWidget.IsValid()
|
||||||
@@ -299,7 +276,6 @@ FVector2D SCogImguiWidget::TransformScreenPointToImGui(const FGeometry& MyGeomet
|
|||||||
return ImGuiToScreen.Inverse().TransformPoint(Point);
|
return ImGuiToScreen.Inverse().TransformPoint(Point);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
bool SCogImguiWidget::IsConsoleOpened() const
|
bool SCogImguiWidget::IsConsoleOpened() const
|
||||||
{
|
{
|
||||||
@@ -318,16 +294,50 @@ void SCogImguiWidget::SetAsCurrentContext()
|
|||||||
ImGui::SetCurrentContext(ImGuiContext);
|
ImGui::SetCurrentContext(ImGuiContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void SCogImguiWidget::SetDPIScale(float Scale)
|
void SCogImguiWidget::SetEnableInput(bool Value)
|
||||||
{
|
{
|
||||||
if (DpiScale == Scale)
|
if (bEnableInput == Value)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DpiScale = Scale;
|
bEnableInput = Value;
|
||||||
|
|
||||||
|
if (bEnableInput)
|
||||||
|
{
|
||||||
|
TakeFocus();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ReturnFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
RefreshVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void SCogImguiWidget::RefreshVisibility()
|
||||||
|
{
|
||||||
|
if (bEnableInput)
|
||||||
|
{
|
||||||
|
SetVisibility(EVisibility::Visible);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetVisibility(EVisibility::SelfHitTestInvisible);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void SCogImguiWidget::SetDPIScale(float Value)
|
||||||
|
{
|
||||||
|
if (DpiScale == Value)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DpiScale = Value;
|
||||||
OnDpiChanged();
|
OnDpiChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -360,101 +370,141 @@ void SCogImguiWidget::OnDpiChanged()
|
|||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
FReply SCogImguiWidget::OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& CharacterEvent)
|
FReply SCogImguiWidget::OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& CharacterEvent)
|
||||||
{
|
{
|
||||||
if (FCogImguiModule::Get().GetEnableInput())
|
if (bEnableInput == false)
|
||||||
{
|
{
|
||||||
ImGui::GetIO().AddInputCharacter(FCogImguiInputHelper::CastInputChar(CharacterEvent.GetCharacter()));
|
ImGui::GetIO().AddInputCharacter(FCogImguiInputHelper::CastInputChar(CharacterEvent.GetCharacter()));
|
||||||
return FReply::Handled();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FReply::Unhandled();
|
if (bShareKeyboard)
|
||||||
|
{
|
||||||
|
return FReply::Unhandled();
|
||||||
|
}
|
||||||
|
|
||||||
|
return FReply::Handled();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
FReply SCogImguiWidget::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent)
|
FReply SCogImguiWidget::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent)
|
||||||
{
|
{
|
||||||
if (FCogImguiInputHelper::IsKeyEventHandled(GameViewport->GetWorld(), KeyEvent) == false)
|
return HandleKeyEvent(MyGeometry, KeyEvent);
|
||||||
{
|
|
||||||
return FReply::Unhandled();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGuiIO& IO = ImGui::GetIO();
|
|
||||||
IO.AddKeyEvent(FCogImguiInputHelper::KeyEventToImGuiKey(KeyEvent), true);
|
|
||||||
IO.AddKeyEvent(ImGuiMod_Ctrl, KeyEvent.IsControlDown());
|
|
||||||
IO.AddKeyEvent(ImGuiMod_Shift, KeyEvent.IsShiftDown());
|
|
||||||
IO.AddKeyEvent(ImGuiMod_Alt, KeyEvent.IsAltDown());
|
|
||||||
IO.AddKeyEvent(ImGuiMod_Super, KeyEvent.IsCommandDown());
|
|
||||||
|
|
||||||
return FReply::Handled();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
FReply SCogImguiWidget::OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent)
|
FReply SCogImguiWidget::OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent)
|
||||||
{
|
{
|
||||||
if (FCogImguiInputHelper::IsKeyEventHandled(GameViewport->GetWorld(), KeyEvent) == false)
|
return HandleKeyEvent(MyGeometry, KeyEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
FReply SCogImguiWidget::HandleKeyEvent(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent)
|
||||||
|
{
|
||||||
|
if (bEnableInput == false)
|
||||||
{
|
{
|
||||||
return FReply::Unhandled();
|
return FReply::Unhandled();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGuiIO& IO = ImGui::GetIO();
|
if (KeyEvent.GetKey().IsGamepadKey())
|
||||||
IO.AddKeyEvent(FCogImguiInputHelper::KeyEventToImGuiKey(KeyEvent), false);
|
{
|
||||||
IO.AddKeyEvent(ImGuiMod_Ctrl, KeyEvent.IsControlDown());
|
if (bShareGamepad)
|
||||||
IO.AddKeyEvent(ImGuiMod_Shift, KeyEvent.IsShiftDown());
|
{
|
||||||
IO.AddKeyEvent(ImGuiMod_Alt, KeyEvent.IsAltDown());
|
// TODO: handle imgui gamepad
|
||||||
IO.AddKeyEvent(ImGuiMod_Super, KeyEvent.IsCommandDown());
|
return FReply::Unhandled();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (FCogImguiInputHelper::IsKeyEventHandled(GameViewport->GetWorld(), KeyEvent) == false)
|
||||||
|
{
|
||||||
|
return FReply::Unhandled();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiIO& IO = ImGui::GetIO();
|
||||||
|
IO.AddKeyEvent(FCogImguiInputHelper::KeyEventToImGuiKey(KeyEvent), false);
|
||||||
|
IO.AddKeyEvent(ImGuiMod_Ctrl, KeyEvent.IsControlDown());
|
||||||
|
IO.AddKeyEvent(ImGuiMod_Shift, KeyEvent.IsShiftDown());
|
||||||
|
IO.AddKeyEvent(ImGuiMod_Alt, KeyEvent.IsAltDown());
|
||||||
|
IO.AddKeyEvent(ImGuiMod_Super, KeyEvent.IsCommandDown());
|
||||||
|
|
||||||
|
if (bShareKeyboard)
|
||||||
|
{
|
||||||
|
return FReply::Unhandled();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FReply::Handled();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
FReply SCogImguiWidget::OnAnalogValueChanged(const FGeometry& MyGeometry, const FAnalogInputEvent& AnalogInputEvent)
|
||||||
|
{
|
||||||
|
if (AnalogInputEvent.GetKey().IsGamepadKey())
|
||||||
|
{
|
||||||
|
if (bShareGamepad)
|
||||||
|
{
|
||||||
|
// TODO: handle imgui gamepad
|
||||||
|
return FReply::Unhandled();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (bShareKeyboard)
|
||||||
|
{
|
||||||
|
return FReply::Unhandled();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return FReply::Handled();
|
return FReply::Handled();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
|
||||||
FReply SCogImguiWidget::OnAnalogValueChanged(const FGeometry& MyGeometry, const FAnalogInputEvent& AnalogInputEvent)
|
|
||||||
{
|
|
||||||
return FReply::Unhandled();
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
FReply SCogImguiWidget::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
|
FReply SCogImguiWidget::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
|
||||||
{
|
{
|
||||||
if (FCogImguiModule::Get().GetEnableInput() == false)
|
if (bEnableInput == false)
|
||||||
{
|
{
|
||||||
return FReply::Unhandled();
|
return FReply::Unhandled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const uint32 MouseButton = FCogImguiInputHelper::MouseButtonToImGuiMouseButton(MouseEvent.GetEffectingButton());
|
||||||
ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse);
|
ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse);
|
||||||
ImGui::GetIO().AddMouseButtonEvent(FCogImguiInputHelper::MouseButtonToImGuiMouseButton(MouseEvent.GetEffectingButton()), true);
|
ImGui::GetIO().AddMouseButtonEvent(MouseButton, true);
|
||||||
|
|
||||||
return FReply::Handled();
|
return FReply::Handled();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
FReply SCogImguiWidget::OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
|
FReply SCogImguiWidget::OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
|
||||||
{
|
{
|
||||||
if (FCogImguiModule::Get().GetEnableInput() == false)
|
if (bEnableInput == false)
|
||||||
{
|
{
|
||||||
return FReply::Unhandled();
|
return FReply::Unhandled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const uint32 MouseButton = FCogImguiInputHelper::MouseButtonToImGuiMouseButton(MouseEvent.GetEffectingButton());
|
||||||
ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse);
|
ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse);
|
||||||
ImGui::GetIO().AddMouseButtonEvent(FCogImguiInputHelper::MouseButtonToImGuiMouseButton(MouseEvent.GetEffectingButton()), false);
|
ImGui::GetIO().AddMouseButtonEvent(MouseButton, false);
|
||||||
|
|
||||||
return FReply::Handled();
|
return FReply::Handled();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
FReply SCogImguiWidget::OnMouseWheel(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
|
FReply SCogImguiWidget::OnMouseWheel(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
|
||||||
{
|
{
|
||||||
if (FCogImguiModule::Get().GetEnableInput() == false)
|
if (bEnableInput == false)
|
||||||
{
|
{
|
||||||
return FReply::Unhandled();
|
return FReply::Unhandled();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse);
|
ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse);
|
||||||
ImGui::GetIO().AddMouseWheelEvent(0, MouseEvent.GetWheelDelta());
|
ImGui::GetIO().AddMouseWheelEvent(0, MouseEvent.GetWheelDelta());
|
||||||
|
|
||||||
return FReply::Handled();
|
return FReply::Handled();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
FReply SCogImguiWidget::OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
|
FReply SCogImguiWidget::OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
|
||||||
{
|
{
|
||||||
if (FCogImguiModule::Get().GetEnableInput() == false)
|
if (bEnableInput == false)
|
||||||
{
|
{
|
||||||
return FReply::Unhandled();
|
return FReply::Unhandled();
|
||||||
}
|
}
|
||||||
@@ -462,13 +512,14 @@ FReply SCogImguiWidget::OnMouseMove(const FGeometry& MyGeometry, const FPointerE
|
|||||||
ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse);
|
ImGui::GetIO().AddMouseSourceEvent(ImGuiMouseSource_Mouse);
|
||||||
const FVector2D Pos = TransformScreenPointToImGui(MyGeometry, MouseEvent.GetScreenSpacePosition());
|
const FVector2D Pos = TransformScreenPointToImGui(MyGeometry, MouseEvent.GetScreenSpacePosition());
|
||||||
ImGui::GetIO().AddMousePosEvent(Pos.X, Pos.Y);
|
ImGui::GetIO().AddMousePosEvent(Pos.X, Pos.Y);
|
||||||
|
|
||||||
return FReply::Handled();
|
return FReply::Handled();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
FReply SCogImguiWidget::OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& FocusEvent)
|
FReply SCogImguiWidget::OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& FocusEvent)
|
||||||
{
|
{
|
||||||
if (FCogImguiModule::Get().GetEnableInput() == false)
|
if (bEnableInput == false)
|
||||||
{
|
{
|
||||||
return FReply::Unhandled();
|
return FReply::Unhandled();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,12 +31,6 @@ public:
|
|||||||
|
|
||||||
ImFontAtlas& GetDefaultFontAtlas() { return DefaultFontAtlas; }
|
ImFontAtlas& GetDefaultFontAtlas() { return DefaultFontAtlas; }
|
||||||
|
|
||||||
bool GetEnableInput() const { return bEnabledInput; }
|
|
||||||
|
|
||||||
void SetEnableInput(bool Value) { bEnabledInput = Value; }
|
|
||||||
|
|
||||||
void ToggleEnableInput() { bEnabledInput = !bEnabledInput; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void Initialize();
|
void Initialize();
|
||||||
@@ -45,7 +39,5 @@ private:
|
|||||||
|
|
||||||
ImFontAtlas DefaultFontAtlas;
|
ImFontAtlas DefaultFontAtlas;
|
||||||
|
|
||||||
bool bEnabledInput = true;
|
|
||||||
|
|
||||||
bool bIsInitialized = false;
|
bool bIsInitialized = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -15,6 +15,15 @@ struct ImPlotContext;
|
|||||||
|
|
||||||
using FCogImguiRenderFunction = TFunction<void(float DeltaTime)>;
|
using FCogImguiRenderFunction = TFunction<void(float DeltaTime)>;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
UENUM()
|
||||||
|
enum class ECogImGuiInputMode : uint8
|
||||||
|
{
|
||||||
|
Inactive,
|
||||||
|
Exclusive,
|
||||||
|
Shared
|
||||||
|
};
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
class COGIMGUI_API SCogImguiWidget : public SCompoundWidget
|
class COGIMGUI_API SCogImguiWidget : public SCompoundWidget
|
||||||
{
|
{
|
||||||
@@ -36,30 +45,64 @@ public:
|
|||||||
// SWidget overrides
|
// SWidget overrides
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
|
virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
|
||||||
|
|
||||||
virtual bool SupportsKeyboardFocus() const override { return true; }
|
virtual bool SupportsKeyboardFocus() const override { return true; }
|
||||||
|
|
||||||
virtual FReply OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& CharacterEvent) override;
|
virtual FReply OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& CharacterEvent) override;
|
||||||
|
|
||||||
virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) override;
|
virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) override;
|
||||||
|
|
||||||
virtual FReply OnKeyUp(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 OnAnalogValueChanged(const FGeometry& MyGeometry, const FAnalogInputEvent& AnalogInputEvent) override;
|
||||||
|
|
||||||
virtual FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
|
virtual FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
|
||||||
|
|
||||||
virtual FReply OnMouseButtonUp(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 OnMouseWheel(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
|
||||||
|
|
||||||
virtual FReply OnMouseMove(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;
|
virtual FReply OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& FocusEvent) override;
|
||||||
|
|
||||||
virtual void OnFocusLost(const FFocusEvent& FocusEvent) override;
|
virtual void OnFocusLost(const FFocusEvent& FocusEvent) override;
|
||||||
|
|
||||||
virtual void OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
|
virtual void OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
|
||||||
|
|
||||||
virtual void OnMouseLeave(const FPointerEvent& MouseEvent) override;
|
virtual void OnMouseLeave(const FPointerEvent& MouseEvent) override;
|
||||||
|
|
||||||
virtual FReply OnTouchStarted(const FGeometry& MyGeometry, const FPointerEvent& TouchEvent) override;
|
virtual FReply OnTouchStarted(const FGeometry& MyGeometry, const FPointerEvent& TouchEvent) override;
|
||||||
|
|
||||||
virtual FReply OnTouchMoved(const FGeometry& MyGeometry, const FPointerEvent& TouchEvent) override;
|
virtual FReply OnTouchMoved(const FGeometry& MyGeometry, const FPointerEvent& TouchEvent) override;
|
||||||
|
|
||||||
virtual FReply OnTouchEnded(const FGeometry& MyGeometry, const FPointerEvent& TouchEvent) override;
|
virtual FReply OnTouchEnded(const FGeometry& MyGeometry, const FPointerEvent& TouchEvent) 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 int32 OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& WidgetStyle, bool bParentEnabled) const override;
|
||||||
|
|
||||||
virtual FVector2D ComputeDesiredSize(float Scale) const override;
|
virtual FVector2D ComputeDesiredSize(float Scale) const override;
|
||||||
|
|
||||||
ULocalPlayer* GetLocalPlayer() const;
|
ULocalPlayer* GetLocalPlayer() const;
|
||||||
|
|
||||||
|
bool GetEnableInput() const { return bEnableInput; }
|
||||||
|
|
||||||
|
void SetEnableInput(bool Value);
|
||||||
|
|
||||||
|
bool GetShareGamepad() const { return bShareGamepad; }
|
||||||
|
|
||||||
|
void SetShareGamepad(bool Value) { bShareGamepad = Value; }
|
||||||
|
|
||||||
|
bool GetShareKeyboard() const { return bShareKeyboard; }
|
||||||
|
|
||||||
|
void SetShareKeyboard(bool Value) { bShareKeyboard= Value; }
|
||||||
|
|
||||||
|
bool GetShareMouse() const { return bShareMouse; }
|
||||||
|
|
||||||
|
void SetShareMouse(bool Value) { bShareMouse = Value; }
|
||||||
|
|
||||||
float GetDpiScale() const { return DpiScale; }
|
float GetDpiScale() const { return DpiScale; }
|
||||||
|
|
||||||
void SetDPIScale(float Scale);
|
void SetDPIScale(float Value);
|
||||||
|
|
||||||
bool IsCurrentContext() const;
|
bool IsCurrentContext() const;
|
||||||
|
|
||||||
@@ -85,16 +128,26 @@ protected:
|
|||||||
|
|
||||||
virtual void OnDpiChanged();
|
virtual void OnDpiChanged();
|
||||||
|
|
||||||
bool IsConsoleOpened() const;
|
virtual void RefreshVisibility();
|
||||||
|
|
||||||
|
virtual bool IsConsoleOpened() const;
|
||||||
|
|
||||||
|
virtual FReply HandleKeyEvent(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent);
|
||||||
|
|
||||||
TWeakObjectPtr<UGameViewportClient> GameViewport;
|
TWeakObjectPtr<UGameViewportClient> GameViewport;
|
||||||
|
|
||||||
ImFontAtlas* FontAtlas;
|
ImFontAtlas* FontAtlas = nullptr;
|
||||||
|
|
||||||
TWeakPtr<SWidget> PreviousUserFocusedWidget;
|
TWeakPtr<SWidget> PreviousUserFocusedWidget;
|
||||||
|
|
||||||
bool bEnableInput = false;
|
bool bEnableInput = false;
|
||||||
|
|
||||||
|
bool bShareGamepad = true;
|
||||||
|
|
||||||
|
bool bShareKeyboard = false;
|
||||||
|
|
||||||
|
bool bShareMouse = false;
|
||||||
|
|
||||||
FSlateRenderTransform ImGuiRenderTransform;
|
FSlateRenderTransform ImGuiRenderTransform;
|
||||||
|
|
||||||
mutable TArray<FSlateVertex> VertexBuffer;
|
mutable TArray<FSlateVertex> VertexBuffer;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include "CogDebugDrawImGui.h"
|
#include "CogDebugDrawImGui.h"
|
||||||
#include "CogImguiInputHelper.h"
|
#include "CogImguiInputHelper.h"
|
||||||
#include "CogImguiModule.h"
|
#include "CogImguiModule.h"
|
||||||
#include "CogImguiWidget.h"
|
#include "CogWindow_Inputs.h"
|
||||||
#include "CogWindow_Settings.h"
|
#include "CogWindow_Settings.h"
|
||||||
#include "CogWindow_Spacing.h"
|
#include "CogWindow_Spacing.h"
|
||||||
#include "CogWindowConfig.h"
|
#include "CogWindowConfig.h"
|
||||||
@@ -41,6 +41,10 @@ void UCogWindowManager::PostInitProperties()
|
|||||||
void UCogWindowManager::InitializeInternal()
|
void UCogWindowManager::InitializeInternal()
|
||||||
{
|
{
|
||||||
ImGuiWidget = FCogImguiModule::Get().CreateImGuiWidget(GEngine->GameViewport, [this](float DeltaTime) { Render(DeltaTime); });
|
ImGuiWidget = FCogImguiModule::Get().CreateImGuiWidget(GEngine->GameViewport, [this](float DeltaTime) { Render(DeltaTime); });
|
||||||
|
ImGuiWidget->SetEnableInput(bEnableInput);
|
||||||
|
ImGuiWidget->SetShareGamepad(bShareGamepad);
|
||||||
|
ImGuiWidget->SetShareKeyboard(bShareKeyboard);
|
||||||
|
ImGuiWidget->SetShareMouse(bShareMouse);
|
||||||
|
|
||||||
ImGuiSettingsHandler IniHandler;
|
ImGuiSettingsHandler IniHandler;
|
||||||
IniHandler.TypeName = "Cog";
|
IniHandler.TypeName = "Cog";
|
||||||
@@ -58,12 +62,14 @@ void UCogWindowManager::InitializeInternal()
|
|||||||
SpaceWindows.Add(AddWindow<FCogWindow_Spacing>("Spacing 3", false));
|
SpaceWindows.Add(AddWindow<FCogWindow_Spacing>("Spacing 3", false));
|
||||||
SpaceWindows.Add(AddWindow<FCogWindow_Spacing>("Spacing 4", false));
|
SpaceWindows.Add(AddWindow<FCogWindow_Spacing>("Spacing 4", false));
|
||||||
|
|
||||||
|
InputsWindow = AddWindow<FCogWindow_Inputs>("Window.Inputs", false);
|
||||||
|
|
||||||
SettingsWindow = AddWindow<FCogWindow_Settings>("Window.Settings", false);
|
SettingsWindow = AddWindow<FCogWindow_Settings>("Window.Settings", false);
|
||||||
|
|
||||||
ConsoleCommands.Add(IConsoleManager::Get().RegisterConsoleCommand(
|
ConsoleCommands.Add(IConsoleManager::Get().RegisterConsoleCommand(
|
||||||
*ToggleInputCommand,
|
*ToggleInputCommand,
|
||||||
TEXT("Toggle the input focus between the Game and ImGui"),
|
TEXT("Toggle the input focus between the Game and ImGui"),
|
||||||
FConsoleCommandWithArgsDelegate::CreateLambda([](const TArray<FString>& Args) { FCogImguiModule::Get().ToggleEnableInput(); }),
|
FConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args) { ToggleInputMode(); }),
|
||||||
ECVF_Cheat));
|
ECVF_Cheat));
|
||||||
|
|
||||||
ConsoleCommands.Add(IConsoleManager::Get().RegisterConsoleCommand(
|
ConsoleCommands.Add(IConsoleManager::Get().RegisterConsoleCommand(
|
||||||
@@ -89,6 +95,14 @@ void UCogWindowManager::InitializeInternal()
|
|||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void UCogWindowManager::Shutdown()
|
void UCogWindowManager::Shutdown()
|
||||||
{
|
{
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// To save the input mode for the next session
|
||||||
|
//------------------------------------------------------------
|
||||||
|
bEnableInput = ImGuiWidget->GetEnableInput();
|
||||||
|
bShareGamepad = ImGuiWidget->GetEnableInput();
|
||||||
|
bShareKeyboard = ImGuiWidget->GetEnableInput();
|
||||||
|
bShareMouse = ImGuiWidget->GetEnableInput();
|
||||||
|
|
||||||
//------------------------------------------------------------
|
//------------------------------------------------------------
|
||||||
// Destroy ImGui before destroying the windows to make sure
|
// Destroy ImGui before destroying the windows to make sure
|
||||||
// imgui serialize their visibility state in imgui.ini
|
// imgui serialize their visibility state in imgui.ini
|
||||||
@@ -165,7 +179,7 @@ void UCogWindowManager::Render(float DeltaTime)
|
|||||||
|
|
||||||
if (bHideAllWindows == false)
|
if (bHideAllWindows == false)
|
||||||
{
|
{
|
||||||
if (FCogImguiModule::Get().GetEnableInput())
|
if (ImGuiWidget->GetEnableInput() || bHideMainMenuOnGameInput == false)
|
||||||
{
|
{
|
||||||
RenderMainMenu();
|
RenderMainMenu();
|
||||||
}
|
}
|
||||||
@@ -335,13 +349,6 @@ void UCogWindowManager::RenderMainMenu()
|
|||||||
|
|
||||||
if (ImGui::BeginMenu("Window"))
|
if (ImGui::BeginMenu("Window"))
|
||||||
{
|
{
|
||||||
if (ImGui::MenuItem("Toggle Input", TCHAR_TO_ANSI(*FCogImguiInputHelper::CommandToString(PlayerInput, ToggleInputCommand))))
|
|
||||||
{
|
|
||||||
FCogImguiModule::Get().ToggleEnableInput();
|
|
||||||
}
|
|
||||||
ImGui::Separator();
|
|
||||||
|
|
||||||
|
|
||||||
if (ImGui::MenuItem("Close All Windows"))
|
if (ImGui::MenuItem("Close All Windows"))
|
||||||
{
|
{
|
||||||
CloseAllWindows();
|
CloseAllWindows();
|
||||||
@@ -425,7 +432,7 @@ void UCogWindowManager::RenderMainMenu()
|
|||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
RenderMenuItem(*InputsWindow, "Inputs");
|
||||||
|
|
||||||
RenderMenuItem(*SettingsWindow, "Settings");
|
RenderMenuItem(*SettingsWindow, "Settings");
|
||||||
|
|
||||||
@@ -824,3 +831,9 @@ const UObject* UCogWindowManager::GetAsset(const TSubclassOf<UObject> AssetClass
|
|||||||
|
|
||||||
return Asset;
|
return Asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void UCogWindowManager::ToggleInputMode()
|
||||||
|
{
|
||||||
|
ImGuiWidget->SetEnableInput(!ImGuiWidget->GetEnableInput());
|
||||||
|
}
|
||||||
@@ -73,8 +73,9 @@ void FCogWindowWidgets::ProgressBarCentered(float Fraction, const ImVec2& Size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void FCogWindowWidgets::ToggleMenuButton(bool* Value, const char* Text, const ImVec4& TrueColor)
|
bool FCogWindowWidgets::ToggleMenuButton(bool* Value, const char* Text, const ImVec4& TrueColor)
|
||||||
{
|
{
|
||||||
|
bool IsPressed = false;
|
||||||
bool IsTrue = *Value;
|
bool IsTrue = *Value;
|
||||||
if (IsTrue)
|
if (IsTrue)
|
||||||
{
|
{
|
||||||
@@ -87,7 +88,8 @@ void FCogWindowWidgets::ToggleMenuButton(bool* Value, const char* Text, const Im
|
|||||||
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Button(Text))
|
IsPressed = ImGui::Button(Text);
|
||||||
|
if (IsPressed)
|
||||||
{
|
{
|
||||||
*Value = !*Value;
|
*Value = !*Value;
|
||||||
}
|
}
|
||||||
@@ -101,24 +103,27 @@ void FCogWindowWidgets::ToggleMenuButton(bool* Value, const char* Text, const Im
|
|||||||
ImGui::PopStyleColor(1);
|
ImGui::PopStyleColor(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return IsPressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void FCogWindowWidgets::ToggleButton(bool* Value, const char* Text, const ImVec4& TrueColor, const ImVec4& FalseColor, const ImVec2& Size)
|
bool FCogWindowWidgets::ToggleButton(bool* Value, const char* Text, const ImVec4& TrueColor, const ImVec4& FalseColor, const ImVec2& Size)
|
||||||
{
|
{
|
||||||
ToggleButton(Value, Text, Text, TrueColor, FalseColor, Size);
|
return ToggleButton(Value, Text, Text, TrueColor, FalseColor, Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void FCogWindowWidgets::ToggleButton(bool* Value, const char* TextTrue, const char* TextFalse, const ImVec4& TrueColor, const ImVec4& FalseColor, const ImVec2& Size)
|
bool FCogWindowWidgets::ToggleButton(bool* Value, const char* TextTrue, const char* TextFalse, const ImVec4& TrueColor, const ImVec4& FalseColor, const ImVec2& Size)
|
||||||
{
|
{
|
||||||
|
bool IsPressed = false;
|
||||||
if (*Value)
|
if (*Value)
|
||||||
{
|
{
|
||||||
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(TrueColor.x, TrueColor.y, TrueColor.z, TrueColor.w * 0.6f));
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(TrueColor.x, TrueColor.y, TrueColor.z, TrueColor.w * 0.6f));
|
||||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(TrueColor.x, TrueColor.y, TrueColor.z, TrueColor.w * 0.8f));
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(TrueColor.x, TrueColor.y, TrueColor.z, TrueColor.w * 0.8f));
|
||||||
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(TrueColor.x, TrueColor.y, TrueColor.z, TrueColor.w * 1.0f));
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(TrueColor.x, TrueColor.y, TrueColor.z, TrueColor.w * 1.0f));
|
||||||
|
|
||||||
if (ImGui::Button(TextTrue, Size))
|
IsPressed = ImGui::Button(TextTrue, Size);
|
||||||
|
if (IsPressed)
|
||||||
{
|
{
|
||||||
*Value = false;
|
*Value = false;
|
||||||
}
|
}
|
||||||
@@ -138,6 +143,8 @@ void FCogWindowWidgets::ToggleButton(bool* Value, const char* TextTrue, const ch
|
|||||||
|
|
||||||
ImGui::PopStyleColor(3);
|
ImGui::PopStyleColor(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return IsPressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
#include "CogWindow_Inputs.h"
|
||||||
|
|
||||||
|
#include "CogImguiInputHelper.h"
|
||||||
|
#include "CogImguiWidget.h"
|
||||||
|
#include "CogWindowManager.h"
|
||||||
|
#include "CogWindowWidgets.h"
|
||||||
|
#include "InputCoreTypes.h"
|
||||||
|
#include "imgui.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FCogWindow_Inputs::Initialize()
|
||||||
|
{
|
||||||
|
Super::Initialize();
|
||||||
|
|
||||||
|
bHasMenu = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FCogWindow_Inputs::RenderContent()
|
||||||
|
{
|
||||||
|
const UPlayerInput* PlayerInput = FCogImguiInputHelper::GetPlayerInput(*GetWorld());
|
||||||
|
if (PlayerInput == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCogImguiWidget* ImGuiWidget = GetOwner()->GetImGuiWidget().Get();
|
||||||
|
if (ImGuiWidget == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bEnableInput = ImGuiWidget->GetEnableInput();
|
||||||
|
if (ImGui::Checkbox("Enable Input", &bEnableInput))
|
||||||
|
{
|
||||||
|
ImGuiWidget->SetEnableInput(bEnableInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* ShortcutText = TCHAR_TO_ANSI(*FCogImguiInputHelper::CommandToString(PlayerInput, UCogWindowManager::ToggleInputCommand));
|
||||||
|
const float ShortcutWidth = (ShortcutText && ShortcutText[0]) ? ImGui::CalcTextSize(ShortcutText, 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(ShortcutText);
|
||||||
|
ImGui::PopStyleColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::Separator();
|
||||||
|
|
||||||
|
bool bShareGamepad = ImGuiWidget->GetShareGamepad();
|
||||||
|
if (ImGui::Checkbox("Share Gamepad", &bShareGamepad))
|
||||||
|
{
|
||||||
|
ImGuiWidget->SetShareGamepad(bShareGamepad);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bShareKeyboard = ImGuiWidget->GetShareKeyboard();
|
||||||
|
if (ImGui::Checkbox("Share Keyboard", &bShareKeyboard))
|
||||||
|
{
|
||||||
|
ImGuiWidget->SetShareKeyboard(bShareKeyboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bShareMouse = ImGuiWidget->GetShareMouse();
|
||||||
|
if (ImGui::Checkbox("Share Mouse", &bShareMouse))
|
||||||
|
{
|
||||||
|
//ImGuiWidget->SetShareMouse(bShareMouse);
|
||||||
|
}
|
||||||
|
if (ImGui::IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui::SetTooltip("Mouse sharing is currently not supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -34,6 +34,8 @@ void FCogWindow_Settings::RenderContent()
|
|||||||
|
|
||||||
ImGui::Checkbox("Show Windows In Main Menu", &GetOwner()->bShowWindowsInMainMenu);
|
ImGui::Checkbox("Show Windows In Main Menu", &GetOwner()->bShowWindowsInMainMenu);
|
||||||
|
|
||||||
|
ImGui::Checkbox("Hide Main Menu On Game Input", &GetOwner()->bHideMainMenuOnGameInput);
|
||||||
|
|
||||||
ImGui::Checkbox("Show Window Help", &GetOwner()->bShowHelp);
|
ImGui::Checkbox("Show Window Help", &GetOwner()->bShowHelp);
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
|
#include "CogImguiWidget.h"
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#include "CogWindowManager.generated.h"
|
#include "CogWindowManager.generated.h"
|
||||||
|
|
||||||
class IConsoleObject;
|
|
||||||
class SCogImguiWidget;
|
|
||||||
class FCogWindow;
|
class FCogWindow;
|
||||||
class FCogWindow_Settings;
|
class FCogWindow_Settings;
|
||||||
|
class IConsoleObject;
|
||||||
|
class SCogImguiWidget;
|
||||||
class UCogWindowConfig;
|
class UCogWindowConfig;
|
||||||
class UPlayerInput;
|
class UPlayerInput;
|
||||||
class UWorld;
|
class UWorld;
|
||||||
@@ -21,11 +22,6 @@ class COGWINDOW_API UCogWindowManager : public UObject
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static FString ToggleInputCommand;
|
|
||||||
static FString LoadLayoutCommand;
|
|
||||||
static FString SaveLayoutCommand;
|
|
||||||
static FString ResetLayoutCommand;
|
|
||||||
|
|
||||||
UCogWindowManager();
|
UCogWindowManager();
|
||||||
|
|
||||||
virtual void PostInitProperties() override;
|
virtual void PostInitProperties() override;
|
||||||
@@ -40,6 +36,9 @@ public:
|
|||||||
|
|
||||||
virtual void AddWindow(FCogWindow* Window, const FString& Name, bool AddToMainMenu = true);
|
virtual void AddWindow(FCogWindow* Window, const FString& Name, bool AddToMainMenu = true);
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
T* AddWindow(const FString& Name, bool AddToMainMenu = true);
|
||||||
|
|
||||||
virtual FCogWindow* FindWindowByID(ImGuiID ID);
|
virtual FCogWindow* FindWindowByID(ImGuiID ID);
|
||||||
|
|
||||||
virtual void CloseAllWindows();
|
virtual void CloseAllWindows();
|
||||||
@@ -74,38 +73,26 @@ public:
|
|||||||
|
|
||||||
virtual bool RegisterDefaultCommands();
|
virtual bool RegisterDefaultCommands();
|
||||||
|
|
||||||
|
UCogWindowConfig* GetConfig(const TSubclassOf<UCogWindowConfig> ConfigClass);
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
T* GetConfig();
|
||||||
|
|
||||||
|
const UObject* GetAsset(const TSubclassOf<UObject> AssetClass);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T* GetAsset();
|
||||||
|
|
||||||
|
TSharedPtr<SCogImguiWidget> GetImGuiWidget() const { return ImGuiWidget; }
|
||||||
|
|
||||||
static void AddCommand(UPlayerInput* PlayerInput, const FString& Command, const FKey& Key);
|
static void AddCommand(UPlayerInput* PlayerInput, const FString& Command, const FKey& Key);
|
||||||
|
|
||||||
static void SortCommands(UPlayerInput* PlayerInput);
|
static void SortCommands(UPlayerInput* PlayerInput);
|
||||||
|
|
||||||
UCogWindowConfig* GetConfig(const TSubclassOf<UCogWindowConfig> ConfigClass);
|
|
||||||
|
|
||||||
const UObject* GetAsset(const TSubclassOf<UObject> AssetClass);
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
T* AddWindow(const FString& Name, bool AddToMainMenu = true)
|
|
||||||
{
|
|
||||||
T* Window = new T();
|
|
||||||
AddWindow(Window, Name, AddToMainMenu);
|
|
||||||
return Window;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
T* GetConfig()
|
|
||||||
{
|
|
||||||
static_assert(TPointerIsConvertibleFromTo<T, const UCogWindowConfig>::Value);
|
|
||||||
return Cast<T>(&GetConfig(T::StaticClass()));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
static T* GetAsset()
|
|
||||||
{
|
|
||||||
return Cast<T>(GetAsset(T::StaticClass()));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
friend class FCogWindow_Settings;
|
friend class FCogWindow_Settings;
|
||||||
|
friend class FCogWindow_Inputs;
|
||||||
|
|
||||||
struct FMenu
|
struct FMenu
|
||||||
{
|
{
|
||||||
@@ -132,6 +119,8 @@ protected:
|
|||||||
|
|
||||||
virtual void TickDPI();
|
virtual void TickDPI();
|
||||||
|
|
||||||
|
virtual void ToggleInputMode();
|
||||||
|
|
||||||
static void SettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*);
|
static void SettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*);
|
||||||
|
|
||||||
static void SettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*);
|
static void SettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*);
|
||||||
@@ -142,6 +131,13 @@ protected:
|
|||||||
|
|
||||||
static void SettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf);
|
static void SettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf);
|
||||||
|
|
||||||
|
static FString ToggleInputCommand;
|
||||||
|
|
||||||
|
static FString LoadLayoutCommand;
|
||||||
|
|
||||||
|
static FString SaveLayoutCommand;
|
||||||
|
|
||||||
|
static FString ResetLayoutCommand;
|
||||||
|
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
mutable TArray<UCogWindowConfig*> Configs;
|
mutable TArray<UCogWindowConfig*> Configs;
|
||||||
@@ -149,6 +145,18 @@ protected:
|
|||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
mutable TArray<const UObject*> Assets;
|
mutable TArray<const UObject*> Assets;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool bEnableInput = false;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool bShareGamepad = true;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool bShareKeyboard = false;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool bShareMouse = false;
|
||||||
|
|
||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
bool bCompactMode = false;
|
bool bCompactMode = false;
|
||||||
|
|
||||||
@@ -167,6 +175,18 @@ protected:
|
|||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
bool bRegisterDefaultCommands = true;
|
bool bRegisterDefaultCommands = true;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool bAuthorizeInactiveInput = true;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool bAuthorizeExclusiveInput = true;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool bAuthorizeSharedInput = true;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool bHideMainMenuOnGameInput = true;
|
||||||
|
|
||||||
TSharedPtr<SCogImguiWidget> ImGuiWidget = nullptr;
|
TSharedPtr<SCogImguiWidget> ImGuiWidget = nullptr;
|
||||||
|
|
||||||
TArray<FCogWindow*> Windows;
|
TArray<FCogWindow*> Windows;
|
||||||
@@ -177,6 +197,8 @@ protected:
|
|||||||
|
|
||||||
TArray<FCogWindow*> SpaceWindows;
|
TArray<FCogWindow*> SpaceWindows;
|
||||||
|
|
||||||
|
FCogWindow_Inputs* InputsWindow = nullptr;
|
||||||
|
|
||||||
FCogWindow_Settings* SettingsWindow = nullptr;
|
FCogWindow_Settings* SettingsWindow = nullptr;
|
||||||
|
|
||||||
FMenu MainMenu;
|
FMenu MainMenu;
|
||||||
@@ -191,3 +213,27 @@ protected:
|
|||||||
|
|
||||||
TArray<IConsoleObject*> ConsoleCommands;
|
TArray<IConsoleObject*> ConsoleCommands;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
template<class T>
|
||||||
|
T* UCogWindowManager::AddWindow(const FString& Name, bool AddToMainMenu)
|
||||||
|
{
|
||||||
|
T* Window = new T();
|
||||||
|
AddWindow(Window, Name, AddToMainMenu);
|
||||||
|
return Window;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
template<class T>
|
||||||
|
T* UCogWindowManager::GetConfig()
|
||||||
|
{
|
||||||
|
static_assert(TPointerIsConvertibleFromTo<T, const UCogWindowConfig>::Value);
|
||||||
|
return Cast<T>(&GetConfig(T::StaticClass()));
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
template<typename T>
|
||||||
|
T* UCogWindowManager::GetAsset()
|
||||||
|
{
|
||||||
|
return Cast<T>(GetAsset(T::StaticClass()));
|
||||||
|
}
|
||||||
@@ -18,11 +18,11 @@ public:
|
|||||||
|
|
||||||
static void ProgressBarCentered(float Fraction, const ImVec2& Size, const char* Overlay);
|
static void ProgressBarCentered(float Fraction, const ImVec2& Size, const char* Overlay);
|
||||||
|
|
||||||
static void ToggleMenuButton(bool* Value, const char* Text, const ImVec4& TrueColor);
|
static bool ToggleMenuButton(bool* Value, const char* Text, const ImVec4& TrueColor);
|
||||||
|
|
||||||
static void ToggleButton(bool* Value, const char* Text, const ImVec4& TrueColor, const ImVec4& FalseColor, const ImVec2& Size = ImVec2(0, 0));
|
static bool ToggleButton(bool* Value, const char* Text, const ImVec4& TrueColor, const ImVec4& FalseColor, const ImVec2& Size = ImVec2(0, 0));
|
||||||
|
|
||||||
static void ToggleButton(bool* Value, const char* TextTrue, const char* TextFalse, const ImVec4& TrueColor, const ImVec4& FalseColor, const ImVec2& Size = ImVec2(0, 0));
|
static bool ToggleButton(bool* Value, const char* TextTrue, const char* TextFalse, const ImVec4& TrueColor, const ImVec4& FalseColor, const ImVec2& Size = ImVec2(0, 0));
|
||||||
|
|
||||||
static bool MultiChoiceButton(const char* Label, bool IsSelected, const ImVec2& Size = ImVec2(0, 0));
|
static bool MultiChoiceButton(const char* Label, bool IsSelected, const ImVec2& Size = ImVec2(0, 0));
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "CogWindow.h"
|
||||||
|
#include "CogImGuiKeyInfo.h"
|
||||||
|
|
||||||
|
class COGWINDOW_API FCogWindow_Inputs : public FCogWindow
|
||||||
|
{
|
||||||
|
typedef FCogWindow Super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void Initialize() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual void RenderContent() override;
|
||||||
|
};
|
||||||
@@ -130,18 +130,18 @@ void FCogInputWindow_Actions::RenderContent()
|
|||||||
|
|
||||||
const ImVec4 ActiveColor(1, 0.8f, 0, 1);
|
const ImVec4 ActiveColor(1, 0.8f, 0, 1);
|
||||||
const ImVec4 InnactiveColor(0.3f, 0.3f, 0.3f, 1);
|
const ImVec4 InnactiveColor(0.3f, 0.3f, 0.3f, 1);
|
||||||
const ImVec2 ButtonWidth(FCogWindowWidgets::GetFontWidth() * 10, 0);
|
const ImVec2 ButtonSize(FCogWindowWidgets::GetFontWidth() * 10, 0);
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::BeginDisabled();
|
ImGui::BeginDisabled();
|
||||||
bool Value = ActionValue.Get<bool>();
|
bool Value = ActionValue.Get<bool>();
|
||||||
FCogWindowWidgets::ToggleButton(&Value, "Pressed##Value", "Released##Value", ActiveColor, InnactiveColor, ButtonWidth);
|
FCogWindowWidgets::ToggleButton(&Value, "Pressed##Value", "Released##Value", ActiveColor, InnactiveColor, ButtonSize);
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
FCogWindowWidgets::ToggleButton(&ActionInfo.bPressed, "Pressed##Inject", "Released##Inject", ActiveColor, InnactiveColor, ButtonWidth);
|
FCogWindowWidgets::ToggleButton(&ActionInfo.bPressed, "Pressed##Inject", "Released##Inject", ActiveColor, InnactiveColor, ButtonSize);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
FCogWindowWidgets::ToggleButton(&ActionInfo.bRepeat, "Repeat", "Repeat", ActiveColor, InnactiveColor, ButtonWidth);
|
FCogWindowWidgets::ToggleButton(&ActionInfo.bRepeat, "Repeat", "Repeat", ActiveColor, InnactiveColor, ButtonSize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user