139 lines
3.8 KiB
C#
139 lines
3.8 KiB
C#
using System;
|
|
using Unity.HLODSystem.Streaming;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.UIElements;
|
|
using UnityEditor.UIElements;
|
|
|
|
namespace Unity.HLODSystem.DebugWindow
|
|
{
|
|
public class HierarchyItem : VisualElement, IDisposable
|
|
{
|
|
private static readonly string s_uxmlGuid = "7b9b7a1f48292534bb048103f56e3404";
|
|
|
|
|
|
private HLODItemData m_hlodData;
|
|
private HierarchyItemData m_data;
|
|
|
|
private HLODDebugWindow m_window;
|
|
private HLODItem m_hlodItem;
|
|
|
|
private UQueryBuilder<VisualElement> m_treeOffset;
|
|
private Toggle m_foldoutToggle;
|
|
private VisualElement m_root;
|
|
|
|
public HierarchyItemData Data
|
|
{
|
|
get
|
|
{
|
|
return m_data;
|
|
}
|
|
}
|
|
|
|
public HierarchyItem(HLODDebugWindow window, HLODItem hlodItem, HLODItemData hlodData)
|
|
{
|
|
m_window = window;
|
|
m_hlodItem = hlodItem;
|
|
m_hlodData = hlodData;
|
|
|
|
var uxmlPath = AssetDatabase.GUIDToAssetPath(s_uxmlGuid);
|
|
var template = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(uxmlPath);
|
|
|
|
m_root = template.CloneTree();
|
|
Add(m_root);
|
|
|
|
m_treeOffset = m_root.Query<VisualElement>("TreeOffset");
|
|
|
|
m_foldoutToggle = m_root.Q<Toggle>("Foldout");
|
|
m_foldoutToggle.RegisterValueChangedCallback(FoldoutValueChanged);
|
|
m_foldoutToggle.RegisterCallback<ClickEvent>(FoldoutClick);
|
|
|
|
RegisterCallback<ClickEvent>(ItemClick);
|
|
|
|
EditorApplication.update += Update;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
this.Unbind();
|
|
|
|
if (m_foldoutToggle != null)
|
|
{
|
|
m_foldoutToggle.UnregisterValueChangedCallback(FoldoutValueChanged);
|
|
m_foldoutToggle.UnregisterCallback<ClickEvent>(FoldoutClick);
|
|
}
|
|
EditorApplication.update -= Update;
|
|
}
|
|
|
|
|
|
private void ItemClick(ClickEvent evt)
|
|
{
|
|
m_window.SetSelectItem(this);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (m_data == null)
|
|
return;
|
|
|
|
var node = m_data.TreeNode;
|
|
var isRendered = false;
|
|
|
|
if (m_window.HighlightRendered)
|
|
{
|
|
isRendered = node.CurrentState == HLODTreeNode.State.Low ||
|
|
(node.CurrentState == HLODTreeNode.State.High && node.GetChildTreeNodeCount() == 0);
|
|
}
|
|
|
|
if (isRendered)
|
|
{
|
|
m_root.AddToClassList("HLODTreeNode_rendered");
|
|
}
|
|
else
|
|
{
|
|
m_root.RemoveFromClassList("HLODTreeNode_rendered");
|
|
}
|
|
}
|
|
|
|
public void BindTreeNode(HierarchyItemData data)
|
|
{
|
|
m_data = data;
|
|
|
|
if (m_data.TreeNode.GetChildTreeNodeCount() == 0)
|
|
{
|
|
m_foldoutToggle.visible = false;
|
|
}
|
|
else
|
|
{
|
|
m_foldoutToggle.visible = true;
|
|
}
|
|
|
|
this.Bind(new SerializedObject(m_data));
|
|
|
|
//setup offset
|
|
m_treeOffset.ForEach(element =>
|
|
{
|
|
element.style.width = data.TreeNode.Level * 30;
|
|
});
|
|
}
|
|
|
|
public void SelectItem()
|
|
{
|
|
AddToClassList("unity-collection-view__item--selected");
|
|
}
|
|
public void UnselectItem()
|
|
{
|
|
RemoveFromClassList("unity-collection-view__item--selected");
|
|
}
|
|
private void FoldoutClick(ClickEvent evt)
|
|
{
|
|
m_hlodItem.UpdateList();
|
|
}
|
|
private void FoldoutValueChanged(ChangeEvent<bool> evt)
|
|
{
|
|
m_data.IsOpen = evt.newValue;
|
|
}
|
|
|
|
|
|
}
|
|
} |