Files
UnrealEngine/Engine/Source/Developer/WidgetRegistration/Private/ToolElementRegistry.cpp
2025-05-18 13:04:45 +08:00

138 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ToolElementRegistry.h"
#include "Widgets/SNullWidget.h"
void FToolElementRegistrationArgs::UpdateWidget()
{
}
void FToolElementRegistrationArgs::ResetWidget()
{
}
FToolElementRegistrationArgs::FToolElementRegistrationArgs(
EToolElement InToolElementType) :
ToolElementType(InToolElementType),
StyleClassName("Section")
{
}
FToolElementRegistrationArgs::FToolElementRegistrationArgs( FName InStyleClassName ) :
ToolElementType(EToolElement::Section),
StyleClassName(InStyleClassName)
{
}
FToolElementRegistrationArgs::FToolElementRegistrationArgs( UE::DisplayBuilders::FBuilderKey InBuilderKey ) :
ToolElementType(EToolElement::Section)
, StyleClassName( InBuilderKey.ToName() )
, BuilderKey( InBuilderKey )
{
}
TSharedPtr<SWidget> FToolElementRegistrationArgs::GenerateWidget()
{
return nullptr;
}
TSharedRef<SWidget> FToolElementRegistrationArgs::GenerateWidgetSharedRef()
{
if (TSharedPtr<SWidget> Widget = GenerateWidget())
{
return Widget.ToSharedRef();
}
return SNullWidget::NullWidget;
}
FToolElementRegistrationKey::FToolElementRegistrationKey(FName InName, EToolElement InToolElementType ) :
Name(InName), ToolElementType(InToolElementType)
{
FString KeyStr = Name.ToString().AppendChar(' ');
KeyStr.AppendInt( static_cast<int32>(ToolElementType));
KeyString = KeyStr;
}
FString FToolElementRegistrationKey::GetKeyString()
{
return KeyString;
}
FToolElement::FToolElement(
const FName InName,
TSharedRef<FToolElementRegistrationArgs> InBuilderArgs) :
FToolElementRegistrationKey(
InName,
InBuilderArgs->ToolElementType),
RegistrationArgs(InBuilderArgs)
{
}
void FToolElement::SetRegistrationArgs(TSharedRef<FToolElementRegistrationArgs> InRegistrationArgs)
{
RegistrationArgs = InRegistrationArgs;
}
TSharedRef<SWidget> FToolElement::GenerateWidget()
{
return RegistrationArgs->GenerateWidget().ToSharedRef();
}
FToolElementRegistry::FToolElementRegistry()
{
ToolElementKeyToToolElementMap.Reset();
}
FToolElementRegistry& FToolElementRegistry::Get()
{
static FToolElementRegistry Registry;
return Registry;
}
TSharedPtr<FToolElement> FToolElementRegistry::GetToolElementSP(FToolElementRegistrationKey& ToolElementKey)
{
TSharedPtr<FToolElement>* Element = ToolElementKeyToToolElementMap.Find(*(ToolElementKey.GetKeyString()));
return Element != nullptr ? *Element : nullptr;
}
TSharedRef< SWidget > FToolElementRegistry::GenerateWidget(
TSharedRef<FToolElementRegistrationKey> ToolElementKeySR,
TSharedPtr<FToolElementRegistrationArgs> RegistrationArgsSP,
bool bUpdateRegistrationArgs)
{
if (const TSharedPtr<FToolElement> Element = GetToolElementSP(ToolElementKeySR.Get()))
{
const bool bHasNewRegistrationArgs = RegistrationArgsSP != nullptr;
const TSharedRef<FToolElementRegistrationArgs> TempArgsSR = Element->RegistrationArgs;
if (bHasNewRegistrationArgs)
{
Element->RegistrationArgs = RegistrationArgsSP.ToSharedRef();
}
const TSharedPtr<SWidget> Widget = Element->RegistrationArgs->GenerateWidget();
if ( !bUpdateRegistrationArgs && bHasNewRegistrationArgs )
{
Element->RegistrationArgs = TempArgsSR;
}
return Widget != nullptr && Widget.IsValid() ? Widget.ToSharedRef() : SNullWidget::NullWidget;
}
return SNullWidget::NullWidget;
}
void FToolElementRegistry::RegisterElement(const TSharedRef<FToolElement> ToolElement)
{
ToolElementKeyToToolElementMap.Add(*ToolElement->GetKeyString(), ToolElement);
}
void FToolElementRegistry::UnregisterElement(const TSharedRef<FToolElement> ToolElement)
{
ToolElementKeyToToolElementMap.Remove(*ToolElement->GetKeyString());
}