static VisualElement BuildVectorEditor <T>(this IConstantEditorBuilder builder, IEditableVectorType <T> v)
        {
            var root = new VisualElement();

            root.styleSheets.Add(AssetDatabase.LoadAssetAtPath <StyleSheet>(UICreationHelper.TemplatePath + "ConstantEditors.uss"));
            root.AddToClassList(v.UssClassName);
            if (v.Object != null)
            {
                var serializedObject = new SerializedObject(v.Object);
                foreach (var propertyName in v.PropertyNames)
                {
                    SerializedProperty p = serializedObject.FindProperty(propertyName);
                    var propertyField    = new PropertyField(p);
                    propertyField.RegisterCallback <ChangeEvent <T> >(new EventCallback <IChangeEvent>(builder.OnValueChanged));
                    root.Add(propertyField);
                }
            }
            else
            {
                foreach (var propertyLabel in v.PropertyLabels)
                {
                    root.Add(v.MakePreviewField(propertyLabel));
                }
            }
            return(root);
        }
        static void CreateField <T>(string label, IConstantEditorBuilder builder, VisualElement container, T oldValue, float fieldValue, Func <ChangeEvent <float>, T> generateValue)
        {
            var field = new FloatField(label);

            field.value = fieldValue;
            container.Add(field);
            field.RegisterValueChangedCallback(evt => Dispatch(builder, oldValue, generateValue(evt)));
        }
示例#3
0
        public static InlineFloatEditor MakeFloatVectorEditor <T>(this IConstantEditorBuilder builder, ConstantNodeModel <T> model, IEnumerable <string> fieldNames, Func <T, int, float> getField, VectorType <T, float> .SetFieldDelegate setField)
        {
            var vectorType = new VectorType <T, float>(model.value, fieldNames, getField, setField);

            return(builder.MakeVectorEditor(vectorType, (label, fieldValue) => new FloatField(label)
            {
                value = fieldValue
            }));
        }
示例#4
0
        static VisualElement BuildSingleFieldEditor <T>(this IConstantEditorBuilder builder, T oldValue, BaseField <T> field)
        {
            var root = new VisualElement();

            //Mimic UIElement property fields style
            root.AddToClassList("unity-property-field");
            root.styleSheets.Add(AssetDatabase.LoadAssetAtPath <StyleSheet>(UICreationHelper.templatePath + "ConstantEditors.uss"));
            field.value = oldValue;
            root.Add(field);
            field.RegisterValueChangedCallback(evt => builder.OnValueChanged(evt));
            return(root);
        }
        public static VisualElement BuildFloat2Editor(this IConstantEditorBuilder builder, ConstantNodeModel <float2> f)
        {
            var root = new VisualElement();

            root.styleSheets.Add(AssetDatabase.LoadAssetAtPath <StyleSheet>(UICreationHelper.TemplatePath + "ConstantEditors.uss"));
            root.AddToClassList("vs-inline-float-editor");
            CreateField("x", builder, root, f.value, f.value.x, ChangeX);
            CreateField("y", builder, root, f.value, f.value.y, ChangeY);

            return(root);

            float2 ChangeX(ChangeEvent <float> evt) => new float2(evt.newValue, f.value.y);
            float2 ChangeY(ChangeEvent <float> evt) => new float2(f.value.x, evt.newValue);
        }
        public static VisualElement BuildEnumEditor(this IConstantEditorBuilder builder, EnumConstantNodeModel enumConstant)
        {
            var enumEditor = new Button {
                text = enumConstant.EnumValue.ToString()
            };                                                                        // TODO use a bindable element

            enumEditor.clickable.clickedWithEventInfo += e =>
            {
                SearcherService.ShowEnumValues("Pick a value", enumConstant.EnumType.Resolve(enumConstant.GraphModel.Stencil), e.originalMousePosition, (v, i) =>
                {
                    enumConstant.value.Value = Convert.ToInt32(v);
                    enumEditor.text          = v.ToString();
                    builder.OnValueChanged?.Invoke(null);
                });
            };
            enumEditor.SetEnabled(!enumConstant.IsLocked);
            return(enumEditor);
        }
        public static VisualElement BuildVector3Editor(this IConstantEditorBuilder builder, ConstantNodeModel <Vector3> v)
        {
            var root = new VisualElement();

            root.styleSheets.Add(AssetDatabase.LoadAssetAtPath <StyleSheet>(UICreationHelper.TemplatePath + "ConstantEditors.uss"));
            root.AddToClassList("vs-inline-float-editor");

            CreateField("x", builder, root, v.value, v.value.x, ChangeX);
            CreateField("y", builder, root, v.value, v.value.y, ChangeY);
            CreateField("z", builder, root, v.value, v.value.z, ChangeZ);

            return(root);

            //Local Functions
            Vector3 ChangeX(ChangeEvent <float> evt) => new Vector3(evt.newValue, v.value.y, v.value.z);
            Vector3 ChangeY(ChangeEvent <float> evt) => new Vector3(v.value.x, evt.newValue, v.value.z);
            Vector3 ChangeZ(ChangeEvent <float> evt) => new Vector3(v.value.x, v.value.y, evt.newValue);
        }
        public static VisualElement BuildStringWrapperEditor(this IConstantEditorBuilder builder, IStringWrapperConstantModel icm)
        {
            var enumEditor = new Button {
                text = icm.ObjectValue.ToString()
            };                                                                 // TODO use a bindable element

            enumEditor.clickable.clickedWithEventInfo += e =>
            {
                List <string> allInputNames = icm.GetAllInputNames();
                SearcherService.ShowValues("Pick a value", allInputNames, e.originalMousePosition, (v, pickedIndex) =>
                {
                    icm.SetValueFromString(v);
                    enumEditor.text = v;
                    builder.OnValueChanged?.Invoke(null);
                });
            };
            enumEditor.SetEnabled(!icm.IsLocked);
            return(enumEditor);
        }
示例#9
0
        public static VisualElement BuildEnumEditor(this IConstantEditorBuilder builder, EnumConstantNodeModel enumConstant)
        {
            void TriggerOnValueChange(Enum newEnumValue)
            {
                var oldValue = enumConstant.value;
                var newValue = enumConstant.value;

                newValue.Value = Convert.ToInt32(newEnumValue);
                builder.TriggerOnValueChanged(oldValue, newValue);
            }

            Type          enumType = enumConstant.EnumType.Resolve(enumConstant.GraphModel.Stencil);
            VisualElement editor   = enumType == typeof(KeyCode)
                ? BuildSearcherEnumEditor(enumConstant.EnumValue, enumType, TriggerOnValueChange)
                : BuildFieldEnumEditor(enumConstant, TriggerOnValueChange);

            editor.SetEnabled(!enumConstant.IsLocked);
            return(editor);
        }
        static VisualElement BuildEnumEditor(IConstantEditorBuilder builder, EnumValueReference enumConstant)
        {
            void TriggerOnValueChange(Enum newEnumValue)
            {
                var oldValue = enumConstant;
                var newValue = new EnumValueReference(newEnumValue);

                using (var evt = ChangeEvent <EnumValueReference> .GetPooled(oldValue, newValue))
                    builder.OnValueChanged(evt);
            }

            Type          enumType = enumConstant.EnumType.Resolve();
            VisualElement editor   = enumType == typeof(KeyCode)
                ? BuildSearcherEnumEditor(enumConstant, enumType, TriggerOnValueChange)
                : BuildEnumFieldEditor(enumConstant, TriggerOnValueChange);

            editor?.SetEnabled(!builder.ConstantIsLocked);
            return(editor);
        }
        public static VisualElement BuildQuaternionEditor(this IConstantEditorBuilder builder, ConstantNodeModel <Quaternion> q)
        {
            var root = new VisualElement();

            root.styleSheets.Add(AssetDatabase.LoadAssetAtPath <StyleSheet>(UICreationHelper.TemplatePath + "ConstantEditors.uss"));
            root.AddToClassList("vs-inline-float-editor");

            CreateField("x", builder, root, q.value, q.value.x, ChangeX);
            CreateField("y", builder, root, q.value, q.value.y, ChangeY);
            CreateField("z", builder, root, q.value, q.value.z, ChangeZ);
            CreateField("w", builder, root, q.value, q.value.w, ChangeW);

            return(root);

            //Local Functions
            Quaternion ChangeX(ChangeEvent <float> evt) => new Quaternion(evt.newValue, q.value.y, q.value.z, q.value.w);
            Quaternion ChangeY(ChangeEvent <float> evt) => new Quaternion(q.value.x, evt.newValue, q.value.z, q.value.w);
            Quaternion ChangeZ(ChangeEvent <float> evt) => new Quaternion(q.value.x, q.value.y, evt.newValue, q.value.w);
            Quaternion ChangeW(ChangeEvent <float> evt) => new Quaternion(q.value.x, q.value.y, q.value.z, evt.newValue);
        }
示例#12
0
        static InlineFloatEditor MakeVectorEditor <T, V, F>(this IConstantEditorBuilder builder, IVectorType <T, V> vectorType, Func <string, V, F> makeField) where F : BaseField <V>
        {
            var editor = new InlineFloatEditor();

            for (int i = 0; i < vectorType.FieldNames.Count; i++)
            {
                var field = makeField(vectorType.FieldNames[i], vectorType.GetField(i));
                editor.Add(field);
                var fieldIndex = i; // apparently safer...
                field.RegisterValueChangedCallback(evt =>
                {
                    var oldValue = vectorType.Value;
                    vectorType.SetField(fieldIndex, evt.newValue);
                    using (ChangeEvent <T> other = ChangeEvent <T> .GetPooled(oldValue, vectorType.Value))
                        builder.OnValueChanged(other);
                });
            }

            return(editor);
        }
示例#13
0
 public static VisualElement BuildDoubleEditor(this IConstantEditorBuilder builder, ConstantNodeModel <double> d)
 {
     return(builder.BuildSingleFieldEditor(d.value, new DoubleField()));
 }
 public static VisualElement BuildQuaternionEditor(this IConstantEditorBuilder builder, ConstantNodeModel <Quaternion> q)
 {
     return(builder.MakeFloatVectorEditor(q, 4,
                                          (vec, i) => vec[i], (ref Quaternion data, int i, float value) => data[i] = value));
 }
 public static VisualElement BuildFloat4Editor(this IConstantEditorBuilder builder, ConstantNodeModel <Vector4, float4> v)
 {
     return(builder.BuildVectorEditor(new EditableFloatVectorType(v, "m_NodeModel.value", new [] { "x", "y", "z", "w" })));
 }
示例#16
0
 public static VisualElement BuildQuaternionEditor(this IConstantEditorBuilder builder, ConstantNodeModel <Quaternion> q)
 {
     return(null);
 }
示例#17
0
 public static VisualElement BuildVector3Editor(this IConstantEditorBuilder builder, ConstantNodeModel <Vector3> v)
 {
     return(builder.MakeFloatVectorEditor(v, 3,
                                          (vec, i) => vec[i], (ref Vector3 data, int i, float value) => data[i] = value));
 }
示例#18
0
        public static InlineFloatEditor MakeFloatVectorEditor <T>(this IConstantEditorBuilder builder, ConstantNodeModel <T> model, int vectorSize, Func <T, int, float> getField, VectorType <T, float> .SetFieldDelegate setField)
        {
            var fieldNames = s_VectorParamNames.Take(vectorSize).Select(c => c.ToString());

            return(builder.MakeFloatVectorEditor(model, fieldNames, getField, setField));
        }
示例#19
0
 public static VisualElement BuildStringEditor(this IConstantEditorBuilder builder, ConstantNodeModel <string> s)
 {
     return(builder.BuildSingleFieldEditor(s.value, new TextField()));
 }
示例#20
0
 public static VisualElement BuildColorEditor(this IConstantEditorBuilder builder, ConstantNodeModel <Color> c)
 {
     return(builder.BuildSingleFieldEditor(c.value, new ColorField()));
 }
示例#21
0
 public static VisualElement BuildBoolEditor(this IConstantEditorBuilder builder, ConstantNodeModel <bool> b)
 {
     return(builder.BuildSingleFieldEditor(b.value, new Toggle()));
 }
示例#22
0
 public static VisualElement BuildIntEditor(this IConstantEditorBuilder builder, ConstantNodeModel <int> i)
 {
     return(builder.BuildSingleFieldEditor(i.value, new IntegerField()));
 }
 static void Dispatch <T>(IConstantEditorBuilder builder, T oldValue, T newValue)
 {
     using (ChangeEvent <T> other = ChangeEvent <T> .GetPooled(oldValue, newValue))
         builder.OnValueChanged(other);
 }
        public static VisualElement BuildDefaultConstantEditor(this IConstantEditorBuilder builder, IConstant constant)
        {
            if (constant.Type == typeof(float))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new FloatField(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(double))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new DoubleField(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(int))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new IntegerField(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(long))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new LongField(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(bool))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new Toggle(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(string))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new TextField(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(Color))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new ColorField(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(Vector2))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new Vector2Field(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(Vector3))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new Vector3Field(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(Vector4))
            {
                return(BuildInlineValueEditor(constant.ObjectValue, new Vector4Field(), builder.OnValueChanged));
            }

            if (constant.Type == typeof(GameObject))
            {
                return(BuildInlineValueEditor(constant.ObjectValue,
                                              new ObjectField {
                    allowSceneObjects = true, objectType = constant.Type
                },
                                              builder.OnValueChanged));
            }

            if (typeof(Object).IsAssignableFrom(constant.Type))
            {
                return(BuildInlineValueEditor(constant.ObjectValue,
                                              new ObjectField {
                    allowSceneObjects = false, objectType = constant.Type
                },
                                              builder.OnValueChanged));
            }

            if (constant.Type == typeof(EnumValueReference))
            {
                return(BuildEnumEditor(builder, (EnumValueReference)constant.ObjectValue));
            }

            return(null);
        }
示例#25
0
 public static VisualElement BuildFloatEditor(this IConstantEditorBuilder builder, ConstantNodeModel <float> f)
 {
     return(builder.BuildSingleFieldEditor(f.value, new FloatField()));
 }
示例#26
0
 public static VisualElement BuildFloat4Editor(this IConstantEditorBuilder builder, ConstantNodeModel <float4> f)
 {
     return(builder.MakeFloatVectorEditor(f, 4,
                                          (vec, i) => vec[i], (ref float4 data, int i, float value) => data[i] = value));
 }
示例#27
0
 public static void TriggerOnValueChanged <T>(this IConstantEditorBuilder builder, T oldValue, T newValue)
 {
     using (ChangeEvent <T> other = ChangeEvent <T> .GetPooled(oldValue, newValue))
         builder.OnValueChanged(other);
 }