// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Algo/AnyOf.h" #include "ISkeletonTreeItem.h" /** Helper for processing tree selections */ class FSkeletonTreeSelection { public: /** Flat array of selected items */ TArrayView> SelectedItems; FSkeletonTreeSelection(TArray>& InSelectedItems) : SelectedItems(InSelectedItems) { } FSkeletonTreeSelection(const TArrayView>& InSelectedItems) : SelectedItems(InSelectedItems) { } bool IsMultipleItemsSelected() const { return SelectedItems.Num() > 1; } bool IsSingleItemSelected() const { return SelectedItems.Num() == 1; } template bool IsSingleOfTypeSelected() const { if (IsSingleItemSelected()) { return SelectedItems[0]->IsOfType(); } return false; } template bool IsSingleOfTypesSelected() const { if (IsSingleItemSelected()) { const bool bTypeResults[] = { false, (SelectedItems[0]->IsOfType())... }; return Algo::AnyOf(bTypeResults); } return false; } TSharedPtr GetSingleSelectedItem() { check(IsSingleItemSelected()); return SelectedItems[0]; } template bool HasSelectedOfType() const { for (const TSharedPtr& SelectedItem : SelectedItems) { if (SelectedItem->IsOfType()) { return true; } } return false; } template bool HasSelectedOfTypes() const { for (const TSharedPtr& SelectedItem : SelectedItems) { const bool bTypeResults[] = { false, (SelectedItem->IsOfType())... }; if (Algo::AnyOf(bTypeResults)) { return true; } } return false; } template TArray> GetSelectedItems() const { TArray> Items; for (const TSharedPtr& SelectedItem : SelectedItems) { if (SelectedItem->IsOfType()) { Items.Add(StaticCastSharedPtr(SelectedItem)); } } return Items; } template TArray> GetSelectedItemsOfTypes() const { TArray> Items; for (const TSharedPtr& SelectedItem : SelectedItems) { const bool bTypeResults[] = { false, (SelectedItem->IsOfType())... }; if (Algo::AnyOf(bTypeResults)) { Items.Add(SelectedItem); } } return Items; } TArray> GetSelectedItemsByTypeId(const FName& InTypeId) const { TArray> Items; for (const TSharedPtr& SelectedItem : SelectedItems) { if (SelectedItem->IsOfTypeByName(InTypeId)) { Items.Add(SelectedItem); } } return Items; } };