NodeInspectorObject.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using UnityEngine;
  2. using UnityEngine.UIElements;
  3. using UnityEditor;
  4. using System;
  5. using System.Collections.Generic;
  6. using Object = UnityEngine.Object;
  7. namespace GraphProcessor
  8. {
  9. /// <summary>
  10. /// Custom editor of the node inspector, you can inherit from this class to customize your node inspector.
  11. /// </summary>
  12. [CustomEditor(typeof(NodeInspectorObject))]
  13. public class NodeInspectorObjectEditor : Editor
  14. {
  15. NodeInspectorObject inspector;
  16. protected VisualElement root;
  17. protected VisualElement selectedNodeList;
  18. protected VisualElement placeholder;
  19. protected virtual void OnEnable()
  20. {
  21. inspector = target as NodeInspectorObject;
  22. inspector.nodeSelectionUpdated += UpdateNodeInspectorList;
  23. root = new VisualElement();
  24. selectedNodeList = new VisualElement();
  25. selectedNodeList.styleSheets.Add(Resources.Load<StyleSheet>("GraphProcessorStyles/InspectorView"));
  26. root.Add(selectedNodeList);
  27. placeholder = new Label("Select a node to show it's settings in the inspector");
  28. placeholder.AddToClassList("PlaceHolder");
  29. UpdateNodeInspectorList();
  30. }
  31. protected virtual void OnDisable()
  32. {
  33. inspector.nodeSelectionUpdated -= UpdateNodeInspectorList;
  34. }
  35. public override VisualElement CreateInspectorGUI() => root;
  36. protected virtual void UpdateNodeInspectorList()
  37. {
  38. selectedNodeList.Clear();
  39. if (inspector.selectedNodes.Count == 0)
  40. selectedNodeList.Add(placeholder);
  41. foreach (var nodeView in inspector.selectedNodes)
  42. selectedNodeList.Add(CreateNodeBlock(nodeView));
  43. }
  44. protected VisualElement CreateNodeBlock(BaseNodeView nodeView)
  45. {
  46. var view = new VisualElement();
  47. view.Add(new Label(nodeView.nodeTarget.name));
  48. var tmp = nodeView.controlsContainer;
  49. nodeView.controlsContainer = view;
  50. nodeView.Enable(true);
  51. nodeView.controlsContainer.AddToClassList("NodeControls");
  52. var block = nodeView.controlsContainer;
  53. nodeView.controlsContainer = tmp;
  54. return block;
  55. }
  56. }
  57. /// <summary>
  58. /// Node inspector object, you can inherit from this class to customize your node inspector.
  59. /// </summary>
  60. public class NodeInspectorObject : ScriptableObject
  61. {
  62. /// <summary>Previously selected object by the inspector</summary>
  63. public Object previouslySelectedObject;
  64. /// <summary>List of currently selected nodes</summary>
  65. public HashSet<BaseNodeView> selectedNodes { get; private set; } = new HashSet<BaseNodeView>();
  66. /// <summary>Triggered when the selection is updated</summary>
  67. public event Action nodeSelectionUpdated;
  68. /// <summary>Updates the selection from the graph</summary>
  69. public virtual void UpdateSelectedNodes(HashSet<BaseNodeView> views)
  70. {
  71. selectedNodes = views;
  72. nodeSelectionUpdated?.Invoke();
  73. }
  74. public virtual void RefreshNodes() => nodeSelectionUpdated?.Invoke();
  75. public virtual void NodeViewRemoved(BaseNodeView view)
  76. {
  77. selectedNodes.Remove(view);
  78. nodeSelectionUpdated?.Invoke();
  79. }
  80. }
  81. }