public void BindStyleField(BuilderStyleRow styleRow, FoldoutColorField foldoutElement) { var colorFields = foldoutElement.Query <ColorField>().ToList(); foreach (var field in colorFields) { field.SetProperty(BuilderConstants.FoldoutFieldPropertyName, foldoutElement); field.RegisterValueChangedCallback((evt) => { var row = field.GetProperty(BuilderConstants.InspectorLinkedStyleRowVEPropertyName) as BuilderStyleRow; if (row != null && !string.IsNullOrEmpty(row.bindingPath)) { foldoutElement.UpdateFromChildField(row.bindingPath, field.value); } foldoutElement.header.AddToClassList(BuilderConstants.InspectorLocalStyleOverrideClassName); }); BuilderStyleRow.ReAssignTooltipToChild(field); } foldoutElement.header.SetProperty(BuilderConstants.FoldoutFieldPropertyName, foldoutElement); foldoutElement.headerInputField.RegisterValueChangedCallback(FoldoutColorFieldOnValueChange); foldoutElement.headerInputField.AddManipulator( new ContextualMenuManipulator((e) => { e.target = foldoutElement.header; BuildStyleFieldContextualMenu(e); })); foldoutElement.header.AddManipulator( new ContextualMenuManipulator(BuildStyleFieldContextualMenu)); }
public VariableEditingHandler(BindableElement field) { targetField = field; if (targetField is DimensionStyleField || targetField is NumericStyleField || targetField is IntegerStyleField) { m_CompleterOnTarget = CreateCompleter(); m_CompleterOnTarget.textField = targetField.Q <TextField>(); } labelElement = new Label(); var fieldLabel = targetField.GetValueByReflection("labelElement") as Label; // TODO: Will need to bring this back once we can also do the dragger at the same time. //fieldLabel.RegisterCallback<MouseDownEvent>(OnMouseDownEvent); labelElement.RegisterValueChangedCallback(e => { e.StopImmediatePropagation(); }); fieldLabel.Add(labelElement); labelElement.AddToClassList(s_LabelClassName); labelElement.text = fieldLabel.text; fieldLabel.generateVisualContent = null; // Leave the text of the default label as it is used in some queries (in tests) but prevent the text from being rendered m_Inspector = targetField.GetFirstAncestorOfType <BuilderInspector>(); if (m_Inspector != null) { m_Builder = m_Inspector.paneWindow as Builder; m_Row = targetField.GetFirstAncestorOfType <BuilderStyleRow>(); } }
public void BindStyleField(BuilderStyleRow styleRow, TransitionsListView transitionsListView) { var transitionList = GetOrCreateFieldListForStyleName(TransitionConstants.Transition); transitionList.Add(transitionsListView); transitionsListView.RegisterCallback <TransitionAddedEvent, TransitionsListView>(OnTransitionAdded, transitionsListView); transitionsListView.RegisterCallback <TransitionChangedEvent, TransitionsListView>(OnTransitionChanged, transitionsListView); transitionsListView.RegisterCallback <TransitionRemovedEvent, TransitionsListView>(OnTransitionRemoved, transitionsListView); }
public void BindDoubleFieldRow(BuilderStyleRow styleRow) { var styleFields = styleRow.Query <BindableElement>().ToList() .Where(element => !string.IsNullOrEmpty(element.bindingPath)).ToList(); if (styleFields.Count > 0) { var headerLabel = styleRow.Q <Label>(classes: "unity-builder-double-field-label"); headerLabel.AddManipulator(new ContextualMenuManipulator(action => { (action.target as VisualElement).userData = styleFields; BuildStyleFieldContextualMenu(action); })); } }
public VariableEditingHandler(BindableElement field) { targetField = field; labelElement = new Label(); labelElement.pickingMode = PickingMode.Position; var fieldLabel = targetField.GetValueByReflection("labelElement") as Label; fieldLabel.RegisterCallback <MouseDownEvent>(OnMouseDownEvent); labelElement.RegisterValueChangedCallback(e => { e.StopImmediatePropagation(); }); fieldLabel.Add(labelElement); labelElement.AddToClassList(s_LabelClassName); labelElement.text = fieldLabel.text; fieldLabel.generateVisualContent = null; // Leave the text of the default label as it is used in some queries (in tests) but prevent the text from being rendered m_Inspector = targetField.GetFirstAncestorOfType <BuilderInspector>(); if (m_Inspector != null) { m_Builder = m_Inspector.paneWindow as Builder; m_Row = targetField.GetFirstAncestorOfType <BuilderStyleRow>(); } }
BuilderStyleRow CreateAttributeRow(UxmlAttributeDescription attribute) { var attributeType = attribute.GetType(); // Generate field label. var fieldLabel = BuilderNameUtilities.ConvertDashToHuman(attribute.name); BindableElement fieldElement; if (attribute is UxmlStringAttributeDescription) { // Hard-coded if (attribute.name.Equals("value") && currentVisualElement is EnumField enumField) { var uiField = new EnumField("Value"); if (null != enumField.value) { uiField.Init(enumField.value, enumField.includeObsoleteValues); } else { uiField.SetValueWithoutNotify(null); } uiField.RegisterValueChangedCallback(evt => PostAttributeValueChange(uiField, uiField.value.ToString())); fieldElement = uiField; } else if (attribute.name.Equals("value") && currentVisualElement is TagField tagField) { var uiField = new TagField("Value"); uiField.RegisterValueChangedCallback(evt => PostAttributeValueChange(uiField, uiField.value.ToString())); fieldElement = uiField; } else { var uiField = new TextField(fieldLabel); if (attribute.name.Equals("name") || attribute.name.Equals("view-data-key")) { uiField.RegisterValueChangedCallback(e => { OnValidatedAttributeValueChange(e, BuilderNameUtilities.attributeRegex, BuilderConstants.AttributeValidationSpacialCharacters); }); } else if (attribute.name.Equals("binding-path")) { uiField.RegisterValueChangedCallback(e => { OnValidatedAttributeValueChange(e, BuilderNameUtilities.bindingPathAttributeRegex, BuilderConstants.BindingPathAttributeValidationSpacialCharacters); }); } else { uiField.RegisterValueChangedCallback(OnAttributeValueChange); } if (attribute.name.Equals("text") || attribute.name.Equals("label")) { uiField.multiline = true; uiField.AddToClassList(BuilderConstants.InspectorMultiLineTextFieldClassName); } fieldElement = uiField; } } else if (attribute is UxmlFloatAttributeDescription) { var uiField = new FloatField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlDoubleAttributeDescription) { var uiField = new DoubleField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlIntAttributeDescription) { if (attribute.name.Equals("value") && currentVisualElement is LayerField) { var uiField = new LayerField("Value"); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute.name.Equals("value") && currentVisualElement is LayerMaskField) { var uiField = new LayerMaskField("Value"); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else { var uiField = new IntegerField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } } else if (attribute is UxmlLongAttributeDescription) { var uiField = new LongField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlBoolAttributeDescription) { var uiField = new Toggle(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlColorAttributeDescription) { var uiField = new ColorField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attributeType.IsGenericType && !attributeType.GetGenericArguments()[0].IsEnum && attributeType.GetGenericArguments()[0] is Type) { var desiredType = attributeType.GetGenericArguments()[0]; var uiField = new TextField(fieldLabel) { isDelayed = true }; var completer = new FieldSearchCompleter <TypeInfo>(uiField); uiField.RegisterCallback <AttachToPanelEvent, FieldSearchCompleter <TypeInfo> >((evt, c) => { // When possible, the popup should have the same width as the input field, so that the auto-complete // characters will try to match said input field. c.popup.anchoredControl = ((VisualElement)evt.target).Q(className: "unity-text-field__input"); }, completer); completer.matcherCallback += (str, info) => info.value.IndexOf(str, StringComparison.OrdinalIgnoreCase) >= 0; completer.itemHeight = 36; completer.dataSourceCallback += () => { return(TypeCache.GetTypesDerivedFrom(desiredType) .Where(t => !t.IsGenericType) // Remove UIBuilder types from the list .Where(t => t.Assembly != GetType().Assembly) .Select(GetTypeInfo)); }; completer.getTextFromDataCallback += info => info.value; completer.makeItem = () => s_TypeNameItemPool.Get(); completer.destroyItem = e => { if (e is BuilderAttributeTypeName typeItem) { s_TypeNameItemPool.Release(typeItem); } }; completer.bindItem = (v, i) => { if (v is BuilderAttributeTypeName l) { l.SetType(completer.results[i].type, completer.textField.text); } }; uiField.RegisterValueChangedCallback(e => OnValidatedTypeAttributeChange(e, desiredType)); fieldElement = uiField; uiField.RegisterCallback <DetachFromPanelEvent, FieldSearchCompleter <TypeInfo> >((evt, c) => { c.popup.RemoveFromHierarchy(); }, completer); uiField.userData = completer; } else if (attributeType.IsGenericType && attributeType.GetGenericArguments()[0].IsEnum) { var propInfo = attributeType.GetProperty("defaultValue"); var defaultEnumValue = propInfo.GetValue(attribute, null) as Enum; if (defaultEnumValue.GetType().GetCustomAttribute <FlagsAttribute>() == null) { // Create and initialize the EnumField. var uiField = new EnumField(fieldLabel); uiField.Init(defaultEnumValue); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else { // Create and initialize the EnumField. var uiField = new EnumFlagsField(fieldLabel); uiField.Init(defaultEnumValue); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } } else { var uiField = new TextField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } // Create row. var styleRow = new BuilderStyleRow(); styleRow.Add(fieldElement); // Link the field. fieldElement.SetProperty(BuilderConstants.InspectorLinkedStyleRowVEPropertyName, styleRow); fieldElement.SetProperty(BuilderConstants.InspectorLinkedAttributeDescriptionVEPropertyName, attribute); // Set initial value. RefreshAttributeField(fieldElement); // Setup field binding path. fieldElement.bindingPath = attribute.name; fieldElement.tooltip = attribute.name; // Context menu. fieldElement.AddManipulator(new ContextualMenuManipulator(BuildAttributeFieldContextualMenu)); return(styleRow); }
public BuilderInspectorLocalStyles(BuilderInspector inspector, BuilderInspectorStyleFields styleFields) { m_Inspector = inspector; m_StyleFields = styleFields; m_StyleFields.updateFlexColumnGlobalState = UpdateFlexColumnGlobalState; m_StyleFields.updateStyleCategoryFoldoutOverrides = UpdateStyleCategoryFoldoutOverrides; m_LocalStylesSection = m_Inspector.Q <PersistedFoldout>("inspector-local-styles-foldout"); // We need to hide new Text Asset style property fields in any Unity version older than 2021.1. #if !PACKAGE_TEXT_CORE || UNITY_2019_4 || UNITY_2020_1 || UNITY_2020_2 || UNITY_2020_3 m_LocalStylesSection.Query(className: "unity-builder-font-asset-property-container").ForEach(e => e.style.display = DisplayStyle.None); #else m_LocalStylesSection.Query(className: "unity-builder-no-font-asset-property-container").ForEach(e => e.style.display = DisplayStyle.None); #endif var styleCategories = m_LocalStylesSection.Query <PersistedFoldout>( className: "unity-builder-inspector__style-category-foldout").ToList(); foreach (var styleCategory in styleCategories) { styleCategory.Q <VisualElement>(null, PersistedFoldout.headerUssClassName) .AddManipulator(new ContextualMenuManipulator(StyleCategoryContextualMenu)); var categoryStyleFields = new List <VisualElement>(); var styleRows = styleCategory.Query <BuilderStyleRow>().ToList(); foreach (var styleRow in styleRows) { var bindingPath = styleRow.bindingPath; var currentStyleFields = styleRow.Query <BindableElement>().ToList(); if (styleRow.ClassListContains("unity-builder-double-field-row")) { m_StyleFields.BindDoubleFieldRow(styleRow); } foreach (var styleField in currentStyleFields) { // Avoid fields within fields. if (styleField.parent != styleRow) { continue; } if (styleField is FoldoutNumberField) { m_StyleFields.BindStyleField(styleRow, styleField as FoldoutNumberField); } else if (styleField is FoldoutColorField) { m_StyleFields.BindStyleField(styleRow, styleField as FoldoutColorField); } else if (!string.IsNullOrEmpty(styleField.bindingPath)) { m_StyleFields.BindStyleField(styleRow, styleField.bindingPath, styleField); } else { BuilderStyleRow.ReAssignTooltipToChild(styleField); m_StyleFields.BindStyleField(styleRow, bindingPath, styleField); } categoryStyleFields.Add(styleField); } } m_StyleCategories.Add(styleCategory, categoryStyleFields); } }
BuilderStyleRow CreateAttributeRow(UxmlAttributeDescription attribute) { var attributeType = attribute.GetType(); // Generate field label. var fieldLabel = BuilderNameUtilities.ConvertDashToHuman(attribute.name); BindableElement fieldElement; if (attribute is UxmlStringAttributeDescription) { var uiField = new TextField(fieldLabel); if (attribute.name.Equals("name") || attribute.name.Equals("view-data-key")) { uiField.RegisterValueChangedCallback(e => { OnValidatedAttributeValueChange(e, BuilderNameUtilities.AttributeRegex, BuilderConstants.AttributeValidationSpacialCharacters); }); } else if (attribute.name.Equals("binding-path")) { uiField.RegisterValueChangedCallback(e => { OnValidatedAttributeValueChange(e, BuilderNameUtilities.BindingPathAttributeRegex, BuilderConstants.BindingPathAttributeValidationSpacialCharacters); }); } else { uiField.RegisterValueChangedCallback(OnAttributeValueChange); } if (attribute.name.Equals("text")) { uiField.multiline = true; uiField.AddToClassList(BuilderConstants.InspectorMultiLineTextFieldClassName); } fieldElement = uiField; } else if (attribute is UxmlFloatAttributeDescription) { var uiField = new FloatField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlDoubleAttributeDescription) { var uiField = new DoubleField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlIntAttributeDescription) { var uiField = new IntegerField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlLongAttributeDescription) { var uiField = new LongField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlBoolAttributeDescription) { var uiField = new Toggle(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlColorAttributeDescription) { var uiField = new ColorField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attributeType.IsGenericType && !attributeType.GetGenericArguments()[0].IsEnum && attributeType.GetGenericArguments()[0] is Type) { var uiField = new TextField(fieldLabel); uiField.isDelayed = true; uiField.RegisterValueChangedCallback(e => { OnValidatedTypeAttributeChange(e, attributeType.GetGenericArguments()[0]); }); fieldElement = uiField; } else if (attributeType.IsGenericType && attributeType.GetGenericArguments()[0].IsEnum) { var propInfo = attributeType.GetProperty("defaultValue"); var enumValue = propInfo.GetValue(attribute, null) as Enum; // Create and initialize the EnumField. var uiField = new EnumField(fieldLabel); uiField.Init(enumValue); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else { var uiField = new TextField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } // Create row. var styleRow = new BuilderStyleRow(); styleRow.Add(fieldElement); // Link the field. fieldElement.SetProperty(BuilderConstants.InspectorLinkedStyleRowVEPropertyName, styleRow); fieldElement.SetProperty(BuilderConstants.InspectorLinkedAttributeDescriptionVEPropertyName, attribute); // Set initial value. RefreshAttributeField(fieldElement); // Setup field binding path. fieldElement.bindingPath = attribute.name; // Tooltip. var label = fieldElement.Q <Label>(); if (label != null) { label.tooltip = attribute.name; } else { fieldElement.tooltip = attribute.name; } // Context menu. fieldElement.AddManipulator(new ContextualMenuManipulator(BuildAttributeFieldContextualMenu)); return(styleRow); }
public BuilderInspectorLocalStyles(BuilderInspector inspector, BuilderInspectorStyleFields styleFields) { m_Inspector = inspector; m_StyleFields = styleFields; m_StyleFields.updateFlexColumnGlobalState = UpdateFlexColumnGlobalState; m_StyleFields.updateStyleCategoryFoldoutOverrides = UpdateStyleCategoryFoldoutOverrides; m_LocalStylesSection = m_Inspector.Q <PersistedFoldout>("inspector-local-styles-foldout"); var styleCategories = m_LocalStylesSection.Query <PersistedFoldout>( className: "unity-builder-inspector__style-category-foldout").ToList(); foreach (var styleCategory in styleCategories) { styleCategory.Q <VisualElement>(null, PersistedFoldout.headerUssClassName) .AddManipulator(new ContextualMenuManipulator(StyleCategoryContextualMenu)); var categoryStyleFields = new List <BindableElement>(); var styleRows = styleCategory.Query <BuilderStyleRow>().ToList(); foreach (var styleRow in styleRows) { var bindingPath = styleRow.bindingPath; var currentStyleFields = styleRow.Query <BindableElement>().ToList(); #if UNITY_2019_2 if (styleRow.ClassListContains(BuilderConstants.Version_2019_3_OrNewer)) { styleRow.AddToClassList(BuilderConstants.HiddenStyleClassName); continue; } #else if (styleRow.ClassListContains(BuilderConstants.Version_2019_2)) { styleRow.AddToClassList(BuilderConstants.HiddenStyleClassName); continue; } #endif if (styleRow.ClassListContains("unity-builder-double-field-row")) { m_StyleFields.BindDoubleFieldRow(styleRow); } foreach (var styleField in currentStyleFields) { // Avoid fields within fields. if (styleField.parent != styleRow) { continue; } if (styleField is FoldoutNumberField) { m_StyleFields.BindStyleField(styleRow, styleField as FoldoutNumberField); } else if (styleField is FoldoutColorField) { m_StyleFields.BindStyleField(styleRow, styleField as FoldoutColorField); } else if (!string.IsNullOrEmpty(styleField.bindingPath)) { m_StyleFields.BindStyleField(styleRow, styleField.bindingPath, styleField); } else { BuilderStyleRow.ReAssignTooltipToChild(styleField); m_StyleFields.BindStyleField(styleRow, bindingPath, styleField); } categoryStyleFields.Add(styleField); } } m_StyleCategories.Add(styleCategory, categoryStyleFields); } }
public void BindStyleField(BuilderStyleRow styleRow, string styleName, VisualElement fieldElement) { // Link the row. fieldElement.SetProperty(BuilderConstants.InspectorLinkedStyleRowVEPropertyName, styleRow); var field = FindStylePropertyInfo(styleName); if (field == null) { return; } // We don't care which element we get the value for here as we're only interested // in the type of Enum it might be (and for validation), but not it's actual value. var val = field.GetValue(fieldElement.computedStyle, null); var valType = val.GetType(); if (val is StyleFloat && fieldElement is FloatField) { var uiField = fieldElement as FloatField; uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); } else if (val is StyleFloat && fieldElement is IntegerField) { var uiField = fieldElement as IntegerField; #if UNITY_2019_3_OR_NEWER if (BuilderConstants.SpecialSnowflakeLengthSytles.Contains(styleName)) { uiField.RegisterValueChangedCallback(e => OnFieldDimensionChange(e, styleName)); } else #endif uiField.RegisterValueChangedCallback(e => OnFieldValueChangeIntToFloat(e, styleName)); } else if (val is StyleFloat && fieldElement is PercentSlider) { var uiField = fieldElement as PercentSlider; uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); } else if (val is StyleInt && fieldElement is IntegerField) { var uiField = fieldElement as IntegerField; uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); } else if (val is StyleLength && fieldElement is IntegerField) { var uiField = fieldElement as IntegerField; #if UNITY_2019_3_OR_NEWER uiField.RegisterValueChangedCallback(e => OnFieldDimensionChange(e, styleName)); #else uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); #endif } else if (val is StyleColor && fieldElement is ColorField) { var uiField = fieldElement as ColorField; uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); } else if (val is StyleFont && fieldElement is ObjectField) { var uiField = fieldElement as ObjectField; uiField.objectType = typeof(Font); uiField.RegisterValueChangedCallback(e => OnFieldValueChangeFont(e, styleName)); } else if (val is StyleBackground && fieldElement is ObjectField) { var uiField = fieldElement as ObjectField; uiField.objectType = typeof(Texture2D); uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); } else if (val is StyleCursor && fieldElement is ObjectField) { var uiField = fieldElement as ObjectField; uiField.objectType = typeof(Texture2D); uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); } else if (valType.IsGenericType && valType.GetGenericArguments()[0].IsEnum) { var propInfo = valType.GetProperty("value"); var enumValue = propInfo.GetValue(val, null) as Enum; if (fieldElement is EnumField) { var uiField = fieldElement as EnumField; uiField.Init(enumValue); uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); } else if (fieldElement is IToggleButtonStrip) { var uiField = fieldElement as IToggleButtonStrip; var choices = new List <string>(); var labels = new List <string>(); var enumType = enumValue.GetType(); foreach (Enum item in Enum.GetValues(enumType)) { var typeName = item.ToString(); var label = string.Empty; if (typeName == "Auto") { label = "AUTO"; } var choice = BuilderNameUtilities.ConvertCamelToDash(typeName); choices.Add(choice); labels.Add(label); } uiField.enumType = enumType; uiField.choices = choices; uiField.labels = labels; uiField.RegisterValueChangedCallback(e => OnFieldValueChange(e, styleName)); } else { // Unsupported style value type. return; } } else { // Unsupported style value type. return; } fieldElement.SetProperty(BuilderConstants.InspectorStylePropertyNameVEPropertyName, styleName); fieldElement.SetProperty(BuilderConstants.InspectorComputedStylePropertyInfoVEPropertyName, field); fieldElement.AddManipulator(new ContextualMenuManipulator(BuildStyleFieldContextualMenu)); // Add to styleName to field map. if (!m_StyleFields.ContainsKey(styleName)) { var newList = new List <VisualElement>(); newList.Add(fieldElement); m_StyleFields.Add(styleName, newList); } else { m_StyleFields[styleName].Add(fieldElement); } }
BuilderStyleRow CreateAttributeRow(UxmlAttributeDescription attribute) { var attributeType = attribute.GetType(); var vea = currentVisualElement.GetVisualElementAsset(); // Generate field label. var fieldLabel = BuilderNameUtilities.ConvertDashToHuman(attribute.name); BindableElement fieldElement = null; if (attribute is UxmlStringAttributeDescription) { var uiField = new TextField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlFloatAttributeDescription) { var uiField = new FloatField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlDoubleAttributeDescription) { var uiField = new DoubleField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlIntAttributeDescription) { var uiField = new IntegerField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlLongAttributeDescription) { var uiField = new LongField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlBoolAttributeDescription) { var uiField = new Toggle(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attribute is UxmlColorAttributeDescription) { var uiField = new ColorField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else if (attributeType.IsGenericType && attributeType.GetGenericArguments()[0].IsEnum) { var propInfo = attributeType.GetProperty("defaultValue"); var enumValue = propInfo.GetValue(attribute, null) as Enum; // Create and initialize the EnumField. var uiField = new EnumField(fieldLabel); uiField.Init(enumValue); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } else { var uiField = new TextField(fieldLabel); uiField.RegisterValueChangedCallback(OnAttributeValueChange); fieldElement = uiField; } // Create row. var styleRow = new BuilderStyleRow(); styleRow.Add(fieldElement); // Link the field. fieldElement.SetProperty(BuilderConstants.InspectorLinkedStyleRowVEPropertyName, styleRow); fieldElement.SetProperty(BuilderConstants.InspectorLinkedAttributeDescriptionVEPropertyName, attribute); // Set initial value. RefreshAttributeField(fieldElement); // Setup field binding path. fieldElement.bindingPath = attribute.name; // Tooltip. var label = fieldElement.Q <Label>(); if (label != null) { label.tooltip = attribute.name; } else { fieldElement.tooltip = attribute.name; } // Context menu. fieldElement.AddManipulator(new ContextualMenuManipulator(BuildAttributeFieldContextualMenu)); return(styleRow); }