SEzAbleTreeViewWidget.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // Fill out your copyright notice in the Description page of Project Settings.
  2. #include "SEzAbleTreeViewWidget.h"
  3. #include "SlateOptMacros.h"
  4. #include "SPositiveActionButton.h"
  5. #include "Widgets/Layout/SScrollBox.h"
  6. #include "SEzAbleTreeViewRowWidget.h"
  7. #define LOCTEXT_NAMESPACE "AbleStateTreeEditor"
  8. BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
  9. void SEzAbleTreeViewWidget::Construct(const FArguments& InArgs, TSharedPtr<FEzAbleTreeViewOperationMode> InAbleTreeViewOperationMode)
  10. {
  11. AbleTreeViewOperationMode = InAbleTreeViewOperationMode;
  12. AbleTreeViewOperationMode->GetOnStateAdded().AddSP(this, &SEzAbleTreeViewWidget::HandleModelStateAdded);
  13. TSharedRef<SScrollBar> HorizontalScrollBar = SNew(SScrollBar)
  14. .Orientation(Orient_Horizontal)
  15. .Thickness(FVector2D(12.0f, 12.0f));
  16. TSharedRef<SScrollBar> VerticalScrollBar = SNew(SScrollBar)
  17. .Orientation(Orient_Vertical)
  18. .Thickness(FVector2D(12.0f, 12.0f));
  19. AbleTreeViewOperationMode->GetSubTrees(Subtrees);
  20. UEzAbilityState* AbilityState = NewObject<UEzAbilityState>();
  21. UEzAbilityState* AbilitySub = NewObject<UEzAbilityState>();
  22. TestStrongState.Add(AbilityState);
  23. TestState.Add(TestStrongState[0]);
  24. TreeView = SNew(STreeView<TWeakObjectPtr<UEzAbilityState>>)
  25. .OnGenerateRow(this, &SEzAbleTreeViewWidget::HandleGenerateRow)
  26. .OnGetChildren(this, &SEzAbleTreeViewWidget::HandleGetChildren)
  27. .TreeItemsSource(&Subtrees)
  28. .ItemHeight(32)
  29. .AllowOverscroll(EAllowOverscroll::No)
  30. .ExternalScrollbar(VerticalScrollBar);
  31. ChildSlot
  32. [
  33. SNew(SVerticalBox)
  34. + SVerticalBox::Slot()
  35. .VAlign(VAlign_Center)
  36. .AutoHeight()
  37. [
  38. SNew(SBorder)
  39. .BorderImage(FAppStyle::GetBrush("ToolPanel.GroupBorder"))
  40. .Padding(2.0f)
  41. [
  42. SNew(SHorizontalBox)
  43. // New State
  44. + SHorizontalBox::Slot()
  45. .VAlign(VAlign_Center)
  46. .Padding(4.0f, 2.0f)
  47. .AutoWidth()
  48. [
  49. SNew(SPositiveActionButton)
  50. .ToolTipText(LOCTEXT("AddStateToolTip", "Add New State"))
  51. .Icon(FAppStyle::Get().GetBrush("Icons.Plus"))
  52. .Text(LOCTEXT("AddState", "Add State"))
  53. .OnClicked(this, &SEzAbleTreeViewWidget::HandleAddStateButton)
  54. ]
  55. ]
  56. ]
  57. + SVerticalBox::Slot()
  58. .Padding(0.0f, 6.0f, 0.0f, 0.0f)
  59. [
  60. SNew(SHorizontalBox)
  61. + SHorizontalBox::Slot()
  62. .FillWidth(1.0f)
  63. .Padding(0.0f)
  64. [
  65. SAssignNew(ViewBox, SScrollBox)
  66. .Orientation(Orient_Horizontal)
  67. .ExternalScrollbar(HorizontalScrollBar)
  68. + SScrollBox::Slot()
  69. .FillSize(1.0f)
  70. [
  71. TreeView.ToSharedRef()
  72. ]
  73. ]
  74. + SHorizontalBox::Slot()
  75. .AutoWidth()
  76. [
  77. VerticalScrollBar
  78. ]
  79. ]
  80. + SVerticalBox::Slot()
  81. .AutoHeight()
  82. [
  83. HorizontalScrollBar
  84. ]
  85. ];
  86. UpdateTree(true);
  87. }
  88. END_SLATE_FUNCTION_BUILD_OPTIMIZATION
  89. FReply SEzAbleTreeViewWidget::HandleAddStateButton()
  90. {
  91. if (AbleTreeViewOperationMode == nullptr)
  92. {
  93. return FReply::Handled();
  94. }
  95. TArray<UEzAbilityState*> SelectedStates;
  96. //AbleTreeViewOperationMode->GetSelectedStates(SelectedStates);
  97. //UStateTreeState* FirstSelectedState = SelectedStates.Num() > 0 ? SelectedStates[0] : nullptr;
  98. // if (FirstSelectedState != nullptr)
  99. // {
  100. // // If the state is root, add child state, else sibling.
  101. // if (FirstSelectedState->Parent == nullptr)
  102. // {
  103. // StateTreeViewModel->AddChildState(FirstSelectedState);
  104. // TreeView->SetItemExpansion(FirstSelectedState, true);
  105. // }
  106. // else
  107. // {
  108. // StateTreeViewModel->AddState(FirstSelectedState);
  109. // }
  110. // }
  111. // else
  112. // {
  113. // // Add root state at the lowest level.
  114. // StateTreeViewModel->AddState(nullptr);
  115. // }
  116. AbleTreeViewOperationMode->AddState(nullptr);
  117. return FReply::Handled();
  118. // UE_LOG(LogTemp, Log, TEXT("SEzAbleTreeViewWidget::HandleAddStateButton"));
  119. // return FReply::Handled();
  120. }
  121. TSharedRef<ITableRow> SEzAbleTreeViewWidget::HandleGenerateRow(TWeakObjectPtr<UEzAbilityState> InState, const TSharedRef<STableViewBase>& InOwnerTableView)
  122. {
  123. return SNew(SEzAbleTreeViewRowWidget, InOwnerTableView, InState, ViewBox);
  124. }
  125. void SEzAbleTreeViewWidget::HandleGetChildren(TWeakObjectPtr<UEzAbilityState> InParent, TArray<TWeakObjectPtr<UEzAbilityState>>& OutChildren)
  126. {
  127. //Test Code.
  128. UE_LOG(LogTemp, Log, TEXT("EZAbleTreeViewWidget HandleGetChildren"));
  129. InParent->AddChildState(FName());
  130. if (const UEzAbilityState* Parent = InParent.Get())
  131. {
  132. OutChildren.Append(Parent->Children);
  133. }
  134. }
  135. void SEzAbleTreeViewWidget::UpdateTree(bool bExpandPersistent /*= false*/)
  136. {
  137. // TArray<TWeakObjectPtr<UEzAbilityState>> TestState;
  138. // UEzAbilityState* AbilityState = NewObject<UEzAbilityState>();
  139. // TestState.Add(AbilityState);
  140. TreeView->SetTreeItemsSource(&TestState);
  141. //TreeView->GenerateNewWidget(AbilityState);
  142. //TreeView->WidgetFromItem(AbilityState);
  143. TreeView->RequestTreeRefresh();
  144. }
  145. void SEzAbleTreeViewWidget::HandleModelStateAdded(UEzAbilityState* ParentState, UEzAbilityState* NewState)
  146. {
  147. // TreeView->SetItemSelection(NewState, true);
  148. // TreeView->SetItemExpansion(NewState, true);
  149. //Test code.
  150. if (TestState.Num() >= 2)
  151. {
  152. TreeView->SetItemSelection(TestState[1], true);
  153. }
  154. UEzAbilityState* AbilityState = NewObject<UEzAbilityState>();
  155. TestStrongState.Add(AbilityState);
  156. TestState.Add(AbilityState);
  157. TreeView->RequestTreeRefresh();
  158. // TreeView->RequestScrollIntoView(TestAddState);
  159. // TreeView->RequestTreeRefresh();
  160. }
  161. #undef LOCTEXT_NAMESPACE