mirror of
https://github.com/kevinporetti/UnrealImGui.git
synced 2025-01-18 08:20:32 +00:00
Added more options to control the canvas size:
- Canvas size can be set to custom width and height, desktop size or viewport size. - The old Adaptive Canvas Size is replaced by the viewport size type. - Custom and desktop size types can be also extended to the viewport size but they will never be smaller than their base sizes.
This commit is contained in:
parent
003eed34d7
commit
4c3905b348
160
Source/ImGui/Private/Editor/ImGuiCanvasSizeInfoCustomization.cpp
Normal file
160
Source/ImGui/Private/Editor/ImGuiCanvasSizeInfoCustomization.cpp
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
// Distributed under the MIT License (MIT) (see accompanying LICENSE file)
|
||||||
|
|
||||||
|
#include "ImGuiPrivatePCH.h"
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
|
||||||
|
#include "ImGuiCanvasSizeInfoCustomization.h"
|
||||||
|
|
||||||
|
#include "ImGuiModuleSettings.h"
|
||||||
|
|
||||||
|
#include <PropertyCustomizationHelpers.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define LOCTEXT_NAMESPACE "ImGuiEditor"
|
||||||
|
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
EImGuiCanvasSizeType GetCanvasSizeTypeEnumValue(const TSharedPtr<IPropertyHandle>& TypeHandle)
|
||||||
|
{
|
||||||
|
uint8 ValueAsByte = 0;
|
||||||
|
if (TypeHandle.IsValid())
|
||||||
|
{
|
||||||
|
TypeHandle->GetValue(ValueAsByte);
|
||||||
|
}
|
||||||
|
return static_cast<EImGuiCanvasSizeType>(ValueAsByte);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsAny(const TSharedPtr<IPropertyHandle>& TypeHandle, EImGuiCanvasSizeType Value)
|
||||||
|
{
|
||||||
|
return GetCanvasSizeTypeEnumValue(TypeHandle) == Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename... TRest>
|
||||||
|
bool IsAny(const TSharedPtr<IPropertyHandle>& TypeHandle, EImGuiCanvasSizeType First, TRest... Rest)
|
||||||
|
{
|
||||||
|
return IsAny(TypeHandle, First) || IsAny(TypeHandle, Rest...);
|
||||||
|
}
|
||||||
|
|
||||||
|
float ShowToHeight(bool bShow)
|
||||||
|
{
|
||||||
|
return bShow ? 0.f /* Infinity */ : SMALL_NUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
|
EVisibility ShowToVisibility(bool bShow)
|
||||||
|
{
|
||||||
|
return bShow ? EVisibility::SelfHitTestInvisible : EVisibility::Hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
// FImGuiKeyInfoCustomization implementation
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TSharedRef<IPropertyTypeCustomization> FImGuiCanvasSizeInfoCustomization::MakeInstance()
|
||||||
|
{
|
||||||
|
return MakeShareable(new FImGuiCanvasSizeInfoCustomization);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FImGuiCanvasSizeInfoCustomization::CustomizeHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
|
||||||
|
{
|
||||||
|
TSharedPtr<IPropertyHandle> TypeHandle = InStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FImGuiCanvasSizeInfo, SizeType));
|
||||||
|
TSharedPtr<IPropertyHandle> WidthHandle = InStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FImGuiCanvasSizeInfo, Width));
|
||||||
|
TSharedPtr<IPropertyHandle> HeightHandle = InStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FImGuiCanvasSizeInfo, Height));
|
||||||
|
TSharedPtr<IPropertyHandle> ExtendToViewportHandle = InStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FImGuiCanvasSizeInfo, bExtendToViewport));
|
||||||
|
|
||||||
|
#define ADD_DIMENSION_SLOT(Handle, LPadding) \
|
||||||
|
+ SHorizontalBox::Slot()\
|
||||||
|
.Padding(LPadding, 0.f, 0.f, 0.f)\
|
||||||
|
.HAlign(HAlign_Fill)\
|
||||||
|
.MaxWidth(80.f)\
|
||||||
|
[\
|
||||||
|
SNew(SVerticalBox)\
|
||||||
|
+ SVerticalBox::Slot()\
|
||||||
|
.AutoHeight()\
|
||||||
|
[\
|
||||||
|
Handle->CreatePropertyNameWidget()\
|
||||||
|
]\
|
||||||
|
+ SVerticalBox::Slot()\
|
||||||
|
.HAlign(HAlign_Fill)\
|
||||||
|
.AutoHeight()\
|
||||||
|
[\
|
||||||
|
Handle->CreatePropertyValueWidget()\
|
||||||
|
]\
|
||||||
|
]
|
||||||
|
|
||||||
|
auto SizeRowHeight = TAttribute<float>::Create([TypeHandle]()
|
||||||
|
{
|
||||||
|
return ShowToHeight(IsAny(TypeHandle, EImGuiCanvasSizeType::Custom));
|
||||||
|
});
|
||||||
|
|
||||||
|
auto SizeRowVisibility = TAttribute<EVisibility>::Create([TypeHandle]()
|
||||||
|
{
|
||||||
|
return ShowToVisibility(IsAny(TypeHandle, EImGuiCanvasSizeType::Custom));
|
||||||
|
});
|
||||||
|
|
||||||
|
auto ExtendRowHeight = TAttribute<float>::Create([TypeHandle]()
|
||||||
|
{
|
||||||
|
return ShowToHeight(IsAny(TypeHandle, EImGuiCanvasSizeType::Custom, EImGuiCanvasSizeType::Desktop));
|
||||||
|
});
|
||||||
|
|
||||||
|
auto ExtendRowVisibility = TAttribute<EVisibility>::Create([TypeHandle]()
|
||||||
|
{
|
||||||
|
return ShowToVisibility(IsAny(TypeHandle, EImGuiCanvasSizeType::Custom, EImGuiCanvasSizeType::Desktop));
|
||||||
|
});
|
||||||
|
|
||||||
|
HeaderRow
|
||||||
|
.NameContent()
|
||||||
|
[
|
||||||
|
InStructPropertyHandle->CreatePropertyNameWidget()
|
||||||
|
]
|
||||||
|
.ValueContent()
|
||||||
|
.MinDesiredWidth(168.f)
|
||||||
|
[
|
||||||
|
SNew(SVerticalBox)
|
||||||
|
+ SVerticalBox::Slot()
|
||||||
|
.AutoHeight()
|
||||||
|
[
|
||||||
|
TypeHandle->CreatePropertyValueWidget()
|
||||||
|
]
|
||||||
|
+ SVerticalBox::Slot()
|
||||||
|
.AutoHeight()
|
||||||
|
.MaxHeight(SizeRowHeight)
|
||||||
|
[
|
||||||
|
SNew(SHorizontalBox)
|
||||||
|
.Visibility(SizeRowVisibility)
|
||||||
|
ADD_DIMENSION_SLOT(WidthHandle, 0.f)
|
||||||
|
ADD_DIMENSION_SLOT(HeightHandle, 6.f)
|
||||||
|
]
|
||||||
|
+ SVerticalBox::Slot()
|
||||||
|
.AutoHeight()
|
||||||
|
.MaxHeight(ExtendRowHeight)
|
||||||
|
[
|
||||||
|
SNew(SHorizontalBox)
|
||||||
|
.Visibility(ExtendRowVisibility)
|
||||||
|
+ SHorizontalBox::Slot()
|
||||||
|
.AutoWidth()
|
||||||
|
[
|
||||||
|
ExtendToViewportHandle->CreatePropertyValueWidget()
|
||||||
|
]
|
||||||
|
+ SHorizontalBox::Slot()
|
||||||
|
.Padding(4.f, 0.f, 0.f, 0.f)
|
||||||
|
.AutoWidth()
|
||||||
|
[
|
||||||
|
ExtendToViewportHandle->CreatePropertyNameWidget()
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
#undef ADD_DIMENSION_SLOT
|
||||||
|
}
|
||||||
|
|
||||||
|
void FImGuiCanvasSizeInfoCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> InStructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#undef LOCTEXT_NAMESPACE
|
||||||
|
|
||||||
|
#endif // WITH_EDITOR
|
@ -0,0 +1,22 @@
|
|||||||
|
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
|
||||||
|
#include <IPropertyTypeCustomization.h>
|
||||||
|
#include <PropertyHandle.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Property type customization for FImGuiCanvasSizeInfo.
|
||||||
|
class FImGuiCanvasSizeInfoCustomization : public IPropertyTypeCustomization
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static TSharedRef<IPropertyTypeCustomization> MakeInstance();
|
||||||
|
|
||||||
|
// IPropertyTypeCustomization interface
|
||||||
|
virtual void CustomizeHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override;
|
||||||
|
virtual void CustomizeChildren(TSharedRef<IPropertyHandle> InStructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // WITH_EDITOR
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "ImGuiEditor.h"
|
#include "ImGuiEditor.h"
|
||||||
|
|
||||||
|
#include "ImGuiCanvasSizeInfoCustomization.h"
|
||||||
#include "ImGuiKeyInfoCustomization.h"
|
#include "ImGuiKeyInfoCustomization.h"
|
||||||
#include "ImGuiModuleSettings.h"
|
#include "ImGuiModuleSettings.h"
|
||||||
|
|
||||||
@ -69,6 +70,8 @@ void FImGuiEditor::Register()
|
|||||||
{
|
{
|
||||||
bCustomPropertyTypeLayoutsRegistered = true;
|
bCustomPropertyTypeLayoutsRegistered = true;
|
||||||
|
|
||||||
|
PropertyModule->RegisterCustomPropertyTypeLayout("ImGuiCanvasSizeInfo",
|
||||||
|
FOnGetPropertyTypeCustomizationInstance::CreateStatic(&FImGuiCanvasSizeInfoCustomization::MakeInstance));
|
||||||
PropertyModule->RegisterCustomPropertyTypeLayout("ImGuiKeyInfo",
|
PropertyModule->RegisterCustomPropertyTypeLayout("ImGuiKeyInfo",
|
||||||
FOnGetPropertyTypeCustomizationInstance::CreateStatic(&FImGuiKeyInfoCustomization::MakeInstance));
|
FOnGetPropertyTypeCustomizationInstance::CreateStatic(&FImGuiKeyInfoCustomization::MakeInstance));
|
||||||
}
|
}
|
||||||
@ -93,6 +96,7 @@ void FImGuiEditor::Unregister()
|
|||||||
|
|
||||||
if (FPropertyEditorModule* PropertyModule = GetPropertyEditorModule())
|
if (FPropertyEditorModule* PropertyModule = GetPropertyEditorModule())
|
||||||
{
|
{
|
||||||
|
PropertyModule->UnregisterCustomPropertyTypeLayout("ImGuiCanvasSizeInfo");
|
||||||
PropertyModule->UnregisterCustomPropertyTypeLayout("ImGuiKeyInfo");
|
PropertyModule->UnregisterCustomPropertyTypeLayout("ImGuiKeyInfo");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ void FImGuiModuleSettings::UpdateSettings()
|
|||||||
SetShareMouseInput(SettingsObject->bShareMouseInput);
|
SetShareMouseInput(SettingsObject->bShareMouseInput);
|
||||||
SetUseSoftwareCursor(SettingsObject->bUseSoftwareCursor);
|
SetUseSoftwareCursor(SettingsObject->bUseSoftwareCursor);
|
||||||
SetToggleInputKey(SettingsObject->ToggleInput);
|
SetToggleInputKey(SettingsObject->ToggleInput);
|
||||||
SetAdaptiveCanvasSize(SettingsObject->bAdaptiveCanvasSize);
|
SetCanvasSizeInfo(SettingsObject->CanvasSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,11 +161,11 @@ void FImGuiModuleSettings::SetToggleInputKey(const FImGuiKeyInfo& KeyInfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FImGuiModuleSettings::SetAdaptiveCanvasSize(bool bAdaptive)
|
void FImGuiModuleSettings::SetCanvasSizeInfo(const FImGuiCanvasSizeInfo& CanvasSizeInfo)
|
||||||
{
|
{
|
||||||
if (bAdaptiveCanvasSize != bAdaptive)
|
if (CanvasSize != CanvasSizeInfo)
|
||||||
{
|
{
|
||||||
bAdaptiveCanvasSize = bAdaptive;
|
CanvasSize = CanvasSizeInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,47 @@ struct FImGuiKeyInfo
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EImGuiCanvasSizeType : uint8
|
||||||
|
{
|
||||||
|
Custom UMETA(ToolTip = "Canvas will have a custom width and height."),
|
||||||
|
Desktop UMETA(ToolTip = "Canvas will have the same width and height as the desktop."),
|
||||||
|
Viewport UMETA(ToolTip = "Canvas will always have the same width and height as the viewport."),
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct with information how to calculate canvas size.
|
||||||
|
*/
|
||||||
|
USTRUCT()
|
||||||
|
struct FImGuiCanvasSizeInfo
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
// Select how to specify canvas size.
|
||||||
|
UPROPERTY(EditAnywhere, Category = "Canvas Size")
|
||||||
|
EImGuiCanvasSizeType SizeType = EImGuiCanvasSizeType::Desktop;
|
||||||
|
|
||||||
|
// Custom canvas width.
|
||||||
|
UPROPERTY(EditAnywhere, Category = "Canvas Size", meta = (ClampMin = 0, UIMin = 0))
|
||||||
|
int32 Width = 3840;
|
||||||
|
|
||||||
|
// Custom canvas height.
|
||||||
|
UPROPERTY(EditAnywhere, Category = "Canvas Size", meta = (ClampMin = 0, UIMin = 0))
|
||||||
|
int32 Height = 2160;
|
||||||
|
|
||||||
|
// If this is true, canvas width or height may be extended, if the viewport size is larger.
|
||||||
|
UPROPERTY(EditAnywhere, Category = "Canvas Size", meta = (ClampMin = 0, UIMin = 0))
|
||||||
|
bool bExtendToViewport = true;
|
||||||
|
|
||||||
|
bool operator==(const FImGuiCanvasSizeInfo& Other) const
|
||||||
|
{
|
||||||
|
return (SizeType == Other.SizeType) && (Width == Other.Width)
|
||||||
|
&& (Height == Other.Height) && (bExtendToViewport == Other.bExtendToViewport);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const FImGuiCanvasSizeInfo& Other) const { return !(*this == Other); }
|
||||||
|
};
|
||||||
|
|
||||||
// UObject used for loading and saving ImGui settings. To access actual settings use FImGuiModuleSettings interface.
|
// UObject used for loading and saving ImGui settings. To access actual settings use FImGuiModuleSettings interface.
|
||||||
UCLASS(config=ImGui, defaultconfig)
|
UCLASS(config=ImGui, defaultconfig)
|
||||||
class UImGuiSettings : public UObject
|
class UImGuiSettings : public UObject
|
||||||
@ -103,9 +144,9 @@ protected:
|
|||||||
UPROPERTY(EditAnywhere, config, Category = "Keyboard Shortcuts")
|
UPROPERTY(EditAnywhere, config, Category = "Keyboard Shortcuts")
|
||||||
FImGuiKeyInfo ToggleInput;
|
FImGuiKeyInfo ToggleInput;
|
||||||
|
|
||||||
// If true, the size of ImGui canvas will be adaptive to game viewport.
|
// Chose how to define the ImGui canvas size. Select between custom, desktop and viewport.
|
||||||
UPROPERTY(EditAnywhere, config, Category = "Canvas Size")
|
UPROPERTY(EditAnywhere, config, Category = "Canvas Size")
|
||||||
bool bAdaptiveCanvasSize = false;
|
FImGuiCanvasSizeInfo CanvasSize;
|
||||||
|
|
||||||
// Deprecated name for ToggleInput. Kept temporarily to automatically move old configuration.
|
// Deprecated name for ToggleInput. Kept temporarily to automatically move old configuration.
|
||||||
UPROPERTY(config)
|
UPROPERTY(config)
|
||||||
@ -152,8 +193,8 @@ public:
|
|||||||
// Get the shortcut configuration for 'ImGui.ToggleInput' command.
|
// Get the shortcut configuration for 'ImGui.ToggleInput' command.
|
||||||
const FImGuiKeyInfo& GetToggleInputKey() const { return ToggleInputKey; }
|
const FImGuiKeyInfo& GetToggleInputKey() const { return ToggleInputKey; }
|
||||||
|
|
||||||
// Get the adaptive canvas size configuration.
|
// Get the information how to calculate the canvas size.
|
||||||
bool AdaptiveCanvasSize() const { return bAdaptiveCanvasSize; }
|
const FImGuiCanvasSizeInfo& GetCanvasSizeInfo() const { return CanvasSize; }
|
||||||
|
|
||||||
// Delegate raised when ImGui Input Handle is changed.
|
// Delegate raised when ImGui Input Handle is changed.
|
||||||
FStringClassReferenceChangeDelegate OnImGuiInputHandlerClassChanged;
|
FStringClassReferenceChangeDelegate OnImGuiInputHandlerClassChanged;
|
||||||
@ -171,7 +212,7 @@ private:
|
|||||||
void SetShareMouseInput(bool bShare);
|
void SetShareMouseInput(bool bShare);
|
||||||
void SetUseSoftwareCursor(bool bUse);
|
void SetUseSoftwareCursor(bool bUse);
|
||||||
void SetToggleInputKey(const FImGuiKeyInfo& KeyInfo);
|
void SetToggleInputKey(const FImGuiKeyInfo& KeyInfo);
|
||||||
void SetAdaptiveCanvasSize(bool bAdaptive);
|
void SetCanvasSizeInfo(const FImGuiCanvasSizeInfo& CanvasSizeInfo);
|
||||||
|
|
||||||
#if WITH_EDITOR
|
#if WITH_EDITOR
|
||||||
void OnPropertyChanged(class UObject* ObjectBeingModified, struct FPropertyChangedEvent& PropertyChangedEvent);
|
void OnPropertyChanged(class UObject* ObjectBeingModified, struct FPropertyChangedEvent& PropertyChangedEvent);
|
||||||
@ -182,9 +223,9 @@ private:
|
|||||||
|
|
||||||
FStringClassReference ImGuiInputHandlerClass;
|
FStringClassReference ImGuiInputHandlerClass;
|
||||||
FImGuiKeyInfo ToggleInputKey;
|
FImGuiKeyInfo ToggleInputKey;
|
||||||
|
FImGuiCanvasSizeInfo CanvasSize;
|
||||||
bool bShareKeyboardInput = false;
|
bool bShareKeyboardInput = false;
|
||||||
bool bShareGamepadInput = false;
|
bool bShareGamepadInput = false;
|
||||||
bool bShareMouseInput = false;
|
bool bShareMouseInput = false;
|
||||||
bool bUseSoftwareCursor = false;
|
bool bUseSoftwareCursor = false;
|
||||||
bool bAdaptiveCanvasSize = false;
|
|
||||||
};
|
};
|
||||||
|
@ -84,7 +84,7 @@ void SImGuiWidget::Construct(const FArguments& InArgs)
|
|||||||
const auto& Settings = ModuleManager->GetSettings();
|
const auto& Settings = ModuleManager->GetSettings();
|
||||||
SetHideMouseCursor(Settings.UseSoftwareCursor());
|
SetHideMouseCursor(Settings.UseSoftwareCursor());
|
||||||
CreateInputHandler(Settings.GetImGuiInputHandlerClass());
|
CreateInputHandler(Settings.GetImGuiInputHandlerClass());
|
||||||
SetAdaptiveCanvasSize(Settings.AdaptiveCanvasSize());
|
SetCanvasSizeInfo(Settings.GetCanvasSizeInfo());
|
||||||
|
|
||||||
// Initialize state.
|
// Initialize state.
|
||||||
UpdateVisibility();
|
UpdateVisibility();
|
||||||
@ -498,15 +498,40 @@ void SImGuiWidget::HandleWindowFocusLost()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SImGuiWidget::SetAdaptiveCanvasSize(bool bEnabled)
|
void SImGuiWidget::SetCanvasSizeInfo(const FImGuiCanvasSizeInfo& CanvasSizeInfo)
|
||||||
{
|
{
|
||||||
if (bAdaptiveCanvasSize != bEnabled)
|
switch (CanvasSizeInfo.SizeType)
|
||||||
{
|
{
|
||||||
bAdaptiveCanvasSize = bEnabled;
|
case EImGuiCanvasSizeType::Custom:
|
||||||
|
MinCanvasSize = { static_cast<float>(CanvasSizeInfo.Width), static_cast<float>(CanvasSizeInfo.Height) };
|
||||||
|
bAdaptiveCanvasSize = CanvasSizeInfo.bExtendToViewport;
|
||||||
|
bCanvasControlEnabled = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EImGuiCanvasSizeType::Desktop:
|
||||||
|
MinCanvasSize = (GEngine && GEngine->GameUserSettings)
|
||||||
|
? GEngine->GameUserSettings->GetDesktopResolution() : FVector2D::ZeroVector;
|
||||||
|
bAdaptiveCanvasSize = CanvasSizeInfo.bExtendToViewport;
|
||||||
|
bCanvasControlEnabled = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EImGuiCanvasSizeType::Viewport:
|
||||||
|
default:
|
||||||
|
MinCanvasSize = FVector2D::ZeroVector;
|
||||||
|
bAdaptiveCanvasSize = true;
|
||||||
|
bCanvasControlEnabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We only update canvas control widget when canvas control is enabled. Make sure that we will not leave
|
||||||
|
// that widget active after disabling canvas control.
|
||||||
|
if (CanvasControlWidget && !bCanvasControlEnabled)
|
||||||
|
{
|
||||||
|
CanvasControlWidget->SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
bUpdateCanvasSize = true;
|
bUpdateCanvasSize = true;
|
||||||
UpdateCanvasSize();
|
UpdateCanvasSize();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void SImGuiWidget::UpdateCanvasSize()
|
void SImGuiWidget::UpdateCanvasSize()
|
||||||
{
|
{
|
||||||
@ -514,28 +539,30 @@ void SImGuiWidget::UpdateCanvasSize()
|
|||||||
{
|
{
|
||||||
if (auto* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex))
|
if (auto* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex))
|
||||||
{
|
{
|
||||||
if (bAdaptiveCanvasSize)
|
CanvasSize = MinCanvasSize;
|
||||||
|
if (bAdaptiveCanvasSize && GameViewport.IsValid())
|
||||||
{
|
{
|
||||||
if (GameViewport.IsValid())
|
FVector2D ViewportSize;
|
||||||
{
|
GameViewport->GetViewportSize(ViewportSize);
|
||||||
FVector2D DisplaySize;
|
CanvasSize = FVector2D::Max(CanvasSize, ViewportSize);
|
||||||
GameViewport->GetViewportSize(DisplaySize);
|
|
||||||
ContextProxy->SetDisplaySize(DisplaySize);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ContextProxy->ResetDisplaySize();
|
// No need for more updates, if we successfully processed fixed-canvas size.
|
||||||
// No need for more updates, if we successfully processed fixed-canvas mode.
|
|
||||||
bUpdateCanvasSize = false;
|
bUpdateCanvasSize = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ContextProxy->SetDisplaySize(CanvasSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SImGuiWidget::UpdateCanvasControlMode(const FInputEvent& InputEvent)
|
void SImGuiWidget::UpdateCanvasControlMode(const FInputEvent& InputEvent)
|
||||||
{
|
{
|
||||||
CanvasControlWidget->SetActive(!bAdaptiveCanvasSize && InputEvent.IsLeftAltDown() && InputEvent.IsLeftShiftDown());
|
if (bCanvasControlEnabled)
|
||||||
|
{
|
||||||
|
CanvasControlWidget->SetActive(InputEvent.IsLeftAltDown() && InputEvent.IsLeftShiftDown());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SImGuiWidget::OnPostImGuiUpdate()
|
void SImGuiWidget::OnPostImGuiUpdate()
|
||||||
@ -628,7 +655,7 @@ int32 SImGuiWidget::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeo
|
|||||||
|
|
||||||
FVector2D SImGuiWidget::ComputeDesiredSize(float Scale) const
|
FVector2D SImGuiWidget::ComputeDesiredSize(float Scale) const
|
||||||
{
|
{
|
||||||
return FVector2D{ 3840.f, 2160.f } * Scale;
|
return CanvasSize * Scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IMGUI_WIDGET_DEBUG
|
#if IMGUI_WIDGET_DEBUG
|
||||||
@ -744,6 +771,13 @@ namespace TwoColumns
|
|||||||
LabelText(Label); ImGui::NextColumn();
|
LabelText(Label); ImGui::NextColumn();
|
||||||
ImGui::Text("%ls", Value); ImGui::NextColumn();
|
ImGui::Text("%ls", Value); ImGui::NextColumn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename LabelType>
|
||||||
|
static void ValueWidthHeight(LabelType&& Label, const FVector2D& Value)
|
||||||
|
{
|
||||||
|
LabelText(Label); ImGui::NextColumn();
|
||||||
|
ImGui::Text("Width = %.0f, Height = %.0f", Value.X, Value.Y); ImGui::NextColumn();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Styles
|
namespace Styles
|
||||||
@ -770,11 +804,19 @@ void SImGuiWidget::OnDebugDraw()
|
|||||||
if (CVars::DebugWidget.GetValueOnGameThread() > 0)
|
if (CVars::DebugWidget.GetValueOnGameThread() > 0)
|
||||||
{
|
{
|
||||||
bool bDebug = true;
|
bool bDebug = true;
|
||||||
ImGui::SetNextWindowSize(ImVec2(380, 480), ImGuiSetCond_Once);
|
ImGui::SetNextWindowSize(ImVec2(380, 480), ImGuiCond_Once);
|
||||||
if (ImGui::Begin("ImGui Widget Debug", &bDebug))
|
if (ImGui::Begin("ImGui Widget Debug", &bDebug))
|
||||||
{
|
{
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
|
|
||||||
|
TwoColumns::CollapsingGroup("Canvas Size", [&]()
|
||||||
|
{
|
||||||
|
TwoColumns::Value("Is Adaptive", bAdaptiveCanvasSize);
|
||||||
|
TwoColumns::Value("Is Updating", bUpdateCanvasSize);
|
||||||
|
TwoColumns::ValueWidthHeight("Min Canvas Size", MinCanvasSize);
|
||||||
|
TwoColumns::ValueWidthHeight("Canvas Size", CanvasSize);
|
||||||
|
});
|
||||||
|
|
||||||
TwoColumns::CollapsingGroup("Context", [&]()
|
TwoColumns::CollapsingGroup("Context", [&]()
|
||||||
{
|
{
|
||||||
TwoColumns::Value("Context Index", ContextIndex);
|
TwoColumns::Value("Context Index", ContextIndex);
|
||||||
@ -821,7 +863,7 @@ void SImGuiWidget::OnDebugDraw()
|
|||||||
FImGuiInputState& InputState = ContextProxy->GetInputState();
|
FImGuiInputState& InputState = ContextProxy->GetInputState();
|
||||||
|
|
||||||
bool bDebug = true;
|
bool bDebug = true;
|
||||||
ImGui::SetNextWindowSize(ImVec2(460, 480), ImGuiSetCond_Once);
|
ImGui::SetNextWindowSize(ImVec2(460, 480), ImGuiCond_Once);
|
||||||
if (ImGui::Begin("ImGui Input State", &bDebug))
|
if (ImGui::Begin("ImGui Input State", &bDebug))
|
||||||
{
|
{
|
||||||
const ImVec4 HiglightColor{ 1.f, 1.f, 0.5f, 1.f };
|
const ImVec4 HiglightColor{ 1.f, 1.f, 0.5f, 1.f };
|
||||||
|
@ -103,7 +103,7 @@ private:
|
|||||||
void UpdateTransparentMouseInput(const FGeometry& AllottedGeometry);
|
void UpdateTransparentMouseInput(const FGeometry& AllottedGeometry);
|
||||||
void HandleWindowFocusLost();
|
void HandleWindowFocusLost();
|
||||||
|
|
||||||
void SetAdaptiveCanvasSize(bool bEnabled);
|
void SetCanvasSizeInfo(const FImGuiCanvasSizeInfo& CanvasSizeInfo);
|
||||||
void UpdateCanvasSize();
|
void UpdateCanvasSize();
|
||||||
|
|
||||||
void UpdateCanvasControlMode(const FInputEvent& InputEvent);
|
void UpdateCanvasControlMode(const FInputEvent& InputEvent);
|
||||||
@ -134,12 +134,16 @@ private:
|
|||||||
|
|
||||||
int32 ContextIndex = 0;
|
int32 ContextIndex = 0;
|
||||||
|
|
||||||
|
FVector2D MinCanvasSize = FVector2D::ZeroVector;
|
||||||
|
FVector2D CanvasSize = FVector2D::ZeroVector;
|
||||||
|
|
||||||
bool bInputEnabled = false;
|
bool bInputEnabled = false;
|
||||||
bool bForegroundWindow = false;
|
bool bForegroundWindow = false;
|
||||||
bool bHideMouseCursor = true;
|
bool bHideMouseCursor = true;
|
||||||
bool bTransparentMouseInput = false;
|
bool bTransparentMouseInput = false;
|
||||||
bool bAdaptiveCanvasSize = false;
|
bool bAdaptiveCanvasSize = false;
|
||||||
bool bUpdateCanvasSize = false;
|
bool bUpdateCanvasSize = false;
|
||||||
|
bool bCanvasControlEnabled = false;
|
||||||
|
|
||||||
TSharedPtr<SImGuiCanvasControl> CanvasControlWidget;
|
TSharedPtr<SImGuiCanvasControl> CanvasControlWidget;
|
||||||
TWeakPtr<SWidget> PreviousUserFocusedWidget;
|
TWeakPtr<SWidget> PreviousUserFocusedWidget;
|
||||||
|
Loading…
Reference in New Issue
Block a user