Files
UnrealEngineUWP/Engine/Source/Developer/WidgetRegistration/Private/ToolElementRegistry.cpp

138 lines
3.6 KiB
C++
Raw Normal View History

// 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;
}
[Backout] - CL31789615 [FYI] Bryan.Johnson Original CL Desc ----------------------------------------------------------------- [Backout] - CL31782478 [FYI] karen.jirak Original CL Desc ----------------------------------------------------------------- Place Actors Panel - Usability Improvements ~ Extracted a large chunk out of FToolkitBuilder and put it in abstract class CategoryDrivenContentBuilderBase, which provides a base class for any class which needs a lefthand vertical category picker which loads content in the box next to the picker ~ Implemented CategoryDrivenContentBuilder, which provides a delegate which takes an FName as an argument which provides the name of the category just clicked, and returns the TSharedRef<SWidget> the user wants loaded for the selected category ~ created FPlacementModeCommands which creates a command to load content for any placement commands found ~ Introduced CVar PlaceActors.EnableCategoryChooserView which, when true, loads the new (in progress) place actors tab ~ altered SPlacementModeTools to create and use the CategoryDrivenContentBuilder when PlaceActors.EnableCategoryChooserView is true, else it loads the usual place actors panel ~ updated ToolElementRegistry with a convenience method that generates the widget and immediately converts it to a shared Ref Note that after a change in the CVar, you will need to close and reopen the place actors panel for it to appear properly. #jira UE-205201 #rb brooke.hubert, JeanMichel.Dignard [CL 31846160 by karen jirak in ue5-main branch]
2024-02-27 13:36:17 -05:00
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());
}