UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IItemsSource.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
9
11{
12template<typename ArgType>
19
20#define SLATE_ITEMS_SOURCE_ARGUMENT( ArgType, ArgName ) \
21 private: \
22 const TArray<ArgType>* _##ArgName##_ArrayPointer = nullptr; \
23 ::UE::Slate::Containers::TObservableArray<ArgType>* _##ArgName##_ObservableArrayPointer = nullptr; \
24 TSharedPtr<::UE::Slate::Containers::TObservableArray<ArgType>> _##ArgName##_SharedObservableArray; \
25 void _Reset##ArgName() \
26 { \
27 _##ArgName##_ArrayPointer = nullptr; \
28 _##ArgName##_ObservableArrayPointer = nullptr; \
29 _##ArgName##_SharedObservableArray.Reset(); \
30 } \
31 public: \
32 WidgetArgsType& ArgName(const TArray<ArgType>* InArg) \
33 { \
34 _Reset##ArgName(); \
35 _##ArgName##_ArrayPointer = InArg; \
36 return static_cast<WidgetArgsType*>(this)->Me(); \
37 } \
38 WidgetArgsType& ArgName(::UE::Slate::Containers::TObservableArray<ArgType>* InArg) \
39 { \
40 _Reset##ArgName(); \
41 _##ArgName##_ObservableArrayPointer = InArg; \
42 return static_cast<WidgetArgsType*>(this)->Me(); \
43 } \
44 WidgetArgsType& ArgName(TSharedPtr<::UE::Slate::Containers::TObservableArray<ArgType>> InArg) \
45 { \
46 _Reset##ArgName(); \
47 _##ArgName##_SharedObservableArray = InArg; \
48 return static_cast<WidgetArgsType*>(this)->Me(); \
49 } \
50 WidgetArgsType& ArgName(TSharedRef<::UE::Slate::Containers::TObservableArray<ArgType>> InArg) \
51 { \
52 _Reset##ArgName(); \
53 _##ArgName##_SharedObservableArray = InArg; \
54 return static_cast<WidgetArgsType*>(this)->Me(); \
55 } \
56 WidgetArgsType& ArgName(::UE::Slate::ItemsSource::ForwardedSlateItemsSourceArgument<ArgType> InArg) \
57 { \
58 _Reset##ArgName(); \
59 _##ArgName##_ArrayPointer = InArg.ArrayPointer; \
60 _##ArgName##_ObservableArrayPointer = InArg.ObservableArrayPointer; \
61 _##ArgName##_SharedObservableArray = InArg.SharedObservableArray; \
62 return static_cast<WidgetArgsType*>(this)->Me(); \
63 } \
64 ::UE::Slate::ItemsSource::ForwardedSlateItemsSourceArgument<ArgType> Get##ArgName() const \
65 { \
66 return {_##ArgName##_ArrayPointer, _##ArgName##_ObservableArrayPointer, _##ArgName##_SharedObservableArray}; \
67 } \
68 TUniquePtr<::UE::Slate::ItemsSource::IItemsSource<ArgType>> Make##ArgName(TSharedRef<STableViewBase> InWidget) const \
69 { \
70 if (_##ArgName##_ArrayPointer) \
71 { \
72 return MakeUnique<::UE::Slate::ItemsSource::FArrayPointer<ArgType>>(_##ArgName##_ArrayPointer); \
73 } \
74 else if (_##ArgName##_ObservableArrayPointer) \
75 { \
76 return MakeUnique<::UE::Slate::ItemsSource::FObservableArrayPointer<ArgType>>(InWidget, _##ArgName##_ObservableArrayPointer); \
77 } \
78 else if (_##ArgName##_SharedObservableArray) \
79 { \
80 return MakeUnique<::UE::Slate::ItemsSource::FSharedObservableArray<ArgType>>(InWidget, _##ArgName##_SharedObservableArray.ToSharedRef()); \
81 } \
82 return TUniquePtr<::UE::Slate::ItemsSource::IItemsSource<ArgType>>(); \
83 }
84
85
86 /*
87 * A generic container for TableView items.
88 */
89 template <typename ItemType>
91{
92public:
93 virtual ~IItemsSource() = default;
95 virtual const TArrayView<const ItemType> GetItems() const = 0;
97 virtual bool IsSame(const void* RawPointer) const = 0;
98};
99
100
101/*
102 *
103 */
104template <typename ItemType>
105class FArrayPointer : public IItemsSource<ItemType>
106{
107public:
109 : ItemsSource(InItemsSource)
110 {
111 }
112
113 virtual const TArrayView<const ItemType> GetItems() const override
114 {
115 return *ItemsSource;
116 }
117
118 virtual bool IsSame(const void* RawPointer) const override
119 {
120 return RawPointer == reinterpret_cast<const void*>(ItemsSource);
121 }
122
123private:
124 const TArray<ItemType>* ItemsSource;
125};
126
127
128/*
129 *
130 */
131template<typename InItemType>
132class FObservableArrayPointer : public IItemsSource<InItemType>
133{
134public:
137
139 : ItemsSource(InItemsSource)
140 , ListViewOwner(InListView)
141 {
142 ArrayChangedHandle = InItemsSource->OnArrayChanged().AddRaw(this, &FObservableArrayPointer::HandleArrayChanged);
143 }
144
146 {
166 checkf(ListViewOwner.IsValid(), TEXT("The View widget has a source needed to be released to prevent bad memory access."));
167 ItemsSource->OnArrayChanged().Remove(ArrayChangedHandle);
168 }
169
170 virtual const TArrayView<const ItemType> GetItems() const override
171 {
172 return TArrayView<const ItemType>(ItemsSource->GetData(), ItemsSource->Num());
173 }
174
175 virtual bool IsSame(const void* RawPointer) const override
176 {
177 return RawPointer == reinterpret_cast<const void*>(&ItemsSource);
178 }
179
180private:
181 void HandleArrayChanged(typename ::UE::Slate::Containers::TObservableArray<ItemType>::ObservableArrayChangedArgsType Args)
182 {
183 if (TSharedPtr<WidgetType> ListViewOwnerPin = ListViewOwner.Pin())
184 {
185 ListViewOwnerPin->RequestListRefresh();
186 }
187 }
188
189private:
191 TWeakPtr<WidgetType> ListViewOwner;
192 FDelegateHandle ArrayChangedHandle;
193};
194
195/*
196 *
197 */
198template<typename InItemType>
199class FSharedObservableArray : public IItemsSource<InItemType>
200{
201public:
204
206 : ItemsSource(InItemsSource)
207 , ListViewOwner(InListView)
208 {
209 ArrayChangedHandle = InItemsSource->OnArrayChanged().AddRaw(this, &FSharedObservableArray::HandleArrayChanged);
210 }
211
213 {
214 ItemsSource->OnArrayChanged().Remove(ArrayChangedHandle);
215 }
216
217 virtual const TArrayView<const ItemType> GetItems() const override
218 {
219 return TArrayView<const ItemType>(ItemsSource->GetData(), ItemsSource->Num());
220 }
221
222 virtual bool IsSame(const void* RawPointer) const override
223 {
225 return RawPointer == reinterpret_cast<const void*>(ValueToTest);
226 }
227
228private:
229 void HandleArrayChanged(typename ::UE::Slate::Containers::TObservableArray<ItemType>::ObservableArrayChangedArgsType Args)
230 {
231 if (TSharedPtr<WidgetType> ListViewOwnerPin = ListViewOwner.Pin())
232 {
233 ListViewOwnerPin->RequestListRefresh();
234 }
235 }
236
237private:
239 TWeakPtr<WidgetType> ListViewOwner;
240 FDelegateHandle ArrayChangedHandle;
241};
242
243} //UE::Slate::ItemsSource
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition IDelegateInstance.h:14
Definition STableViewBase.h:110
Definition ArrayView.h:139
Definition Array.h:670
Definition SharedPointer.h:692
Definition SharedPointer.h:153
ObjectType & Get() const
Definition SharedPointer.h:474
Definition SharedPointer.h:1295
Definition IItemsSource.h:106
FArrayPointer(const TArray< ItemType > *InItemsSource)
Definition IItemsSource.h:108
virtual bool IsSame(const void *RawPointer) const override
Definition IItemsSource.h:118
virtual const TArrayView< const ItemType > GetItems() const override
Definition IItemsSource.h:113
InItemType ItemType
Definition IItemsSource.h:136
FObservableArrayPointer(TSharedRef< WidgetType > InListView, ::UE::Slate::Containers::TObservableArray< ItemType > *InItemsSource)
Definition IItemsSource.h:138
virtual ~FObservableArrayPointer()
Definition IItemsSource.h:145
virtual const TArrayView< const ItemType > GetItems() const override
Definition IItemsSource.h:170
virtual bool IsSame(const void *RawPointer) const override
Definition IItemsSource.h:175
FSharedObservableArray(TSharedRef< WidgetType > InListView, TSharedRef<::UE::Slate::Containers::TObservableArray< ItemType > > InItemsSource)
Definition IItemsSource.h:205
InItemType ItemType
Definition IItemsSource.h:203
virtual bool IsSame(const void *RawPointer) const override
Definition IItemsSource.h:222
virtual ~FSharedObservableArray()
Definition IItemsSource.h:212
virtual const TArrayView< const ItemType > GetItems() const override
Definition IItemsSource.h:217
Definition IItemsSource.h:91
virtual bool IsSame(const void *RawPointer) const =0
virtual const TArrayView< const ItemType > GetItems() const =0
Definition IItemsSource.h:11
Definition ObservableArray.h:187
FArrayChangedDelegate & OnArrayChanged()
Definition ObservableArray.h:238
int32 Num() const
Definition ObservableArray.h:457
ElementType * GetData()
Definition ObservableArray.h:477
const TArray< ArgType > * ArrayPointer
Definition IItemsSource.h:15
::UE::Slate::Containers::TObservableArray< ArgType > * ObservableArrayPointer
Definition IItemsSource.h:16
TSharedPtr<::UE::Slate::Containers::TObservableArray< ArgType > > SharedObservableArray
Definition IItemsSource.h:17