| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | using UnityEngine;using UnityEditor.Experimental.GraphView;using UnityEditor.UIElements;using UnityEngine.UIElements;using System.Collections;using System.Collections.Generic;using System.Linq;namespace GraphProcessor{    public class GroupView : UnityEditor.Experimental.GraphView.Group	{		public BaseGraphView	owner;		public Group		    group;        Label                   titleLabel;        ColorField              colorField;        readonly string         groupStyle = "GraphProcessorStyles/GroupView";        public GroupView()        {            styleSheets.Add(Resources.Load<StyleSheet>(groupStyle));		}				private static void BuildContextualMenu(ContextualMenuPopulateEvent evt) {}				public void Initialize(BaseGraphView graphView, Group block)		{			group = block;			owner = graphView;            title = block.title;            SetPosition(block.position);						this.AddManipulator(new ContextualMenuManipulator(BuildContextualMenu));			            headerContainer.Q<TextField>().RegisterCallback<ChangeEvent<string>>(TitleChangedCallback);            titleLabel = headerContainer.Q<Label>();            colorField = new ColorField{ value = group.color, name = "headerColorPicker" };            colorField.RegisterValueChangedCallback(e =>            {                UpdateGroupColor(e.newValue);            });            UpdateGroupColor(group.color);            headerContainer.Add(colorField);            InitializeInnerNodes();		}        void InitializeInnerNodes()        {            foreach (var nodeGUID in group.innerNodeGUIDs.ToList())            {                if (!owner.graph.nodesPerGUID.ContainsKey(nodeGUID))                {                    Debug.LogWarning("Node GUID not found: " + nodeGUID);                    group.innerNodeGUIDs.Remove(nodeGUID);                    continue ;                }                var node = owner.graph.nodesPerGUID[nodeGUID];                var nodeView = owner.nodeViewsPerNode[node];                AddElement(nodeView);            }        }        protected override void OnElementsAdded(IEnumerable<GraphElement> elements)        {            foreach (var element in elements)            {                var node = element as BaseNodeView;                // Adding an element that is not a node currently supported                if (node == null)                    continue;                if (!group.innerNodeGUIDs.Contains(node.nodeTarget.GUID))                    group.innerNodeGUIDs.Add(node.nodeTarget.GUID);            }            base.OnElementsAdded(elements);        }        protected override void OnElementsRemoved(IEnumerable<GraphElement> elements)        {            // Only remove the nodes when the group exists in the hierarchy            if (parent != null)            {                foreach (var elem in elements)                {                    if (elem is BaseNodeView nodeView)                    {                        group.innerNodeGUIDs.Remove(nodeView.nodeTarget.GUID);                    }                }            }            base.OnElementsRemoved(elements);        }        public void UpdateGroupColor(Color newColor)        {            group.color = newColor;            style.backgroundColor = newColor;        }        void TitleChangedCallback(ChangeEvent< string > e)        {            group.title = e.newValue;        }		public override void SetPosition(Rect newPos)		{			base.SetPosition(newPos);			group.position = newPos;		}	}}
 |