Clean-up in debug code:

- Added common debug config file for module-wide debug symbols and loggers.
- Added IMGUI_MODULE_DEVELOPER symbol to enable or disable module developer mode, that is intended to add additional module debug options hidden from normal usage.
- ImGui Widget debug is only available in developer mode because in normal usage it adds noise to ImGui console variables while not being very useful.
- Merged LogImGuiInputHandler and LogImGuiInputHandlerFactory loggers as they are part of the same feature.
- Renamed LogImGuiInputState to LogImGuiInput.
This commit is contained in:
Sebastian 2018-10-30 22:25:48 +00:00
parent 20d1490bd3
commit fc6fd2e498
7 changed files with 63 additions and 15 deletions

View File

@ -18,7 +18,8 @@
#endif // WITH_EDITOR #endif // WITH_EDITOR
DEFINE_LOG_CATEGORY_STATIC(LogImGuiInputHandler, Warning, All); DEFINE_LOG_CATEGORY(LogImGuiInputHandler);
FImGuiInputResponse UImGuiInputHandler::OnKeyDown(const FKeyEvent& KeyEvent) FImGuiInputResponse UImGuiInputHandler::OnKeyDown(const FKeyEvent& KeyEvent)
{ {

View File

@ -8,8 +8,6 @@
#include "ImGuiSettings.h" #include "ImGuiSettings.h"
DEFINE_LOG_CATEGORY_STATIC(LogImGuiInputHandlerFactory, Warning, All);
UImGuiInputHandler* FImGuiInputHandlerFactory::NewHandler(FImGuiModuleManager* ModuleManager, UGameViewportClient* GameViewport, int32 ContextIndex) UImGuiInputHandler* FImGuiInputHandlerFactory::NewHandler(FImGuiModuleManager* ModuleManager, UGameViewportClient* GameViewport, int32 ContextIndex)
{ {
UClass* HandlerClass = nullptr; UClass* HandlerClass = nullptr;
@ -22,7 +20,7 @@ UImGuiInputHandler* FImGuiInputHandlerFactory::NewHandler(FImGuiModuleManager* M
if (!HandlerClass) if (!HandlerClass)
{ {
UE_LOG(LogImGuiInputHandlerFactory, Error, TEXT("Couldn't load ImGui Input Handler class '%s'."), *HandlerClassReference.ToString()); UE_LOG(LogImGuiInputHandler, Error, TEXT("Couldn't load ImGui Input Handler class '%s'."), *HandlerClassReference.ToString());
} }
} }
} }
@ -40,7 +38,7 @@ UImGuiInputHandler* FImGuiInputHandlerFactory::NewHandler(FImGuiModuleManager* M
} }
else else
{ {
UE_LOG(LogImGuiInputHandlerFactory, Error, TEXT("Failed attempt to create Input Handler: HandlerClass = %s."), *GetNameSafe(HandlerClass)); UE_LOG(LogImGuiInputHandler, Error, TEXT("Failed attempt to create Input Handler: HandlerClass = %s."), *GetNameSafe(HandlerClass));
} }
return Handler; return Handler;

View File

@ -13,7 +13,7 @@
#define VALIDATE_INPUT_CHARACTERS 1 #define VALIDATE_INPUT_CHARACTERS 1
#if VALIDATE_INPUT_CHARACTERS #if VALIDATE_INPUT_CHARACTERS
DEFINE_LOG_CATEGORY_STATIC(LogImGuiInputState, Warning, All); DEFINE_LOG_CATEGORY_STATIC(LogImGuiInput, Warning, All);
#endif #endif
namespace namespace
@ -34,7 +34,7 @@ namespace
// truncations. // truncations.
static constexpr auto MinLimit = (std::numeric_limits<std::make_signed_t<ImWchar>>::min)(); static constexpr auto MinLimit = (std::numeric_limits<std::make_signed_t<ImWchar>>::min)();
static constexpr auto MaxLimit = (std::numeric_limits<std::make_unsigned_t<ImWchar>>::max)(); static constexpr auto MaxLimit = (std::numeric_limits<std::make_unsigned_t<ImWchar>>::max)();
UE_CLOG(!(Char >= MinLimit && Char <= MaxLimit), LogImGuiInputState, Error, UE_CLOG(!(Char >= MinLimit && Char <= MaxLimit), LogImGuiInput, Error,
TEXT("TCHAR value '%c' (%#x) is out of range %d (%#x) to %u (%#x) that can be safely converted to ImWchar. ") TEXT("TCHAR value '%c' (%#x) is out of range %d (%#x) to %u (%#x) that can be safely converted to ImWchar. ")
TEXT("If you wish to disable this validation, please set VALIDATE_INPUT_CHARACTERS in ImGuiInputState.cpp to 0."), TEXT("If you wish to disable this validation, please set VALIDATE_INPUT_CHARACTERS in ImGuiInputState.cpp to 0."),
Char, Char, MinLimit, MinLimit, MaxLimit, MaxLimit); Char, Char, MinLimit, MinLimit, MaxLimit, MaxLimit);

View File

@ -0,0 +1,16 @@
// Distributed under the MIT License (MIT) (see accompanying LICENSE file)
#pragma once
#include <Logging/LogMacros.h>
// Module-wide debug symbols and loggers.
// If enabled, it activates debug code and console variables that in normal usage are hidden.
#define IMGUI_MODULE_DEVELOPER 0
// Input Handler logger (used also in non-developer mode to raise problems with handler extensions).
DECLARE_LOG_CATEGORY_EXTERN(LogImGuiInputHandler, Warning, All);

View File

@ -1,8 +1,11 @@
// Distributed under the MIT License (MIT) (see accompanying LICENSE file) // Distributed under the MIT License (MIT) (see accompanying LICENSE file)
// Module-wide macros
#include "VersionCompatibility.h"
#include "ImGuiModuleDebug.h"
// Module // Module
#include "ImGuiModule.h" #include "ImGuiModule.h"
#include "VersionCompatibility.h"
// Engine // Engine
#include <Core.h> #include <Core.h>

View File

@ -25,8 +25,12 @@
constexpr int32 IMGUI_WIDGET_Z_ORDER = 10000; constexpr int32 IMGUI_WIDGET_Z_ORDER = 10000;
#if IMGUI_WIDGET_DEBUG
DEFINE_LOG_CATEGORY_STATIC(LogImGuiWidget, Warning, All); DEFINE_LOG_CATEGORY_STATIC(LogImGuiWidget, Warning, All);
#define IMGUI_WIDGET_LOG(Verbosity, Format, ...) UE_LOG(LogImGuiWidget, Verbosity, Format, __VA_ARGS__)
#define TEXT_INPUT_MODE(Val) (\ #define TEXT_INPUT_MODE(Val) (\
(Val) == EInputMode::Full ? TEXT("Full") :\ (Val) == EInputMode::Full ? TEXT("Full") :\
(Val) == EInputMode::MousePointerOnly ? TEXT("MousePointerOnly") :\ (Val) == EInputMode::MousePointerOnly ? TEXT("MousePointerOnly") :\
@ -34,6 +38,11 @@ DEFINE_LOG_CATEGORY_STATIC(LogImGuiWidget, Warning, All);
#define TEXT_BOOL(Val) ((Val) ? TEXT("true") : TEXT("false")) #define TEXT_BOOL(Val) ((Val) ? TEXT("true") : TEXT("false"))
#else
#define IMGUI_WIDGET_LOG(...)
#endif // IMGUI_WIDGET_DEBUG
namespace namespace
{ {
@ -61,7 +70,11 @@ namespace CVars
TEXT("2: gamepad navigation (gamepad input is consumed)\n") TEXT("2: gamepad navigation (gamepad input is consumed)\n")
TEXT("3: keyboard and gamepad navigation (gamepad input is consumed)"), TEXT("3: keyboard and gamepad navigation (gamepad input is consumed)"),
ECVF_Default); ECVF_Default);
}
#if IMGUI_WIDGET_DEBUG
namespace CVars
{
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")
@ -74,6 +87,7 @@ namespace CVars
TEXT("1: enabled"), TEXT("1: enabled"),
ECVF_Default); ECVF_Default);
} }
#endif // IMGUI_WIDGET_DEBUG
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SImGuiWidget::Construct(const FArguments& InArgs) void SImGuiWidget::Construct(const FArguments& InArgs)
@ -101,7 +115,9 @@ void SImGuiWidget::Construct(const FArguments& InArgs)
// Bind this widget to its context proxy. // Bind this widget to its context proxy.
auto* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex); auto* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex);
checkf(ContextProxy, TEXT("Missing context during widget construction: ContextIndex = %d"), ContextIndex); checkf(ContextProxy, TEXT("Missing context during widget construction: ContextIndex = %d"), ContextIndex);
#if IMGUI_WIDGET_DEBUG
ContextProxy->OnDraw().AddRaw(this, &SImGuiWidget::OnDebugDraw); ContextProxy->OnDraw().AddRaw(this, &SImGuiWidget::OnDebugDraw);
#endif // IMGUI_WIDGET_DEBUG
ContextProxy->SetInputState(&InputState); ContextProxy->SetInputState(&InputState);
// Cache locally software cursor mode. // Cache locally software cursor mode.
@ -126,7 +142,9 @@ SImGuiWidget::~SImGuiWidget()
// Remove binding between this widget and its context proxy. // Remove binding between this widget and its context proxy.
if (auto* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex)) if (auto* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex))
{ {
#if IMGUI_WIDGET_DEBUG
ContextProxy->OnDraw().RemoveAll(this); ContextProxy->OnDraw().RemoveAll(this);
#endif // IMGUI_WIDGET_DEBUG
ContextProxy->RemoveInputState(&InputState); ContextProxy->RemoveInputState(&InputState);
} }
@ -323,7 +341,7 @@ FReply SImGuiWidget::OnFocusReceived(const FGeometry& MyGeometry, const FFocusEv
{ {
Super::OnFocusReceived(MyGeometry, FocusEvent); Super::OnFocusReceived(MyGeometry, FocusEvent);
UE_LOG(LogImGuiWidget, VeryVerbose, TEXT("ImGui Widget %d - Focus Received."), ContextIndex); IMGUI_WIDGET_LOG(VeryVerbose, TEXT("ImGui Widget %d - Focus Received."), ContextIndex);
// If widget has a keyboard focus we always maintain mouse input. Technically, if mouse is outside of the widget // If widget has a keyboard focus we always maintain mouse input. Technically, if mouse is outside of the widget
// area it won't generate events but we freeze its state until it either comes back or input is completely lost. // area it won't generate events but we freeze its state until it either comes back or input is completely lost.
@ -337,7 +355,7 @@ void SImGuiWidget::OnFocusLost(const FFocusEvent& FocusEvent)
{ {
Super::OnFocusLost(FocusEvent); Super::OnFocusLost(FocusEvent);
UE_LOG(LogImGuiWidget, VeryVerbose, TEXT("ImGui Widget %d - Focus Lost."), ContextIndex); IMGUI_WIDGET_LOG(VeryVerbose, TEXT("ImGui Widget %d - Focus Lost."), ContextIndex);
UpdateInputMode(false, IsDirectlyHovered()); UpdateInputMode(false, IsDirectlyHovered());
} }
@ -346,7 +364,7 @@ void SImGuiWidget::OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent
{ {
Super::OnMouseEnter(MyGeometry, MouseEvent); Super::OnMouseEnter(MyGeometry, MouseEvent);
UE_LOG(LogImGuiWidget, VeryVerbose, TEXT("ImGui Widget %d - Mouse Enter."), ContextIndex); IMGUI_WIDGET_LOG(VeryVerbose, TEXT("ImGui Widget %d - Mouse Enter."), ContextIndex);
// If mouse enters while input is active then we need to update mouse buttons because there is a chance that we // If mouse enters while input is active then we need to update mouse buttons because there is a chance that we
// missed some events. // missed some events.
@ -365,7 +383,7 @@ void SImGuiWidget::OnMouseLeave(const FPointerEvent& MouseEvent)
{ {
Super::OnMouseLeave(MouseEvent); Super::OnMouseLeave(MouseEvent);
UE_LOG(LogImGuiWidget, VeryVerbose, TEXT("ImGui Widget %d - Mouse Leave."), ContextIndex); IMGUI_WIDGET_LOG(VeryVerbose, TEXT("ImGui Widget %d - Mouse Leave."), ContextIndex);
// We don't get any events when application loses focus, but often this is followed by OnMouseLeave, so we can use // We don't get any events when application loses focus, but often this is followed by OnMouseLeave, so we can use
// this event to immediately disable keyboard input if application lost focus. // this event to immediately disable keyboard input if application lost focus.
@ -497,7 +515,7 @@ void SImGuiWidget::SetVisibilityFromInputEnabled()
// If we don't use input disable hit test to make this widget invisible for cursors hit detection. // If we don't use input disable hit test to make this widget invisible for cursors hit detection.
SetVisibility(bInputEnabled ? EVisibility::Visible : EVisibility::HitTestInvisible); SetVisibility(bInputEnabled ? EVisibility::Visible : EVisibility::HitTestInvisible);
UE_LOG(LogImGuiWidget, VeryVerbose, TEXT("ImGui Widget %d - Visibility updated to '%s'."), IMGUI_WIDGET_LOG(VeryVerbose, TEXT("ImGui Widget %d - Visibility updated to '%s'."),
ContextIndex, *GetVisibility().ToString()); ContextIndex, *GetVisibility().ToString());
} }
@ -508,7 +526,7 @@ void SImGuiWidget::UpdateInputEnabled()
{ {
bInputEnabled = bEnabled; bInputEnabled = bEnabled;
UE_LOG(LogImGuiWidget, Log, TEXT("ImGui Widget %d - Input Enabled changed to '%s'."), IMGUI_WIDGET_LOG(Log, TEXT("ImGui Widget %d - Input Enabled changed to '%s'."),
ContextIndex, TEXT_BOOL(bInputEnabled)); ContextIndex, TEXT_BOOL(bInputEnabled));
SetVisibilityFromInputEnabled(); SetVisibilityFromInputEnabled();
@ -568,7 +586,7 @@ void SImGuiWidget::UpdateInputMode(bool bHasKeyboardFocus, bool bHasMousePointer
if (InputMode != NewInputMode) if (InputMode != NewInputMode)
{ {
UE_LOG(LogImGuiWidget, Verbose, TEXT("ImGui Widget %d - Input Mode changed from '%s' to '%s'."), IMGUI_WIDGET_LOG(Verbose, TEXT("ImGui Widget %d - Input Mode changed from '%s' to '%s'."),
ContextIndex, TEXT_INPUT_MODE(InputMode), TEXT_INPUT_MODE(NewInputMode)); ContextIndex, TEXT_INPUT_MODE(InputMode), TEXT_INPUT_MODE(NewInputMode));
// We need to reset input components if we are either fully shutting down or we are downgrading from full to // We need to reset input components if we are either fully shutting down or we are downgrading from full to
@ -1048,6 +1066,8 @@ FVector2D SImGuiWidget::ComputeDesiredSize(float) const
return FVector2D{ 3840.f, 2160.f }; return FVector2D{ 3840.f, 2160.f };
} }
#if IMGUI_WIDGET_DEBUG
static TArray<FKey> GetImGuiMappedKeys() static TArray<FKey> GetImGuiMappedKeys()
{ {
TArray<FKey> Keys; TArray<FKey> Keys;
@ -1329,3 +1349,7 @@ void SImGuiWidget::OnDebugDraw()
#undef TEXT_INPUT_MODE #undef TEXT_INPUT_MODE
#undef TEXT_BOOL #undef TEXT_BOOL
#endif // IMGUI_WIDGET_DEBUG
#undef IMGUI_WIDGET_LOG

View File

@ -3,10 +3,14 @@
#pragma once #pragma once
#include "ImGuiInputState.h" #include "ImGuiInputState.h"
#include "ImGuiModuleDebug.h"
#include <Widgets/SLeafWidget.h> #include <Widgets/SLeafWidget.h>
// Hide ImGui Widget debug in non-developer mode.
#define IMGUI_WIDGET_DEBUG IMGUI_MODULE_DEVELOPER
class FImGuiModuleManager; class FImGuiModuleManager;
class UImGuiInputHandler; class UImGuiInputHandler;
@ -151,7 +155,9 @@ private:
virtual FVector2D ComputeDesiredSize(float) const override; virtual FVector2D ComputeDesiredSize(float) const override;
#if IMGUI_WIDGET_DEBUG
void OnDebugDraw(); void OnDebugDraw();
#endif // IMGUI_WIDGET_DEBUG
FImGuiModuleManager* ModuleManager = nullptr; FImGuiModuleManager* ModuleManager = nullptr;
TWeakObjectPtr<UGameViewportClient> GameViewport; TWeakObjectPtr<UGameViewportClient> GameViewport;