using System; using UnityEditor.UIElements; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.VFX; using UnityEngine.UIElements; using UnityEditor.VFX; using System.Collections.Generic; using UnityEditor; using System.Linq; using System.Text; using UnityEditor.Graphs; using UnityEditor.SceneManagement; namespace UnityEditor.VFX.UI { class ValueFilterEnumPropertyRMProvider : SimplePropertyRMProvider { bool m_NoEnum; public ValueFilterEnumPropertyRMProvider(string name, System.Func getter, System.Action setter, bool noEnum) : base(name, getter, setter) { m_NoEnum = noEnum; } public override IEnumerable filteredOutEnumerators { get { return m_NoEnum ? new int[] { 2 } : null; } } } class VFXBlackboardPropertyView : VisualElement, IControlledElement { public VFXBlackboardPropertyView() { RegisterCallback(OnAttachToPanel); } public VFXBlackboardRow owner { get; set; } Controller IControlledElement.controller { get { return owner.controller; } } public VFXParameterController controller { get { return owner.controller; } } PropertyRM m_Property; PropertyRM m_MinProperty; PropertyRM m_MaxProperty; PropertyRM m_EnumProperty; List m_SubProperties; StringPropertyRM m_TooltipProperty; IEnumerable allProperties { get { var result = Enumerable.Empty(); if (m_ExposedProperty != null) result = result.Concat(Enumerable.Repeat(m_ExposedProperty, 1)); if (m_Property != null) result = result.Concat(Enumerable.Repeat(m_Property, 1)); if (m_SubProperties != null) result = result.Concat(m_SubProperties); if (m_TooltipProperty != null) result = result.Concat(Enumerable.Repeat(m_TooltipProperty, 1)); if (m_ValueFilterProperty != null) result = result.Concat(Enumerable.Repeat(m_ValueFilterProperty, 1)); if (m_MinProperty != null) result = result.Concat(Enumerable.Repeat(m_MinProperty, 1)); if (m_MaxProperty != null) result = result.Concat(Enumerable.Repeat(m_MaxProperty, 1)); if (m_EnumProperty != null) result = result.Concat(Enumerable.Repeat(m_EnumProperty, 1)); return result; } } void GetPreferedWidths(ref float labelWidth) { foreach (var port in allProperties) { float portLabelWidth = port.GetPreferredLabelWidth() + 5; if (labelWidth < portLabelWidth) { labelWidth = portLabelWidth; } } } void ApplyWidths(float labelWidth) { foreach (var port in allProperties) { port.SetLabelWidth(labelWidth); } } void CreateSubProperties(ref int insertIndex, List fieldPath) { var subControllers = controller.GetSubControllers(fieldPath); var subFieldPath = new List(); int cpt = 0; foreach (var subController in subControllers) { subController.RegisterHandler(this); PropertyRM prop = PropertyRM.Create(subController, 85); if (prop != null) { m_SubProperties.Add(prop); Insert(insertIndex++, prop); } if (subController.expanded) { subFieldPath.Clear(); subFieldPath.AddRange(fieldPath); subFieldPath.Add(cpt); CreateSubProperties(ref insertIndex, subFieldPath); } ++cpt; } } EnumPropertyRM m_ValueFilterProperty; BoolPropertyRM m_ExposedProperty; IPropertyRMProvider m_RangeProvider; public new void Clear() { m_ExposedProperty = null; m_ValueFilterProperty = null; } void IControlledElement.OnControllerChanged(ref ControllerChangedEvent e) { if (m_Property != null && e.change == VFXSubParameterController.ExpandedChange) { int insertIndex = 2; RecreateSubproperties(ref insertIndex); foreach (var prop in allProperties) { prop.Update(); } } } public void SelfChange(int change) { if (change == VFXParameterController.ValueChanged) { foreach (var prop in allProperties) { prop.Update(); } return; } int insertIndex = 0; bool isOutputParameter = controller.isOutput; if (!isOutputParameter) { if (m_ExposedProperty == null) { m_ExposedProperty = new BoolPropertyRM(new SimplePropertyRMProvider("Exposed", () => controller.exposed, t => controller.exposed = t), 55); Insert(insertIndex++, m_ExposedProperty); } else { insertIndex++; } if (m_Property == null || !m_Property.IsCompatible(controller)) { if (m_Property != null) { m_Property.RemoveFromHierarchy(); } m_Property = PropertyRM.Create(controller, 55); if (m_Property != null) { Insert(insertIndex++, m_Property); if (!m_Property.showsEverything) { RecreateSubproperties(ref insertIndex); } List fieldpath = new List(); if (m_TooltipProperty == null) { m_TooltipProperty = new StringPropertyRM(new SimplePropertyRMProvider("Tooltip", () => controller.model.tooltip, t => controller.model.tooltip = t), 55); TextField field = m_TooltipProperty.Query(); field.multiline = true; } Insert(insertIndex++, m_TooltipProperty); } else { m_TooltipProperty = null; } } else { insertIndex += 1 + (m_SubProperties != null ? m_SubProperties.Count : 0) + 1; //main property + subproperties + tooltip } bool mustRelayout = false; if (controller.canHaveValueFilter) { if (m_MinProperty == null || !m_MinProperty.IsCompatible(controller.minController)) { if (m_MinProperty != null) m_MinProperty.RemoveFromHierarchy(); m_MinProperty = PropertyRM.Create(controller.minController, 55); } if (m_MaxProperty == null || !m_MaxProperty.IsCompatible(controller.minController)) { if (m_MaxProperty != null) m_MaxProperty.RemoveFromHierarchy(); m_MaxProperty = PropertyRM.Create(controller.maxController, 55); } if (m_ValueFilterProperty == null) { m_ValueFilterProperty = new EnumPropertyRM(new ValueFilterEnumPropertyRMProvider("Mode", () => controller.valueFilter, t => controller.valueFilter = t, controller.portType != typeof(uint)), 55); } Insert(insertIndex++, m_ValueFilterProperty); if (controller.model.valueFilter == VFXValueFilter.Range) { if (m_MinProperty.parent == null) { Insert(insertIndex++, m_MinProperty); Insert(insertIndex++, m_MaxProperty); mustRelayout = true; } } else if (m_MinProperty.parent != null) { m_MinProperty.RemoveFromHierarchy(); m_MaxProperty.RemoveFromHierarchy(); } if (controller.valueFilter == VFXValueFilter.Enum) { if (m_EnumProperty == null || !m_EnumProperty.IsCompatible(controller.enumController)) { if (m_EnumProperty != null) m_EnumProperty.RemoveFromHierarchy(); m_EnumProperty = new VFXListParameterEnumValuePropertyRM(controller.enumController, 55); } if (m_EnumProperty.parent == null) { Insert(insertIndex++, m_EnumProperty); mustRelayout = true; } } else if (m_EnumProperty != null && m_EnumProperty.parent != null) { m_EnumProperty.RemoveFromHierarchy(); } } else { if (m_MinProperty != null) { m_MinProperty.RemoveFromHierarchy(); m_MinProperty = null; } if (m_MaxProperty != null) { m_MaxProperty.RemoveFromHierarchy(); m_MaxProperty = null; } if (m_ValueFilterProperty != null) { m_ValueFilterProperty.RemoveFromHierarchy(); m_ValueFilterProperty = null; } } if (mustRelayout) Relayout(); } else { m_Property = null; m_ExposedProperty = null; m_SubProperties = null; m_MinProperty = null; m_MaxProperty = null; m_ValueFilterProperty = null; if (m_TooltipProperty == null) { m_TooltipProperty = new StringPropertyRM(new SimplePropertyRMProvider("Tooltip", () => controller.model.tooltip, t => controller.model.tooltip = t), 55); } Insert(insertIndex++, m_TooltipProperty); } foreach (var prop in allProperties) { prop.Update(); } } private void RecreateSubproperties(ref int insertIndex) { if (m_SubProperties != null) { foreach (var subProperty in m_SubProperties) { (subProperty.provider as Controller).UnregisterHandler(this); subProperty.RemoveFromHierarchy(); } } else { m_SubProperties = new List(); } m_SubProperties.Clear(); List fieldpath = new List(); if (!m_Property.showsEverything) { CreateSubProperties(ref insertIndex, fieldpath); } } void OnAttachToPanel(AttachToPanelEvent e) { RegisterCallback(OnGeometryChanged); } void OnGeometryChanged(GeometryChangedEvent e) { if (panel != null) { Relayout(); } UnregisterCallback(OnGeometryChanged); } private void Relayout() { float labelWidth = 70; GetPreferedWidths(ref labelWidth); ApplyWidths(labelWidth); } } }