Minor refactor

This commit is contained in:
Arnaud Jamin
2025-03-22 21:09:29 -04:00
parent 25690a4103
commit 3cdb23544b
6 changed files with 98 additions and 32 deletions
+62 -1
View File
@@ -1541,4 +1541,65 @@ bool FCogWidgets::InputChordProperty(UObject& InConfig, const FProperty& InInput
return FCogWidgets::InputChord(Name.Get(), *InputChord); return FCogWidgets::InputChord(Name.Get(), *InputChord);
} }
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWidgets::IsConfigContainingInputChords(const UObject& InConfig)
{
for (TFieldIterator<FProperty> It(InConfig.GetClass()); It; ++It)
{
if (const FStructProperty* StructProperty = CastField<FStructProperty>(*It))
{
if (StructProperty->Struct == FInputChord::StaticStruct())
{
return true;
}
}
}
return false;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWidgets::AllInputChordsOfConfig(UObject& InConfig, FProperty** InModifiedProperty)
{
bool HasChanged = false;
TArray<FProperty*> Properties;
for (TFieldIterator<FProperty> It(InConfig.GetClass()); It; ++It)
{
if (FStructProperty* StructProperty = CastField<FStructProperty>(*It))
{
if (StructProperty->Struct == FInputChord::StaticStruct())
{
if (FCogWidgets::InputChordProperty(InConfig, *StructProperty))
{
HasChanged = true;
if (InModifiedProperty != nullptr)
{
*InModifiedProperty = StructProperty;
}
}
}
}
}
return HasChanged;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWidgets::TextOfAllInputChordsOfConfig(UObject& InConfig)
{
TArray<FProperty*> Properties;
for (TFieldIterator<FProperty> It(InConfig.GetClass()); It; ++It)
{
if (const FStructProperty* StructProperty = CastField<FStructProperty>(*It))
{
if (StructProperty->Struct == FInputChord::StaticStruct())
{
TextInputChordProperty(InConfig, *StructProperty);
}
}
}
}
@@ -3,6 +3,7 @@
#include "CogDebug.h" #include "CogDebug.h"
#include "CogWindow_Settings.h" #include "CogWindow_Settings.h"
#include "CogSubsystem.h" #include "CogSubsystem.h"
#include "CogWidgets.h"
#include "Engine/World.h" #include "Engine/World.h"
#include "imgui_internal.h" #include "imgui_internal.h"
#include "GameFramework/Pawn.h" #include "GameFramework/Pawn.h"
@@ -254,3 +255,13 @@ float FCogWindow::GetDpiScale() const
{ {
return GetOwner()->GetContext().GetDpiScale(); return GetOwner()->GetContext().GetDpiScale();
} }
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindow::RenderConfigShortcuts(UCogCommonConfig& InConfig) const
{
FProperty* InModifiedProperty = nullptr;
if (FCogWidgets::AllInputChordsOfConfig(InConfig, &InModifiedProperty))
{
GetOwner()->RebindShortcut(InConfig, *InModifiedProperty);
}
}
@@ -244,32 +244,20 @@ void FCogWindow_Settings::RenderContent()
//------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------
if (ImGui::CollapsingHeader("Shortcuts", ImGuiTreeNodeFlags_DefaultOpen)) if (ImGui::CollapsingHeader("Shortcuts", ImGuiTreeNodeFlags_DefaultOpen))
{ {
TArray<TObjectPtr<UCogCommonConfig>>& Configs = GetOwner()->GetConfigs(); for (TObjectPtr SomeConfig : GetOwner()->GetConfigs())
for (TObjectPtr<UCogCommonConfig> SomeConfig : Configs)
{ {
TArray<FProperty*> Properties; if (SomeConfig == nullptr)
for (TFieldIterator<FProperty> It(SomeConfig->GetClass()); It; ++It) { continue; }
{
if (FStructProperty* StructProperty = CastField<FStructProperty>(*It)) if (FCogWidgets::IsConfigContainingInputChords(*SomeConfig))
{
if (StructProperty->Struct == FInputChord::StaticStruct())
{
Properties.Add(StructProperty);
}
}
}
if (Properties.Num() > 0)
{ {
auto ConfigName = StringCast<ANSICHAR>(*FCogWidgets::FormatConfigName(SomeConfig->GetClass()->GetName())); auto ConfigName = StringCast<ANSICHAR>(*FCogWidgets::FormatConfigName(SomeConfig->GetClass()->GetName()));
ImGui::SeparatorText(ConfigName.Get()); ImGui::SeparatorText(ConfigName.Get());
for (const FProperty* Property : Properties) FProperty* InModifiedProperty = nullptr;
if (FCogWidgets::AllInputChordsOfConfig(*SomeConfig, &InModifiedProperty))
{ {
if (FCogWidgets::InputChordProperty(*SomeConfig, *Property)) GetOwner()->RebindShortcut(*SomeConfig, *InModifiedProperty);
{
GetOwner()->RebindShortcut(*SomeConfig, *Property);
}
} }
} }
} }
@@ -188,6 +188,12 @@ public:
static void TextInputChordProperty(UObject& InConfig, const FProperty& InInputChordProperty); static void TextInputChordProperty(UObject& InConfig, const FProperty& InInputChordProperty);
static bool InputChordProperty(UObject& InConfig, const FProperty& InInputChordProperty); static bool InputChordProperty(UObject& InConfig, const FProperty& InInputChordProperty);
static bool IsConfigContainingInputChords(const UObject& InConfig);
static bool AllInputChordsOfConfig(UObject& InConfig, FProperty** InModifiedProperty = nullptr);
static void TextOfAllInputChordsOfConfig(UObject& InConfig);
}; };
template<typename EnumType> template<typename EnumType>
+4 -1
View File
@@ -79,6 +79,7 @@ public:
float GetDpiScale() const; float GetDpiScale() const;
template<class T> template<class T>
T* GetConfig(bool InResetConfigOnRequest = true) const { return Cast<T>(GetConfig(T::StaticClass(), InResetConfigOnRequest)); } T* GetConfig(bool InResetConfigOnRequest = true) const { return Cast<T>(GetConfig(T::StaticClass(), InResetConfigOnRequest)); }
@@ -117,7 +118,9 @@ protected:
virtual void OnSelectionChanged(AActor* OldSelection, AActor* NewSelection) {} virtual void OnSelectionChanged(AActor* OldSelection, AActor* NewSelection) {}
virtual bool IsWindowRenderedInMainMenu(); virtual bool IsWindowRenderedInMainMenu();
virtual void RenderConfigShortcuts(UCogCommonConfig& InConfig) const;
APawn* GetLocalPlayerPawn() const; APawn* GetLocalPlayerPawn() const;
APlayerController* GetLocalPlayerController() const; APlayerController* GetLocalPlayerController() const;
@@ -54,21 +54,21 @@ void FCogEngineWindow_TimeScale::RenderContent()
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_TimeScale::RenderContextMenu() void FCogEngineWindow_TimeScale::RenderContextMenu()
{ {
UCogEngineWindowConfig_TimeScale* ConfigPtr = Config.Get();
if (IsWindowRenderedInMainMenu() == false) if (IsWindowRenderedInMainMenu() == false)
{ {
ImGui::Checkbox("Inline", &Config->Inline); ImGui::Checkbox("Inline", &ConfigPtr->Inline);
} }
FCogImguiHelper::ColorEdit4("Time Scale Modified Color", Config->TimeScaleModifiedColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaPreviewHalf); FCogImguiHelper::ColorEdit4("Time Scale Modified Color", ConfigPtr->TimeScaleModifiedColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaPreviewHalf);
ImGui::SetItemTooltip("Color of the current time scale, in widget mode, when the time scale in not 1."); ImGui::SetItemTooltip("Color of the current time scale, in widget mode, when the time scale in not 1.");
FCogWidgets::FloatArray("Time Scales", Config->TimeScales, 10, ImVec2(0, ImGui::GetFontSize() * 10)); FCogWidgets::FloatArray("Time Scales", ConfigPtr->TimeScales, 10, ImVec2(0, ImGui::GetFontSize() * 10));
if (ImGui::CollapsingHeader("Shortcuts", ImGuiTreeNodeFlags_DefaultOpen)) if (ImGui::CollapsingHeader("Shortcuts", ImGuiTreeNodeFlags_DefaultOpen))
{ {
FCogWidgets::InputChord("Speed Up", Config->Shortcut_FasterTimeScale); RenderConfigShortcuts(*ConfigPtr);
FCogWidgets::InputChord("Speed Down", Config->Shortcut_SlowerTimeScale);
FCogWidgets::InputChord("Reset Time", Config->Shortcut_ResetTimeScale);
} }
ImGui::Separator(); ImGui::Separator();
@@ -134,10 +134,7 @@ void FCogEngineWindow_TimeScale::RenderMainMenuWidget()
ImGui::Text("Time Scale: x%g", TimeDilation); ImGui::Text("Time Scale: x%g", TimeDilation);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Separator(); ImGui::Separator();
FCogWidgets::TextInputChordProperty(Config.Get(), &UCogEngineWindowConfig_TimeScale::Shortcut_FasterTimeScale); FCogWidgets::TextOfAllInputChordsOfConfig(*Config.Get());
FCogWidgets::TextInputChordProperty(Config.Get(), &UCogEngineWindowConfig_TimeScale::Shortcut_SlowerTimeScale);
FCogWidgets::TextInputChordProperty(Config.Get(), &UCogEngineWindowConfig_TimeScale::Shortcut_ResetTimeScale);
FCogWidgets::TextInputChordProperty(Config.Get(), &UCogEngineWindowConfig_TimeScale::Shortcut_ZeroTimeScale);
ImGui::EndTooltip(); ImGui::EndTooltip();
} }
} }