Files
UnrealEngine/Engine/Plugins/Chooser/Source/ChooserEditor/Private/FloatDistanceColumnEditor.cpp
2025-05-18 13:04:45 +08:00

75 lines
2.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "FloatDistanceColumnEditor.h"
#include "ChooserEditorStyle.h"
#include "ChooserColumnHeader.h"
#include "FloatDistanceColumn.h"
#include "ObjectChooserWidgetFactories.h"
#include "ChooserTableEditor.h"
#include "ChooserEditorStyle.h"
#include "Widgets/Input/SNumericEntryBox.h"
#include "Widgets/Images/SImage.h"
#include "GraphEditorSettings.h"
#include "ScopedTransaction.h"
#define LOCTEXT_NAMESPACE "FloatDistanceColumnEditor"
namespace UE::ChooserEditor
{
TSharedRef<SWidget> CreateFloatDistanceColumnWidget(UChooserTable* Chooser, FChooserColumnBase* Column, int Row)
{
FFloatDistanceColumn* FloatDistanceColumn = static_cast<FFloatDistanceColumn*>(Column);
if (Row == ColumnWidget_SpecialIndex_Fallback)
{
return SNullWidget::NullWidget;
}
else if (Row == ColumnWidget_SpecialIndex_Header)
{
// create column header widget
const FSlateBrush* ColumnIcon = FCoreStyle::Get().GetBrush("Icons.SortUp");
const FText ColumnTooltip = LOCTEXT("Float difference tooltip", "Float Difference Column: rows recieve a Score based on how different the input float is from the row value");
const FText ColumnName = LOCTEXT("Float Difference","Float Difference");
TSharedPtr<SWidget> DebugWidget = nullptr;
if (Chooser->GetEnableDebugTesting())
{
DebugWidget = SNew(SNumericEntryBox<float>)
.IsEnabled_Lambda([Chooser](){ return !Chooser->HasDebugTarget(); })
.Value_Lambda([FloatDistanceColumn]() { return FloatDistanceColumn->TestValue; })
.OnValueCommitted_Lambda([Chooser, FloatDistanceColumn](float NewValue, ETextCommit::Type CommitType) { FloatDistanceColumn->TestValue = NewValue; });
}
return MakeColumnHeaderWidget(Chooser, Column, ColumnName, ColumnTooltip, ColumnIcon, DebugWidget);
}
// create cell widget
return SNew(SNumericEntryBox<float>)
.Value_Lambda([FloatDistanceColumn, Row]()
{
return (Row < FloatDistanceColumn->RowValues.Num()) ? FloatDistanceColumn->RowValues[Row].Value : 0;
})
.OnValueCommitted_Lambda([Chooser, FloatDistanceColumn, Row](float NewValue, ETextCommit::Type CommitType)
{
if (Row < FloatDistanceColumn->RowValues.Num())
{
const FScopedTransaction Transaction(LOCTEXT("Edit Float Distance Value", "Edit Float Distance Value"));
Chooser->Modify(true);
FloatDistanceColumn->RowValues[Row].Value = NewValue;
}
});
}
void RegisterFloatDistanceWidgets()
{
FObjectChooserWidgetFactories::RegisterColumnWidgetCreator(FFloatDistanceColumn::StaticStruct(), CreateFloatDistanceColumnWidget);
}
}
#undef LOCTEXT_NAMESPACE