foreword
Implement the editor to dynamically add interface elements, such as buttons
Effect
accomplish
.h file to add definition
.cpp file implements logic
- interface layout
TSharedRef<SDockTab> FDynamicCreateToolModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
{
TSharedRef<SDockTab> dockTabSharedRef =
SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
[
SNew(SButton)
.Text(FText::FromString("Add"))
.OnClicked_Raw(this, &FDynamicCreateToolModule::AddButtonOnClick)
]
+ SHorizontalBox::Slot()
[
SNew(SButton)
.Text(FText::FromString("Remove"))
.OnClicked_Raw(this, &FDynamicCreateToolModule::RemoveButtonOnClick)
]
]
+ SVerticalBox::Slot()
[
SAssignNew(VerticalBoxPtr, SVerticalBox)
]
];
return dockTabSharedRef;
}
- button click
FReply FDynamicCreateToolModule::AddButtonOnClick()
{
ButtonCount += 1;
UpdateDynamicButtonCount();
return FReply::Handled();
}
FReply FDynamicCreateToolModule::RemoveButtonOnClick()
{
ButtonCount -= 1;
if (ButtonCount < 0)
{
ButtonCount = 0;
}
UpdateDynamicButtonCount();
return FReply::Handled();
}
void FDynamicCreateToolModule::UpdateDynamicButtonCount()
{
VerticalBoxPtr->ClearChildren();
for (int index = 0; index < ButtonCount; index++)
{
int id = index;
VerticalBoxPtr->AddSlot()
[
SNew(SButton)
.Text(FText::FromString(FString::FromInt(id)))
.OnClicked(FOnClicked::CreateLambda([id]
{
UE_LOG(LogTemp, Display, TEXT("OnClick: %d"), id);
return FReply::Handled();
}))
];
VerticalBoxPtr->AddSlot()
[
SNullWidget::NullWidget
];
}
}