Stream Chat Unreal SDK
Loading...
Searching...
No Matches
SStreamListView.h
1// Copyright 2026 Stream.IO, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Components/NativeWidgetHost.h"
6#include "CoreMinimal.h"
7#include "Slate/SObjectTableRow.h"
8
9template <class ItemType>
10class SStreamListView : public SListView<ItemType>
11{
12public:
13 using FSuperArguments = typename SListView<ItemType>::FArguments;
14
15 DECLARE_DELEGATE_RetVal_OneParam(UWidget*, FCreateListViewWidgetDelegate, const ItemType&);
16
17 SLATE_BEGIN_ARGS(SStreamListView<ItemType>) : _ListItemsSource(nullptr), _CreateListViewWidget(), _OnListViewScrolled()
18 {
19 }
20
21 SLATE_ARGUMENT(const TArray<ItemType>*, ListItemsSource)
22 SLATE_EVENT(FCreateListViewWidgetDelegate, CreateListViewWidget);
23 SLATE_EVENT(FOnTableViewScrolled, OnListViewScrolled)
24
25 SLATE_END_ARGS()
26
27 void Construct(const FArguments& InArgs);
28
29private:
30 class SNullTableRow : public STableRow<ItemType>
31 {
32 public:
33 virtual const FSlateBrush* GetBorder() const override
34 {
35 return nullptr;
36 }
37
38 protected:
39 virtual ESelectionMode::Type GetSelectionMode() const override
40 {
41 return ESelectionMode::None;
42 }
43 };
44
45 TSharedRef<ITableRow> HandleGenerateRow(ItemType Item, const TSharedRef<STableViewBase>& OwnerTable)
46 {
47 UWidget* EntryWidget = CreateItemWidget.Execute(Item);
48 const TSharedPtr<SWidget> CachedWidget = EntryWidget->TakeWidget();
49 return SNew(SNullTableRow, OwnerTable)[CachedWidget.ToSharedRef()];
50 }
51
52 FCreateListViewWidgetDelegate CreateItemWidget;
53};
54
55template <class ItemType>
56void SStreamListView<ItemType>::Construct(const FArguments& InArgs)
57{
58 SListView<ItemType>::Construct(FSuperArguments()
59 // UE5 adds a default background brush which we want to disable
60 .ListViewStyle(&FTableViewStyle::GetDefault())
61 .OnGenerateRow(this, &SStreamListView::HandleGenerateRow)
62 .ListItemsSource(InArgs._ListItemsSource)
63 .OnListViewScrolled(InArgs._OnListViewScrolled));
64
65 this->CreateItemWidget = InArgs._CreateListViewWidget;
66}