Exemplo n.º 1
0
        public override IList <ItemSelector.CustomItem> GetItems(Node source, MemberData data, System.Type type)
        {
            var items = new List <ItemSelector.CustomItem>();

            if (type.IsPrimitive && type != typeof(bool) && type != typeof(char))
            {
                string typeName = type.PrettyName();
                items.Add(new ItemSelector.CustomItem(string.Format("Add ({0}, {0})", typeName), () => {
                    NodeEditorUtility.AddNewNode(graph.editorData, null, null, mousePositionOnCanvas, (MultiArithmeticNode n) => {
                        n.targets[0]   = data;
                        n.targets[1]   = new MemberData(ReflectionUtils.CreateInstance(type));
                        n.operatorType = ArithmeticType.Add;
                        graph.Refresh();
                    });
                }, "Operator")
                {
                    icon = uNodeEditorUtility.GetTypeIcon(type)
                });
                items.Add(new ItemSelector.CustomItem(string.Format("Subtract ({0}, {0})", typeName), () => {
                    NodeEditorUtility.AddNewNode(graph.editorData, null, null, mousePositionOnCanvas, (MultiArithmeticNode n) => {
                        n.targets[0]   = data;
                        n.targets[1]   = new MemberData(ReflectionUtils.CreateInstance(type));
                        n.operatorType = ArithmeticType.Subtract;
                        graph.Refresh();
                    });
                }, "Operator")
                {
                    icon = uNodeEditorUtility.GetTypeIcon(type)
                });
                items.Add(new ItemSelector.CustomItem(string.Format("Divide ({0}, {0})", typeName), () => {
                    NodeEditorUtility.AddNewNode(graph.editorData, null, null, mousePositionOnCanvas, (MultiArithmeticNode n) => {
                        n.targets[0]   = data;
                        n.targets[1]   = new MemberData(ReflectionUtils.CreateInstance(type));
                        n.operatorType = ArithmeticType.Divide;
                        graph.Refresh();
                    });
                }, "Operator")
                {
                    icon = uNodeEditorUtility.GetTypeIcon(type)
                });
                items.Add(new ItemSelector.CustomItem(string.Format("Multiply ({0}, {0})", typeName), () => {
                    NodeEditorUtility.AddNewNode(graph.editorData, null, null, mousePositionOnCanvas, (MultiArithmeticNode n) => {
                        n.targets[0]   = data;
                        n.targets[1]   = new MemberData(ReflectionUtils.CreateInstance(type));
                        n.operatorType = ArithmeticType.Multiply;
                        graph.Refresh();
                    });
                }, "Operator")
                {
                    icon = uNodeEditorUtility.GetTypeIcon(type)
                });
                items.Add(new ItemSelector.CustomItem(string.Format("Modulo ({0}, {0})", typeName), () => {
                    NodeEditorUtility.AddNewNode(graph.editorData, null, null, mousePositionOnCanvas, (MultiArithmeticNode n) => {
                        n.targets[0]   = data;
                        n.targets[1]   = new MemberData(ReflectionUtils.CreateInstance(type));
                        n.operatorType = ArithmeticType.Modulo;
                        graph.Refresh();
                    });
                }, "Operator")
                {
                    icon = uNodeEditorUtility.GetTypeIcon(type)
                });
            }

            var preference         = uNodePreference.GetPreference();
            var assemblies         = EditorReflectionUtility.GetAssemblies();
            var includedAssemblies = uNodePreference.GetIncludedAssemblies();
            var ns = graph.editorData.GetNamespaces();

            foreach (var assembly in assemblies)
            {
                if (!includedAssemblies.Contains(assembly.GetName().Name))
                {
                    continue;
                }
                var operators = EditorReflectionUtility.GetOperators(assembly, (op) => {
                    return(ns.Contains(op.DeclaringType.Namespace));
                });
                if (operators.Count > 0)
                {
                    foreach (var op in operators)
                    {
                        switch (op.Name)
                        {
                        case "op_Addition": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ArithmeticType.Add));
                            break;
                        }

                        case "op_Subtraction": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ArithmeticType.Subtract));
                            break;
                        }

                        case "op_Division": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ArithmeticType.Divide));
                            break;
                        }

                        case "op_Multiply": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ArithmeticType.Multiply));
                            break;
                        }

                        case "op_Modulus": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ArithmeticType.Modulo));
                            break;
                        }
                        }
                    }
                }
            }
            items.Sort((x, y) => string.Compare(x.name, y.name));
            return(items);
        }
Exemplo n.º 2
0
        public override void OnInspectorGUI()
        {
            MultiArithmeticNode node = target as MultiArithmeticNode;

            DrawDefaultInspector();
            VariableEditorUtility.DrawMembers(new GUIContent("Targets"), node.targets, node, new FilterAttribute(typeof(object)),
                                              (obj) => {
                node.targets = obj;
            },
                                              () => {
                uNodeEditorUtility.RegisterUndo(node);
                var type = node.ReturnType();
                if (type != typeof(object) && ReflectionUtils.CanCreateInstance(type))
                {
                    node.targets.Add(new MemberData(ReflectionUtils.CreateInstance(type)));
                }
                else if (node.targets.Count > 0)
                {
                    node.targets.Add(new MemberData(node.targets[node.targets.Count - 1]));
                }
                else
                {
                    node.targets.Add(new MemberData());
                }
            });
            if (GUILayout.Button(new GUIContent("Change Operator")))
            {
                var customItems = new List <ItemSelector.CustomItem>();
                {                //Primitives
                    customItems.AddRange(GetCustomItemForPrimitives(node, typeof(int)));
                    customItems.AddRange(GetCustomItemForPrimitives(node, typeof(float)));
                }
                var ns                 = NodeGraph.GetOpenedGraphUsingNamespaces();
                var preference         = uNodePreference.GetPreference();
                var assemblies         = EditorReflectionUtility.GetAssemblies();
                var includedAssemblies = uNodePreference.GetIncludedAssemblies();
                foreach (var assembly in assemblies)
                {
                    if (!includedAssemblies.Contains(assembly.GetName().Name))
                    {
                        continue;
                    }
                    var operators = EditorReflectionUtility.GetOperators(assembly, (op) => {
                        return(ns == null || ns.Contains(op.DeclaringType.Namespace));
                    });
                    if (operators.Count > 0)
                    {
                        foreach (var op in operators)
                        {
                            switch (op.Name)
                            {
                            case "op_Addition": {
                                var parameters = op.GetParameters();
                                customItems.Add(GetCustomItem(node, parameters[0].ParameterType, parameters[1].ParameterType, op.DeclaringType, op.ReturnType, ArithmeticType.Add));
                                break;
                            }

                            case "op_Subtraction": {
                                var parameters = op.GetParameters();
                                customItems.Add(GetCustomItem(node, parameters[0].ParameterType, parameters[1].ParameterType, op.DeclaringType, op.ReturnType, ArithmeticType.Subtract));
                                break;
                            }

                            case "op_Division": {
                                var parameters = op.GetParameters();
                                customItems.Add(GetCustomItem(node, parameters[0].ParameterType, parameters[1].ParameterType, op.DeclaringType, op.ReturnType, ArithmeticType.Divide));
                                break;
                            }

                            case "op_Multiply": {
                                var parameters = op.GetParameters();
                                customItems.Add(GetCustomItem(node, parameters[0].ParameterType, parameters[1].ParameterType, op.DeclaringType, op.ReturnType, ArithmeticType.Multiply));
                                break;
                            }

                            case "op_Modulus": {
                                var parameters = op.GetParameters();
                                customItems.Add(GetCustomItem(node, parameters[0].ParameterType, parameters[1].ParameterType, op.DeclaringType, op.ReturnType, ArithmeticType.Modulo));
                                break;
                            }
                            }
                        }
                    }
                }
                customItems.Sort((x, y) => {
                    if (x.category == y.category)
                    {
                        return(string.Compare(x.name, y.name));
                    }
                    return(string.Compare(x.category, y.category));
                });
                if (customItems.Count > 0)
                {
                    ItemSelector.ShowWindow(null, null, null, false, customItems).
                    ChangePosition(
                        GUIUtility.GUIToScreenRect(GUILayoutUtility.GetLastRect())
                        ).displayDefaultItem = false;
                }
            }
        }
Exemplo n.º 3
0
        public override IList <ItemSelector.CustomItem> GetItems(Node source, MemberData data, System.Type type)
        {
            var items = new List <ItemSelector.CustomItem>();

            if (type.IsPrimitive && type != typeof(bool) && type != typeof(char))             //Primitives
            {
                items.AddRange(GetCustomItemForPrimitives(type, data));
            }
            else
            {
                items.Add(GetItem(type, type, type, typeof(bool), data, ComparisonType.Equal));
                items.Add(GetItem(type, type, type, typeof(bool), data, ComparisonType.NotEqual));
            }
            var preference         = uNodePreference.GetPreference();
            var assemblies         = EditorReflectionUtility.GetAssemblies();
            var includedAssemblies = uNodePreference.GetIncludedAssemblies();
            var ns = graph.editorData.GetNamespaces();

            foreach (var assembly in assemblies)
            {
                if (!includedAssemblies.Contains(assembly.GetName().Name))
                {
                    continue;
                }
                var operators = EditorReflectionUtility.GetOperators(assembly, (op) => {
                    return(ns.Contains(op.DeclaringType.Namespace));
                });
                if (operators.Count > 0)
                {
                    foreach (var op in operators)
                    {
                        switch (op.Name)
                        {
                        //case "op_Equality": {
                        //	var parameters = op.GetParameters();
                        //	if(parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                        //		break;
                        //	items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ComparisonType.Equal));
                        //	break;
                        //}
                        //case "op_Inequality": {
                        //	var parameters = op.GetParameters();
                        //	if(parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                        //		break;
                        //	items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ComparisonType.NotEqual));
                        //	break;
                        //}
                        case "op_LessThan": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ComparisonType.LessThan));
                            break;
                        }

                        case "op_GreaterThan": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ComparisonType.GreaterThan));
                            break;
                        }

                        case "op_LessThanOrEqual": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ComparisonType.LessThanOrEqual));
                            break;
                        }

                        case "op_GreaterThanOrEqual": {
                            var parameters = op.GetParameters();
                            if (parameters[0].ParameterType != type && parameters[1].ParameterType != type)
                            {
                                break;
                            }
                            items.Add(GetItem(type, parameters[0].ParameterType, parameters[1].ParameterType, op.ReturnType, data, ComparisonType.GreaterThanOrEqual));
                            break;
                        }
                        }
                    }
                }
            }
            items.Sort((x, y) => string.Compare(x.name, y.name));
            return(items);
        }