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

87 lines
2.6 KiB
C#

using System;
using System.Reflection;
namespace Ingvar.LiveWatch
{
public class WatchVariableCreator
{
public WatchVariable CreateEmpty(string name)
{
var variable = new WatchVariable()
{
Name = name
};
return variable;
}
public WatchVariable GetOrAdd(WatchStorage storage, string path, bool directChild = true)
{
var currentStorage = storage;
WatchVariable currentVariable = default;
WatchVariable currentParent = null;
if (directChild)
{
GetOrCreateVariable(path);
return currentVariable;
}
var variableNames = path.Split(Watch.PathSeparator);
foreach (var variableName in variableNames)
{
GetOrCreateVariable(variableName);
currentStorage = currentVariable.Childs;
currentParent = currentVariable;
}
void GetOrCreateVariable(string variableName)
{
var pathExists = currentStorage.TryGet(variableName, out currentVariable);
if (!pathExists)
{
currentVariable = CreateEmpty(variableName);
currentVariable.Parent = currentParent;
var catchUpCount = WatchServices.VariableUpdater.ValuesCount + (!WatchServices.VariableUpdater.AnyPushSinceUpdate ? 0 : -1);
WatchServices.VariableUpdater.CatchUpWithValuesCount(currentVariable, catchUpCount);
currentStorage.Add(currentVariable);
}
}
return currentVariable;
}
public void PushEmpty(WatchVariable variable, bool withRoot = true, int maxRecursionDepth = 10)
{
if (maxRecursionDepth <= 0)
return;
if (withRoot)
{
variable.Values.PushEmpty();
WatchServices.VariableUpdater.UpdateTotalValuesCount(variable);
}
foreach (var childWatchPair in variable.Childs.Items)
PushEmpty(childWatchPair.Value, true, maxRecursionDepth - 1);
}
public bool IsAlwaysShrinkable(WatchVariable variable)
{
if (variable.RuntimeMeta.AlwaysShrinkable)
return true;
if (variable.Parent != null && variable.Parent.RuntimeMeta.AlwaysShrinkable)
{
variable.RuntimeMeta.AlwaysShrinkable = true;
return true;
}
return false;
}
}
}