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 / VFXOperatorUI.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using UnityEditor.Experimental.GraphView;
6 using UnityEngine;
7 using UnityEngine.UIElements;
8 using UnityEngine.Experimental.VFX;
9 using UnityEditor.VFX.UIElements;
10 using Branch = UnityEditor.VFX.Operator.VFXOperatorDynamicBranch;
11
12 namespace UnityEditor.VFX.UI
13 {
14     class VFXOperatorUI : VFXNodeUI
15     {
16         VisualElement m_EditButton;
17
18         public VFXOperatorUI()
19         {
20             this.AddStyleSheetPath("VFXOperator");
21
22             m_Middle = new VisualElement();
23             m_Middle.name = "middle";
24             inputContainer.parent.Insert(1, m_Middle);
25
26             m_EditButton = new VisualElement() {name = "edit"};
27             m_EditButton.Add(new VisualElement() { name = "icon" });
28             m_EditButton.AddManipulator(new Clickable(OnEdit));
29             this.AddManipulator(new SuperCollapser());
30
31             RegisterCallback<GeometryChangedEvent>(OnPostLayout);
32         }
33
34         VisualElement m_EditContainer;
35
36         void OnEdit()
37         {
38             if (m_EditContainer != null)
39             {
40                 if (m_EditContainer.parent != null)
41                 {
42                     m_EditContainer.RemoveFromHierarchy();
43                 }
44                 else
45                 {
46                     expanded = true;
47                     RefreshPorts(); // refresh port to make sure outputContainer is added before the editcontainer.
48                     topContainer.Add(m_EditContainer);
49                 }
50
51                 UpdateCollapse();
52             }
53         }
54
55         VisualElement m_Middle;
56
57         public new VFXOperatorController controller
58         {
59             get { return base.controller as VFXOperatorController; }
60         }
61
62
63         public override void GetPreferedWidths(ref float labelWidth, ref float controlWidth)
64         {
65             base.GetPreferedWidths(ref labelWidth, ref controlWidth);
66
67             foreach (var port in GetPorts(true, false).Cast<VFXEditableDataAnchor>())
68             {
69                 float portLabelWidth = port.GetPreferredLabelWidth() + 1;
70                 float portControlWidth = port.GetPreferredControlWidth();
71
72                 if (labelWidth < portLabelWidth)
73                 {
74                     labelWidth = portLabelWidth;
75                 }
76                 if (controlWidth < portControlWidth)
77                 {
78                     controlWidth = portControlWidth;
79                 }
80             }
81         }
82
83         public override void ApplyWidths(float labelWidth, float controlWidth)
84         {
85             base.ApplyWidths(labelWidth, controlWidth);
86             foreach (var port in GetPorts(true, false).Cast<VFXEditableDataAnchor>())
87             {
88                 port.SetLabelWidth(labelWidth);
89             }
90             inputContainer.style.width = labelWidth + controlWidth + 20;
91         }
92
93         public bool isEditable
94         {
95             get
96             {
97                 return controller != null && controller.isEditable;
98             }
99         }
100
101         protected VisualElement GetControllerEditor()
102         {
103             if (controller is VFXCascadedOperatorController)
104             {
105                 var edit = new VFXCascadedOperatorEdit();
106                 edit.controller = controller as VFXCascadedOperatorController;
107                 return edit;
108             }
109             if (controller is VFXNumericUniformOperatorController)
110             {
111                 var edit = new VFXUniformOperatorEdit<VFXNumericUniformOperatorController, VFXOperatorNumericUniform>();
112                 edit.controller = controller as VFXNumericUniformOperatorController;
113                 return edit;
114             }
115             if (controller is VFXBranchOperatorController)
116             {
117                 var edit = new VFXUniformOperatorEdit<VFXBranchOperatorController, Branch>();
118                 edit.controller = controller as VFXBranchOperatorController;
119                 return edit;
120             }
121             if (controller is VFXUnifiedOperatorController)
122             {
123                 var edit = new VFXUnifiedOperatorEdit();
124                 edit.controller = controller as VFXUnifiedOperatorController;
125                 return edit;
126             }
127             return null;
128         }
129
130         public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
131         {
132             if (evt.target == this && controller != null && controller.model is VFXInlineOperator)
133             {
134                 evt.menu.AppendAction("Convert to Parameter", OnConvertToParameter, e => DropdownMenuAction.Status.Normal);
135                 evt.menu.AppendSeparator();
136             }
137         }
138
139         void OnConvertToParameter(DropdownMenuAction evt)
140         {
141             controller.ConvertToParameter();
142         }
143
144         public override bool superCollapsed
145         {
146             get { return base.superCollapsed && (m_EditContainer == null || m_EditContainer.parent == null); }
147         }
148
149         protected override void SelfChange()
150         {
151             base.SelfChange();
152
153             bool hasMiddle = inputContainer.childCount != 0;
154             if (hasMiddle)
155             {
156                 if (m_Middle.parent == null)
157                 {
158                     inputContainer.parent.Insert(1, m_Middle);
159                 }
160             }
161             else if (m_Middle.parent != null)
162             {
163                 m_Middle.RemoveFromHierarchy();
164             }
165
166             if (isEditable)
167             {
168                 if (m_EditButton.parent == null)
169                 {
170                     titleContainer.Insert(1, m_EditButton);
171                 }
172                 if (m_EditContainer == null)
173                 {
174                     m_EditContainer = GetControllerEditor();
175                     if (m_EditContainer != null)
176                         m_EditContainer.name = "edit-container";
177                 }
178             }
179             else
180             {
181                 if (m_EditContainer != null && m_EditContainer.parent != null)
182                 {
183                     m_EditContainer.RemoveFromHierarchy();
184                 }
185                 m_EditContainer = null;
186                 if (m_EditButton.parent != null)
187                 {
188                     m_EditButton.RemoveFromHierarchy();
189                 }
190             }
191         }
192
193         void OnPostLayout(GeometryChangedEvent e)
194         {
195             RefreshLayout();
196         }
197
198         public override void RefreshLayout()
199         {
200             base.RefreshLayout();
201             if (!superCollapsed)
202             {
203                 float settingsLabelWidth = 30;
204                 float settingsControlWidth = 50;
205                 GetPreferedSettingsWidths(ref settingsLabelWidth, ref settingsControlWidth);
206
207                 float labelWidth = 30;
208                 float controlWidth = 50;
209                 GetPreferedWidths(ref labelWidth, ref controlWidth);
210
211                 float newMinWidth = Mathf.Max(settingsLabelWidth + settingsControlWidth, labelWidth + controlWidth) + 20;
212
213                 if (resolvedStyle.minWidth != newMinWidth)
214                 {
215                     style.minWidth = newMinWidth;
216                 }
217
218                 ApplySettingsWidths(settingsLabelWidth, settingsControlWidth);
219
220                 ApplyWidths(labelWidth, controlWidth);
221             }
222             else
223             {
224                 if (resolvedStyle.minWidth != 0f)
225                 {
226                     style.minWidth = 0f;
227                 }
228             }
229         }
230     }
231 }