A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
DlgTreeViewNode.h
Go to the documentation of this file.
1// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.
2#pragma once
3
4#include "CoreMinimal.h"
5#include "Widgets/Views/STreeView.h"
6
8template <class SelfType>
9class FDlgTreeViewNode : public TSharedFromThis<SelfType>
10{
11public:
12 /* Create a listing for a search result*/
13 FDlgTreeViewNode(const FText& InDisplayText, const TSharedPtr<SelfType>& InParent)
14 : Parent(InParent), DisplayText(InDisplayText) {}
15 virtual ~FDlgTreeViewNode() {}
16
17 /* Called when user clicks on the search item */
18 virtual FReply OnClick()
19 {
20 // If there is a parent, handle it using the parent's functionality
21 if (Parent.IsValid())
22 {
23 return Parent.Pin()->OnClick();
24 }
25
26 return FReply::Unhandled();
27 }
28
29 // DisplayText:
30 FText GetDisplayText() const { return DisplayText; }
31 FName GetDisplayTextAsFName() const { return FName(*DisplayText.ToString()); }
32 void SetDisplayText(const FText& InText) { DisplayText = InText; }
33 bool DoesDisplayTextContains(const FString& InSearch, ESearchCase::Type SearchCase = ESearchCase::IgnoreCase)
34 {
35 return DisplayText.ToString().Contains(InSearch, SearchCase);
36 }
37
38 // Parent:
39 bool HasParent() const { return Parent.IsValid(); }
40 TWeakPtr<SelfType> GetParent() const { return Parent; }
41 void SetParent(TWeakPtr<SelfType> InParentNode) { Parent = InParentNode; }
42 void ClearParent() { Parent.Reset(); }
43
44 // Children:
45 bool HasChildren() const { return Children.Num() > 0; }
46 const TArray<TSharedPtr<SelfType>>& GetChildren() const { return Children; }
47 void GetVisibleChildren(TArray<TSharedPtr<SelfType>>& OutChildren)
48 {
49 for (const TSharedPtr<SelfType>& Child : Children)
50 {
51 if (Child->IsVisible())
52 {
53 OutChildren.Add(Child);
54 }
55 }
56 }
57 virtual void AddChild(const TSharedPtr<SelfType>& ChildNode)
58 {
59 ensure(!ChildNode->IsRoot());
60 ChildNode->SetParent(this->AsShared());
61 Children.Add(ChildNode);
62 }
63 virtual void SetChildren(const TArray<TSharedPtr<SelfType>>& InChildren)
64 {
65 Children = InChildren;
66 for (const TSharedPtr<SelfType>& Child : Children)
67 {
68 ensure(!Child->IsRoot());
69 Child->SetParent(this->AsShared());
70 }
71 }
72 virtual void ClearChildren()
73 {
74 Children.Empty();
75 }
76
77 // bIsVisible:
78 bool IsVisible() const { return bIsVisible; }
79 void SetIsVisible(bool InIsVisible) { bIsVisible = InIsVisible; }
80
82 bool IsRoot() const { return !Parent.IsValid(); }
83
85 bool IsLeaf() const { return Children.Num() == 0; }
86
93 void ExpandAllChildren(const TSharedPtr<STreeView<TSharedPtr<SelfType>>>& TreeView, bool bRecursive = true)
94 {
95 static constexpr bool bShouldExpandItem = true;
96 if (!HasChildren())
97 {
98 return;
99 }
100
101 TreeView->SetItemExpansion(this->AsShared(), bShouldExpandItem);
102 for (const TSharedPtr<SelfType>& ChildNode : Children)
103 {
104 if (bRecursive)
105 {
106 // recursive on all children.
107 ChildNode->ExpandAllChildren(TreeView, bRecursive);
108 }
109 else
110 {
111 // Only direct children
112 TreeView->SetItemExpansion(ChildNode, bShouldExpandItem);
113 }
114 }
115 }
116
122 void GetAllNodes(TArray<TSharedPtr<SelfType>>& OutNodeArray) const
123 {
124 for (const TSharedPtr<SelfType>& ChildNode : Children)
125 {
126 OutNodeArray.Add(ChildNode);
127 ChildNode->GetAllNodes(OutNodeArray);
128 }
129 }
130
136 virtual void FilterPathsToNodesThatContainText(const FString& InSearch, TArray<TArray<TSharedPtr<SelfType>>>& OutNodes)
137 {
138 for (int32 Index = 0, Num = Children.Num(); Index < Num; Index++)
139 {
140 TSharedPtr<SelfType> CurrentChild = Children[Index];
141 CurrentChild->SetIsVisible(false);
142 GetPathToChildThatContainsText(Children[Index], InSearch, OutNodes);
143
144 // Let child classes handle this themselves
145 PostFilterPathsToNodes(CurrentChild);
146 }
147 }
148
149protected:
151 virtual void PostFilterPathsToNodes(const TSharedPtr<SelfType>& Child) {}
152
154 virtual void PostBuildPathToTopMostParent(const TSharedPtr<SelfType>& CurrentParentNode) {}
155
157 virtual bool FilterIsChildVisible(const TSharedPtr<SelfType>& GrandChild)
158 {
159 return GrandChild->IsLeaf();
160 }
161
163 virtual bool FilterDoesChildContainText(const TSharedPtr<SelfType>& Child, const FString& InSearch)
164 {
165 return Child->DoesDisplayTextContains(InSearch);
166 }
167
169 const TSharedPtr<SelfType>& Child,
170 const FString& InSearch,
171 TArray<TArray<TSharedPtr<SelfType>>>& OutNodes
172 )
173 {
174 // Child has text, build path to it
175 bool bChildIsVisible;
176 if (FilterDoesChildContainText(Child, InSearch))
177 {
178 bChildIsVisible = true;
179
180 // Build path to top most parent
181 TSharedPtr<SelfType> CurrentNode = Child;
182 TArray<TSharedPtr<SelfType>> ChildOutNodes;
183 while (CurrentNode->HasParent())
184 {
185 ChildOutNodes.Add(CurrentNode);
186
187 // Parents are visible too
188 TSharedPtr<SelfType> CurrentParentNode = CurrentNode->GetParent().Pin();
189 CurrentParentNode->SetIsVisible(bChildIsVisible);
190
191 // Advance up the tree
192 CurrentNode = CurrentParentNode;
193
194 PostBuildPathToTopMostParent(CurrentParentNode);
195 }
196
197 // reverse
198 Algo::Reverse(ChildOutNodes);
199 OutNodes.Emplace(ChildOutNodes);
200 }
201 else
202 {
203 bChildIsVisible = false;
204 }
205 Child->SetIsVisible(bChildIsVisible);
206
207 // Check children
208 for (const TSharedPtr<SelfType>& GrandChild : Child->GetChildren())
209 {
210 GetPathToChildThatContainsText(GrandChild, InSearch, OutNodes);
211 GrandChild->SetIsVisible(bChildIsVisible && FilterIsChildVisible(GrandChild));
212 }
213 }
214
215protected:
217 TArray<TSharedPtr<SelfType>> Children;
218
220 TWeakPtr<SelfType> Parent;
221
224
226 bool bIsVisible = true;
227};
bool DoesDisplayTextContains(const FString &InSearch, ESearchCase::Type SearchCase=ESearchCase::IgnoreCase)
virtual void PostBuildPathToTopMostParent(const TSharedPtr< SelfType > &CurrentParentNode)
void GetVisibleChildren(TArray< TSharedPtr< SelfType > > &OutChildren)
bool IsRoot() const
virtual bool FilterDoesChildContainText(const TSharedPtr< SelfType > &Child, const FString &InSearch)
void SetDisplayText(const FText &InText)
bool IsLeaf() const
bool HasChildren() const
const TArray< TSharedPtr< SelfType > > & GetChildren() const
void SetParent(TWeakPtr< SelfType > InParentNode)
virtual ~FDlgTreeViewNode()
bool IsVisible() const
FDlgTreeViewNode(const FText &InDisplayText, const TSharedPtr< SelfType > &InParent)
virtual void GetPathToChildThatContainsText(const TSharedPtr< SelfType > &Child, const FString &InSearch, TArray< TArray< TSharedPtr< SelfType > > > &OutNodes)
virtual void PostFilterPathsToNodes(const TSharedPtr< SelfType > &Child)
FText GetDisplayText() const
virtual void SetChildren(const TArray< TSharedPtr< SelfType > > &InChildren)
virtual void AddChild(const TSharedPtr< SelfType > &ChildNode)
TArray< TSharedPtr< SelfType > > Children
virtual bool FilterIsChildVisible(const TSharedPtr< SelfType > &GrandChild)
TWeakPtr< SelfType > Parent
void GetAllNodes(TArray< TSharedPtr< SelfType > > &OutNodeArray) const
virtual void ClearChildren()
virtual void FilterPathsToNodesThatContainText(const FString &InSearch, TArray< TArray< TSharedPtr< SelfType > > > &OutNodes)
void SetIsVisible(bool InIsVisible)
TWeakPtr< SelfType > GetParent() const
virtual FReply OnClick()
void ExpandAllChildren(const TSharedPtr< STreeView< TSharedPtr< SelfType > > > &TreeView, bool bRecursive=true)
FName GetDisplayTextAsFName() const
bool HasParent() const