Skip to content

Commit 8fd99c2

Browse files
committed
Asset Collection filters
1 parent aa0a668 commit 8fd99c2

File tree

10 files changed

+267
-41
lines changed

10 files changed

+267
-41
lines changed

Source/PCGExtendedToolkit/Public/Paths/PCGExPathSolidify.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class UPCGExPathSolidifySettings : public UPCGExPathProcessorSettings
112112

113113
/** Defines how the selected axis will be used to construct the point' rotation. This will be using remapped axis from the selected order. X = Primary, Y = Secondary, Z = Tertiary*/
114114
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Settings, meta = (PCG_Overridable))
115-
EPCGExMakeRotAxis RotationConstruction = EPCGExMakeRotAxis::XY;
115+
EPCGExMakeRotAxis RotationConstruction = EPCGExMakeRotAxis::X;
116116

117117
// - Constant vs attribute
118118
// - Attribute can be int as pick (with sanitization)

Source/PCGExtendedToolkitEditor/Private/Details/Collections/PCGExActorCollectionEditor.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ void FPCGExActorCollectionEditor::BuildAssetHeaderToolbar(FToolBarBuilder& Toolb
2222
FPCGExAssetCollectionEditor::BuildAssetHeaderToolbar(ToolbarBuilder);
2323
}
2424

25-
void FPCGExActorCollectionEditor::CreateTabs(TArray<FPCGExDetailsTabInfos>& OutTabs)
25+
void FPCGExActorCollectionEditor::CreateTabs(TArray<PCGExAssetCollectionEditor::TabInfos>& OutTabs)
2626
{
2727
// Default handling (will append default collection settings tab)
2828
FPCGExAssetCollectionEditor::CreateTabs(OutTabs);
@@ -51,11 +51,17 @@ void FPCGExActorCollectionEditor::CreateTabs(TArray<FPCGExDetailsTabInfos>& OutT
5151

5252
// Set the asset to display
5353
DetailsView->SetObject(EditedCollection.Get());
54-
FPCGExDetailsTabInfos& Infos = OutTabs.Emplace_GetRef(FName("Assets"), DetailsView);
54+
PCGExAssetCollectionEditor::TabInfos& Infos = OutTabs.Emplace_GetRef(FName("Assets"), DetailsView);
5555
Infos.Icon = TEXT("Entries");
5656

57-
FToolBarBuilder ToolbarBuilder(GetToolkitCommands(), FMultiBoxCustomization::None);
58-
ToolbarBuilder.SetStyle(&FAppStyle::Get(), FName("Toolbar"));
59-
BuildAssetHeaderToolbar(ToolbarBuilder);
60-
Infos.Header = ToolbarBuilder.MakeWidget();
57+
FToolBarBuilder HeaderToolbarBuilder(GetToolkitCommands(), FMultiBoxCustomization::None);
58+
HeaderToolbarBuilder.SetStyle(&FAppStyle::Get(), FName("Toolbar"));
59+
BuildAssetHeaderToolbar(HeaderToolbarBuilder);
60+
Infos.Header = HeaderToolbarBuilder.MakeWidget();
61+
62+
FToolBarBuilder FooterToolbarBuilder(GetToolkitCommands(), FMultiBoxCustomization::None);
63+
FooterToolbarBuilder.SetStyle(&FAppStyle::Get(), FName("Toolbar"));
64+
BuildAssetFooterToolbar(FooterToolbarBuilder);
65+
Infos.Footer = FooterToolbarBuilder.MakeWidget();
66+
6167
}

Source/PCGExtendedToolkitEditor/Private/Details/Collections/PCGExAssetCollectionEditor.cpp

Lines changed: 98 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "Details/Collections/PCGExAssetCollectionEditor.h"
55

6+
#include "PCGExGlobalEditorSettings.h"
67
#include "ToolMenus.h"
78
#include "Widgets/Input/SButton.h"
89
#include "Framework/MultiBox/MultiBoxBuilder.h"
@@ -20,6 +21,13 @@ namespace PCGExCollectionEditor
2021
{
2122
}
2223

24+
TMap<FName, PCGExAssetCollectionEditor::FilterInfos> FPCGExAssetCollectionEditor::FilterInfos;
25+
26+
FPCGExAssetCollectionEditor::FPCGExAssetCollectionEditor()
27+
{
28+
RegisterPropertyNameMapping(GetMutableDefault<UPCGExGlobalEditorSettings>()->PropertyNamesMap);
29+
}
30+
2331
void FPCGExAssetCollectionEditor::InitEditor(UPCGExAssetCollection* InCollection, const EToolkitMode::Type Mode, const TSharedPtr<IToolkitHost>& InitToolkitHost)
2432
{
2533
EditedCollection = InCollection;
@@ -61,14 +69,45 @@ void FPCGExAssetCollectionEditor::InitEditor(UPCGExAssetCollection* InCollection
6169

6270
AddToolbarExtender(ToolbarExtender);
6371
RegenerateMenusAndToolbars();
72+
73+
// Assuming DetailsView is already created.
74+
UPCGExGlobalEditorSettings::OnHiddenAssetPropertyNamesChanged.AddRaw(this, &FPCGExAssetCollectionEditor::ForceRefreshTabs);
6475
}
6576

6677
UPCGExAssetCollection* FPCGExAssetCollectionEditor::GetEditedCollection() const
6778
{
6879
return EditedCollection.Get();
6980
}
7081

71-
void FPCGExAssetCollectionEditor::CreateTabs(TArray<FPCGExDetailsTabInfos>& OutTabs)
82+
void FPCGExAssetCollectionEditor::RegisterPropertyNameMapping(TMap<FName, FName>& Mapping)
83+
{
84+
#define PCGEX_DECL_ASSET_FILTER(_NAME, _ID, _LABEL, _TOOLTIP)PCGExAssetCollectionEditor::FilterInfos& _NAME = FilterInfos.Emplace(FName(_ID), PCGExAssetCollectionEditor::FilterInfos(FName(_ID),FTEXT(_LABEL), FTEXT(_TOOLTIP)));
85+
86+
PCGEX_DECL_ASSET_FILTER(Variations, "AssetEditor.Variations", "Variations", "Show/hide Variations")
87+
Mapping.Add(FName("VariationMode"), Variations.Id);
88+
Mapping.Add(FName("Variations"), Variations.Id);
89+
90+
PCGEX_DECL_ASSET_FILTER(Tags, "AssetEditor.Tags", "Tags", "Show/hide Tags")
91+
Mapping.Add(FName("Tags"), Tags.Id);
92+
93+
PCGEX_DECL_ASSET_FILTER(Staging, "AssetEditor.Staging", "Staging", "Show/hide Staging")
94+
Mapping.Add(FName("Staging"), Staging.Id);
95+
96+
PCGEX_DECL_ASSET_FILTER(Materials, "AssetEditor.Materials", "Materials", "Show/hide Materials")
97+
Mapping.Add(FName("MaterialVariants"), Materials.Id);
98+
Mapping.Add(FName("SlotIndex"), Materials.Id);
99+
Mapping.Add(FName("MaterialOverrideVariants"), Materials.Id);
100+
Mapping.Add(FName("MaterialOverrideVariantsList"), Materials.Id);
101+
102+
PCGEX_DECL_ASSET_FILTER(Descriptors, "AssetEditor.Descriptors", "Descriptors", "Show/hide Descriptors")
103+
Mapping.Add(FName("DescriptorSource"), Descriptors.Id);
104+
Mapping.Add(FName("ISMDescriptor"), Descriptors.Id);
105+
Mapping.Add(FName("SMDescriptor"), Descriptors.Id);
106+
107+
#undef PCGEX_DECL_ASSET_FILTER
108+
}
109+
110+
void FPCGExAssetCollectionEditor::CreateTabs(TArray<PCGExAssetCollectionEditor::TabInfos>& OutTabs)
72111
{
73112
// Property editor module
74113
FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
@@ -94,7 +133,7 @@ void FPCGExAssetCollectionEditor::CreateTabs(TArray<FPCGExDetailsTabInfos>& OutT
94133
// Set the asset to display
95134
DetailsView->SetObject(EditedCollection.Get());
96135

97-
FPCGExDetailsTabInfos& Infos = OutTabs.Emplace_GetRef(FName("Collection"), DetailsView, FName("Collection Settings"));
136+
PCGExAssetCollectionEditor::TabInfos& Infos = OutTabs.Emplace_GetRef(FName("Collection"), DetailsView, FName("Collection Settings"));
98137
Infos.Icon = TEXT("Settings");
99138
}
100139

@@ -296,7 +335,7 @@ void FPCGExAssetCollectionEditor::BuildAssetHeaderToolbar(FToolBarBuilder& Toolb
296335
ToolbarBuilder.BeginSection("SortingSection");
297336
{
298337
PCGEX_SECTION_HEADER("Sort")
299-
338+
300339
ToolbarBuilder.AddWidget(
301340
SNew(SUniformGridPanel)
302341
.SlotPadding(FMargin(1, 2))
@@ -331,6 +370,49 @@ void FPCGExAssetCollectionEditor::BuildAssetHeaderToolbar(FToolBarBuilder& Toolb
331370
#pragma endregion
332371
}
333372

373+
void FPCGExAssetCollectionEditor::BuildAssetFooterToolbar(FToolBarBuilder& ToolbarBuilder)
374+
{
375+
ToolbarBuilder.BeginSection("FilterSection");
376+
{
377+
PCGEX_SECTION_HEADER("Filters")
378+
379+
TSharedRef<SUniformGridPanel> Grid =
380+
SNew(SUniformGridPanel)
381+
.SlotPadding(FMargin(2, 2));
382+
383+
int32 Index = 0;
384+
for (const TPair<FName, PCGExAssetCollectionEditor::FilterInfos>& Infos : FilterInfos)
385+
{
386+
const PCGExAssetCollectionEditor::FilterInfos& Filter = Infos.Value;
387+
388+
Grid->AddSlot(Index / 2, Index % 2)
389+
[
390+
SNew(SButton)
391+
.Text(Filter.Label)
392+
.ButtonStyle(FAppStyle::Get(), "PCGEx.ActionIcon")
393+
.OnClicked_Lambda(
394+
[Filter]()
395+
{
396+
UPCGExGlobalEditorSettings* MutableSettings = GetMutableDefault<UPCGExGlobalEditorSettings>();
397+
MutableSettings->ToggleHiddenAssetPropertyName(Filter.Id, MutableSettings->GetIsPropertyVisible(Filter.Id));
398+
return FReply::Handled();
399+
})
400+
.ButtonColorAndOpacity_Lambda(
401+
[Filter]
402+
{
403+
return GetMutableDefault<UPCGExGlobalEditorSettings>()->GetIsPropertyVisible(Filter.Id) ? FLinearColor(0.005, 0.005, 0.005, 0.8) : FLinearColor::Transparent;
404+
})
405+
.ToolTipText(Filter.ToolTip)
406+
];
407+
408+
Index++;
409+
}
410+
411+
ToolbarBuilder.AddWidget(Grid);
412+
}
413+
ToolbarBuilder.EndSection();
414+
}
415+
334416
#undef PCGEX_SLATE_ICON
335417
#undef PCGEX_CURRENT_COLLECTION
336418
#undef PCGEX_SECTION_HEADER
@@ -339,7 +421,7 @@ void FPCGExAssetCollectionEditor::RegisterTabSpawners(const TSharedRef<FTabManag
339421
{
340422
TabManager->SetCanDoDragOperation(false);
341423

342-
for (const FPCGExDetailsTabInfos& Tab : Tabs)
424+
for (const PCGExAssetCollectionEditor::TabInfos& Tab : Tabs)
343425
{
344426
// Register tab spawner with out layout Id
345427
FTabSpawnerEntry& Entry =
@@ -383,4 +465,15 @@ void FPCGExAssetCollectionEditor::RegisterTabSpawners(const TSharedRef<FTabManag
383465
if (!Tabs.IsEmpty()) { TabManager->SetMainTab(Tabs[0].Id); }
384466

385467
FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
386-
}
468+
}
469+
470+
void FPCGExAssetCollectionEditor::ForceRefreshTabs()
471+
{
472+
for (const PCGExAssetCollectionEditor::TabInfos& Tab : Tabs)
473+
{
474+
if (TSharedPtr<IDetailsView> DetailsView = StaticCastSharedPtr<IDetailsView>(Tab.View))
475+
{
476+
DetailsView->ForceRefresh();
477+
}
478+
}
479+
}

Source/PCGExtendedToolkitEditor/Private/Details/Collections/PCGExAssetEntryCustomization.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
#include "DetailLayoutBuilder.h"
77
#include "DetailWidgetRow.h"
88
#include "IDetailChildrenBuilder.h"
9+
#include "PCGExGlobalEditorSettings.h"
910
#include "PropertyCustomizationHelpers.h"
1011
#include "PropertyHandle.h"
1112
#include "Collections/PCGExActorCollection.h"
1213
#include "Collections/PCGExAssetCollection.h"
1314
#include "Collections/PCGExMeshCollection.h"
1415
#include "Constants/PCGExTuple.h"
16+
#include "Details/Collections/PCGExAssetCollectionEditor.h"
1517
#include "Widgets/Text/STextBlock.h"
1618
#include "Widgets/Input/SCheckBox.h"
1719
#include "Widgets/Input/SEditableTextBox.h"
@@ -128,8 +130,17 @@ void FPCGExAssetEntryCustomization::CustomizeChildren(
128130
for (uint32 i = 0; i < NumElements; ++i)
129131
{
130132
TSharedPtr<IPropertyHandle> ElementHandle = PropertyHandle->GetChildHandle(i);
131-
if (!ElementHandle.IsValid() || CustomizedTopLevelProperties.Contains(ElementHandle->GetProperty()->GetFName())) { continue; }
132-
ChildBuilder.AddProperty(ElementHandle.ToSharedRef());
133+
FName ElementName = ElementHandle ? ElementHandle->GetProperty()->GetFName() : NAME_None;
134+
if (!ElementHandle.IsValid() || CustomizedTopLevelProperties.Contains(ElementName)) { continue; }
135+
136+
IDetailPropertyRow& PropertyRow = ChildBuilder.AddProperty(ElementHandle.ToSharedRef());
137+
// Bind visibility dynamically
138+
PropertyRow.Visibility(
139+
TAttribute<EVisibility>::Create(
140+
[ElementName]()
141+
{
142+
return GetDefault<UPCGExGlobalEditorSettings>()->GetPropertyVisibility(ElementName);
143+
}));
133144
}
134145
}
135146

Source/PCGExtendedToolkitEditor/Private/Details/Collections/PCGExMeshCollectionEditor.cpp

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,27 @@
1717
#include "Modules/ModuleManager.h"
1818
#include "Widgets/Layout/SUniformGridPanel.h"
1919

20+
void FPCGExMeshCollectionEditor::RegisterPropertyNameMapping(TMap<FName, FName>& Mapping)
21+
{
22+
FPCGExAssetCollectionEditor::RegisterPropertyNameMapping(Mapping);
23+
24+
#define PCGEX_DECL_ASSET_FILTER(_NAME, _ID, _LABEL, _TOOLTIP)PCGExAssetCollectionEditor::FilterInfos& _NAME = FilterInfos.Emplace(FName(_ID), PCGExAssetCollectionEditor::FilterInfos(FName(_ID),FTEXT(_LABEL), FTEXT(_TOOLTIP)));
25+
26+
PCGEX_DECL_ASSET_FILTER(Materials, "AssetEditor.Materials", "Materials", "Show/hide Materials")
27+
Mapping.Add(FName("MaterialVariants"), Materials.Id);
28+
Mapping.Add(FName("SlotIndex"), Materials.Id);
29+
Mapping.Add(FName("MaterialOverrideVariants"), Materials.Id);
30+
Mapping.Add(FName("MaterialOverrideVariantsList"), Materials.Id);
31+
32+
PCGEX_DECL_ASSET_FILTER(Descriptors, "AssetEditor.Descriptors", "Descriptors", "Show/hide Descriptors")
33+
Mapping.Add(FName("DescriptorSource"), Descriptors.Id);
34+
Mapping.Add(FName("ISMDescriptor"), Descriptors.Id);
35+
Mapping.Add(FName("SMDescriptor"), Descriptors.Id);
36+
37+
#undef PCGEX_DECL_ASSET_FILTER
38+
39+
}
40+
2041
void FPCGExMeshCollectionEditor::BuildAssetHeaderToolbar(FToolBarBuilder& ToolbarBuilder)
2142
{
2243
FPCGExAssetCollectionEditor::BuildAssetHeaderToolbar(ToolbarBuilder);
@@ -48,7 +69,6 @@ void FPCGExMeshCollectionEditor::BuildAssetHeaderToolbar(FToolBarBuilder& Toolba
4869

4970
#pragma region Sorting
5071

51-
5272
ToolbarBuilder.BeginSection("DescriptorSection");
5373
{
5474
ToolbarBuilder.AddWidget(
@@ -94,7 +114,7 @@ void FPCGExMeshCollectionEditor::BuildAssetHeaderToolbar(FToolBarBuilder& Toolba
94114
#undef PCGEX_CURRENT_COLLECTION
95115
}
96116

97-
void FPCGExMeshCollectionEditor::CreateTabs(TArray<FPCGExDetailsTabInfos>& OutTabs)
117+
void FPCGExMeshCollectionEditor::CreateTabs(TArray<PCGExAssetCollectionEditor::TabInfos>& OutTabs)
98118
{
99119
// Default handling (will append default collection settings tab)
100120
FPCGExAssetCollectionEditor::CreateTabs(OutTabs);
@@ -123,11 +143,16 @@ void FPCGExMeshCollectionEditor::CreateTabs(TArray<FPCGExDetailsTabInfos>& OutTa
123143

124144
// Set the asset to display
125145
DetailsView->SetObject(EditedCollection.Get());
126-
FPCGExDetailsTabInfos& Infos = OutTabs.Emplace_GetRef(FName("Assets"), DetailsView);
146+
PCGExAssetCollectionEditor::TabInfos& Infos = OutTabs.Emplace_GetRef(FName("Assets"), DetailsView);
127147
Infos.Icon = TEXT("Entries");
128148

129-
FToolBarBuilder ToolbarBuilder(GetToolkitCommands(), FMultiBoxCustomization::None);
130-
ToolbarBuilder.SetStyle(&FAppStyle::Get(), FName("Toolbar"));
131-
BuildAssetHeaderToolbar(ToolbarBuilder);
132-
Infos.Header = ToolbarBuilder.MakeWidget();
149+
FToolBarBuilder HeaderToolbarBuilder(GetToolkitCommands(), FMultiBoxCustomization::None);
150+
HeaderToolbarBuilder.SetStyle(&FAppStyle::Get(), FName("Toolbar"));
151+
BuildAssetHeaderToolbar(HeaderToolbarBuilder);
152+
Infos.Header = HeaderToolbarBuilder.MakeWidget();
153+
154+
FToolBarBuilder FooterToolbarBuilder(GetToolkitCommands(), FMultiBoxCustomization::None);
155+
FooterToolbarBuilder.SetStyle(&FAppStyle::Get(), FName("Toolbar"));
156+
BuildAssetFooterToolbar(FooterToolbarBuilder);
157+
Infos.Footer = FooterToolbarBuilder.MakeWidget();
133158
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2025 Timothé Lapetite and contributors
2+
// Released under the MIT license https://opensource.org/license/MIT/
3+
4+
#include "PCGExGlobalEditorSettings.h"
5+
6+
#include "CoreMinimal.h"
7+
#include "Components/SlateWrapperTypes.h"
8+
9+
FSimpleMulticastDelegate UPCGExGlobalEditorSettings::OnHiddenAssetPropertyNamesChanged;
10+
11+
void UPCGExGlobalEditorSettings::ToggleHiddenAssetPropertyName(const FName PropertyName, const bool bHide)
12+
{
13+
if (bHide)
14+
{
15+
bool bIsAlreadyInSet = false;
16+
HiddenPropertyNames.Add(PropertyName, &bIsAlreadyInSet);
17+
if (bIsAlreadyInSet) { return; }
18+
}
19+
else if (!HiddenPropertyNames.Remove(PropertyName))
20+
{
21+
return;
22+
}
23+
24+
SaveConfig();
25+
OnHiddenAssetPropertyNamesChanged.Broadcast();
26+
}
27+
28+
EVisibility UPCGExGlobalEditorSettings::GetPropertyVisibility(const FName PropertyName) const
29+
{
30+
const FName* Id = PropertyNamesMap.Find(PropertyName);
31+
return Id ? HiddenPropertyNames.Contains(*Id) ? EVisibility::Collapsed : EVisibility::Visible : EVisibility::Visible;
32+
}
33+
34+
bool UPCGExGlobalEditorSettings::GetIsPropertyVisible(const FName PropertyName) const
35+
{
36+
return !HiddenPropertyNames.Contains(PropertyName);
37+
}

Source/PCGExtendedToolkitEditor/Public/Details/Collections/PCGExActorCollectionEditor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ class FPCGExActorCollectionEditor : public FPCGExAssetCollectionEditor
1818

1919
protected:
2020
virtual void BuildAssetHeaderToolbar(FToolBarBuilder& ToolbarBuilder) override;
21-
virtual void CreateTabs(TArray<FPCGExDetailsTabInfos>& OutTabs) override;
21+
virtual void CreateTabs(TArray<PCGExAssetCollectionEditor::TabInfos>& OutTabs) override;
2222
};

0 commit comments

Comments
 (0)