123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- // Copyright 2017-2021 marynate. All Rights Reserved.
- #include "SMetaDataView.h"
- #include "Widgets/Text/SMultiLineEditableText.h"
- #include "Widgets/Views/SListView.h"
- #include "Widgets/Views/STableRow.h"
- namespace MetaDataViewColumns
- {
- /** IDs for list columns */
- static const FName ColumnID_Tag("Tag");
- static const FName ColumnID_Value("Value");
- }
- struct FMetaDataLine
- {
- FMetaDataLine(FName InTag, const FString& InValue)
- : Tag(InTag)
- , Value(InValue)
- {
- }
- FName Tag;
- FString Value;
- };
- /**
- * The widget that represents a row in the MetaDataView's list view widget. Generates a widget for each column, on-demand.
- */
- class SMetaDataViewRow : public SMultiColumnTableRow< TSharedPtr< FMetaDataLine > >
- {
- public:
- SLATE_BEGIN_ARGS(SMetaDataViewRow) {}
- SLATE_END_ARGS()
- /**
- * Construct this widget. Called by the SNew() Slate macro.
- *
- * @param InArgs Declaration used by the SNew() macro to construct this widget
- * @param InMetaData The metadata tag/value to display in the row widget
- * @param InOwnerTableView The owner of the row widget
- */
- void Construct(const FArguments& InArgs, TSharedRef< FMetaDataLine > InMetaData, TSharedRef< STableViewBase > InOwnerTableView);
- /**
- * Constructs the widget that represents the specified ColumnID for this Row
- *
- * @param ColumnID A unique ID for a column in this TableView; see SHeaderRow::FColumn for more info.
- *
- * @return a widget to represent the contents of a cell in this row of a TableView.
- */
- virtual TSharedRef< SWidget > GenerateWidgetForColumn(const FName& ColumnID) override;
- private:
- TSharedPtr< FMetaDataLine > MetaDataLine;
- };
- void SMetaDataViewRow::Construct(const FArguments& InArgs, TSharedRef< FMetaDataLine > InMetadata, TSharedRef< STableViewBase > InOwnerTableView)
- {
- MetaDataLine = InMetadata;
- SMultiColumnTableRow< TSharedPtr< FMetaDataLine > >::Construct(FSuperRowType::FArguments(), InOwnerTableView);
- }
- TSharedRef< SWidget > SMetaDataViewRow::GenerateWidgetForColumn(const FName& ColumnID)
- {
- TSharedPtr< SWidget > TableRowContent;
- static const FTextBlockStyle MetadataTextStyle = FTextBlockStyle(FCoreStyle::Get().GetWidgetStyle<FTextBlockStyle>("NormalText"))
- .SetFontSize(10);
- if (ColumnID == MetaDataViewColumns::ColumnID_Tag)
- {
- SAssignNew(TableRowContent, SHorizontalBox)
- + SHorizontalBox::Slot()
- .Padding(1.5f)
- .FillWidth(100.0f)
- [
- SNew(SMultiLineEditableText)
- .Text(FText::FromName(MetaDataLine->Tag))
- .TextStyle(&MetadataTextStyle)
- .IsReadOnly(true)
- ];
- }
- else if (ColumnID == MetaDataViewColumns::ColumnID_Value)
- {
- SAssignNew(TableRowContent, SHorizontalBox)
- + SHorizontalBox::Slot()
- .Padding(1.5f)
- .FillWidth(400.0f)
- [
- SNew(SMultiLineEditableText)
- .Text(FText::FromString(*(MetaDataLine->Value)))
- .TextStyle(&MetadataTextStyle)
- .IsReadOnly(true)
- .AutoWrapText(true)
- ];
- }
- else
- {
- checkf(false, TEXT("Unknown ColumnID provided to SMetaDataView"));
- }
- return TableRowContent.ToSharedRef();
- }
- void SMetaDataView::Construct(const FArguments& InArgs, const TMap<FName, FString>& InMetadata)
- {
- for (auto It = InMetadata.CreateConstIterator(); It; ++It)
- {
- MetaDataLines.Add(MakeShared<FMetaDataLine>(FMetaDataLine(It->Key, It->Value)));
- }
- TSharedPtr< SHeaderRow > HeaderRowWidget =
- SNew(SHeaderRow)
- // Tag column
- + SHeaderRow::Column(MetaDataViewColumns::ColumnID_Tag)
- .FillWidth(100.0f)
- .DefaultLabel(NSLOCTEXT("MetadataView", "ColumnID_Tag", "Tag"))
- .DefaultTooltip(FText())
- // Value column
- + SHeaderRow::Column(MetaDataViewColumns::ColumnID_Value)
- .FillWidth(400.0f)
- .DefaultLabel(NSLOCTEXT("MetadataView", "ColumnID_Value", "Value"))
- .DefaultTooltip(FText());
- ChildSlot
- [
- SNew(SVerticalBox)
- + SVerticalBox::Slot()
- [
- SNew(SListView< TSharedPtr< FMetaDataLine > >)
- .ListItemsSource(&MetaDataLines)
- .OnGenerateRow(this, &SMetaDataView::OnGenerateRow)
- .HeaderRow(HeaderRowWidget)
- ]
- ];
- }
- TSharedRef< ITableRow > SMetaDataView::OnGenerateRow(const TSharedPtr< FMetaDataLine > Item, const TSharedRef< STableViewBase >& OwnerTable)
- {
- return SNew(SMetaDataViewRow, Item.ToSharedRef(), OwnerTable);
- }
|