Files
UnrealEngineUWP/Engine/Source/Developer/Settings/Private/SettingsContainer.cpp
dave belanger f3137a8ba7 Keep setttings category sort stable (update doc that pretends there's alphanumeric sorting going on)
#rb Jason.Stasik
#preflight skip

#ROBOMERGE-AUTHOR: dave.belanger
#ROBOMERGE-SOURCE: CL 20472948 via CL 20473072 via CL 20473108 via CL 20473116
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v954-20466795)

[CL 20475297 by dave belanger in ue5-main branch]
2022-06-02 16:34:29 -04:00

140 lines
4.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SettingsContainer.h"
#include "UObject/WeakObjectPtr.h"
#include "Misc/App.h"
#include "Algo/Transform.h"
/* FSettingsContainer structors
*****************************************************************************/
FSettingsContainer::FSettingsContainer( const FName& InName )
: Name(InName)
{ }
/* FSettingsContainer interface
*****************************************************************************/
ISettingsSectionPtr FSettingsContainer::AddSection( const FName& CategoryName, const FName& SectionName, const FText& InDisplayName, const FText& InDescription, const TWeakObjectPtr<UObject>& SettingsObject )
{
TSharedPtr<FSettingsCategory> Category = Categories.FindRef(CategoryName);
if (!Category.IsValid())
{
DescribeCategory(CategoryName, FText::FromString(FName::NameToDisplayString(CategoryName.ToString(), false)), FText::GetEmpty());
Category = Categories.FindRef(CategoryName);
}
ISettingsSectionRef Section = Category->AddSection(SectionName, InDisplayName, InDescription, SettingsObject);
CategoryModifiedDelegate.Broadcast(CategoryName);
return Section;
}
ISettingsSectionPtr FSettingsContainer::AddSection( const FName& CategoryName, const FName& SectionName, const FText& InDisplayName, const FText& InDescription, const TSharedRef<SWidget>& CustomWidget )
{
TSharedPtr<FSettingsCategory> Category = Categories.FindRef(CategoryName);
if (!Category.IsValid())
{
DescribeCategory(CategoryName, FText::FromString(FName::NameToDisplayString(CategoryName.ToString(), false)), FText::GetEmpty());
Category = Categories.FindRef(CategoryName);
}
ISettingsSectionRef Section = Category->AddSection(SectionName, InDisplayName, InDescription, CustomWidget);
CategoryModifiedDelegate.Broadcast(CategoryName);
return Section;
}
void FSettingsContainer::RemoveSection( const FName& CategoryName, const FName& SectionName )
{
TSharedPtr<FSettingsCategory> Category = Categories.FindRef(CategoryName);
if (Category.IsValid())
{
ISettingsSectionPtr Section = Category->GetSection(SectionName, true);
if (Section.IsValid())
{
Category->RemoveSection(SectionName);
SectionRemovedDelegate.Broadcast(Section.ToSharedRef());
CategoryModifiedDelegate.Broadcast(CategoryName);
}
}
}
/* ISettingsContainer interface
*****************************************************************************/
void FSettingsContainer::Describe( const FText& InDisplayName, const FText& InDescription, const FName& InIconName )
{
Description = InDescription;
DisplayName = InDisplayName;
IconName = InIconName;
}
void FSettingsContainer::DescribeCategory( const FName& CategoryName, const FText& InDisplayName, const FText& InDescription )
{
TSharedPtr<FSettingsCategory>& Category = Categories.FindOrAdd(CategoryName);
if (!Category.IsValid())
{
Category = MakeShareable(new FSettingsCategory(CategoryName));
}
Category->Describe(InDisplayName, InDescription);
CategoryModifiedDelegate.Broadcast(CategoryName);
}
int32 FSettingsContainer::GetCategories( TArray<ISettingsCategoryPtr>& OutCategories ) const
{
OutCategories.Empty(Categories.Num());
Algo::Transform(Categories, OutCategories, [](const TPair<FName, TSharedPtr<FSettingsCategory>>& Iter) { return Iter.Value; });
OutCategories.StableSort([this](const ISettingsCategoryPtr& CatetoryA, const ISettingsCategoryPtr& CategoryB)
{
auto GetCategoryPriority = [this](const ISettingsCategoryPtr& Category)
{
static const FName AdvancedCategoryName("Advanced");
const FName GameSpecificCategoryName = FApp::GetProjectName();
if (const float* Priority = CategorySortPriorities.Find(Category->GetName()))
{
return *Priority;
}
else if (Category->GetName() == GameSpecificCategoryName)
{
return -1.f;
}
else if (Category->GetName() == AdvancedCategoryName)
{
return 1.f;
}
else
{
return 0.f;
}
};
return GetCategoryPriority(CatetoryA) < GetCategoryPriority(CategoryB);
});
return OutCategories.Num();
}
void FSettingsContainer::SetCategorySortPriority(FName CategoryName, float Priority)
{
CategorySortPriorities.Add(CategoryName, Priority);
}
void FSettingsContainer::ResetCategorySortPriority(FName CategoryName)
{
CategorySortPriorities.Remove(CategoryName);
}