using UnityEngine; using UnityEngine.UIElements; using UnityEditor; using System; using System.Collections.Generic; using Object = UnityEngine.Object; namespace GraphProcessor { /// /// Custom editor of the node inspector, you can inherit from this class to customize your node inspector. /// [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("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; } } /// /// Node inspector object, you can inherit from this class to customize your node inspector. /// public class NodeInspectorObject : ScriptableObject { /// Previously selected object by the inspector public Object previouslySelectedObject; /// List of currently selected nodes public HashSet selectedNodes { get; private set; } = new HashSet(); /// Triggered when the selection is updated public event Action nodeSelectionUpdated; /// Updates the selection from the graph public virtual void UpdateSelectedNodes(HashSet views) { selectedNodes = views; nodeSelectionUpdated?.Invoke(); } public virtual void RefreshNodes() => nodeSelectionUpdated?.Invoke(); public virtual void NodeViewRemoved(BaseNodeView view) { selectedNodes.Remove(view); nodeSelectionUpdated?.Invoke(); } } }