| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | using UnityEngine;using UnityEngine.UIElements;using UnityEditor;using System;using System.Collections.Generic;using Object = UnityEngine.Object;namespace GraphProcessor{    /// <summary>    /// Custom editor of the node inspector, you can inherit from this class to customize your node inspector.    /// </summary>    [CustomEditor(typeof(NodeInspectorObject))]    public class NodeInspectorObjectEditor : Editor    {        NodeInspectorObject inspector;        protected VisualElement root;        protected VisualElement selectedNodeList;        protected VisualElement placeholder;        protected virtual void OnEnable()        {            inspector = target as NodeInspectorObject;            inspector.nodeSelectionUpdated += UpdateNodeInspectorList;            root = new VisualElement();            selectedNodeList = new VisualElement();            selectedNodeList.styleSheets.Add(Resources.Load<StyleSheet>("GraphProcessorStyles/InspectorView"));            root.Add(selectedNodeList);            placeholder = new Label("Select a node to show it's settings in the inspector");            placeholder.AddToClassList("PlaceHolder");            UpdateNodeInspectorList();        }        protected virtual void OnDisable()        {            inspector.nodeSelectionUpdated -= UpdateNodeInspectorList;        }        public override VisualElement CreateInspectorGUI() => root;        protected virtual void UpdateNodeInspectorList()        {            selectedNodeList.Clear();            if (inspector.selectedNodes.Count == 0)                selectedNodeList.Add(placeholder);            foreach (var nodeView in inspector.selectedNodes)                selectedNodeList.Add(CreateNodeBlock(nodeView));        }        protected VisualElement CreateNodeBlock(BaseNodeView nodeView)        {            var view = new VisualElement();            view.Add(new Label(nodeView.nodeTarget.name));            var tmp = nodeView.controlsContainer;            nodeView.controlsContainer = view;            nodeView.Enable(true);            nodeView.controlsContainer.AddToClassList("NodeControls");            var block = nodeView.controlsContainer;            nodeView.controlsContainer = tmp;                        return block;        }    }    /// <summary>    /// Node inspector object, you can inherit from this class to customize your node inspector.    /// </summary>    public class NodeInspectorObject : ScriptableObject    {        /// <summary>Previously selected object by the inspector</summary>        public Object previouslySelectedObject;        /// <summary>List of currently selected nodes</summary>        public HashSet<BaseNodeView> selectedNodes { get; private set; } = new HashSet<BaseNodeView>();        /// <summary>Triggered when the selection is updated</summary>        public event Action nodeSelectionUpdated;        /// <summary>Updates the selection from the graph</summary>        public virtual void UpdateSelectedNodes(HashSet<BaseNodeView> views)        {            selectedNodes = views;            nodeSelectionUpdated?.Invoke();        }        public virtual void RefreshNodes() => nodeSelectionUpdated?.Invoke();        public virtual void NodeViewRemoved(BaseNodeView view)        {            selectedNodes.Remove(view);            nodeSelectionUpdated?.Invoke();        }    }}
 |