Files
UnrealEngine/Engine/Plugins/Runtime/GameFeatures/Source/GameFeaturesEditor/Private/GameFeaturePluginMetadataCustomization.cpp
2025-05-18 13:04:45 +08:00

82 lines
2.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "GameFeaturePluginMetadataCustomization.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "Dom/JsonValue.h"
#include "Interfaces/IPluginManager.h"
#include "SGameFeatureStateWidget.h"
#include "GameFeaturesSubsystem.h"
#include "GameFeatureTypes.h"
#include "Widgets/Text/STextBlock.h"
#define LOCTEXT_NAMESPACE "GameFeatures"
//////////////////////////////////////////////////////////////////////////
// FGameFeaturePluginMetadataCustomization
void FGameFeaturePluginMetadataCustomization::CustomizeDetails(FPluginEditingContext& InPluginContext, IDetailLayoutBuilder& DetailBuilder)
{
Plugin = InPluginContext.PluginBeingEdited;
const EBuiltInAutoState AutoState = UGameFeaturesSubsystem::DetermineBuiltInInitialFeatureState(Plugin->GetDescriptor().CachedJson, FString());
InitialState = UGameFeaturesSubsystem::ConvertInitialFeatureStateToTargetState(AutoState);
IDetailCategoryBuilder& TopCategory = DetailBuilder.EditCategory("Game Features", FText::GetEmpty(), ECategoryPriority::Important);
FDetailWidgetRow& ControlRow = TopCategory.AddCustomRow(LOCTEXT("ControlSearchText", "Plugin State Control"))
.NameContent()
[
SNew(STextBlock)
.Text(LOCTEXT("InitialState", "Initial State"))
.Font(DetailBuilder.GetDetailFont())
]
.ValueContent()
[
SNew(SGameFeatureStateWidget)
.ToolTipText(LOCTEXT("DefaultStateSwitcherTooltip", "Change the default initial state of this game feature"))
.CurrentState(this, &FGameFeaturePluginMetadataCustomization::GetDefaultState)
.OnStateChanged(this, &FGameFeaturePluginMetadataCustomization::ChangeDefaultState)
];
}
void FGameFeaturePluginMetadataCustomization::CommitEdits(FPluginDescriptor& Descriptor)
{
FString StateStr;
switch (InitialState)
{
case EGameFeaturePluginState::Installed:
StateStr = TEXT("Installed");
break;
case EGameFeaturePluginState::Registered:
StateStr = TEXT("Registered");
break;
case EGameFeaturePluginState::Loaded:
StateStr = TEXT("Loaded");
break;
case EGameFeaturePluginState::Active:
StateStr = TEXT("Active");
break;
}
if (ensure(!StateStr.IsEmpty()))
{
Descriptor.AdditionalFieldsToWrite.FindOrAdd(TEXT("BuiltInInitialFeatureState")) = MakeShared<FJsonValueString>(StateStr);
}
}
EGameFeaturePluginState FGameFeaturePluginMetadataCustomization::GetDefaultState() const
{
return InitialState;
}
void FGameFeaturePluginMetadataCustomization::ChangeDefaultState(EGameFeaturePluginState DesiredState)
{
InitialState = DesiredState;
}
//////////////////////////////////////////////////////////////////////////
#undef LOCTEXT_NAMESPACE