using UnityEngine;
|
using UnityEditor;
|
using System;
|
using System.Collections.Generic;
|
using qtools.qhierarchy.pcomponent;
|
using qtools.qhierarchy.pcomponent.pbase;
|
using qtools.qhierarchy.pdata;
|
using qtools.qhierarchy.phelper;
|
using System.Reflection;
|
|
namespace qtools.qhierarchy.phierarchy
|
{
|
public class QHierarchy
|
{
|
// PRIVATE
|
private HashSet<int> errorHandled = new HashSet<int>();
|
private Dictionary<int, QBaseComponent> componentDictionary;
|
private List<QBaseComponent> preComponents;
|
private List<QBaseComponent> orderedComponents;
|
private List<QBaseComponent> postComponents;
|
private bool hideIconsIfThereIsNoFreeSpace;
|
private int indentation;
|
private Texture2D trimIcon;
|
|
// CONSTRUCTOR
|
public QHierarchy ()
|
{
|
componentDictionary = new Dictionary<int, QBaseComponent>();
|
componentDictionary.Add((int)QHierarchyComponentEnum.LockComponent , new QLockComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.VisibilityComponent , new QVisibilityComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.StaticComponent , new QStaticComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.RendererComponent , new QRendererComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.TagLayerComponent , new QTagLayerComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.GameObjectIconComponent , new QGameObjectIconComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.ErrorComponent , new QErrorComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.TagIconComponent , new QTagIconComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.ColorComponent , new QColorComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.ComponentsComponent , new QComponentsComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.ChildrenCountComponent , new QChildrenCountComponent());
|
componentDictionary.Add((int)QHierarchyComponentEnum.PrefabComponent , new QPrefabComponent());
|
|
preComponents = new List<QBaseComponent>();
|
preComponents.Add(new QTreeMapComponent());
|
preComponents.Add(new QMonoBehaviorIconComponent());
|
|
orderedComponents = new List<QBaseComponent>();
|
|
postComponents = new List<QBaseComponent>();
|
postComponents.Add(new QSeparatorComponent());
|
|
trimIcon = QResources.getInstance().getTexture(QTexture.QTrimIcon);
|
|
QSettings.getInstance().addEventListener(QSetting.Identation , settingsChanged);
|
QSettings.getInstance().addEventListener(QSetting.ComponentOrder , settingsChanged);
|
QSettings.getInstance().addEventListener(QSetting.HideIconsIfNotFit , settingsChanged);
|
settingsChanged();
|
}
|
|
// PRIVATE
|
private void settingsChanged()
|
{
|
orderedComponents.Clear();
|
string componentOrder = QSettings.getInstance().get<string>(QSetting.ComponentOrder);
|
string[] componentIds = componentOrder.Split(';');
|
if (componentIds.Length != QSettings.DEFAULT_ORDER_COUNT)
|
{
|
QSettings.getInstance().set(QSetting.ComponentOrder, QSettings.DEFAULT_ORDER);
|
componentIds = QSettings.DEFAULT_ORDER.Split(';');
|
}
|
|
for (int i = 0; i < componentIds.Length; i++)
|
orderedComponents.Add(componentDictionary[int.Parse(componentIds[i])]);
|
orderedComponents.Add(componentDictionary[(int)QHierarchyComponentEnum.ComponentsComponent]);
|
|
indentation = QSettings.getInstance().get<int>(QSetting.Identation);
|
hideIconsIfThereIsNoFreeSpace = QSettings.getInstance().get<bool>(QSetting.HideIconsIfNotFit);
|
}
|
|
public void hierarchyWindowItemOnGUIHandler(int instanceId, Rect selectionRect)
|
{
|
try
|
{
|
GameObject gameObject = (GameObject)EditorUtility.InstanceIDToObject(instanceId);
|
if (gameObject == null) return;
|
|
Rect curRect = new Rect(selectionRect);
|
curRect.width = 16;
|
curRect.x += selectionRect.width - indentation;
|
|
float gameObjectNameWidth = hideIconsIfThereIsNoFreeSpace ? GUI.skin.label.CalcSize(new GUIContent(gameObject.name)).x : 0;
|
|
QObjectList objectList = QObjectListManager.getInstance().getObjectList(gameObject, false);
|
|
drawComponents(preComponents , selectionRect, ref curRect, gameObject, objectList);
|
drawComponents(orderedComponents, selectionRect, ref curRect, gameObject, objectList, hideIconsIfThereIsNoFreeSpace, selectionRect.x + gameObjectNameWidth + 7);
|
drawComponents(postComponents , selectionRect, ref curRect, gameObject, objectList);
|
|
errorHandled.Remove(instanceId);
|
}
|
catch (Exception exception)
|
{
|
if (errorHandled.Add(instanceId))
|
{
|
Debug.LogError(exception.ToString());
|
}
|
}
|
}
|
|
private void drawComponents(List<QBaseComponent> components, Rect selectionRect, ref Rect curRect, GameObject gameObject, QObjectList objectList, bool trim = false, float minX = 50)
|
{
|
Rect rect = new Rect(curRect);
|
if (Event.current.type == EventType.Repaint)
|
{
|
for (int i = 0, n = components.Count; i < n; i++)
|
{
|
QBaseComponent component = components[i];
|
if (component.isEnabled())
|
{
|
component.layout(gameObject, objectList, ref rect);
|
if (trim && minX > rect.x)
|
{
|
rect.Set(curRect.x - 7, curRect.y, 7, 16);
|
GUI.DrawTexture(rect, trimIcon);
|
return;
|
}
|
component.draw(gameObject, objectList, selectionRect, rect);
|
curRect.Set(rect.x, rect.y, rect.width, rect.height);
|
}
|
else
|
{
|
component.disabledHandler(gameObject, objectList);
|
}
|
}
|
}
|
else if (Event.current.isMouse)
|
{
|
for (int i = 0, n = components.Count; i < n; i++)
|
{
|
QBaseComponent component = components[i];
|
if (component.isEnabled())
|
{
|
component.layout(gameObject, objectList, ref rect);
|
if (trim && minX > rect.x)
|
{
|
rect.Set(curRect.x - 7, curRect.y, 7, 16);
|
GUI.DrawTexture(rect, trimIcon);
|
return;
|
}
|
component.eventHandler(gameObject, objectList, Event.current, rect);
|
curRect.Set(rect.x, rect.y, rect.width, rect.height);
|
}
|
}
|
}
|
}
|
}
|
}
|