|
@@ -8,7 +8,8 @@
|
|
#define LOCTEXT_NAMESPACE "AbleTreeEditor"
|
|
#define LOCTEXT_NAMESPACE "AbleTreeEditor"
|
|
|
|
|
|
FEzAbleTreeViewOperationMode::FEzAbleTreeViewOperationMode()
|
|
FEzAbleTreeViewOperationMode::FEzAbleTreeViewOperationMode()
|
|
- : TreeDataWeak(nullptr)
|
|
|
|
|
|
+ : TreeDataWeak(nullptr),
|
|
|
|
+ AbleTreeViewCommandList(MakeShared<FUICommandList>())
|
|
{
|
|
{
|
|
|
|
|
|
}
|
|
}
|
|
@@ -26,7 +27,7 @@ void FEzAbleTreeViewOperationMode::Init(UEzAbilityEditorData* InTreeData)
|
|
TreeDataWeak = InTreeData;
|
|
TreeDataWeak = InTreeData;
|
|
|
|
|
|
GEditor->RegisterForUndo(this);
|
|
GEditor->RegisterForUndo(this);
|
|
-
|
|
|
|
|
|
+ //AbleTreeViewCommandList = MakeShared<FUICommandList>();
|
|
FAbleTreeEditorCommands::Register();
|
|
FAbleTreeEditorCommands::Register();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -108,59 +109,161 @@ void FEzAbleTreeViewOperationMode::AddState(UEzAbilityState* AfterState)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+void FEzAbleTreeViewOperationMode::ClearSelection()
|
|
|
|
+{
|
|
|
|
+ SelectedStates.Reset();
|
|
|
|
+
|
|
|
|
+ const TArray<TWeakObjectPtr<UEzAbilityState>> SelectedStatesArr;
|
|
|
|
+ OnSelectionChanged.Broadcast(SelectedStatesArr);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void FEzAbleTreeViewOperationMode::SetSelection(UEzAbilityState* Selected)
|
|
|
|
+{
|
|
|
|
+ SelectedStates.Reset();
|
|
|
|
+
|
|
|
|
+ SelectedStates.Add(Selected);
|
|
|
|
+
|
|
|
|
+ TArray<TWeakObjectPtr<UEzAbilityState>> SelectedStatesArr;
|
|
|
|
+ SelectedStatesArr.Add(Selected);
|
|
|
|
+ OnSelectionChanged.Broadcast(SelectedStatesArr);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void FEzAbleTreeViewOperationMode::SetSelection(const TArray<TWeakObjectPtr<UEzAbilityState>>& InSelectedStates)
|
|
|
|
+{
|
|
|
|
+ SelectedStates.Reset();
|
|
|
|
+
|
|
|
|
+ for (const TWeakObjectPtr<UEzAbilityState>& State : InSelectedStates)
|
|
|
|
+ {
|
|
|
|
+ if (State.Get())
|
|
|
|
+ {
|
|
|
|
+ SelectedStates.Add(State);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ TArray<FGuid> SelectedTaskIDArr;
|
|
|
|
+ OnSelectionChanged.Broadcast(InSelectedStates);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool FEzAbleTreeViewOperationMode::HasSelection() const
|
|
|
|
+{
|
|
|
|
+ return SelectedStates.Num() > 0;
|
|
|
|
+}
|
|
|
|
+
|
|
void FEzAbleTreeViewOperationMode::RemoveSelectedStates()
|
|
void FEzAbleTreeViewOperationMode::RemoveSelectedStates()
|
|
{
|
|
{
|
|
-// UEzAbilityEditorData* TreeData = TreeDataWeak.Get();
|
|
|
|
-// if (TreeData == nullptr)
|
|
|
|
-// {
|
|
|
|
-// return;
|
|
|
|
-// }
|
|
|
|
-//
|
|
|
|
-// TArray<UEzAbilityState*> States;
|
|
|
|
-// GetSelectedStates(States);
|
|
|
|
-//
|
|
|
|
-// // Remove items whose parent also exists in the selection.
|
|
|
|
-// UE::StateTree::Editor::RemoveContainedChildren(States);
|
|
|
|
-//
|
|
|
|
-// if (States.Num() > 0)
|
|
|
|
-// {
|
|
|
|
-// const FScopedTransaction Transaction(LOCTEXT("DeleteStateTransaction", "Delete State"));
|
|
|
|
-//
|
|
|
|
-// TSet<UStateTreeState*> AffectedParents;
|
|
|
|
-//
|
|
|
|
-// for (UStateTreeState* StateToRemove : States)
|
|
|
|
-// {
|
|
|
|
-// if (StateToRemove)
|
|
|
|
-// {
|
|
|
|
-// StateToRemove->Modify();
|
|
|
|
-//
|
|
|
|
-// UStateTreeState* ParentState = StateToRemove->Parent;
|
|
|
|
-// if (ParentState != nullptr)
|
|
|
|
-// {
|
|
|
|
-// AffectedParents.Add(ParentState);
|
|
|
|
-// ParentState->Modify();
|
|
|
|
-// }
|
|
|
|
-// else
|
|
|
|
-// {
|
|
|
|
-// AffectedParents.Add(nullptr);
|
|
|
|
-// TreeData->Modify();
|
|
|
|
-// }
|
|
|
|
-//
|
|
|
|
-// TArray<TObjectPtr<UStateTreeState>>& ArrayToRemoveFrom = ParentState ? ParentState->Children : TreeData->SubTrees;
|
|
|
|
-// const int32 ItemIndex = ArrayToRemoveFrom.Find(StateToRemove);
|
|
|
|
-// if (ItemIndex != INDEX_NONE)
|
|
|
|
-// {
|
|
|
|
-// ArrayToRemoveFrom.RemoveAt(ItemIndex);
|
|
|
|
-// StateToRemove->Parent = nullptr;
|
|
|
|
-// }
|
|
|
|
-//
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-//
|
|
|
|
-// OnStatesRemoved.Broadcast(AffectedParents);
|
|
|
|
-//
|
|
|
|
-// ClearSelection();
|
|
|
|
-// }
|
|
|
|
|
|
+ UEzAbilityEditorData* TreeData = TreeDataWeak.Get();
|
|
|
|
+ if (TreeData == nullptr)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ TArray<UEzAbilityState*> States;
|
|
|
|
+ GetSelectedStates(States);
|
|
|
|
+
|
|
|
|
+ // Remove items whose parent also exists in the selection.
|
|
|
|
+ RemoveContainedChildren(States);
|
|
|
|
+ //UE::StateTree::Editor::RemoveContainedChildren(States);
|
|
|
|
+
|
|
|
|
+ if (States.Num() > 0)
|
|
|
|
+ {
|
|
|
|
+ const FScopedTransaction Transaction(LOCTEXT("DeleteStateTransaction", "Delete State"));
|
|
|
|
+
|
|
|
|
+ TSet<UEzAbilityState*> AffectedParents;
|
|
|
|
+
|
|
|
|
+ for (UEzAbilityState* StateToRemove : States)
|
|
|
|
+ {
|
|
|
|
+ if (StateToRemove)
|
|
|
|
+ {
|
|
|
|
+ StateToRemove->Modify();
|
|
|
|
+
|
|
|
|
+ UEzAbilityState* ParentState = StateToRemove->Parent;
|
|
|
|
+ if (ParentState != nullptr)
|
|
|
|
+ {
|
|
|
|
+ AffectedParents.Add(ParentState);
|
|
|
|
+ ParentState->Modify();
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ AffectedParents.Add(nullptr);
|
|
|
|
+ TreeData->Modify();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ TArray<TObjectPtr<UEzAbilityState>>& ArrayToRemoveFrom = ParentState ? ParentState->Children : TreeData->SubTrees;
|
|
|
|
+ const int32 ItemIndex = ArrayToRemoveFrom.Find(StateToRemove);
|
|
|
|
+ if (ItemIndex != INDEX_NONE)
|
|
|
|
+ {
|
|
|
|
+ ArrayToRemoveFrom.RemoveAt(ItemIndex);
|
|
|
|
+ StateToRemove->Parent = nullptr;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ OnStatesRemoved.Broadcast(AffectedParents);
|
|
|
|
+
|
|
|
|
+ ClearSelection();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void FEzAbleTreeViewOperationMode::GetSelectedStates(TArray<UEzAbilityState*>& OutSelectedStates) const
|
|
|
|
+{
|
|
|
|
+ OutSelectedStates.Reset();
|
|
|
|
+ for (const TWeakObjectPtr<UEzAbilityState>& WeakState : SelectedStates)
|
|
|
|
+ {
|
|
|
|
+ if (UEzAbilityState* State = WeakState.Get())
|
|
|
|
+ {
|
|
|
|
+ OutSelectedStates.Add(State);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void FEzAbleTreeViewOperationMode::GetSelectedStates(TArray<TWeakObjectPtr<UEzAbilityState>>& OutSelectedStates) const
|
|
|
|
+{
|
|
|
|
+ OutSelectedStates.Reset();
|
|
|
|
+ for (const TWeakObjectPtr<UEzAbilityState>& WeakState : SelectedStates)
|
|
|
|
+ {
|
|
|
|
+ if (WeakState.Get())
|
|
|
|
+ {
|
|
|
|
+ OutSelectedStates.Add(WeakState);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void FEzAbleTreeViewOperationMode::RemoveContainedChildren(TArray<UEzAbilityState*>& States)
|
|
|
|
+{
|
|
|
|
+ TSet<UEzAbilityState*> UniqueStates;
|
|
|
|
+ for (UEzAbilityState* State : States)
|
|
|
|
+ {
|
|
|
|
+ UniqueStates.Add(State);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (int32 i = 0; i < States.Num(); )
|
|
|
|
+ {
|
|
|
|
+ UEzAbilityState* State = States[i];
|
|
|
|
+
|
|
|
|
+ // Walk up the parent state sand if the current state
|
|
|
|
+ // exists in any of them, remove it.
|
|
|
|
+ UEzAbilityState* StateParent = State->Parent;
|
|
|
|
+ bool bShouldRemove = false;
|
|
|
|
+ while (StateParent)
|
|
|
|
+ {
|
|
|
|
+ if (UniqueStates.Contains(StateParent))
|
|
|
|
+ {
|
|
|
|
+ bShouldRemove = true;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ StateParent = StateParent->Parent;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (bShouldRemove)
|
|
|
|
+ {
|
|
|
|
+ States.RemoveAt(i);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ i++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void FEzAbleTreeViewOperationMode::GetSubTrees(TArray<TWeakObjectPtr<UEzAbilityState>>& OutSubtrees) const
|
|
void FEzAbleTreeViewOperationMode::GetSubTrees(TArray<TWeakObjectPtr<UEzAbilityState>>& OutSubtrees) const
|