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