Hi !
I’m trying to fill a STreeView with a SComponentWidget by pushing a button.
Currently, I have a good result with a FString Array:
.h
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Views/ITableRow.h"
#include "Widgets/Views/STableViewBase.h"
#include "Widgets/Views/STreeView.h"
class UMMGTreeViewSettings;
class SMMGTreeView : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SMMGTreeView) {}
SLATE_ARGUMENT(UMMGTreeViewSettings*, MMGTreeViewSettings)
SLATE_END_ARGS()
void Construct(const FArguments& TreeArgs);
FReply ButtonPressed();
TSharedRef<ITableRow> OnGenerateListRow(TSharedPtr<FString> Item, const TSharedRef<STableViewBase>& OwnerTable);
void OnGetChildren(TSharedPtr<FString> Item, TArray<TSharedPtr<FString>>& OutChildren);
TSharedPtr<STreeView<TSharedPtr<FString>>> TreeViewWidget;
private:
UMMGTreeViewSettings* MMGTreeViewSettings = nullptr;
};
.cpp
#include "UI/MMGTreeView.h"
#include "UI/MMGSettings.h"
#include "Widgets/Layout/SScrollBox.h"
#define LOCTEXT_NAMESPACE "MMGTreeView"
void SMMGTreeView::Construct(const FArguments& TreeArgs)
{
if(TreeArgs._MMGTreeViewSettings)
{
MMGTreeViewSettings = TreeArgs._MMGTreeViewSettings;
}
ensure(MMGTreeViewSettings);
ChildSlot[
SNew(SScrollBox)
+ SScrollBox::Slot()[
SNew(SButton)
.Text(FText::FromString("Generate Row"))
.OnClicked(this, &SMMGTreeView::ButtonPressed)
]
+ SScrollBox::Slot()[
SAssignNew(TreeViewWidget, STreeView<TSharedPtr<FString>>)
.ItemHeight(24)
.TreeItemsSource(&MMGTreeViewSettings->Items)
.OnGenerateRow(this, &SMMGTreeView::OnGenerateListRow)
.OnGetChildren(this, &SMMGTreeView::OnGetChildren)
]
];
}
FReply SMMGTreeView::ButtonPressed()
{
MMGTreeViewSettings->Items.Add(MakeShareable(new FString("Row")));
TreeViewWidget->RequestTreeRefresh();
return FReply::Handled();
}
TSharedRef<ITableRow> SMMGTreeView::OnGenerateListRow(TSharedPtr<FString> Item, const TSharedRef<STableViewBase>& OwnerTable)
{
return
SNew(STableRow< TSharedPtr<FString>>, OwnerTable)
.Padding(2.0f)[
SNew(STextBlock).Text(FText::FromString(*Item.Get()))
];
}
.
.
.
How can I replace the FString by, for exemple, this simple SComponentWidget ?
void SMMGSimpleWidget::Construct(const FArguments& InArgs)
{
ChildSlot[
SNew(STextBlock)
.Text(FText::FromString("Row"))
];
}
Thanks !