123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- // 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"
- #include "AbleTreeEditorCommands.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)
- .OnSelectionChanged(this, &SEzAbleTreeViewWidget::HandleTreeSelectionChanged)
- .OnExpansionChanged(this, &SEzAbleTreeViewWidget::HandleTreeExpansionChanged)
- .OnContextMenuOpening(this, &SEzAbleTreeViewWidget::HandleContextMenuOpening )
- .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
- ]
- ];
- if (CommandList = AbleTreeViewOperationMode->AbleTreeViewCommandList)
- {
- BindCommands();
- }
- 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();
- }
- 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*/)
- {
- TreeView->RequestTreeRefresh();
- }
- void SEzAbleTreeViewWidget::HandleTreeSelectionChanged(TWeakObjectPtr<UEzAbilityState> InSelectedItem, ESelectInfo::Type SelectionType)
- {
- if (!AbleTreeViewOperationMode)
- {
- return;
- }
- // Do not report code based selection changes.
- if (SelectionType == ESelectInfo::Direct)
- {
- return;
- }
- TArray<TWeakObjectPtr<UEzAbilityState>> SelectedItems = TreeView->GetSelectedItems();
- bUpdatingSelection = true;
- AbleTreeViewOperationMode->SetSelection(SelectedItems);
- bUpdatingSelection = false;
- }
- void SEzAbleTreeViewWidget::HandleTreeExpansionChanged(TWeakObjectPtr<UEzAbilityState> InSelectedItem, bool bExpanded)
- {
-
- }
- TSharedPtr<SWidget> SEzAbleTreeViewWidget::HandleContextMenuOpening()
- {
- if (!AbleTreeViewOperationMode)
- {
- return nullptr;
- }
- FMenuBuilder MenuBuilder(true, CommandList);
- MenuBuilder.AddSubMenu(
- LOCTEXT("AddState", "Add State"),
- FText(),
- FNewMenuDelegate::CreateLambda([this](FMenuBuilder& MenuBuilder)
- {
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().AddSiblingState);
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().AddChildState);
- }),
- /*bInOpenSubMenuOnClick =*/false,
- FSlateIcon(FAppStyle::GetAppStyleSetName(), "Icons.Plus")
- );
- MenuBuilder.AddSeparator();
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().CutStates);
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().CopyStates);
- MenuBuilder.AddSubMenu(
- LOCTEXT("Paste", "Paste"),
- FText(),
- FNewMenuDelegate::CreateLambda([this](FMenuBuilder& MenuBuilder)
- {
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().PasteStatesAsSiblings);
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().PasteStatesAsChildren);
- }),
- /*bInOpenSubMenuOnClick =*/false,
- FSlateIcon(FAppStyle::GetAppStyleSetName(), "GenericCommands.Paste")
- );
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().DuplicateStates);
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().DeleteStates);
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().RenameState);
- MenuBuilder.AddSeparator();
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().EnableStates);
- //#if WITH_STATETREE_TRACE_DEBUGGER
- MenuBuilder.AddSeparator();
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().EnableOnEnterStateBreakpoint);
- MenuBuilder.AddMenuEntry(FAbleTreeEditorCommands::Get().EnableOnExitStateBreakpoint);
- //#endif // WITH_STATETREE_TRACE_DEBUGGER
- return MenuBuilder.MakeWidget();
- }
- void SEzAbleTreeViewWidget::HandleModelStateAdded(UEzAbilityState* ParentState, UEzAbilityState* NewState)
- {
- TreeView->RequestTreeRefresh();
- }
- bool SEzAbleTreeViewWidget::HasSelection() const
- {
- return AbleTreeViewOperationMode && AbleTreeViewOperationMode->HasSelection();
- }
- void SEzAbleTreeViewWidget::BindCommands()
- {
- const FAbleTreeEditorCommands& Commands = FAbleTreeEditorCommands::Get();
- CommandList->MapAction(
- Commands.DeleteStates,
- FExecuteAction::CreateSP(this, &SEzAbleTreeViewWidget::HandleDeleteStates),
- FCanExecuteAction::CreateSP(this, &SEzAbleTreeViewWidget::HasSelection));
- }
- void SEzAbleTreeViewWidget::HandleDeleteStates()
- {
- if (AbleTreeViewOperationMode)
- {
- AbleTreeViewOperationMode->RemoveSelectedStates();
- TreeView->RequestTreeRefresh();
- }
- }
- FReply SEzAbleTreeViewWidget::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent)
- {
- if (CommandList->ProcessCommandBindings(InKeyEvent))
- {
- return FReply::Handled();
- }
- else
- {
- return SCompoundWidget::OnKeyDown(MyGeometry, InKeyEvent);
- }
- }
- #undef LOCTEXT_NAMESPACE
|