using System; using UnityEngine; using UnityEditor; using qtools.qhierarchy.pcomponent.pbase; using qtools.qhierarchy.phierarchy; using qtools.qhierarchy.phelper; using qtools.qhierarchy.pdata; using System.Reflection; namespace qtools.qhierarchy.pcomponent { public class QGameObjectIconComponent: QBaseComponent { // PRIVATE private MethodInfo getIconMethodInfo; private object[] getIconMethodParams; // CONSTRUCTOR public QGameObjectIconComponent () { rect.width = 14; rect.height = 14; getIconMethodInfo = typeof(EditorGUIUtility).GetMethod("GetIconForObject", BindingFlags.NonPublic | BindingFlags.Static ); getIconMethodParams = new object[1]; QSettings.getInstance().addEventListener(QSetting.GameObjectIconShow , settingsChanged); QSettings.getInstance().addEventListener(QSetting.GameObjectIconShowDuringPlayMode , settingsChanged); QSettings.getInstance().addEventListener(QSetting.GameObjectIconSize , settingsChanged); settingsChanged(); } // PRIVATE private void settingsChanged() { enabled = QSettings.getInstance().get(QSetting.GameObjectIconShow); showComponentDuringPlayMode = QSettings.getInstance().get(QSetting.GameObjectIconShowDuringPlayMode); QHierarchySizeAll size = (QHierarchySizeAll)QSettings.getInstance().get(QSetting.GameObjectIconSize); rect.width = rect.height = (size == QHierarchySizeAll.Normal ? 15 : (size == QHierarchySizeAll.Big ? 16 : 13)); } // DRAW public override QLayoutStatus layout(GameObject gameObject, QObjectList objectList, Rect selectionRect, ref Rect curRect, float maxWidth) { if (maxWidth < rect.width + 2) { return QLayoutStatus.Failed; } else { curRect.x -= rect.width + 2; rect.x = curRect.x; rect.y = curRect.y - (rect.height - 16) / 2; return QLayoutStatus.Success; } } public override void draw(GameObject gameObject, QObjectList objectList, Rect selectionRect) { getIconMethodParams[0] = gameObject; Texture2D icon = (Texture2D)getIconMethodInfo.Invoke(null, getIconMethodParams ); if (icon != null) GUI.DrawTexture(rect, icon, ScaleMode.ScaleToFit, true); } public override void eventHandler(GameObject gameObject, QObjectList objectList, Event currentEvent) { if (currentEvent.isMouse && currentEvent.type == EventType.MouseDown && currentEvent.button == 0 && rect.Contains(currentEvent.mousePosition)) { currentEvent.Use(); Type iconSelectorType = Assembly.Load("UnityEditor").GetType("UnityEditor.IconSelector"); MethodInfo showIconSelectorMethodInfo = iconSelectorType.GetMethod("ShowAtPosition", BindingFlags.Static | BindingFlags.NonPublic); showIconSelectorMethodInfo.Invoke(null, new object[] { gameObject, rect, true }); } } } }