using System; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using UnityEditor; 
 | 
using qtools.qhierarchy.pcomponent.pbase; 
 | 
using qtools.qhierarchy.phierarchy; 
 | 
using qtools.qhierarchy.pdata; 
 | 
using qtools.qhierarchy.phelper; 
 | 
  
 | 
namespace qtools.qhierarchy.pcomponent 
 | 
{ 
 | 
    public class QRendererComponent: QBaseComponent 
 | 
    { 
 | 
        // PRIVATE 
 | 
        private Texture2D rendererOn; 
 | 
        private Texture2D rendererOff; 
 | 
        private Texture2D rendererWireframe; 
 | 
        private int targetRendererMode = -1;  
 | 
        private Color backgroundColor; 
 | 
  
 | 
        // CONSTRUCTOR 
 | 
        public QRendererComponent() 
 | 
        { 
 | 
            rendererWireframe = QResources.getInstance().getTexture(QTexture.QRendererWireframeButton); 
 | 
            rendererOn        = QResources.getInstance().getTexture(QTexture.QRendererOnButton); 
 | 
            rendererOff       = QResources.getInstance().getTexture(QTexture.QRendererOffButton); 
 | 
            backgroundColor   = QResources.getInstance().getColor(QColor.Background); 
 | 
  
 | 
            QSettings.getInstance().addEventListener(QSetting.ShowRendererComponent              , settingsChanged); 
 | 
            QSettings.getInstance().addEventListener(QSetting.ShowRendererComponentDuringPlayMode, settingsChanged); 
 | 
            settingsChanged(); 
 | 
        } 
 | 
  
 | 
        // PRIVATE 
 | 
        private void settingsChanged() 
 | 
        { 
 | 
            enabled = QSettings.getInstance().get<bool>(QSetting.ShowRendererComponent); 
 | 
            showComponentDuringPlayMode = QSettings.getInstance().get<bool>(QSetting.ShowRendererComponentDuringPlayMode); 
 | 
        } 
 | 
  
 | 
        // DRAW 
 | 
        public override void layout(GameObject gameObject, QObjectList objectList, ref Rect rect) 
 | 
        { 
 | 
            rect.x -= 14; 
 | 
            rect.width = 14; 
 | 
        } 
 | 
  
 | 
        public override void disabledHandler(GameObject gameObject, QObjectList objectList) 
 | 
        { 
 | 
            if (objectList != null && objectList.wireframeHiddenObjects.Contains(gameObject)) 
 | 
            {       
 | 
                objectList.wireframeHiddenObjects.Remove(gameObject); 
 | 
                Renderer renderer = gameObject.GetComponent<Renderer>(); 
 | 
                if (renderer != null) setSelectedRenderState(renderer, false); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public override void draw(GameObject gameObject, QObjectList objectList, Rect selectionRect, Rect curRect) 
 | 
        { 
 | 
            Renderer renderer = gameObject.GetComponent<Renderer>(); 
 | 
            if (renderer != null) 
 | 
            { 
 | 
                bool wireframeHiddenObjectsContains = isWireframeHidden(gameObject, objectList); 
 | 
                GUI.DrawTexture(curRect, wireframeHiddenObjectsContains ? rendererWireframe : (renderer.enabled ? rendererOn : rendererOff)); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                EditorGUI.DrawRect(curRect, backgroundColor); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public override void eventHandler(GameObject gameObject, QObjectList objectList, Event currentEvent, Rect rect) 
 | 
        { 
 | 
            if (currentEvent.isMouse && currentEvent.button == 0 && rect.Contains(currentEvent.mousePosition)) 
 | 
            { 
 | 
                Renderer renderer = gameObject.GetComponent<Renderer>(); 
 | 
                if (renderer != null) 
 | 
                { 
 | 
                    bool wireframeHiddenObjectsContains = isWireframeHidden(gameObject, objectList); 
 | 
                    bool isEnabled = renderer.enabled; 
 | 
                     
 | 
                    if (currentEvent.type == EventType.MouseDown) 
 | 
                    { 
 | 
                        targetRendererMode = ((!isEnabled) == true ? 1 : 0); 
 | 
                    } 
 | 
                    else if (currentEvent.type == EventType.MouseDrag && targetRendererMode != -1) 
 | 
                    { 
 | 
                        if (targetRendererMode == (isEnabled == true ? 1 : 0)) return; 
 | 
                    }  
 | 
                    else 
 | 
                    { 
 | 
                        targetRendererMode = -1; 
 | 
                        return; 
 | 
                    } 
 | 
  
 | 
                    Undo.RecordObject(renderer, "renderer visibility change");                     
 | 
                     
 | 
                    if (currentEvent.control || currentEvent.command) 
 | 
                    { 
 | 
                        if (!wireframeHiddenObjectsContains) 
 | 
                        { 
 | 
                            setSelectedRenderState(renderer, true); 
 | 
                            SceneView.RepaintAll(); 
 | 
                            setWireframeMode(gameObject, objectList, true); 
 | 
                        } 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        if (wireframeHiddenObjectsContains) 
 | 
                        { 
 | 
                            setSelectedRenderState(renderer, false); 
 | 
                            SceneView.RepaintAll(); 
 | 
                            setWireframeMode(gameObject, objectList, false); 
 | 
                        } 
 | 
                        else 
 | 
                        { 
 | 
                            Undo.RecordObject(renderer, isEnabled ? "Disable Component" : "Enable Component"); 
 | 
                            renderer.enabled = !isEnabled; 
 | 
                        } 
 | 
                    } 
 | 
                     
 | 
                    EditorUtility.SetDirty(gameObject); 
 | 
                } 
 | 
                currentEvent.Use(); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        // PRIVATE 
 | 
        public bool isWireframeHidden(GameObject gameObject, QObjectList objectList) 
 | 
        { 
 | 
            return objectList == null ? false : objectList.wireframeHiddenObjects.Contains(gameObject); 
 | 
        } 
 | 
         
 | 
        public void setWireframeMode(GameObject gameObject, QObjectList objectList, bool targetWireframe) 
 | 
        { 
 | 
            if (objectList == null && targetWireframe) objectList = QObjectListManager.getInstance().getObjectList(gameObject, true); 
 | 
            if (objectList != null) 
 | 
            { 
 | 
                Undo.RecordObject(objectList, "Renderer Visibility Change"); 
 | 
                if (targetWireframe) objectList.wireframeHiddenObjects.Add(gameObject); 
 | 
                else objectList.wireframeHiddenObjects.Remove(gameObject); 
 | 
                EditorUtility.SetDirty(objectList); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        static public void setSelectedRenderState(Renderer renderer, bool visible) 
 | 
        { 
 | 
            #if UNITY_5_5_OR_NEWER 
 | 
            EditorUtility.SetSelectedRenderState(renderer, visible ? EditorSelectedRenderState.Wireframe : EditorSelectedRenderState.Hidden); 
 | 
            #else 
 | 
            EditorUtility.SetSelectedWireframeHidden(renderer, visible); 
 | 
            #endif 
 | 
        } 
 | 
    } 
 | 
} 
 |