ProjectDDD/Assets/_Datas/SLShared/SLUnity/Editor/SLUI/SLBindingEntityView.cs
2025-06-17 20:47:57 +09:00

123 lines
3.8 KiB (Stored with Git LFS)
C#

using System.Collections.Generic;
using System.Linq;
using Superlazy;
using Superlazy.UI;
using UnityEditor;
using UnityEngine;
public static class SLBindingEntityViewUtil
{
private static SLUIComponent currentComponent;
private static readonly Dictionary<string, bool> sessionView = new Dictionary<string, bool>();
public static void ViewEntity(this SLUIComponent component)
{
if (Application.isPlaying == false) return;
if (component.isActiveAndEnabled == false) return;
var parent = component.bindParent;
if (component is SLUIObjectOnOff)
{
parent = component as SLUIObjectOnOff;
}
if (parent == null) return;
var on = EditorGUILayout.Foldout(component == currentComponent, parent.BindPath);
if (on)
{
if (currentComponent != component) sessionView.Clear();
currentComponent = component;
SLBindingEntityView.UpdateView(SLGame.Session.Get(parent.BindPath), "", 1, sessionView);
}
}
}
public class SLBindingEntityView
{
public static void UpdateView(SLEntity e, string prefix, int depth, Dictionary<string, bool> view)
{
var changed = SLEntity.Empty;
ViewTree(e, prefix, depth, view, changed);
ChangeView(e, changed);
}
private static void ViewTree(SLEntity e, string prefix, int depth, Dictionary<string, bool> view, SLEntity changed)
{
foreach (var tree in e.OrderBy(child => child.IsValue ? "B" + child.ID : "A" + child.ID))
{
var id = prefix + tree.ID;
if (view.ContainsKey(id) == false)
{
view[id] = false;
}
if (tree.IsValue == false)
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("", GUILayout.Width(10 * depth));
view[id] = EditorGUILayout.Foldout(view[id], tree.ToString());
EditorGUILayout.EndHorizontal();
if (view[id])
{
ViewTree(tree, id + ".", depth + 1, view, changed[tree.ID]);
}
}
else
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("", GUILayout.Width(10 * depth));
string changeValue;
if (tree.ToString() == "True")
{
changeValue = EditorGUILayout.Toggle(tree.ID, e[tree.ID]).ToString();
}
else if (tree.IsNumeric)
{
changeValue = EditorGUILayout.DoubleField(tree.ID, e[tree.ID]).ToString();
}
else
{
changeValue = EditorGUILayout.TextField(tree.ID, e[tree.ID]);
}
if (changeValue != e[tree.ID])
{
changed[tree.ID] = changeValue;
}
EditorGUILayout.EndHorizontal();
}
}
}
private static void ChangeView(SLEntity e, SLEntity changed)
{
if (changed)
{
foreach (var entity in changed)
{
if (entity.IsValue == false)
{
ChangeView(e[entity.ID], entity);
}
else
{
if (e[entity.ID].IsNumeric)
{
e[entity.ID] = double.Parse(entity);
}
else if (entity == "False")
{
e[entity.ID] = false;
}
else
{
e[entity.ID] = entity;
}
}
}
}
}
}