Files
BXSSP_Andriod/Plugins/CesiumForUnreal/Source/CesiumEditor/Private/CesiumCustomization.cpp

111 lines
3.7 KiB
C++

// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#include "CesiumCustomization.h"
#include "DetailCategoryBuilder.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "IDetailGroup.h"
#include "ScopedTransaction.h"
#include "Widgets/Input/SButton.h"
#include "Widgets/Layout/SWrapBox.h"
#include "Widgets/Text/STextBlock.h"
struct CesiumButtonGroup::Impl {
TSharedPtr<SWrapBox> Container;
TArray<TWeakObjectPtr<UObject>> SelectedObjects;
FTextBuilder ButtonSearchText;
};
CesiumButtonGroup::CesiumButtonGroup() : pImpl(MakeUnique<Impl>()) {
this->pImpl->Container = SNew(SWrapBox).UseAllottedSize(true);
}
void CesiumButtonGroup::AddButtonForUFunction(
UFunction* Function,
const FText& Label) {
check(Function);
if (!Function)
return;
FText ButtonCaption =
Label.IsEmpty()
? FText::FromString(
FName::NameToDisplayString(*Function->GetName(), false))
: Label;
FText ButtonTooltip = Function->GetToolTipText();
this->pImpl->ButtonSearchText.AppendLine(ButtonCaption);
this->pImpl->ButtonSearchText.AppendLine(ButtonTooltip);
TWeakObjectPtr<UFunction> WeakFunctionPtr = Function;
pImpl->Container->AddSlot()
.VAlign(EVerticalAlignment::VAlign_Center)
.Padding(
0.0f,
3.0f,
0.0f,
3.0f)[SNew(SButton)
.Text(ButtonCaption)
.OnClicked_Lambda([WeakFunctionPtr,
ButtonCaption,
Group = this->AsShared()]() {
if (UFunction* Function = WeakFunctionPtr.Get()) {
FScopedTransaction Transaction(ButtonCaption);
FEditorScriptExecutionGuard ScriptGuard;
for (TWeakObjectPtr<UObject> SelectedObjectPtr :
Group->pImpl->SelectedObjects) {
if (UObject* Object = SelectedObjectPtr.Get()) {
Object->Modify();
Object->ProcessEvent(Function, nullptr);
}
}
}
return FReply::Handled();
})
.ToolTipText(ButtonTooltip)];
}
void CesiumButtonGroup::Finish(
IDetailLayoutBuilder& DetailBuilder,
IDetailCategoryBuilder& Category) {
DetailBuilder.GetObjectsBeingCustomized(this->pImpl->SelectedObjects);
Category.AddCustomRow(this->pImpl->ButtonSearchText.ToText())
.RowTag("Actions")[this->pImpl->Container.ToSharedRef()];
}
IDetailGroup& CesiumCustomization::CreateGroup(
IDetailCategoryBuilder& Category,
FName GroupName,
const FText& LocalizedDisplayName,
bool bForAdvanced,
bool bStartExpanded) {
IDetailGroup& Group = Category.AddGroup(
GroupName,
LocalizedDisplayName,
bForAdvanced,
bStartExpanded);
Group.HeaderRow()
.WholeRowContent()
.HAlign(HAlign_Left)
.VAlign(VAlign_Center)
[SNew(SButton)
.ButtonStyle(FAppStyle::Get(), "NoBorder")
.ContentPadding(FMargin(0, 2, 0, 2))
.OnClicked_Lambda([&Group]() {
Group.ToggleExpansion(!Group.GetExpansionState());
return FReply::Handled();
})
.ForegroundColor(FSlateColor::UseForeground())
.Content()[SNew(STextBlock)
.Font(IDetailLayoutBuilder::GetDetailFont())
.Text(LocalizedDisplayName)]
];
return Group;
}
TSharedPtr<CesiumButtonGroup> CesiumCustomization::CreateButtonGroup() {
return MakeShared<CesiumButtonGroup>();
}