Files
project-reset/Assets/Plugins/LiveWatchLite/Scripts/Utilities/WatchVariableQueryExtensions.cs
2025-08-31 18:14:07 -04:00

71 lines
2.2 KiB
C#

using System;
using System.Collections.Generic;
namespace Ingvar.LiveWatch
{
[Flags]
public enum WatchFilters
{
None = 0,
FoldedIfChilds = 1 << 0,
NoValues = 1 << 1,
NoChilds = 1 << 2,
}
public static class WatchVariableQueryExtensions
{
public static void GetAllChildRecursive(this WatchStorage storage, List<WatchVariable> variables, WatchFilters breakFilters, WatchFilters continueFilters, bool includeItself = true)
{
variables.Clear();
foreach (var variableName in storage.SortedNames)
{
FindAllChildsRecursive(storage.Items[variableName], 0, variables, breakFilters, continueFilters, includeItself);
}
}
private static void FindAllChildsRecursive(WatchVariable variable, int recursionDepth, List<WatchVariable> results, WatchFilters breakFilters, WatchFilters continueFilters, bool includeItself = true)
{
if (includeItself && !SkippedByQuery(variable, continueFilters))
{
results.Add(variable);
}
if (recursionDepth >= Watch.MaxRecursionDepth
|| SkippedByQuery(variable, breakFilters))
{
return;
}
foreach (var childVariableName in variable.Childs.SortedNames)
{
FindAllChildsRecursive(variable.Childs.Items[childVariableName], recursionDepth + 1, results, breakFilters, continueFilters);
}
}
private static bool SkippedByQuery(WatchVariable variable, WatchFilters filters)
{
if (filters == WatchFilters.None)
{
return false;
}
if (filters.HasFlag(WatchFilters.FoldedIfChilds) && variable.HasChilds && !variable.EditorMeta.IsExpanded)
{
return true;
}
if (filters.HasFlag(WatchFilters.NoValues) && !variable.HasValues)
{
return true;
}
if (filters.HasFlag(WatchFilters.NoChilds) && !variable.HasChilds)
{
return true;
}
return false;
}
}
}