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 errorHandled = new HashSet(); private Dictionary componentDictionary; private List preComponents; private List orderedComponents; private List postComponents; private bool hideIconsIfThereIsNoFreeSpace; private int indentation; private Texture2D trimIcon; // CONSTRUCTOR public QHierarchy () { componentDictionary = new Dictionary(); 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(); preComponents.Add(new QTreeMapComponent()); preComponents.Add(new QMonoBehaviorIconComponent()); orderedComponents = new List(); postComponents = new List(); 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(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(QSetting.Identation); hideIconsIfThereIsNoFreeSpace = QSettings.getInstance().get(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 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); } } } } } }