chicken_dy/Assets/WX-WASM-SDK/Editor/MinigameAssetAnalysis/SerializedPropertyTable.cs

141 lines
4.5 KiB
C#

using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using UnityEngine.Profiling;
namespace WeChatWASM.Analysis
{
internal class SerializedPropertyTable
{
private readonly float m_DragHeight = 20f;
private readonly float m_DragWidth = 32f;
private readonly float m_FilterHeight = 20f;
private float m_ColumnHeaderHeight;
private SerializedPropertyDataStore m_DataStore;
private readonly SerializedPropertyDataStore.GatherDelegate m_GatherDelegate;
private readonly HeaderDelegate m_HeaderDelegate;
private bool m_Initialized;
private MultiColumnHeaderState m_MultiColumnHeaderState;
private readonly string m_SerializationUID;
//private float m_TableHeight = 200f;
private SerializedPropertyTreeView m_TreeView;
private TreeViewState m_TreeViewState;
public SerializedPropertyTable(string serializationUID, SerializedPropertyDataStore.GatherDelegate gatherDelegate, HeaderDelegate headerDelegate)
{
//dragHandleEnabled = true;
m_SerializationUID = serializationUID;
m_GatherDelegate = gatherDelegate;
m_HeaderDelegate = headerDelegate;
//OnEnable();
}
//public bool dragHandleEnabled { get; set; }
private void InitIfNeeded()
{
if (!m_Initialized)
{
if (m_TreeViewState == null)
m_TreeViewState = new TreeViewState();
if (m_MultiColumnHeaderState == null)
{
string[] propNames;
m_MultiColumnHeaderState = new MultiColumnHeaderState(m_HeaderDelegate(out propNames));
m_DataStore = new SerializedPropertyDataStore(propNames, m_GatherDelegate);
}
var multiColumnHeader = new MultiColumnHeader(m_MultiColumnHeaderState);
m_ColumnHeaderHeight = multiColumnHeader.height;
m_TreeView = new SerializedPropertyTreeView(m_TreeViewState, multiColumnHeader, m_DataStore);
m_TreeView.DeserializeState(m_SerializationUID);
m_TreeView.Reload();
m_Initialized = true;
}
}
private float GetMinHeight()
{
var singleLineHeight = EditorGUIUtility.singleLineHeight;
var num = m_FilterHeight + m_ColumnHeaderHeight + singleLineHeight + m_DragHeight;
return num + singleLineHeight * 3f;
}
public void OnInspectorUpdate()
{
if (m_DataStore != null && m_DataStore.Repopulate() && m_TreeView != null)
m_TreeView.FullReload();
else if (m_TreeView != null && m_TreeView.Update())
m_TreeView.Repaint();
}
public void OnHierarchyChange()
{
if (m_DataStore != null && m_DataStore.Repopulate() && m_TreeView != null)
m_TreeView.FullReload();
}
public void OnSelectionChange()
{
OnSelectionChange(Selection.instanceIDs);
}
public void OnSelectionChange(int[] instanceIDs)
{
if (m_TreeView != null)
m_TreeView.SetSelection(instanceIDs);
}
public void OnGUI()
{
Profiler.BeginSample("SerializedPropertyTable.OnGUI");
InitIfNeeded();
var rect = GUILayoutUtility.GetRect(0f, Screen.width, 0f, Screen.height);
if (Event.current.type != EventType.Layout)
{
rect.x += m_DragWidth;
rect.width -= m_DragWidth * 2;
rect.y += m_DragHeight;
var r = rect;
rect.y += m_FilterHeight;
rect.height = rect.height - m_FilterHeight - m_DragHeight * 2;
var rect2 = rect;
Profiler.BeginSample("TreeView.OnGUI");
m_TreeView.OnGUI(rect2);
Profiler.EndSample();
m_TreeView.OnFilterGUI(r);
if (m_TreeView.IsFilteredDirty())
m_TreeView.Reload();
Profiler.EndSample();
}
}
public void OnDisable()
{
if (m_TreeView != null)
m_TreeView.SerializeState(m_SerializationUID);
}
private static class Styles
{
public static readonly GUIStyle DragHandle = "RL DragHandle";
}
internal delegate SerializedPropertyTreeView.Column[] HeaderDelegate(out string[] propNames);
}
}