OSDN Git Service

Added Assets for main menu
[mindgames/Mindgames_main.git] / Mindgames / Library / PackageCache / com.unity.visualeffectgraph@6.9.0-preview / Editor / GraphView / Elements / VFXGroupNode.cs
1 using System.Collections.Generic;
2 using UnityEditor.Experimental.GraphView;
3 using UnityEngine;
4 using UnityEngine.UIElements;
5 using System.Reflection;
6 using System.Linq;
7
8 namespace UnityEditor.VFX.UI
9 {
10     class VFXGroupNode : Group, IControlledElement<VFXGroupNodeController>, IVFXMovable
11     {
12         Controller IControlledElement.controller
13         {
14             get { return m_Controller; }
15         }
16         public VFXGroupNodeController controller
17         {
18             get { return m_Controller; }
19             set
20             {
21                 if (m_Controller != null)
22                 {
23                     m_Controller.UnregisterHandler(this);
24                 }
25                 m_Controller = value;
26                 if (m_Controller != null)
27                 {
28                     m_Controller.RegisterHandler(this);
29                 }
30             }
31         }
32
33         VFXGroupNodeController m_Controller;
34
35         VisualElement m_GroupDropArea;
36
37         public VFXGroupNode()
38         {
39             this.AddManipulator(new ContextualMenuManipulator(BuildContextualMenu));
40
41             m_GroupDropArea = this.Query("dropArea");
42
43             RegisterCallback<DragPerformEvent>(DragPerform);
44             RegisterCallback<DragUpdatedEvent>(DragUpdated);
45             RegisterCallback<DragLeaveEvent>(DragLeave);
46         }
47
48         public bool CanAcceptDrop()
49         {
50             VFXView view = GetFirstAncestorOfType<VFXView>();
51             if (view == null)
52                 return false;
53             return view.selection.Any(t => t is BlackboardField && (t as BlackboardField).GetFirstAncestorOfType<VFXBlackboardRow>() != null);
54         }
55
56         public void DragUpdated(DragUpdatedEvent evt)
57         {
58             if (CanAcceptDrop())
59                 m_GroupDropArea.AddToClassList("dragEntered");
60         }
61
62         public void DragPerform(DragPerformEvent evt)
63         {
64             m_GroupDropArea.RemoveFromClassList("dragEntered");
65         }
66
67         public void DragLeave(DragLeaveEvent evt)
68         {
69             m_GroupDropArea.RemoveFromClassList("dragEntered");
70         }
71
72         public void BuildContextualMenu(ContextualMenuPopulateEvent evt)
73         {
74         }
75
76         public void OnMoved()
77         {
78             controller.position = GetPosition();
79
80             foreach (var node in containedElements.OfType<IVFXMovable>())
81             {
82                 node.OnMoved();
83             }
84         }
85
86         void IControlledElement.OnControllerChanged(ref ControllerChangedEvent e)
87         {
88             if (e.controller == controller)
89             {
90                 SelfChange();
91             }
92         }
93
94         public void SelfChange()
95         {
96             // use are custom data changed from the view because we can't listen simply to the VFXUI, because the VFXUI might have been modified because we were removed and the datawatch might call us before the view
97             VFXView view = this.GetFirstAncestorOfType<VFXView>();
98             if (view == null) return;
99
100
101             m_ModificationFromController = true;
102             inRemoveElement = true;
103             title = controller.title;
104
105
106             var presenterContent = new HashSet<Controller>(controller.nodes);
107             var elementContent = containedElements.OfType<IControlledElement>().Where(t => t.controller is VFXNodeController || t.controller is VFXStickyNoteController).ToArray();
108
109             bool elementsChanged = false;
110             var elementToDelete = elementContent.Where(t => !presenterContent.Contains(t.controller)).ToArray();
111             foreach (var element in elementToDelete)
112             {
113                 this.RemoveElement(element as GraphElement);
114                 elementsChanged = true;
115             }
116
117             if (presenterContent.Count() != elementContent.Count())
118             {
119                 var elementToAdd = presenterContent.Select(t => view.GetGroupNodeElement(t)).Except(elementContent.Cast<GraphElement>()).ToArray();
120
121                 //bool someNodeNotFound = false;
122                 foreach (var element in elementToAdd)
123                 {
124                     if (element != null)
125                     {
126                         this.AddElement(element as GraphElement);
127                         elementsChanged = true;
128                     }
129                     else
130                     {
131                         //someNodeNotFound = true;
132                     }
133                 }
134             }
135
136             // only update position if the groupnode is empty otherwise the size should be computed from the content.
137             if (presenterContent.Count() == 0)
138             {
139                 SetPosition(controller.position);
140             }
141             else
142             {
143                 if (elementsChanged)
144                     UpdateGeometryFromContent();
145             }
146
147             m_ModificationFromController = false;
148             inRemoveElement = false;
149         }
150
151         bool m_ModificationFromController;
152
153         public static bool inRemoveElement {get; set; }
154
155         public void ElementsAddedToGroupNode(IEnumerable<GraphElement> elements)
156         {
157             if (!m_ModificationFromController)
158             {
159                 controller.AddNodes(elements.OfType<ISettableControlledElement<VFXNodeController>>().Select(t => t.controller));
160                 controller.AddStickyNotes(elements.OfType<VFXStickyNote>().Select(t => t.controller));
161                 OnMoved();
162             }
163         }
164
165         public void ElementsRemovedFromGroupNode(IEnumerable<GraphElement> elements)
166         {
167             if (!m_ModificationFromController && !inRemoveElement)
168             {
169                 controller.RemoveNodes(elements.OfType<ISettableControlledElement<VFXNodeController>>().Select(t => t.controller));
170                 controller.RemoveStickyNotes(elements.OfType<VFXStickyNote>().Select(t => t.controller));
171             }
172         }
173
174         public void GroupNodeTitleChanged(string title)
175         {
176             if (!m_ModificationFromController)
177             {
178                 controller.title = title;
179             }
180         }
181     }
182 }