Skip to content

Commit 7f73697

Browse files
authored
Merge pull request #7 from JanSeliv/develop
Develop
2 parents 9037e3c + ceb8383 commit 7f73697

File tree

45 files changed

+838
-275
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+838
-275
lines changed
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Binaries/Win64/UnrealEditor.modules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"BuildId": "27405482",
2+
"BuildId": "33043543",
33
"Modules":
44
{
55
"SettingsWidgetConstructor": "UnrealEditor-SettingsWidgetConstructor.dll",

Config/BaseSettingsWidgetConstructor.ini

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
[/Script/SettingsWidgetConstructorEditor.SettingsWidgetFactory]
2-
SettingsWidgetClassInternal=WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/WBP_SettingsWidgetConstructor.WBP_SettingsWidgetConstructor_C'
2+
SettingsWidgetClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/WBP_SettingsWidgetConstructor.WBP_SettingsWidgetConstructor_C'
33

44
[/Script/SettingsWidgetConstructor.SettingsDataAsset]
55
SettingsDataTableInternal=
66
SettingsDataRegistryInternal=/SettingsWidgetConstructor/Data/DR_SettingsDataTables.DR_SettingsDataTables
7-
ButtonClassInternal=WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsButton.WBP_SettingsButton_C'
8-
CheckboxClassInternal=WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsCheckBox.WBP_SettingsCheckBox_C'
9-
ComboboxClassInternal=WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsCombobox.WBP_SettingsCombobox_C'
10-
SliderClassInternal=WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsSlider.WBP_SettingsSlider_C'
11-
TextLineClassInternal=WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsTextLine.WBP_SettingsTextLine_C'
12-
UserInputClassInternal=WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsTextInput.WBP_SettingsTextInput_C'
7+
ButtonClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsButton.WBP_SettingsButton_C'
8+
CheckboxClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsCheckBox.WBP_SettingsCheckBox_C'
9+
ComboboxClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsCombobox.WBP_SettingsCombobox_C'
10+
SliderClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsSlider.WBP_SettingsSlider_C'
11+
TextLineClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsTextLine.WBP_SettingsTextLine_C'
12+
UserInputClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsTextInput.WBP_SettingsTextInput_C'
13+
TooltipClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsToolTip.WBP_SettingsToolTip_C'
14+
ColumnClassInternal=/Script/UMG.WidgetBlueprintGeneratedClass'/SettingsWidgetConstructor/Subwidgets/WBP_SettingsMenuColumn.WBP_SettingsMenuColumn_C'
1315
bAutoConstructInternal=True
1416
bAutoFocusOnOpenInternal=True
1517
SettingsPercentSizeInternal=(X=0.600000,Y=0.400000)
1618
SettingsPaddingInternal=(Left=50.000000,Top=50.000000,Right=50.000000,Bottom=50.000000)
1719
ScrollboxPercentHeightInternal=1.000000
18-
ScrollboxPaddingInternal=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000)
20+
ColumnPaddingInternal=(Left=10.000000,Top=0.000000,Right=10.000000,Bottom=0.000000)
1921
SpaceBetweenColumnsInternal=10.000000
2022
ButtonThemeDataInternal=(PressedPadding=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),Texture=Texture2D'"/SettingsWidgetConstructor/Textures/T_Settings_Button.T_Settings_Button"',Size=(X=128.000000,Y=128.000000),DrawAs=Box,Margin=(Left=0.250000,Top=0.250000,Right=0.250000,Bottom=0.250000),Padding=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000))
2123
CheckboxThemeDataInternal=(CheckedTexture=Texture2D'"/SettingsWidgetConstructor/Textures/T_Settings_Checkbox_checked.T_Settings_Checkbox_checked"',UndeterminedTexture=None,Texture=Texture2D'"/SettingsWidgetConstructor/Textures/T_Settings_Checkbox_unchecked.T_Settings_Checkbox_unchecked"',Size=(X=24.000000,Y=24.000000),DrawAs=Image,Margin=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),Padding=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000))
206 KB
Binary file not shown.
254 KB
Binary file not shown.
440 KB
Binary file not shown.
41.4 KB
Binary file not shown.
-163 KB
Binary file not shown.
Binary file not shown.
-134 KB
Binary file not shown.
191 KB
Binary file not shown.
-17.8 KB
Binary file not shown.
Binary file not shown.
152 KB
Binary file not shown.
73.2 KB
Binary file not shown.
-2.18 MB
Binary file not shown.

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ Check out our [Release](https://github.com/JanSeliv/SettingsWidgetConstructor/re
3333
Also, explore this [game project repository](https://github.com/JanSeliv/Bomber) to view the Settings Widget Constructor in action.
3434

3535
## 📅 Changelog
36+
#### 2024-12-26
37+
- Updated to **Unreal Engine 5.4**.
38+
- Moved a significant chunk of the logic from blueprints to code and simplified amount of widgets used.
3639
#### 2023-10-12
3740
- Updated to **Unreal Engine 5.3**
3841
- Added **multiple Settings Data Tables** support ([see doc](https://docs.google.com/document/d/1IXnOqrgaXTClP-0cIo28a9f6GHc9N1BCgTNnMk-X9VQ/edit#heading=h.cix3vjszb2vm)).

SettingsWidgetConstructor.uplugin

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"DocsURL": "",
1111
"MarketplaceURL": "",
1212
"SupportURL": "mailto:janseliw@gmail.com",
13-
"EngineVersion": "5.3.0",
13+
"EngineVersion": "5.4.0",
1414
"EnabledByDefault": true,
1515
"CanContainContent": true,
1616
"IsBetaVersion": false,

Source/SettingsWidgetConstructor/Private/Data/SettingArchetypesData.cpp

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,6 @@ void FSettingsButton::BindSetting(USettingsWidget& SettingsWidget, const FSettin
3131
SettingsWidget.BindButton(PrimaryData, *this);
3232
}
3333

34-
// Calls the Add function of the Settings Widget of this setting type
35-
void FSettingsButton::AddSetting(USettingsWidget& SettingsWidget, const FSettingsPrimary& PrimaryData)
36-
{
37-
SettingsWidget.AddButton(PrimaryData, *this);
38-
}
39-
4034
/*********************************************************************************************
4135
* FSettingsCheckbox
4236
********************************************************************************************* */
@@ -67,12 +61,6 @@ void FSettingsCheckbox::BindSetting(USettingsWidget& SettingsWidget, const FSett
6761
SettingsWidget.BindCheckbox(PrimaryData, *this);
6862
}
6963

70-
// Calls the Add function of the Settings Widget of this setting type
71-
void FSettingsCheckbox::AddSetting(USettingsWidget& SettingsWidget, const FSettingsPrimary& InOutPrimaryData)
72-
{
73-
SettingsWidget.AddCheckbox(InOutPrimaryData, *this);
74-
}
75-
7664
/*********************************************************************************************
7765
* FSettingsCombobox
7866
********************************************************************************************* */
@@ -120,12 +108,6 @@ void FSettingsCombobox::BindSetting(USettingsWidget& SettingsWidget, const FSett
120108
SettingsWidget.BindCombobox(PrimaryData, *this);
121109
}
122110

123-
// Calls the Add function of the Settings Widget of this setting type
124-
void FSettingsCombobox::AddSetting(USettingsWidget& SettingsWidget, const FSettingsPrimary& InOutPrimaryData)
125-
{
126-
SettingsWidget.AddCombobox(InOutPrimaryData, *this);
127-
}
128-
129111
/*********************************************************************************************
130112
* FSettingsSlider
131113
********************************************************************************************* */
@@ -156,12 +138,6 @@ void FSettingsSlider::BindSetting(USettingsWidget& SettingsWidget, const FSettin
156138
SettingsWidget.BindSlider(PrimaryData, *this);
157139
}
158140

159-
// Calls the Add function of the Settings Widget of this setting type
160-
void FSettingsSlider::AddSetting(USettingsWidget& SettingsWidget, const FSettingsPrimary& InOutPrimaryData)
161-
{
162-
SettingsWidget.AddSlider(InOutPrimaryData, *this);
163-
}
164-
165141
/*********************************************************************************************
166142
* FSettingsTextLine
167143
********************************************************************************************* */
@@ -193,12 +169,6 @@ void FSettingsTextLine::BindSetting(USettingsWidget& SettingsWidget, const FSett
193169
SettingsWidget.BindTextLine(PrimaryData, *this);
194170
}
195171

196-
// Calls the Add function of the Settings Widget of this setting type
197-
void FSettingsTextLine::AddSetting(USettingsWidget& SettingsWidget, const FSettingsPrimary& InOutPrimaryData)
198-
{
199-
SettingsWidget.AddTextLine(InOutPrimaryData, *this);
200-
}
201-
202172
/*********************************************************************************************
203173
* FSettingsUserInput
204174
********************************************************************************************* */
@@ -229,12 +199,6 @@ void FSettingsUserInput::BindSetting(USettingsWidget& SettingsWidget, const FSet
229199
SettingsWidget.BindUserInput(PrimaryData, *this);
230200
}
231201

232-
// Calls the Add function of the Settings Widget of this setting type
233-
void FSettingsUserInput::AddSetting(USettingsWidget& SettingsWidget, const FSettingsPrimary& InOutPrimaryData)
234-
{
235-
SettingsWidget.AddUserInput(InOutPrimaryData, *this);
236-
}
237-
238202
/*********************************************************************************************
239203
* FSettingsCustomWidget
240204
********************************************************************************************* */
@@ -257,9 +221,3 @@ void FSettingsCustomWidget::BindSetting(USettingsWidget& SettingsWidget, const F
257221
{
258222
SettingsWidget.BindCustomWidget(PrimaryData, *this);
259223
}
260-
261-
// Calls the Add function of the Settings Widget of this setting type
262-
void FSettingsCustomWidget::AddSetting(USettingsWidget& SettingsWidget, const FSettingsPrimary& InOutPrimaryData)
263-
{
264-
SettingsWidget.AddCustomWidget(InOutPrimaryData, *this);
265-
}

Source/SettingsWidgetConstructor/Private/Data/SettingsDataAsset.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
#include "Data/SettingsDataTable.h"
66
#include "MyUtilsLibraries/SettingsUtilsLibrary.h"
77
//---
8+
#include "DataRegistry.h"
9+
#include "Engine/Engine.h"
10+
#include "Misc/CoreDelegates.h"
11+
//---
812
#include UE_INLINE_GENERATED_CPP_BY_NAME(SettingsDataAsset)
913

1014
// Returns the data table, it has to be set manually
@@ -14,7 +18,7 @@ const USettingsDataTable* USettingsDataAsset::GetSettingsDataTable() const
1418
}
1519

1620
// Returns the Settings Data Registry asset, is automatically set by default to which 'Settings Data Table' is added by itself
17-
const UDataRegistry* USettingsDataAsset::GetSettingsDataRegistry() const
21+
UDataRegistry* USettingsDataAsset::GetSettingsDataRegistry() const
1822
{
1923
return SettingsDataRegistryInternal.LoadSynchronous();
2024
}

Source/SettingsWidgetConstructor/Private/Data/SettingsDataTable.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ USettingsDataTable::USettingsDataTable()
1717
RowStruct = FSettingsRow::StaticStruct();
1818
}
1919

20+
// Returns the table rows
21+
void USettingsDataTable::GetSettingRows(TMap<FName, FSettingsRow>& OutRows) const
22+
{
23+
GetRows(OutRows);
24+
}
25+
2026
#if WITH_EDITOR
2127
// Called on every change in this data table to automatic set the key name by specified setting tag
2228
void USettingsDataTable::OnThisDataTableChanged(FName RowKey, const uint8& RowData)

Source/SettingsWidgetConstructor/Private/MyUtilsLibraries/SWCWidgetUtilsLibrary.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,9 @@ class FSWCWidgetUtilsLibrary
2626
* As an example, it returns SCheckbox slate widget from UCheckBox widget. */
2727
template <typename T>
2828
static FORCEINLINE TSharedPtr<T> GetSlateWidget(const UWidget* ForWidget) { return ForWidget ? StaticCastSharedPtr<T>(ForWidget->GetCachedWidget()) : nullptr; }
29+
30+
/** Completely destroys specified widget.
31+
* Is useful for MGF-modules unloading in runtime.
32+
* In most gameplay cases it should not be used, since it's expensive: prefer collapse widget instead. */
33+
static void DestroyWidget(UUserWidget& ParentWidget);
2934
};

Source/SettingsWidgetConstructor/Private/MyUtilsLibraries/SettingsUtilsLibrary.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ UGameUserSettings* USettingsUtilsLibrary::GetGameUserSettings(const UObject* Opt
3030
}
3131

3232
// Returns all Settings Rows from project's Settings Data Table and all other additional Data Tables from 'SettingsDataTable' Data Registry
33-
void USettingsUtilsLibrary::GetAllSettingRows(TMap<FName, FSettingsRow>& OutSettingRows)
33+
void USettingsUtilsLibrary::GenerateAllSettingRows(TMap<FName, FSettingsPicker>& OutSettingRows)
3434
{
3535
if (!OutSettingRows.IsEmpty())
3636
{
@@ -102,7 +102,7 @@ void USettingsUtilsLibrary::GetAllSettingRows(TMap<FName, FSettingsRow>& OutSett
102102
for (const FSettingsRow& Row : OrderedSettings)
103103
{
104104
const FName Tag = Row.SettingsPicker.PrimaryData.Tag.GetTagName();
105-
OutSettingRows.Add(Tag, Row);
105+
OutSettingRows.Add(Tag, Row.SettingsPicker);
106106

107107
// Check if there's an override block for this tag
108108
const FSettingTag SettingTag = Row.SettingsPicker.PrimaryData.Tag;
@@ -113,7 +113,7 @@ void USettingsUtilsLibrary::GetAllSettingRows(TMap<FName, FSettingsRow>& OutSett
113113
for (const FSettingsRow& OverrideRow : *OverrideBlock)
114114
{
115115
const FName OverrideTag = OverrideRow.SettingsPicker.PrimaryData.Tag.GetTagName();
116-
OutSettingRows.Add(OverrideTag, OverrideRow);
116+
OutSettingRows.Add(OverrideTag, OverrideRow.SettingsPicker);
117117
}
118118
}
119119
}
@@ -129,7 +129,7 @@ void USettingsUtilsLibrary::RegisterDataTable(const TSoftObjectPtr<const USettin
129129
UDataRegistrySubsystem* DataRegistrySubsystem = UDataRegistrySubsystem::Get();
130130
checkf(DataRegistrySubsystem, TEXT("ERROR: [%i] %s:\n'DataRegistrySubsystem' is null!"), __LINE__, *FString(__FUNCTION__));
131131

132-
const TSoftObjectPtr<const UDataRegistry>& SettingsDataRegistry = USettingsDataAsset::Get().GetSettingsDataRegistrySoft();
132+
const TSoftObjectPtr<UDataRegistry>& SettingsDataRegistry = USettingsDataAsset::Get().GetSettingsDataRegistrySoft();
133133
if (ensureMsgf(!SettingsDataRegistry.IsNull(), TEXT("ASSERT: 'SettingsDataRegistry' is null, it has to be set automatically, something went wrong!")))
134134
{
135135
// Initialize the Settings Data Registry

Source/SettingsWidgetConstructor/Private/MyUtilsLibraries/WidgetUtilsLibrary.cpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,37 @@ UUserWidget* FSWCWidgetUtilsLibrary::FindWidgetOfClass(UObject* WorldContextObje
4040
{
4141
TArray<UUserWidget*> FoundWidgets;
4242
UWidgetBlueprintLibrary::GetAllWidgetsOfClass(WorldContextObject, /*out*/FoundWidgets, ParentWidgetClass);
43-
return !FoundWidgets.IsEmpty()? FoundWidgets[0] : nullptr;
43+
return !FoundWidgets.IsEmpty() ? FoundWidgets[0] : nullptr;
4444
}
4545

46+
// Completely destroys specified widget
47+
void FSWCWidgetUtilsLibrary::DestroyWidget(UUserWidget& ParentWidget)
48+
{
49+
// Get an array of all child widgets
50+
TArray<UWidget*> ChildWidgets;
51+
const UWidgetTree* WidgetTree = ParentWidget.WidgetTree;
52+
WidgetTree->GetAllWidgets(ChildWidgets);
53+
54+
// Iterate through the child widgets
55+
for (UWidget* ChildWidgetIt : ChildWidgets)
56+
{
57+
UUserWidget* ChildUserWidget = Cast<UUserWidget>(ChildWidgetIt);
58+
const UWidgetTree* WidgetTreeIt = IsValid(ChildUserWidget) ? ChildUserWidget->WidgetTree : nullptr;
59+
const bool bHasChildWidgets = WidgetTreeIt && WidgetTreeIt->RootWidget;
60+
61+
if (bHasChildWidgets)
62+
{
63+
// If the child widget has its own child widgets, recursively remove and destroy them
64+
DestroyWidget(*ChildUserWidget);
65+
}
66+
}
67+
68+
// Hide widget to let last chance react on visibility change
69+
ParentWidget.SetVisibility(ESlateVisibility::Collapsed);
70+
71+
// Remove the child widget from the viewport
72+
ParentWidget.RemoveFromParent();
73+
74+
// RemoveFromParent() does not completely destroy widget, so schedule the child widget for destruction
75+
ParentWidget.ConditionalBeginDestroy();
76+
}

Source/SettingsWidgetConstructor/Private/SettingsWidgetConstructorModule.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
// Copyright (c) Yevhenii Selivanov.
22

33
#include "SettingsWidgetConstructorModule.h"
4-
5-
#define LOCTEXT_NAMESPACE "FSettingsWidgetConstructorModule"
6-
4+
//---
5+
#include "Modules/ModuleManager.h"
76
// Called right after the module DLL has been loaded and the module object has been created
87
void FSettingsWidgetConstructorModule::StartupModule()
98
{
@@ -17,6 +16,4 @@ void FSettingsWidgetConstructorModule::ShutdownModule()
1716
// we call this function before unloading the module.
1817
}
1918

20-
#undef LOCTEXT_NAMESPACE
21-
2219
IMPLEMENT_MODULE(FSettingsWidgetConstructorModule, SettingsWidgetConstructor)

0 commit comments

Comments
 (0)