Replaced 'ImGui.DrawMouseCursor' console variable with a settings property.

This commit is contained in:
Sebastian 2018-10-28 21:15:02 +00:00
parent b492932055
commit 20d1490bd3
4 changed files with 48 additions and 15 deletions

View File

@ -64,6 +64,10 @@ void UImGuiSettings::OnPropertyChanged(class UObject* ObjectBeingModified, struc
{ {
DebugExecBindings::UpdatePlayerInputs(SwitchInputModeKey, Commands::SwitchInputMode); DebugExecBindings::UpdatePlayerInputs(SwitchInputModeKey, Commands::SwitchInputMode);
} }
else if (UpdatedPropertyName == GET_MEMBER_NAME_CHECKED(UImGuiSettings, bUseSoftwareCursor))
{
OnSoftwareCursorChanged.Broadcast();
}
} }
} }

View File

@ -59,9 +59,15 @@ public:
// Get mapping for 'ImGui.SwitchInputMode' command. // Get mapping for 'ImGui.SwitchInputMode' command.
const FImGuiKeyInfo& GetSwitchInputModeKey() const { return SwitchInputModeKey; } const FImGuiKeyInfo& GetSwitchInputModeKey() const { return SwitchInputModeKey; }
// Check whether ImGui should draw its own software cursor.
bool UseSoftwareCursor() const { return bUseSoftwareCursor; }
// Delegate raised when ImGuiInputHandlerClass property has changed. // Delegate raised when ImGuiInputHandlerClass property has changed.
FSimpleMulticastDelegate OnImGuiInputHandlerClassChanged; FSimpleMulticastDelegate OnImGuiInputHandlerClassChanged;
// Delegate raised when SoftwareCursorEnabled property has changed.
FSimpleMulticastDelegate OnSoftwareCursorChanged;
virtual void PostInitProperties() override; virtual void PostInitProperties() override;
protected: protected:
@ -79,6 +85,12 @@ protected:
UPROPERTY(EditAnywhere, config, Category = "Keyboard Shortcuts") UPROPERTY(EditAnywhere, config, Category = "Keyboard Shortcuts")
FImGuiKeyInfo SwitchInputModeKey; FImGuiKeyInfo SwitchInputModeKey;
// If true, then in input mode ImGui will draw its own cursor in place of the hardware one.
// When disabled (default) there is a noticeable difference between cursor position seen by ImGui and position on
// the screen. Enabling this option removes that effect but with lower frame-rates UI becomes quickly unusable.
UPROPERTY(EditAnywhere, config, Category = "Input")
bool bUseSoftwareCursor = false;
private: private:
#if WITH_EDITOR #if WITH_EDITOR

View File

@ -62,12 +62,6 @@ namespace CVars
TEXT("3: keyboard and gamepad navigation (gamepad input is consumed)"), TEXT("3: keyboard and gamepad navigation (gamepad input is consumed)"),
ECVF_Default); ECVF_Default);
TAutoConsoleVariable<int> DrawMouseCursor(TEXT("ImGui.DrawMouseCursor"), 0,
TEXT("Whether or not mouse cursor in input mode should be drawn by ImGui.\n")
TEXT("0: disabled, hardware cursor will be used (default)\n")
TEXT("1: enabled, ImGui will take care for drawing mouse cursor"),
ECVF_Default);
TAutoConsoleVariable<int> DebugWidget(TEXT("ImGui.Debug.Widget"), 0, TAutoConsoleVariable<int> DebugWidget(TEXT("ImGui.Debug.Widget"), 0,
TEXT("Show debug for SImGuiWidget.\n") TEXT("Show debug for SImGuiWidget.\n")
TEXT("0: disabled (default)\n") TEXT("0: disabled (default)\n")
@ -110,16 +104,23 @@ void SImGuiWidget::Construct(const FArguments& InArgs)
ContextProxy->OnDraw().AddRaw(this, &SImGuiWidget::OnDebugDraw); ContextProxy->OnDraw().AddRaw(this, &SImGuiWidget::OnDebugDraw);
ContextProxy->SetInputState(&InputState); ContextProxy->SetInputState(&InputState);
// Cache locally software cursor mode.
UpdateSoftwareCursorMode();
// Create ImGui Input Handler. // Create ImGui Input Handler.
CreateInputHandler(); CreateInputHandler();
RegisterInputHandlerChangedDelegate();
// Register for settings change.
RegisterImGuiSettingsDelegates();
} }
END_SLATE_FUNCTION_BUILD_OPTIMIZATION END_SLATE_FUNCTION_BUILD_OPTIMIZATION
SImGuiWidget::~SImGuiWidget() SImGuiWidget::~SImGuiWidget()
{ {
// Stop listening for settings change.
UnregisterImGuiSettingsDelegates();
// Release ImGui Input Handler. // Release ImGui Input Handler.
UnregisterInputHandlerChangedDelegate();
ReleaseInputHandler(); ReleaseInputHandler();
// Remove binding between this widget and its context proxy. // Remove binding between this widget and its context proxy.
@ -378,7 +379,7 @@ FCursorReply SImGuiWidget::OnCursorQuery(const FGeometry& MyGeometry, const FPoi
{ {
MouseCursor = MouseCursorOverride; MouseCursor = MouseCursorOverride;
} }
else if (CVars::DrawMouseCursor.GetValueOnGameThread() <= 0) else if (!bUseSoftwareCursor)
{ {
if (FImGuiContextProxy* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex)) if (FImGuiContextProxy* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex))
{ {
@ -412,7 +413,13 @@ void SImGuiWidget::RecreateInputHandler()
CreateInputHandler(); CreateInputHandler();
} }
void SImGuiWidget::RegisterInputHandlerChangedDelegate() void SImGuiWidget::UpdateSoftwareCursorMode()
{
UImGuiSettings* Settings = GetMutableDefault<UImGuiSettings>();
bUseSoftwareCursor = Settings && Settings->UseSoftwareCursor();
}
void SImGuiWidget::RegisterImGuiSettingsDelegates()
{ {
if (UImGuiSettings* Settings = GetMutableDefault<UImGuiSettings>()) if (UImGuiSettings* Settings = GetMutableDefault<UImGuiSettings>())
{ {
@ -420,14 +427,19 @@ void SImGuiWidget::RegisterInputHandlerChangedDelegate()
{ {
Settings->OnImGuiInputHandlerClassChanged.AddRaw(this, &SImGuiWidget::RecreateInputHandler); Settings->OnImGuiInputHandlerClassChanged.AddRaw(this, &SImGuiWidget::RecreateInputHandler);
} }
if (!Settings->OnSoftwareCursorChanged.IsBoundToObject(this))
{
Settings->OnSoftwareCursorChanged.AddRaw(this, &SImGuiWidget::UpdateSoftwareCursorMode);
}
} }
} }
void SImGuiWidget::UnregisterInputHandlerChangedDelegate() void SImGuiWidget::UnregisterImGuiSettingsDelegates()
{ {
if (UImGuiSettings* Settings = GetMutableDefault<UImGuiSettings>()) if (UImGuiSettings* Settings = GetMutableDefault<UImGuiSettings>())
{ {
Settings->OnImGuiInputHandlerClassChanged.RemoveAll(this); Settings->OnImGuiInputHandlerClassChanged.RemoveAll(this);
Settings->OnSoftwareCursorChanged.RemoveAll(this);
} }
} }
@ -476,7 +488,7 @@ void SImGuiWidget::SetMouseCursorOverride(EMouseCursor::Type InMouseCursorOverri
{ {
MouseCursorOverride = InMouseCursorOverride; MouseCursorOverride = InMouseCursorOverride;
FSlateApplication::Get().QueryCursor(); FSlateApplication::Get().QueryCursor();
InputState.SetMousePointer(MouseCursorOverride == EMouseCursor::None && IsDirectlyHovered() && CVars::DrawMouseCursor.GetValueOnGameThread() > 0); InputState.SetMousePointer(bUseSoftwareCursor && MouseCursorOverride == EMouseCursor::None && IsDirectlyHovered());
} }
} }
@ -581,7 +593,7 @@ void SImGuiWidget::UpdateInputMode(bool bHasKeyboardFocus, bool bHasMousePointer
} }
} }
InputState.SetMousePointer(MouseCursorOverride == EMouseCursor::None && bHasMousePointer && CVars::DrawMouseCursor.GetValueOnGameThread() > 0); InputState.SetMousePointer(bUseSoftwareCursor && MouseCursorOverride == EMouseCursor::None && bHasMousePointer);
} }
void SImGuiWidget::UpdateMouseStatus() void SImGuiWidget::UpdateMouseStatus()

View File

@ -91,8 +91,10 @@ private:
void ReleaseInputHandler(); void ReleaseInputHandler();
void RecreateInputHandler(); void RecreateInputHandler();
void RegisterInputHandlerChangedDelegate(); void UpdateSoftwareCursorMode();
void UnregisterInputHandlerChangedDelegate();
void RegisterImGuiSettingsDelegates();
void UnregisterImGuiSettingsDelegates();
// If needed, add to event reply a mouse lock or unlock request. // If needed, add to event reply a mouse lock or unlock request.
FORCEINLINE FReply WithMouseLockRequests(FReply&& Reply); FORCEINLINE FReply WithMouseLockRequests(FReply&& Reply);
@ -167,6 +169,9 @@ private:
bool bReceivedMouseEvent = false; bool bReceivedMouseEvent = false;
bool bMouseLock = false; bool bMouseLock = false;
// Whether or not ImGui should draw its own cursor.
bool bUseSoftwareCursor = false;
// Canvas map mode allows to zoom in/out and navigate between different parts of ImGui canvas. // Canvas map mode allows to zoom in/out and navigate between different parts of ImGui canvas.
bool bCanvasMapMode = false; bool bCanvasMapMode = false;