using System; using System.Reflection; using System.Collections.Generic; using UnityEngine; using UnityEditor; using qtools.qhierarchy.pcomponent.pbase; using qtools.qhierarchy.pdata; using qtools.qhierarchy.phelper; namespace qtools.qhierarchy.pcomponent { public class QComponentsComponent: QBaseComponent { // PRIVATE private GUIStyle hintLabelStyle; private Color grayColor; private Color backgroundColor; private Color backgroundDarkColor; private Texture2D componentIcon; private Component[] components; // CONSTRUCTOR public QComponentsComponent () { this.backgroundColor = QResources.getInstance().getColor(QColor.Background); this.backgroundDarkColor = QResources.getInstance().getColor(QColor.BackgroundDark); this.grayColor = QResources.getInstance().getColor(QColor.Gray); this.componentIcon = QResources.getInstance().getTexture(QTexture.QComponentUnknownIcon); hintLabelStyle = new GUIStyle(); hintLabelStyle.normal.textColor = grayColor; hintLabelStyle.fontSize = 11; hintLabelStyle.clipping = TextClipping.Clip; QSettings.getInstance().addEventListener(QSetting.ShowComponentsComponent , settingsChanged); QSettings.getInstance().addEventListener(QSetting.ShowComponentsComponentDuringPlayMode, settingsChanged); settingsChanged(); } // PRIVATE private void settingsChanged() { enabled = QSettings.getInstance().get(QSetting.ShowComponentsComponent); showComponentDuringPlayMode = QSettings.getInstance().get(QSetting.ShowComponentsComponentDuringPlayMode); } // DRAW public override void layout(GameObject gameObject, QObjectList objectList, ref Rect curRect) { components = gameObject.GetComponents(); int totalWidth = 2 + 16 * (components.Length - 1); curRect.x -= totalWidth; curRect.width = totalWidth; } public override void draw(GameObject gameObject, QObjectList objectList, Rect selectionRect, Rect curRect) { EditorGUI.DrawRect(curRect, backgroundColor); curRect.width = 16; for (int i = 0, n = components.Length; i < n; i++) { Component component = components[i]; if (component is Transform) continue; GUIContent content = EditorGUIUtility.ObjectContent(component, null); bool enabled = true; try { PropertyInfo propertyInfo = component.GetType().GetProperty("enabled"); enabled = (bool)propertyInfo.GetGetMethod().Invoke(component, null); } catch {} Color color = GUI.color; color.a = enabled ? 1f : 0.3f; GUI.color = color; GUI.DrawTexture(curRect, content.image == null ? componentIcon : content.image); color.a = 1; GUI.color = color; if (curRect.Contains(Event.current.mousePosition)) { string componentName = "Missing script"; if (component != null) componentName = component.GetType().Name; int labelWidth = Mathf.CeilToInt(hintLabelStyle.CalcSize(new GUIContent(componentName)).x); selectionRect.x = curRect.x - labelWidth / 2 - 4; selectionRect.width = labelWidth + 8; selectionRect.height -= 1; if (selectionRect.y > 16) selectionRect.y -= 16; else selectionRect.x += labelWidth; EditorGUI.DrawRect(selectionRect, backgroundColor); EditorGUI.DrawRect(selectionRect, backgroundDarkColor); selectionRect.x += 4; selectionRect.y += 1; GUI.Label(selectionRect, componentName, hintLabelStyle); } curRect.x += 16; } } public override void eventHandler(GameObject gameObject, QObjectList objectList, Event currentEvent, Rect curRect) { if (currentEvent.isMouse && currentEvent.button == 0 && curRect.Contains(currentEvent.mousePosition)) { if (currentEvent.type == EventType.MouseDown) { int id = Mathf.FloorToInt((currentEvent.mousePosition.x - curRect.x) / 16) + 1; try { PropertyInfo propertyInfo = components[id].GetType().GetProperty("enabled"); bool enabled = (bool)propertyInfo.GetGetMethod().Invoke(components[id], null); Undo.RecordObject(components[id], enabled ? "Disable Component" : "Enable Component"); propertyInfo.GetSetMethod().Invoke(components[id], new object[] { !enabled }); } catch {} EditorUtility.SetDirty(gameObject); } currentEvent.Use(); } } } }