Introduced input sharing properties:

- Added properties defining whether keyboard or gamepad input should be shared between ImGui and game.
- Added interface and commands to dynamically change introduced properties.
- Updated ImGui Input Handler to base default input responses on sharing properties.
This commit is contained in:
Sebastian 2018-12-02 18:42:28 +00:00
parent 0c69e6ddfc
commit f4718e404a
5 changed files with 77 additions and 11 deletions

View File

@ -20,6 +20,7 @@
DEFINE_LOG_CATEGORY(LogImGuiInputHandler); DEFINE_LOG_CATEGORY(LogImGuiInputHandler);
static FImGuiInputResponse IgnoreResponse{ false, false };
FImGuiInputResponse UImGuiInputHandler::OnKeyDown(const FKeyEvent& KeyEvent) FImGuiInputResponse UImGuiInputHandler::OnKeyDown(const FKeyEvent& KeyEvent)
{ {
@ -27,13 +28,13 @@ FImGuiInputResponse UImGuiInputHandler::OnKeyDown(const FKeyEvent& KeyEvent)
if (IsToggleInputEvent(KeyEvent)) if (IsToggleInputEvent(KeyEvent))
{ {
ModuleManager->GetProperties().ToggleInput(); ModuleManager->GetProperties().ToggleInput();
return FImGuiInputResponse().RequestConsume(); return GetDefaultKeyboardResponse().RequestConsume();
} }
// Ignore console events, so we don't block it from opening. // Ignore console events, so we don't block it from opening.
if (IsConsoleEvent(KeyEvent)) if (IsConsoleEvent(KeyEvent))
{ {
return FImGuiInputResponse{ false, false }; return IgnoreResponse;
} }
#if WITH_EDITOR #if WITH_EDITOR
@ -41,11 +42,21 @@ FImGuiInputResponse UImGuiInputHandler::OnKeyDown(const FKeyEvent& KeyEvent)
// command, then ignore that event and let the command execute. // command, then ignore that event and let the command execute.
if (!HasImGuiActiveItem() && IsStopPlaySessionEvent(KeyEvent)) if (!HasImGuiActiveItem() && IsStopPlaySessionEvent(KeyEvent))
{ {
return FImGuiInputResponse{ false, false }; return IgnoreResponse;
} }
#endif // WITH_EDITOR #endif // WITH_EDITOR
return DefaultResponse(); return GetDefaultKeyboardResponse();
}
FImGuiInputResponse UImGuiInputHandler::GetDefaultKeyboardResponse() const
{
return FImGuiInputResponse{ true, !ModuleManager->GetProperties().IsKeyboardInputShared() };
}
FImGuiInputResponse UImGuiInputHandler::GetDefaultGamepadResponse() const
{
return FImGuiInputResponse{ true, !ModuleManager->GetProperties().IsGamepadInputShared() };
} }
bool UImGuiInputHandler::IsConsoleEvent(const FKeyEvent& KeyEvent) const bool UImGuiInputHandler::IsConsoleEvent(const FKeyEvent& KeyEvent) const

View File

@ -16,6 +16,8 @@ namespace CommandNames
const TCHAR* ToggleInput = TEXT("ImGui.ToggleInput"); const TCHAR* ToggleInput = TEXT("ImGui.ToggleInput");
const TCHAR* ToggleKeyboardNavigation = TEXT("ImGui.ToggleKeyboardNavigation"); const TCHAR* ToggleKeyboardNavigation = TEXT("ImGui.ToggleKeyboardNavigation");
const TCHAR* ToggleGamepadNavigation = TEXT("ImGui.ToggleGamepadNavigation"); const TCHAR* ToggleGamepadNavigation = TEXT("ImGui.ToggleGamepadNavigation");
const TCHAR* ToggleKeyboardInputSharing = TEXT("ImGui.ToggleKeyboardInputSharing");
const TCHAR* ToggleGamepadInputSharing = TEXT("ImGui.ToggleGamepadInputSharing");
const TCHAR* ToggleDemo = TEXT("ImGui.ToggleDemo"); const TCHAR* ToggleDemo = TEXT("ImGui.ToggleDemo");
} }
} }
@ -31,6 +33,12 @@ FImGuiModuleCommands::FImGuiModuleCommands(FImGuiModuleManager& InModuleManager)
, ToggleGamepadNavigationCommand(CommandNames::ToggleGamepadNavigation, , ToggleGamepadNavigationCommand(CommandNames::ToggleGamepadNavigation,
TEXT("Toggle ImGui gamepad navigation."), TEXT("Toggle ImGui gamepad navigation."),
FConsoleCommandDelegate::CreateRaw(this, &FImGuiModuleCommands::ToggleGamepadNavigation)) FConsoleCommandDelegate::CreateRaw(this, &FImGuiModuleCommands::ToggleGamepadNavigation))
, ToggleKeyboardInputSharingCommand(CommandNames::ToggleKeyboardInputSharing,
TEXT("Toggle ImGui keyboard input sharing."),
FConsoleCommandDelegate::CreateRaw(this, &FImGuiModuleCommands::ToggleKeyboardInputSharing))
, ToggleGamepadInputSharingCommand(CommandNames::ToggleGamepadInputSharing,
TEXT("Toggle ImGui gamepad input sharing."),
FConsoleCommandDelegate::CreateRaw(this, &FImGuiModuleCommands::ToggleGamepadInputSharing))
, ToggleDemoCommand(CommandNames::ToggleDemo, , ToggleDemoCommand(CommandNames::ToggleDemo,
TEXT("Toggle ImGui demo."), TEXT("Toggle ImGui demo."),
FConsoleCommandDelegate::CreateRaw(this, &FImGuiModuleCommands::ToggleDemo)) FConsoleCommandDelegate::CreateRaw(this, &FImGuiModuleCommands::ToggleDemo))
@ -97,6 +105,16 @@ void FImGuiModuleCommands::ToggleGamepadNavigation()
ModuleManager.GetProperties().ToggleGamepadNavigation(); ModuleManager.GetProperties().ToggleGamepadNavigation();
} }
void FImGuiModuleCommands::ToggleKeyboardInputSharing()
{
ModuleManager.GetProperties().ToggleKeyboardInputSharing();
}
void FImGuiModuleCommands::ToggleGamepadInputSharing()
{
ModuleManager.GetProperties().ToggleGamepadInputSharing();
}
void FImGuiModuleCommands::ToggleDemo() void FImGuiModuleCommands::ToggleDemo()
{ {
ModuleManager.GetProperties().ToggleDemo(); ModuleManager.GetProperties().ToggleDemo();

View File

@ -33,6 +33,8 @@ private:
void ToggleInput(); void ToggleInput();
void ToggleKeyboardNavigation(); void ToggleKeyboardNavigation();
void ToggleGamepadNavigation(); void ToggleGamepadNavigation();
void ToggleKeyboardInputSharing();
void ToggleGamepadInputSharing();
void ToggleDemo(); void ToggleDemo();
FImGuiModuleManager& ModuleManager; FImGuiModuleManager& ModuleManager;
@ -40,5 +42,7 @@ private:
FAutoConsoleCommand ToggleInputCommand; FAutoConsoleCommand ToggleInputCommand;
FAutoConsoleCommand ToggleKeyboardNavigationCommand; FAutoConsoleCommand ToggleKeyboardNavigationCommand;
FAutoConsoleCommand ToggleGamepadNavigationCommand; FAutoConsoleCommand ToggleGamepadNavigationCommand;
FAutoConsoleCommand ToggleKeyboardInputSharingCommand;
FAutoConsoleCommand ToggleGamepadInputSharingCommand;
FAutoConsoleCommand ToggleDemoCommand; FAutoConsoleCommand ToggleDemoCommand;
}; };

View File

@ -106,7 +106,7 @@ public:
* @returns Response with rules how input should be handled. Default implementation contains requests to process * @returns Response with rules how input should be handled. Default implementation contains requests to process
* and consume this event. * and consume this event.
*/ */
virtual FImGuiInputResponse OnKeyChar(const struct FCharacterEvent& CharacterEvent) { return DefaultResponse(); } virtual FImGuiInputResponse OnKeyChar(const struct FCharacterEvent& CharacterEvent) { return GetDefaultKeyboardResponse(); }
/** /**
* Called when handling keyboard key down events. * Called when handling keyboard key down events.
@ -125,7 +125,7 @@ public:
* @returns Response with rules how input should be handled. Default implementation contains requests to consume * @returns Response with rules how input should be handled. Default implementation contains requests to consume
* this event. * this event.
*/ */
virtual FImGuiInputResponse OnKeyUp(const FKeyEvent& KeyEvent) { return DefaultResponse(); } virtual FImGuiInputResponse OnKeyUp(const FKeyEvent& KeyEvent) { return GetDefaultKeyboardResponse(); }
/** /**
* Called when handling gamepad key down events. * Called when handling gamepad key down events.
@ -133,7 +133,7 @@ public:
* @returns Response with rules how input should be handled. Default implementation contains requests to process * @returns Response with rules how input should be handled. Default implementation contains requests to process
* and consume this event. * and consume this event.
*/ */
virtual FImGuiInputResponse OnGamepadKeyDown(const FKeyEvent& GamepadKeyEvent) { return DefaultResponse(); } virtual FImGuiInputResponse OnGamepadKeyDown(const FKeyEvent& GamepadKeyEvent) { return GetDefaultGamepadResponse(); }
/** /**
* Called when handling gamepad key up events. * Called when handling gamepad key up events.
@ -143,7 +143,7 @@ public:
* @returns Response with rules how input should be handled. Default implementation contains requests to consume * @returns Response with rules how input should be handled. Default implementation contains requests to consume
* this event. * this event.
*/ */
virtual FImGuiInputResponse OnGamepadKeyUp(const FKeyEvent& GamepadKeyEvent) { return DefaultResponse(); } virtual FImGuiInputResponse OnGamepadKeyUp(const FKeyEvent& GamepadKeyEvent) { return GetDefaultGamepadResponse(); }
/** /**
* Called when handling gamepad analog events. * Called when handling gamepad analog events.
@ -151,10 +151,24 @@ public:
* @returns Response with rules how input should be handled. Default implementation contains requests to process * @returns Response with rules how input should be handled. Default implementation contains requests to process
* and consume this event. * and consume this event.
*/ */
virtual FImGuiInputResponse OnGamepadAxis(const FAnalogInputEvent& GamepadAxisEvent) { return DefaultResponse(); } virtual FImGuiInputResponse OnGamepadAxis(const FAnalogInputEvent& GamepadAxisEvent) { return GetDefaultGamepadResponse(); }
protected: protected:
/**
* Get default keyboard response, with consume request based on IsKeyboardInputShared property.
*
* @returns Default response for keyboard inputs.
*/
FImGuiInputResponse GetDefaultKeyboardResponse() const;
/**
* Get default gamepad response, with consume request based on IsGamepadInputShared property.
*
* @returns Default response for gamepad inputs.
*/
FImGuiInputResponse GetDefaultGamepadResponse() const;
/** /**
* Checks whether this is a key event that can open console. * Checks whether this is a key event that can open console.
* *
@ -192,8 +206,6 @@ private:
void Initialize(FImGuiModuleManager* InModuleManager, UGameViewportClient* InGameViewport, int32 InContextIndex); void Initialize(FImGuiModuleManager* InModuleManager, UGameViewportClient* InGameViewport, int32 InContextIndex);
FORCEINLINE FImGuiInputResponse DefaultResponse() { return FImGuiInputResponse{ true, true }; }
FImGuiModuleManager* ModuleManager = nullptr; FImGuiModuleManager* ModuleManager = nullptr;
TWeakObjectPtr<UGameViewportClient> GameViewport; TWeakObjectPtr<UGameViewportClient> GameViewport;

View File

@ -35,6 +35,24 @@ public:
/** Toggle gamepad navigation. */ /** Toggle gamepad navigation. */
void ToggleGamepadNavigation() { SetGamepadNavigationEnabled(!IsGamepadNavigationEnabled()); } void ToggleGamepadNavigation() { SetGamepadNavigationEnabled(!IsGamepadNavigationEnabled()); }
/** Check whether keyboard input is shared with game. */
bool IsKeyboardInputShared() const { return bKeyboardInputShared; }
/** Set whether keyboard input should be shared with game. */
void SetKeyboardInputShared(bool bShared) { bKeyboardInputShared = bShared; }
/** Toggle whether keyboard input should be shared with game. */
void ToggleKeyboardInputSharing() { SetKeyboardInputShared(!IsKeyboardInputShared()); }
/** Check whether gamepad input is shared with game. */
bool IsGamepadInputShared() const { return bGamepadInputShared; }
/** Set whether gamepad input should be shared with game. */
void SetGamepadInputShared(bool bShared) { bGamepadInputShared = bShared; }
/** Toggle whether gamepad input should be shared with game. */
void ToggleGamepadInputSharing() { SetGamepadInputShared(!IsGamepadInputShared()); }
/** Check whether ImGui demo is visible. */ /** Check whether ImGui demo is visible. */
bool ShowDemo() const { return bShowDemo; } bool ShowDemo() const { return bShowDemo; }
@ -51,5 +69,8 @@ private:
bool bKeyboardNavigationEnabled = false; bool bKeyboardNavigationEnabled = false;
bool bGamepadNavigationEnabled = false; bool bGamepadNavigationEnabled = false;
bool bKeyboardInputShared = false;
bool bGamepadInputShared = false;
bool bShowDemo = false; bool bShowDemo = false;
}; };