AssetStudio/AssetStudioGUI/Components/JsonTreeView.cs
2025-01-15 00:41:01 +03:00

106 lines
3.7 KiB
C#

using System.Text.Json;
using System.Windows.Forms;
using AssetStudio;
namespace AssetStudioGUI
{
public static class JsonTreeView
{
public static void LoadFromJson(this TreeView treeView, JsonDocument jsonDoc, string rootName)
{
if (jsonDoc == null)
{
Logger.Info("Unable to build tree view of current object");
return;
}
try
{
treeView.BeginUpdate();
treeView.Nodes.Clear();
var rootNode = treeView.Nodes[treeView.Nodes.Add(new TreeNode(rootName))];
foreach (var property in jsonDoc.RootElement.EnumerateObject())
{
var childNode = rootNode.Nodes[rootNode.Nodes.Add(new TreeNode(property.Name))];
AddNodes(property.Value, childNode);
}
rootNode.Expand();
rootNode.EnsureVisible();
}
finally
{
treeView.EndUpdate();
}
}
private static void AddNodes(JsonElement jsonElement, TreeNode treeNode)
{
switch (jsonElement.ValueKind)
{
case JsonValueKind.Object:
foreach (var property in jsonElement.EnumerateObject())
{
var childNode = treeNode.Nodes[treeNode.Nodes.Add(new TreeNode(property.Name))];
AddNodes(property.Value, childNode);
}
break;
case JsonValueKind.Array:
const int arrayLenLimit = 500;
var arrayLen = jsonElement.GetArrayLength();
if (arrayLen == 0)
{
SetValue(jsonElement, treeNode);
}
else
{
var i = 0;
foreach (var jsonArrayElem in jsonElement.EnumerateArray())
{
if (jsonArrayElem.ValueKind == JsonValueKind.Number) //number array
{
SetValue(jsonElement, treeNode);
break;
}
if (i > arrayLenLimit)
{
treeNode.Nodes.Add(new TreeNode($"[{i++}-{arrayLen - 1}] Skipped. Too many elements to display"));
break;
}
var childNode = treeNode.Nodes[treeNode.Nodes.Add(new TreeNode($"[{i++}]"))];
AddNodes(jsonArrayElem, childNode);
}
}
break;
default:
SetValue(jsonElement, treeNode);
break;
}
}
private static void SetValue(JsonElement jsonElem, TreeNode node)
{
const int maxStrLen = 128;
var endStr = "...";
var strValue = jsonElem.ToString();
if (jsonElem.ValueKind == JsonValueKind.Array)
{
strValue = strValue.Replace("\r", "").Replace("\n", "").Replace(" ", "").Replace(",", ", ");
endStr += "]";
}
if (jsonElem.ValueKind == JsonValueKind.Null)
{
strValue = jsonElem.GetRawText();
}
node.Name = node.Text;
node.Text += strValue?.Length > maxStrLen
? $": {strValue.Substring(0, maxStrLen)}{endStr}"
: $": {strValue}";
node.Tag = strValue;
}
}
}