162 lines
4.4 KiB
C++
162 lines
4.4 KiB
C++
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||
|
|
||
|
#include "GameSettingRegistry.h"
|
||
|
|
||
|
#include "GameSetting.h"
|
||
|
#include "GameSettingCollection.h"
|
||
|
#include "GameSettingAction.h"
|
||
|
#include <IAnalyticsProviderET.h>
|
||
|
#include "Stats/Stats.h"
|
||
|
|
||
|
#define LOCTEXT_NAMESPACE "GameSetting"
|
||
|
|
||
|
//--------------------------------------
|
||
|
// UGameSettingRegistry
|
||
|
//--------------------------------------
|
||
|
|
||
|
UGameSettingRegistry::UGameSettingRegistry()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::Initialize(ULocalPlayer* InLocalPlayer)
|
||
|
{
|
||
|
OwningLocalPlayer = InLocalPlayer;
|
||
|
OnInitialize(InLocalPlayer);
|
||
|
|
||
|
//UGameFeaturesSubsystem
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::Regenerate()
|
||
|
{
|
||
|
for (UGameSetting* Setting : RegisteredSettings)
|
||
|
{
|
||
|
Setting->MarkAsGarbage();
|
||
|
}
|
||
|
RegisteredSettings.Reset();
|
||
|
TopLevelSettings.Reset();
|
||
|
|
||
|
OnInitialize(OwningLocalPlayer);
|
||
|
}
|
||
|
|
||
|
bool UGameSettingRegistry::IsFinishedInitializing() const
|
||
|
{
|
||
|
bool bReady = true;
|
||
|
for (UGameSetting* Setting : RegisteredSettings)
|
||
|
{
|
||
|
if (!Setting->IsReady())
|
||
|
{
|
||
|
bReady = false;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bReady;
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::SaveChanges()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::GetSettingsForFilter(const FGameSettingFilterState& FilterState, TArray<UGameSetting*>& InOutSettings)
|
||
|
{
|
||
|
TArray<UGameSetting*> RootSettings;
|
||
|
if (FilterState.GetSettingRootList().Num() > 0)
|
||
|
{
|
||
|
RootSettings.Append(FilterState.GetSettingRootList());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
RootSettings.Append(TopLevelSettings);
|
||
|
}
|
||
|
|
||
|
for (UGameSetting* TopLevelSetting : RootSettings)
|
||
|
{
|
||
|
if (const UGameSettingCollection* TopLevelCollection = Cast<UGameSettingCollection>(TopLevelSetting))
|
||
|
{
|
||
|
TopLevelCollection->GetSettingsForFilter(FilterState, InOutSettings);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (FilterState.DoesSettingPassFilter(*TopLevelSetting))
|
||
|
{
|
||
|
InOutSettings.Add(TopLevelSetting);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
UGameSetting* UGameSettingRegistry::FindSettingByDevName(const FName& SettingDevName)
|
||
|
{
|
||
|
for (UGameSetting* Setting : RegisteredSettings)
|
||
|
{
|
||
|
if (Setting->GetDevName() == SettingDevName)
|
||
|
{
|
||
|
return Setting;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nullptr;
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::RegisterSetting(UGameSetting* InSetting)
|
||
|
{
|
||
|
if (InSetting)
|
||
|
{
|
||
|
TopLevelSettings.Add(InSetting);
|
||
|
InSetting->SetRegistry(this);
|
||
|
RegisterInnerSettings(InSetting);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::RegisterInnerSettings(UGameSetting* InSetting)
|
||
|
{
|
||
|
InSetting->OnSettingChangedEvent.AddUObject(this, &ThisClass::HandleSettingChanged);
|
||
|
InSetting->OnSettingEditConditionChangedEvent.AddUObject(this, &ThisClass::HandleSettingEditConditionsChanged);
|
||
|
|
||
|
// Not a fan of this, but it makes sense to aggregate action events for simplicity.
|
||
|
if (UGameSettingAction* ActionSetting = Cast<UGameSettingAction>(InSetting))
|
||
|
{
|
||
|
ActionSetting->OnExecuteNamedActionEvent.AddUObject(this, &ThisClass::HandleSettingNamedAction);
|
||
|
}
|
||
|
// Not a fan of this, but it makes sense to aggregate navigation events for simplicity.
|
||
|
else if (UGameSettingCollectionPage* NewPageCollection = Cast<UGameSettingCollectionPage>(InSetting))
|
||
|
{
|
||
|
NewPageCollection->OnExecuteNavigationEvent.AddUObject(this, &ThisClass::HandleSettingNavigation);
|
||
|
}
|
||
|
|
||
|
#if !UE_BUILD_SHIPPING
|
||
|
ensureAlwaysMsgf(!RegisteredSettings.Contains(InSetting), TEXT("This setting has already been registered!"));
|
||
|
ensureAlwaysMsgf(nullptr == RegisteredSettings.FindByPredicate([&InSetting](UGameSetting* ExistingSetting) { return InSetting->GetDevName() == ExistingSetting->GetDevName(); }), TEXT("A setting with this DevName has already been registered! DevNames must be unique within a registry."));
|
||
|
#endif
|
||
|
|
||
|
RegisteredSettings.Add(InSetting);
|
||
|
|
||
|
for (UGameSetting* ChildSetting : InSetting->GetChildSettings())
|
||
|
{
|
||
|
RegisterInnerSettings(ChildSetting);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::HandleSettingChanged(UGameSetting* Setting, EGameSettingChangeReason Reason)
|
||
|
{
|
||
|
OnSettingChangedEvent.Broadcast(Setting, Reason);
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::HandleSettingEditConditionsChanged(UGameSetting* Setting)
|
||
|
{
|
||
|
OnSettingEditConditionChangedEvent.Broadcast(Setting);
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::HandleSettingNamedAction(UGameSetting* Setting, FGameplayTag GameSettings_Action_Tag)
|
||
|
{
|
||
|
OnSettingNamedActionEvent.Broadcast(Setting, GameSettings_Action_Tag);
|
||
|
}
|
||
|
|
||
|
void UGameSettingRegistry::HandleSettingNavigation(UGameSetting* Setting)
|
||
|
{
|
||
|
OnExecuteNavigationEvent.Broadcast(Setting);
|
||
|
}
|
||
|
|
||
|
#undef LOCTEXT_NAMESPACE
|