mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-25 05:40:21 -04:00
106 lines
3.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|