rokojori_action_library/Runtime/Selectors/FlagSelector.cs

110 lines
2.0 KiB
C#

using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System;
using Godot;
using System.Linq;
using Rokojori.Extensions;
namespace Rokojori
{
[Tool]
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/Selector.svg")]
public partial class FlagSelector:Selector
{
[Export]
public SelectorFlag[] flag;
public enum FlagMode
{
Needs_One_Flag,
Needs_All_Flags
}
[Export]
public FlagMode flagMode = FlagMode.Needs_One_Flag;
public enum IterationMode
{
Only_Node,
Only_Iterator,
Node_And_Iterator
}
[Export]
public IterationMode iterationMode= IterationMode.Node_And_Iterator;
[Export]
public TreeIteratorType iteratorType = TreeIteratorType.DirectChildren;
bool SelectsSelectable( Selectable s )
{
var numPresent = 0;
for ( int i = 0; i < flag.Length; i++ )
{
if ( Array.IndexOf( s.flags, flag[ i ] ) != -1 )
{
numPresent ++;
}
}
if ( numPresent == flag.Length )
{
return true;
}
if ( flagMode == FlagMode.Needs_One_Flag && numPresent > 0 )
{
return true;
}
return false;
}
public override bool Selects( Node node )
{
if ( IterationMode.Only_Node == iterationMode )
{
return node is Selectable s && SelectsSelectable( s );
}
if ( IterationMode.Only_Iterator != iterationMode )
{
if ( node is Selectable s && SelectsSelectable( s ) )
{
return true;
}
}
var iterator = TreeIterator<Node>.GetIterator( iteratorType, node, NodesWalker.Get() );
while ( iterator.HasNext() )
{
iterator.MoveToNext();
var it = iterator.Current();
if ( it is Selectable s )
{
var selects = SelectsSelectable( s );
if ( selects )
{
return true;
}
}
}
return false;
}
}
}