123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- // Fill out your copyright notice in the Description page of Project Settings.
- #include "SEzAbleTreeViewWidget.h"
- #include "SlateOptMacros.h"
- #include "SPositiveActionButton.h"
- #include "Widgets/Layout/SScrollBox.h"
- #include "SEzAbleTreeViewRowWidget.h"
- #define LOCTEXT_NAMESPACE "AbleStateTreeEditor"
- BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
- void SEzAbleTreeViewWidget::Construct(const FArguments& InArgs, TSharedPtr<FEzAbleTreeViewOperationMode> InAbleTreeViewOperationMode)
- {
- AbleTreeViewOperationMode = InAbleTreeViewOperationMode;
- AbleTreeViewOperationMode->GetOnStateAdded().AddSP(this, &SEzAbleTreeViewWidget::HandleModelStateAdded);
- TSharedRef<SScrollBar> HorizontalScrollBar = SNew(SScrollBar)
- .Orientation(Orient_Horizontal)
- .Thickness(FVector2D(12.0f, 12.0f));
- TSharedRef<SScrollBar> VerticalScrollBar = SNew(SScrollBar)
- .Orientation(Orient_Vertical)
- .Thickness(FVector2D(12.0f, 12.0f));
- AbleTreeViewOperationMode->GetSubTrees(Subtrees);
- UEzAbilityState* AbilityState = NewObject<UEzAbilityState>();
- UEzAbilityState* AbilitySub = NewObject<UEzAbilityState>();
- TestStrongState.Add(AbilityState);
- TestState.Add(TestStrongState[0]);
- TreeView = SNew(STreeView<TWeakObjectPtr<UEzAbilityState>>)
- .OnGenerateRow(this, &SEzAbleTreeViewWidget::HandleGenerateRow)
- .OnGetChildren(this, &SEzAbleTreeViewWidget::HandleGetChildren)
- .TreeItemsSource(&Subtrees)
- .ItemHeight(32)
- .AllowOverscroll(EAllowOverscroll::No)
- .ExternalScrollbar(VerticalScrollBar);
- ChildSlot
- [
- SNew(SVerticalBox)
- + SVerticalBox::Slot()
- .VAlign(VAlign_Center)
- .AutoHeight()
- [
- SNew(SBorder)
- .BorderImage(FAppStyle::GetBrush("ToolPanel.GroupBorder"))
- .Padding(2.0f)
- [
- SNew(SHorizontalBox)
- // New State
- + SHorizontalBox::Slot()
- .VAlign(VAlign_Center)
- .Padding(4.0f, 2.0f)
- .AutoWidth()
- [
- SNew(SPositiveActionButton)
- .ToolTipText(LOCTEXT("AddStateToolTip", "Add New State"))
- .Icon(FAppStyle::Get().GetBrush("Icons.Plus"))
- .Text(LOCTEXT("AddState", "Add State"))
- .OnClicked(this, &SEzAbleTreeViewWidget::HandleAddStateButton)
- ]
- ]
- ]
- + SVerticalBox::Slot()
- .Padding(0.0f, 6.0f, 0.0f, 0.0f)
- [
- SNew(SHorizontalBox)
- + SHorizontalBox::Slot()
- .FillWidth(1.0f)
- .Padding(0.0f)
- [
- SAssignNew(ViewBox, SScrollBox)
- .Orientation(Orient_Horizontal)
- .ExternalScrollbar(HorizontalScrollBar)
- + SScrollBox::Slot()
- .FillSize(1.0f)
- [
- TreeView.ToSharedRef()
- ]
- ]
- + SHorizontalBox::Slot()
- .AutoWidth()
- [
- VerticalScrollBar
- ]
- ]
- + SVerticalBox::Slot()
- .AutoHeight()
- [
- HorizontalScrollBar
- ]
- ];
- UpdateTree(true);
- }
- END_SLATE_FUNCTION_BUILD_OPTIMIZATION
- FReply SEzAbleTreeViewWidget::HandleAddStateButton()
- {
- if (AbleTreeViewOperationMode == nullptr)
- {
- return FReply::Handled();
- }
- TArray<UEzAbilityState*> SelectedStates;
- //AbleTreeViewOperationMode->GetSelectedStates(SelectedStates);
- //UStateTreeState* FirstSelectedState = SelectedStates.Num() > 0 ? SelectedStates[0] : nullptr;
- // if (FirstSelectedState != nullptr)
- // {
- // // If the state is root, add child state, else sibling.
- // if (FirstSelectedState->Parent == nullptr)
- // {
- // StateTreeViewModel->AddChildState(FirstSelectedState);
- // TreeView->SetItemExpansion(FirstSelectedState, true);
- // }
- // else
- // {
- // StateTreeViewModel->AddState(FirstSelectedState);
- // }
- // }
- // else
- // {
- // // Add root state at the lowest level.
- // StateTreeViewModel->AddState(nullptr);
- // }
- AbleTreeViewOperationMode->AddState(nullptr);
- return FReply::Handled();
- // UE_LOG(LogTemp, Log, TEXT("SEzAbleTreeViewWidget::HandleAddStateButton"));
- // return FReply::Handled();
- }
- TSharedRef<ITableRow> SEzAbleTreeViewWidget::HandleGenerateRow(TWeakObjectPtr<UEzAbilityState> InState, const TSharedRef<STableViewBase>& InOwnerTableView)
- {
- return SNew(SEzAbleTreeViewRowWidget, InOwnerTableView, InState, ViewBox);
- }
- void SEzAbleTreeViewWidget::HandleGetChildren(TWeakObjectPtr<UEzAbilityState> InParent, TArray<TWeakObjectPtr<UEzAbilityState>>& OutChildren)
- {
- //Test Code.
- UE_LOG(LogTemp, Log, TEXT("EZAbleTreeViewWidget HandleGetChildren"));
- InParent->AddChildState(FName());
- if (const UEzAbilityState* Parent = InParent.Get())
- {
- OutChildren.Append(Parent->Children);
- }
- }
- void SEzAbleTreeViewWidget::UpdateTree(bool bExpandPersistent /*= false*/)
- {
- // TArray<TWeakObjectPtr<UEzAbilityState>> TestState;
- // UEzAbilityState* AbilityState = NewObject<UEzAbilityState>();
- // TestState.Add(AbilityState);
- TreeView->SetTreeItemsSource(&TestState);
- //TreeView->GenerateNewWidget(AbilityState);
- //TreeView->WidgetFromItem(AbilityState);
- TreeView->RequestTreeRefresh();
- }
- void SEzAbleTreeViewWidget::HandleModelStateAdded(UEzAbilityState* ParentState, UEzAbilityState* NewState)
- {
- // TreeView->SetItemSelection(NewState, true);
- // TreeView->SetItemExpansion(NewState, true);
-
- //Test code.
- if (TestState.Num() >= 2)
- {
- TreeView->SetItemSelection(TestState[1], true);
- }
- UEzAbilityState* AbilityState = NewObject<UEzAbilityState>();
- TestStrongState.Add(AbilityState);
- TestState.Add(AbilityState);
- TreeView->RequestTreeRefresh();
- // TreeView->RequestScrollIntoView(TestAddState);
- // TreeView->RequestTreeRefresh();
- }
- #undef LOCTEXT_NAMESPACE
|