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

127 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Profiling;
namespace Ingvar.LiveWatch
{
public class WatchVariableUpdater
{
public static string ErrorValue = "ERROR";
public bool AnyPushSinceUpdate { get; set; }
public bool IsUpdatingNow { get; private set; }
public int ValuesCount { get; private set; }
public void UpdateAll()
{
if (!Watch.IsLive)
return;
Profiler.BeginSample("Watch update all");
IsUpdatingNow = true;
foreach (var watch in Watch.Watches.Items)
Update(watch.Value);
foreach (var watch in Watch.Watches.Items)
PostUpdate(watch.Value);
IsUpdatingNow = false;
AnyPushSinceUpdate = false;
Profiler.EndSample();
}
private void Update(WatchVariable watchVariable)
{
if (watchVariable == null)
{
return;
}
if (watchVariable.RuntimeMeta.UpdateCall != null)
{
try
{
watchVariable.RuntimeMeta.UpdateCall();
}
catch {
if (watchVariable.Values.Type == WatchValueType.String)
watchVariable.Values.StringList.Add(new WatchValue<string>(ErrorValue));
else
watchVariable.Values.PushEmpty();
}
}
foreach (var child in watchVariable.Childs.Items)
{
Update(child.Value);
}
watchVariable.RuntimeMeta.IsUpdatedAtLeastOnce = true;
}
private void PostUpdate(WatchVariable watchVariable)
{
if (watchVariable == null)
{
return;
}
CatchUpWithValuesCount(watchVariable, ValuesCount);
foreach (var child in watchVariable.Childs.Items)
{
PostUpdate(child.Value);
}
}
public void ClearAll()
{
foreach (var watch in Watch.Watches.Items)
{
Clear(watch.Value, true);
}
ValuesCount = 0;
}
public void Clear(WatchVariable watchVariable, bool recursive = true)
{
watchVariable.Values.Clear();
watchVariable.EditorMeta.LastNonShrinkableIndexOfKey = -1;
watchVariable.EditorMeta.LastStringToNumberValue = -1;
if (recursive && watchVariable.HasChilds)
{
foreach (var child in watchVariable.Childs.Items)
{
Clear(child.Value);
}
}
}
public void UpdateTotalValuesCount(WatchVariable variable)
{
ValuesCount = Mathf.Max(ValuesCount, variable.Values.Count);
}
public void CatchUpWithValuesCount(WatchVariable variable, int valuesCount)
{
if (valuesCount <= 0
|| variable.Values.Count >= valuesCount)
return;
if (variable.Values.Count == 0)
variable.Values.PushEmpty();
variable.Values.Expand(valuesCount - variable.Values.Count);
}
}
}