mirror of
https://github.com/Ed94/Cog.git
synced 2026-06-13 08:02:23 -07:00
Use InputProcessor to support shared mouse
This commit is contained in:
@@ -386,11 +386,6 @@ void FCogEngineWindow_Selection::TickSelectionMode()
|
||||
return;
|
||||
}
|
||||
|
||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AnyWindow))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
APlayerController* PlayerController = GetLocalPlayerController();
|
||||
if (PlayerController == nullptr)
|
||||
{
|
||||
@@ -398,7 +393,6 @@ void FCogEngineWindow_Selection::TickSelectionMode()
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ImDrawList* DrawList = ImGui::GetBackgroundDrawList();
|
||||
DrawList->AddRect(ImVec2(0, 0), ImGui::GetIO().DisplaySize, IM_COL32(255, 0, 0, 128), 0.0f, 0, 20.0f);
|
||||
FCogWindowWidgets::AddTextWithShadow(DrawList, ImVec2(20, 20), IM_COL32(255, 255, 255, 255), "Picking Mode. \n[LMB] Pick \n[RMB] Cancel");
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
#pragma once
|
||||
|
||||
#include "Framework/Application/IInputProcessor.h"
|
||||
|
||||
class SCogImguiWidget;
|
||||
class UPlayerInput;
|
||||
enum ImGuiKey : int;
|
||||
struct FKeyBind;
|
||||
|
||||
class FImGuiInputProcessor : public IInputProcessor
|
||||
{
|
||||
public:
|
||||
|
||||
FImGuiInputProcessor(UPlayerInput* InPlayerInput, SCogImguiWidget* InWidget);
|
||||
|
||||
virtual void Tick(const float DeltaTime, FSlateApplication& SlateApp, TSharedRef<ICursor> 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);
|
||||
|
||||
bool IsKeyBoundToCommand(const FKeyEvent& KeyEvent);
|
||||
|
||||
static ImGuiKey ToImKey(const FKey& Key);
|
||||
|
||||
static bool IsKeyEventMatchingKeyBind(const FKeyEvent& KeyEvent, const FKeyBind& KeyBind);
|
||||
|
||||
static bool IsConsoleEvent(const FKeyEvent& KeyEvent);
|
||||
|
||||
static bool IsStopPlaySessionEvent(const FKeyEvent& KeyEvent);
|
||||
|
||||
static uint32 ToImGuiMouseButton(const FKey& MouseButton);
|
||||
|
||||
TObjectPtr<UPlayerInput> PlayerInput = nullptr;
|
||||
|
||||
TObjectPtr<SCogImguiWidget> MainWidget = nullptr;
|
||||
};
|
||||
@@ -13,9 +13,6 @@
|
||||
#include "Kismet2/DebuggerCommands.h"
|
||||
#endif //WITH_EDITOR
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
TMap<FKey, ImGuiKey> FCogImguiInputHelper::KeyMap;
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
APlayerController* FCogImguiInputHelper::GetFirstLocalPlayerController(const UWorld& World)
|
||||
{
|
||||
@@ -244,22 +241,6 @@ bool FCogImguiInputHelper::IsStopPlaySessionEvent(const FKeyEvent& KeyEvent)
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
ImGuiKey FCogImguiInputHelper::KeyEventToImGuiKey(const FKeyEvent& KeyEvent)
|
||||
{
|
||||
if (KeyMap.IsEmpty())
|
||||
{
|
||||
InitializeKeyMap();
|
||||
}
|
||||
|
||||
if (const ImGuiKey* Key = KeyMap.Find(KeyEvent.GetKey()))
|
||||
{
|
||||
return *Key;
|
||||
}
|
||||
|
||||
return ImGuiKey_None;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
uint32 FCogImguiInputHelper::MouseButtonToImGuiMouseButton(const FKey& MouseButton)
|
||||
{
|
||||
@@ -291,148 +272,6 @@ EMouseCursor::Type FCogImguiInputHelper::ToSlateMouseCursor(ImGuiMouseCursor Mou
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void FCogImguiInputHelper::InitializeKeyMap()
|
||||
{
|
||||
KeyMap.Add(EKeys::LeftMouseButton, ImGuiKey_MouseLeft);
|
||||
KeyMap.Add(EKeys::RightMouseButton, ImGuiKey_MouseRight);
|
||||
KeyMap.Add(EKeys::MiddleMouseButton, ImGuiKey_MouseMiddle);
|
||||
KeyMap.Add(EKeys::ThumbMouseButton, ImGuiKey_MouseX1);
|
||||
KeyMap.Add(EKeys::ThumbMouseButton2, ImGuiKey_MouseX2);
|
||||
|
||||
KeyMap.Add(EKeys::BackSpace, ImGuiKey_Backspace);
|
||||
KeyMap.Add(EKeys::Tab, ImGuiKey_Tab);
|
||||
KeyMap.Add(EKeys::Enter, ImGuiKey_Enter);
|
||||
KeyMap.Add(EKeys::Pause, ImGuiKey_Pause);
|
||||
|
||||
KeyMap.Add(EKeys::CapsLock, ImGuiKey_CapsLock);
|
||||
KeyMap.Add(EKeys::Escape, ImGuiKey_Escape);
|
||||
KeyMap.Add(EKeys::SpaceBar, ImGuiKey_Space);
|
||||
KeyMap.Add(EKeys::PageUp, ImGuiKey_PageUp);
|
||||
KeyMap.Add(EKeys::PageDown, ImGuiKey_PageDown);
|
||||
KeyMap.Add(EKeys::End, ImGuiKey_End);
|
||||
KeyMap.Add(EKeys::Home, ImGuiKey_Home);
|
||||
|
||||
KeyMap.Add(EKeys::Left, ImGuiKey_LeftArrow);
|
||||
KeyMap.Add(EKeys::Up, ImGuiKey_UpArrow);
|
||||
KeyMap.Add(EKeys::Right, ImGuiKey_RightArrow);
|
||||
KeyMap.Add(EKeys::Down, ImGuiKey_DownArrow);
|
||||
|
||||
KeyMap.Add(EKeys::Insert, ImGuiKey_Insert);
|
||||
KeyMap.Add(EKeys::Delete, ImGuiKey_Delete);
|
||||
|
||||
KeyMap.Add(EKeys::Zero, ImGuiKey_0);
|
||||
KeyMap.Add(EKeys::One, ImGuiKey_1);
|
||||
KeyMap.Add(EKeys::Two, ImGuiKey_2);
|
||||
KeyMap.Add(EKeys::Three, ImGuiKey_3);
|
||||
KeyMap.Add(EKeys::Four, ImGuiKey_4);
|
||||
KeyMap.Add(EKeys::Five, ImGuiKey_5);
|
||||
KeyMap.Add(EKeys::Six, ImGuiKey_6);
|
||||
KeyMap.Add(EKeys::Seven, ImGuiKey_7);
|
||||
KeyMap.Add(EKeys::Eight, ImGuiKey_8);
|
||||
KeyMap.Add(EKeys::Nine, ImGuiKey_9);
|
||||
|
||||
KeyMap.Add(EKeys::A, ImGuiKey_A);
|
||||
KeyMap.Add(EKeys::B, ImGuiKey_B);
|
||||
KeyMap.Add(EKeys::C, ImGuiKey_C);
|
||||
KeyMap.Add(EKeys::D, ImGuiKey_D);
|
||||
KeyMap.Add(EKeys::E, ImGuiKey_E);
|
||||
KeyMap.Add(EKeys::F, ImGuiKey_F);
|
||||
KeyMap.Add(EKeys::G, ImGuiKey_G);
|
||||
KeyMap.Add(EKeys::H, ImGuiKey_H);
|
||||
KeyMap.Add(EKeys::I, ImGuiKey_I);
|
||||
KeyMap.Add(EKeys::J, ImGuiKey_J);
|
||||
KeyMap.Add(EKeys::K, ImGuiKey_K);
|
||||
KeyMap.Add(EKeys::L, ImGuiKey_L);
|
||||
KeyMap.Add(EKeys::M, ImGuiKey_M);
|
||||
KeyMap.Add(EKeys::N, ImGuiKey_N);
|
||||
KeyMap.Add(EKeys::O, ImGuiKey_O);
|
||||
KeyMap.Add(EKeys::P, ImGuiKey_P);
|
||||
KeyMap.Add(EKeys::Q, ImGuiKey_Q);
|
||||
KeyMap.Add(EKeys::R, ImGuiKey_R);
|
||||
KeyMap.Add(EKeys::S, ImGuiKey_S);
|
||||
KeyMap.Add(EKeys::T, ImGuiKey_T);
|
||||
KeyMap.Add(EKeys::U, ImGuiKey_U);
|
||||
KeyMap.Add(EKeys::V, ImGuiKey_V);
|
||||
KeyMap.Add(EKeys::W, ImGuiKey_W);
|
||||
KeyMap.Add(EKeys::X, ImGuiKey_X);
|
||||
KeyMap.Add(EKeys::Y, ImGuiKey_Y);
|
||||
KeyMap.Add(EKeys::Z, ImGuiKey_Z);
|
||||
|
||||
KeyMap.Add(EKeys::NumPadZero, ImGuiKey_Keypad0);
|
||||
KeyMap.Add(EKeys::NumPadOne, ImGuiKey_Keypad1);
|
||||
KeyMap.Add(EKeys::NumPadTwo, ImGuiKey_Keypad2);
|
||||
KeyMap.Add(EKeys::NumPadThree, ImGuiKey_Keypad3);
|
||||
KeyMap.Add(EKeys::NumPadFour, ImGuiKey_Keypad4);
|
||||
KeyMap.Add(EKeys::NumPadFive, ImGuiKey_Keypad5);
|
||||
KeyMap.Add(EKeys::NumPadSix, ImGuiKey_Keypad6);
|
||||
KeyMap.Add(EKeys::NumPadSeven, ImGuiKey_Keypad7);
|
||||
KeyMap.Add(EKeys::NumPadEight, ImGuiKey_Keypad8);
|
||||
KeyMap.Add(EKeys::NumPadNine, ImGuiKey_Keypad9);
|
||||
|
||||
KeyMap.Add(EKeys::Multiply, ImGuiKey_KeypadMultiply);
|
||||
KeyMap.Add(EKeys::Add, ImGuiKey_KeypadAdd);
|
||||
KeyMap.Add(EKeys::Subtract, ImGuiKey_KeypadSubtract);
|
||||
KeyMap.Add(EKeys::Decimal, ImGuiKey_KeypadDecimal);
|
||||
KeyMap.Add(EKeys::Divide, ImGuiKey_KeypadDivide);
|
||||
|
||||
KeyMap.Add(EKeys::F1, ImGuiKey_F1);
|
||||
KeyMap.Add(EKeys::F2, ImGuiKey_F2);
|
||||
KeyMap.Add(EKeys::F3, ImGuiKey_F3);
|
||||
KeyMap.Add(EKeys::F4, ImGuiKey_F4);
|
||||
KeyMap.Add(EKeys::F5, ImGuiKey_F5);
|
||||
KeyMap.Add(EKeys::F6, ImGuiKey_F6);
|
||||
KeyMap.Add(EKeys::F7, ImGuiKey_F7);
|
||||
KeyMap.Add(EKeys::F8, ImGuiKey_F8);
|
||||
KeyMap.Add(EKeys::F9, ImGuiKey_F9);
|
||||
KeyMap.Add(EKeys::F10, ImGuiKey_F10);
|
||||
KeyMap.Add(EKeys::F11, ImGuiKey_F11);
|
||||
KeyMap.Add(EKeys::F12, ImGuiKey_F12);
|
||||
|
||||
KeyMap.Add(EKeys::NumLock, ImGuiKey_NumLock);
|
||||
|
||||
KeyMap.Add(EKeys::ScrollLock, ImGuiKey_ScrollLock);
|
||||
|
||||
KeyMap.Add(EKeys::LeftShift, ImGuiKey_LeftShift);
|
||||
KeyMap.Add(EKeys::RightShift, ImGuiKey_RightShift);
|
||||
KeyMap.Add(EKeys::LeftControl, ImGuiKey_LeftCtrl);
|
||||
KeyMap.Add(EKeys::RightControl, ImGuiKey_RightCtrl);
|
||||
KeyMap.Add(EKeys::LeftAlt, ImGuiKey_LeftAlt);
|
||||
KeyMap.Add(EKeys::RightAlt, ImGuiKey_RightAlt);
|
||||
KeyMap.Add(EKeys::LeftCommand, ImGuiKey_LeftSuper);
|
||||
KeyMap.Add(EKeys::RightCommand, ImGuiKey_RightSuper);
|
||||
|
||||
KeyMap.Add(EKeys::Semicolon, ImGuiKey_Semicolon);
|
||||
KeyMap.Add(EKeys::Equals, ImGuiKey_Equal);
|
||||
KeyMap.Add(EKeys::Comma, ImGuiKey_Comma);
|
||||
KeyMap.Add(EKeys::Hyphen, ImGuiKey_Minus);
|
||||
KeyMap.Add(EKeys::Period, ImGuiKey_Period);
|
||||
KeyMap.Add(EKeys::Slash, ImGuiKey_Slash);
|
||||
|
||||
KeyMap.Add(EKeys::LeftBracket, ImGuiKey_LeftBracket);
|
||||
KeyMap.Add(EKeys::Backslash, ImGuiKey_Backslash);
|
||||
KeyMap.Add(EKeys::RightBracket, ImGuiKey_RightBracket);
|
||||
KeyMap.Add(EKeys::Apostrophe, ImGuiKey_Apostrophe);
|
||||
|
||||
//KeyMap.Add(EKeys::MouseX, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::MouseY, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Mouse2D, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::MouseScrollUp, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::MouseScrollDown, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::MouseWheelAxis, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Underscore, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Tilde, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Ampersand, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Asterix, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Caret, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Colon, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Dollar, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Exclamation, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::LeftParantheses, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::RightParantheses, ImGuiKey_None;
|
||||
//KeyMap.Add(EKeys::Quote, ImGuiKey_None;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
FString FCogImguiInputHelper::CommandToString(const UWorld& World, const FString& Command)
|
||||
{
|
||||
|
||||
@@ -51,18 +51,24 @@ void SCogImguiWidget::Construct(const FArguments& InArgs)
|
||||
//--------------------------------------------------------------------
|
||||
// Register input processor to forward input events to imgui
|
||||
//--------------------------------------------------------------------
|
||||
UPlayerInput* PlayerInput = FCogImguiInputHelper::GetPlayerInput(*GameViewport->GetWorld());
|
||||
InputProcessor = MakeShared<FImGuiInputProcessor>(PlayerInput, this);
|
||||
FSlateApplication::Get().RegisterInputPreProcessor(InputProcessor.ToSharedRef(), 0);
|
||||
if (FSlateApplication::IsInitialized())
|
||||
{
|
||||
UPlayerInput* PlayerInput = FCogImguiInputHelper::GetPlayerInput(*GameViewport->GetWorld());
|
||||
InputProcessor = MakeShared<FImGuiInputProcessor>(PlayerInput, this);
|
||||
FSlateApplication::Get().RegisterInputPreProcessor(InputProcessor.ToSharedRef(), 0);
|
||||
}
|
||||
}
|
||||
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
SCogImguiWidget::~SCogImguiWidget()
|
||||
{
|
||||
if (InputProcessor.IsValid())
|
||||
if (FSlateApplication::IsInitialized())
|
||||
{
|
||||
FSlateApplication::Get().UnregisterInputPreProcessor(InputProcessor);
|
||||
if (InputProcessor.IsValid())
|
||||
{
|
||||
FSlateApplication::Get().UnregisterInputPreProcessor(InputProcessor);
|
||||
}
|
||||
}
|
||||
|
||||
DestroyImGuiContext();
|
||||
|
||||
@@ -38,8 +38,6 @@ public:
|
||||
|
||||
static bool IsStopPlaySessionEvent(const FKeyEvent& KeyEvent);
|
||||
|
||||
static ImGuiKey KeyEventToImGuiKey(const FKeyEvent& KeyEvent);
|
||||
|
||||
static uint32 MouseButtonToImGuiMouseButton(const FKey& MouseButton);
|
||||
|
||||
static EMouseCursor::Type ToSlateMouseCursor(ImGuiMouseCursor MouseCursor);
|
||||
@@ -55,8 +53,4 @@ public:
|
||||
{
|
||||
return static_cast<ImWchar>(Char);
|
||||
}
|
||||
|
||||
static void InitializeKeyMap();
|
||||
|
||||
static TMap<FKey, ImGuiKey> KeyMap;
|
||||
};
|
||||
|
||||
@@ -96,7 +96,7 @@ protected:
|
||||
|
||||
bool bEnableInput = false;
|
||||
|
||||
bool bShareMouse = false;
|
||||
bool bShareMouse = true;
|
||||
|
||||
FSlateRenderTransform ImGuiRenderTransform;
|
||||
|
||||
|
||||
@@ -683,11 +683,10 @@ bool UCogWindowManager::RegisterDefaultCommandBindings()
|
||||
|
||||
UPlayerInput* PlayerInput = FCogImguiInputHelper::GetPlayerInput(*GetWorld());
|
||||
|
||||
AddCommand(PlayerInput, "Cog.ToggleInput", EKeys::Tab);
|
||||
AddCommand(PlayerInput, "Cog.LoadLayout 1", EKeys::F1);
|
||||
AddCommand(PlayerInput, "Cog.LoadLayout 2", EKeys::F2);
|
||||
AddCommand(PlayerInput, "Cog.LoadLayout 3", EKeys::F3);
|
||||
AddCommand(PlayerInput, "Cog.LoadLayout 4", EKeys::F4);
|
||||
AddCommand(PlayerInput, "Cog.ToggleInput", EKeys::F1);
|
||||
AddCommand(PlayerInput, "Cog.LoadLayout 1", EKeys::F2);
|
||||
AddCommand(PlayerInput, "Cog.LoadLayout 2", EKeys::F3);
|
||||
AddCommand(PlayerInput, "Cog.LoadLayout 3", EKeys::F4);
|
||||
AddCommand(PlayerInput, "Cog.ToggleSelectionMode", EKeys::F5);
|
||||
|
||||
SortCommands(PlayerInput);
|
||||
|
||||
@@ -55,6 +55,6 @@ public:
|
||||
bShareMouse = true;
|
||||
bNavEnableKeyboard = true;
|
||||
bNavEnableGamepad = true;
|
||||
bNavNoCaptureInput = false;
|
||||
bNavNoCaptureInput = true;
|
||||
}
|
||||
};
|
||||
@@ -14,9 +14,9 @@ public class CogSample : ModuleRules
|
||||
"CoreUObject",
|
||||
"Engine",
|
||||
"EnhancedInput",
|
||||
"GameplayTasks",
|
||||
"GameplayAbilities",
|
||||
"GameplayTags",
|
||||
"GameplayTasks",
|
||||
"InputCore",
|
||||
"NetCore",
|
||||
"Niagara",
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#include "CogDebugPlot.h"
|
||||
#include "CogDebugReplicator.h"
|
||||
#include "CogEngineReplicator.h"
|
||||
#include "Framework/Application/NavigationConfig.h"
|
||||
#include "Framework/Application/SlateApplication.h"
|
||||
#endif //ENABLE_COG
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
- CogImGui: Add a way to create and override CogImguiwidget
|
||||
- CogImGui: Try to find a global solution to prevent crash when breaking in a blueprint from an imgui action (reset the stack)
|
||||
- CogImgui: support multi viewports
|
||||
- CogImgui: Support multi viewports
|
||||
|
||||
- CogWindow: Add reset window position menu item or reset layout (window can get far away)
|
||||
- CogWindow: Try to remove CogWindow dependency to cogimgui. Should only depends on imgui (currently use setdpiscale of cogimgui)
|
||||
@@ -8,6 +8,7 @@
|
||||
- CogWindow: Hide menu is not saved anymore
|
||||
- CogWindow: DPI change on mousewheel should be a command with a key bind as the rest.
|
||||
- CogWindow: Add more window help and tooltip on input window and more
|
||||
- CogWindow: Support loading/saving custom style
|
||||
|
||||
- CogEngine: More stats in the stats window
|
||||
- CogEngine: Overlay mode of stats.
|
||||
@@ -28,3 +29,6 @@
|
||||
|
||||
- CogDebug: Check KismetExecutionMessage for warnings. As an exemple it is used by GEngine::GetWorldFromContextObject.
|
||||
- CogDebug: Rework Thickness and Duration params.
|
||||
|
||||
- CogInput: Add help about usnig CTRL+Drag on the stick to lock them
|
||||
|
||||
|
||||
Reference in New Issue
Block a user