2 using System.Collections.Generic;
5 using UnityEditor.Experimental.GraphView;
7 using UnityEngine.UIElements;
8 using UnityEngine.Experimental.VFX;
9 using UnityEditor.VFX.UIElements;
10 using Branch = UnityEditor.VFX.Operator.VFXOperatorDynamicBranch;
12 namespace UnityEditor.VFX.UI
14 class VFXOperatorUI : VFXNodeUI
16 VisualElement m_EditButton;
18 public VFXOperatorUI()
20 this.AddStyleSheetPath("VFXOperator");
22 m_Middle = new VisualElement();
23 m_Middle.name = "middle";
24 inputContainer.parent.Insert(1, m_Middle);
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());
31 RegisterCallback<GeometryChangedEvent>(OnPostLayout);
34 VisualElement m_EditContainer;
38 if (m_EditContainer != null)
40 if (m_EditContainer.parent != null)
42 m_EditContainer.RemoveFromHierarchy();
47 RefreshPorts(); // refresh port to make sure outputContainer is added before the editcontainer.
48 topContainer.Add(m_EditContainer);
55 VisualElement m_Middle;
57 public new VFXOperatorController controller
59 get { return base.controller as VFXOperatorController; }
63 public override void GetPreferedWidths(ref float labelWidth, ref float controlWidth)
65 base.GetPreferedWidths(ref labelWidth, ref controlWidth);
67 foreach (var port in GetPorts(true, false).Cast<VFXEditableDataAnchor>())
69 float portLabelWidth = port.GetPreferredLabelWidth() + 1;
70 float portControlWidth = port.GetPreferredControlWidth();
72 if (labelWidth < portLabelWidth)
74 labelWidth = portLabelWidth;
76 if (controlWidth < portControlWidth)
78 controlWidth = portControlWidth;
83 public override void ApplyWidths(float labelWidth, float controlWidth)
85 base.ApplyWidths(labelWidth, controlWidth);
86 foreach (var port in GetPorts(true, false).Cast<VFXEditableDataAnchor>())
88 port.SetLabelWidth(labelWidth);
90 inputContainer.style.width = labelWidth + controlWidth + 20;
93 public bool isEditable
97 return controller != null && controller.isEditable;
101 protected VisualElement GetControllerEditor()
103 if (controller is VFXCascadedOperatorController)
105 var edit = new VFXCascadedOperatorEdit();
106 edit.controller = controller as VFXCascadedOperatorController;
109 if (controller is VFXNumericUniformOperatorController)
111 var edit = new VFXUniformOperatorEdit<VFXNumericUniformOperatorController, VFXOperatorNumericUniform>();
112 edit.controller = controller as VFXNumericUniformOperatorController;
115 if (controller is VFXBranchOperatorController)
117 var edit = new VFXUniformOperatorEdit<VFXBranchOperatorController, Branch>();
118 edit.controller = controller as VFXBranchOperatorController;
121 if (controller is VFXUnifiedOperatorController)
123 var edit = new VFXUnifiedOperatorEdit();
124 edit.controller = controller as VFXUnifiedOperatorController;
130 public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
132 if (evt.target == this && controller != null && controller.model is VFXInlineOperator)
134 evt.menu.AppendAction("Convert to Parameter", OnConvertToParameter, e => DropdownMenuAction.Status.Normal);
135 evt.menu.AppendSeparator();
139 void OnConvertToParameter(DropdownMenuAction evt)
141 controller.ConvertToParameter();
144 public override bool superCollapsed
146 get { return base.superCollapsed && (m_EditContainer == null || m_EditContainer.parent == null); }
149 protected override void SelfChange()
153 bool hasMiddle = inputContainer.childCount != 0;
156 if (m_Middle.parent == null)
158 inputContainer.parent.Insert(1, m_Middle);
161 else if (m_Middle.parent != null)
163 m_Middle.RemoveFromHierarchy();
168 if (m_EditButton.parent == null)
170 titleContainer.Insert(1, m_EditButton);
172 if (m_EditContainer == null)
174 m_EditContainer = GetControllerEditor();
175 if (m_EditContainer != null)
176 m_EditContainer.name = "edit-container";
181 if (m_EditContainer != null && m_EditContainer.parent != null)
183 m_EditContainer.RemoveFromHierarchy();
185 m_EditContainer = null;
186 if (m_EditButton.parent != null)
188 m_EditButton.RemoveFromHierarchy();
193 void OnPostLayout(GeometryChangedEvent e)
198 public override void RefreshLayout()
200 base.RefreshLayout();
203 float settingsLabelWidth = 30;
204 float settingsControlWidth = 50;
205 GetPreferedSettingsWidths(ref settingsLabelWidth, ref settingsControlWidth);
207 float labelWidth = 30;
208 float controlWidth = 50;
209 GetPreferedWidths(ref labelWidth, ref controlWidth);
211 float newMinWidth = Mathf.Max(settingsLabelWidth + settingsControlWidth, labelWidth + controlWidth) + 20;
213 if (resolvedStyle.minWidth != newMinWidth)
215 style.minWidth = newMinWidth;
218 ApplySettingsWidths(settingsLabelWidth, settingsControlWidth);
220 ApplyWidths(labelWidth, controlWidth);
224 if (resolvedStyle.minWidth != 0f)