Пример #1
0
        async System.Threading.Tasks.Task RemoveInParam(MethodInvokeParameterControl paramNode)
        {
            // 删除子图中的连线
            await RemoveGraphInParam(paramNode);

            RemoveChildNode(paramNode);
        }
Пример #2
0
        public async System.Threading.Tasks.Task RemoveGraphInParam(MethodInvokeParameterControl ctrl)
        {
            if (mLinkedNodesContainer == null)
            {
                await InitializeLinkedNodesContainer();
            }

            var param = CSParam as MethodInvoke_DelegateControlConstructionParams;

            for (int i = param.InParamIndexes.Count - 1; i >= 0; i--)
            {
                if (param.InParamIndexes[i] == ctrl.Id)
                {
                    var paramIdx = i + param.CustomParamStartIndexInDelegateMethodInfo;
                    var func     = param.DelegateMethodInfo.InParams[paramIdx];
                    param.DelegateMethodInfo.InParams.RemoveAt(paramIdx);

                    //for (int nodeIdx = 0; nodeIdx < mLinkedNodesContainer.CtrlNodeList.Count; nodeIdx++)
                    //{
                    //    var node = mLinkedNodesContainer.CtrlNodeList[nodeIdx] as MethodCustom;
                    //    if (node == null)
                    //        continue;

                    //    await node.OnRemovedInParam(paramIdx, func);
                    //}
                    param.InParamIndexes.RemoveAt(i);
                    param.DelegateMethodInfo._OnRemovedInParam(paramIdx, func);
                }
            }
        }
Пример #3
0
        private void Button_AddPin_Click(object sender, RoutedEventArgs e)
        {
            var param = CSParam as MethodInvoke_DelegateControlConstructionParams;

            if (param.DelegateMethodInfo == null)
            {
                InitDelegateMethodInfo();
            }

            var paramInfo = new MethodParamInfoAssist();

            paramInfo.FieldDirection = System.CodeDom.FieldDirection.In;
            paramInfo.IsParamsArray  = false;
            paramInfo.ParameterType  = typeof(object);
            paramInfo.ParamName      = "";
            param.InputParmas.Add(paramInfo);

            var inputParam = new MethodInvokeParameterControl.MethodInvokeParameterConstructionParams()
            {
                CSType             = param.CSType,
                HostNodesContainer = param.HostNodesContainer,
                ConstructParam     = "",
                ConstructType      = MethodInvokeNode.enParamConstructType.Delegate,
                ParamInfo          = paramInfo,
            };
            var child = new MethodInvokeParameterControl(inputParam);

            child.RemoveButton.Click += (object removeBtnSender, RoutedEventArgs removeBtnE) =>
            {
                var noUse = RemoveInParam(child);
            };
            AddChildNode(child, StackPanel_InputPins);
        }
Пример #4
0
        protected void SetParameters(List <MethodParamInfoAssist> paramInfos)
        {
            if (paramInfos == null)
            {
                return;
            }

            mParamsPanel?.Children.Clear();
            foreach (var paramInfo in paramInfos)
            {
                CodeGenerateSystem.Base.BaseNodeControl pc = null;
                if (paramInfo.ParameterType.IsSubclassOf(typeof(System.Delegate)))
                {
                    var csParam = new MethodInvoke_DelegateControl.MethodInvoke_DelegateControlConstructionParams()
                    {
                        CSType             = mCSParam.CSType,
                        HostNodesContainer = mCSParam.HostNodesContainer,
                        ConstructParam     = this.NodeName,
                        ConstructType      = MethodInvokeNode.enParamConstructType.MethodOverride,
                        ParamInfo          = paramInfo,
                    };
                    pc = new MethodInvoke_DelegateControl(csParam);
                }
                else
                {
                    if (paramInfo.IsParamsArray)
                    {
                        var csParam = new ParamParameterControl.ParamParameterConstructionParams()
                        {
                            CSType             = mCSParam.CSType,
                            HostNodesContainer = mCSParam.HostNodesContainer,
                            ConstructParam     = "",
                            ConstructType      = MethodInvokeNode.enParamConstructType.MethodOverride,
                            ParamInfo          = paramInfo,
                        };
                        pc = new ParamParameterControl(csParam);
                    }
                    else
                    {
                        var csParam = new MethodInvokeParameterControl.MethodInvokeParameterConstructionParams()
                        {
                            CSType             = mCSParam.CSType,
                            HostNodesContainer = mCSParam.HostNodesContainer,
                            ConstructParam     = "",
                            ConstructType      = MethodInvokeNode.enParamConstructType.MethodOverride,
                            ParamInfo          = paramInfo,
                        };
                        pc = new MethodInvokeParameterControl(csParam);
                    }
                }

                //pc.SetToolTip(EngineNS.Rtti.AttributeHelper.GetCustomAttributePropertyValue(paramInfo, typeof(DescriptionAttribute).FullName, "Description", false));
                AddChildNode(pc, mParamsPanel);
            }
        }
Пример #5
0
        protected void SetParameters(string[] paramInfos, EngineNS.ECSType csType)
        {
            foreach (var info in paramInfos)
            {
                var tempSplits = info.Split(':');
                if (tempSplits.Length > 2)
                {
                    switch (tempSplits[2])
                    {
                    case "Ref":
                    case "Out":
                        tempSplits[1] += "&";
                        break;
                    }
                }
                CodeGenerateSystem.Base.BaseNodeControl pc = null;
                var type = EngineNS.Rtti.RttiHelper.GetTypeFromSaveString(tempSplits[1]);
                if (type != null && type.IsSubclassOf(typeof(System.Delegate)))
                {
                    var csParam = new MethodInvoke_DelegateControl.MethodInvoke_DelegateControlConstructionParams()
                    {
                        CSType             = csType,
                        HostNodesContainer = this.HostNodesContainer,
                        ConstructParam     = info + ":" + this.NodeName,
                        ConstructType      = MethodInvokeNode.enParamConstructType.MethodOverride,
                    };
                    pc = new MethodInvoke_DelegateControl(csParam);
                }
                else
                {
                    var csParam = new MethodInvokeParameterControl.MethodInvokeParameterConstructionParams()
                    {
                        CSType             = csType,
                        HostNodesContainer = this.HostNodesContainer,
                        ConstructParam     = info,
                        ConstructType      = MethodInvokeNode.enParamConstructType.MethodOverride,
                    };
                    pc = new MethodInvokeParameterControl(csParam);
                }

                AddChildNode(pc, mParamsPanel);
            }
        }
Пример #6
0
        void OnUpdateChildParamType(MethodInvokeParameterControl ctrl, CodeDomNode.VariableType newType)
        {
            // 类型改变,重新创建TemplateClass;
            var param = CSParam as ReturnCustomConstructParam;

            if (param.ShowPropertyType == ReturnCustomConstructParam.enShowPropertyType.ReturnValue)
            {
                var cpInfos = new List <CodeGenerateSystem.Base.CustomPropertyInfo>(param.MethodInfo.OutParams.Count);
                foreach (var methodParam in param.MethodInfo.OutParams)
                {
                    var paramType = methodParam.ParamType.GetActualType();
                    if (Program.IsTypeValidInPropertyGridShow(paramType))
                    {
                        var infoAssist = new MethodParamInfoAssist()
                        {
                            FieldDirection = System.CodeDom.FieldDirection.Out,
                            IsParamsArray  = false,
                            ParameterType  = paramType,
                            ParamName      = methodParam.ParamName,
                        };
                        var cpInfo = Program.GetFromParamInfo(infoAssist);
                        cpInfos.Add(cpInfo);
                    }
                }
                var tempClass = mTemplateClassInstance;
                if (tempClass != null)
                {
                    var oldTempClassType = tempClass.GetType();
                    CreateTemplateClass(cpInfos);
                    foreach (var pro in mTemplateClassInstance.GetType().GetProperties())
                    {
                        var oldPro = oldTempClassType.GetProperty(pro.Name);
                        if (oldPro == null || oldPro.PropertyType != pro.PropertyType)
                        {
                            continue;
                        }

                        pro.SetValue(mTemplateClassInstance, oldPro.GetValue(tempClass));
                    }
                }
            }
        }
Пример #7
0
        //void ReturnCustom_AddParam(CustomMethodInfo.FunctionParam funcParam)
        public async Task OnAddedOutParam(CodeDomNode.CustomMethodInfo.FunctionParam funcParam)
        {
            await EngineNS.Thread.AsyncDummyClass.DummyFunc();

            var csParam = CSParam as ReturnCustomConstructParam;
            MethodParamInfoAssist retValue;

            if (funcParam.ParamType.Type.IsByRef)
            {
                var typefullname = funcParam.ParamType.Type.FullName.Substring(0, funcParam.ParamType.Type.FullName.Length - 1);
                var type         = funcParam.ParamType.Type.Assembly.GetType(typefullname);
                //funcParam.ParamType = new VariableType(type, funcParam.ParamType.CSType);
                retValue = new MethodParamInfoAssist();
                retValue.FieldDirection = System.CodeDom.FieldDirection.Out;
                retValue.IsParamsArray  = false;
                retValue.ParameterType  = type;
                retValue.ParamName      = funcParam.ParamName;
                BindingOperations.SetBinding(this, CodeDomNode.CustomMethodInfo.FunctionParam.ParamNameProperty, new Binding("ParamName")
                {
                    Source = retValue, Mode = BindingMode.TwoWay
                });
            }
            else
            {
                retValue = funcParam.CreateParamInfoAssist(System.CodeDom.FieldDirection.Out);
            }

            var pm = new MethodInvokeParameterControl.MethodInvokeParameterConstructionParams()
            {
                CSType             = CSParam.CSType,
                HostNodesContainer = CSParam.HostNodesContainer,
                ConstructParam     = "",
                ConstructType      = MethodInvokeNode.enParamConstructType.ReturnCustom,
                ParamInfo          = retValue,
            };
            var pc = new MethodInvokeParameterControl(pm);

            funcParam.OnParamTypeChanged -= pc.UpdateParamType;
            funcParam.OnParamTypeChanged += pc.UpdateParamType;
            pc.OnUpdateParamTypeAction    = OnUpdateChildParamType;
            AddChildNode(pc, mParamsPanel);
        }
Пример #8
0
        public async Task OnInsertOutParam(int index, CodeDomNode.CustomMethodInfo.FunctionParam funcParam)
        {
            await EngineNS.Thread.AsyncDummyClass.DummyFunc();

            var csParam = CSParam as ReturnCustomConstructParam;
            var pm      = new MethodInvokeParameterControl.MethodInvokeParameterConstructionParams()
            {
                CSType             = CSParam.CSType,
                HostNodesContainer = CSParam.HostNodesContainer,
                ConstructParam     = "",
                ConstructType      = MethodInvokeNode.enParamConstructType.ReturnCustom,
                ParamInfo          = funcParam.CreateParamInfoAssist(System.CodeDom.FieldDirection.Out),
            };
            var pc = new MethodInvokeParameterControl(pm);

            funcParam.OnParamTypeChanged -= pc.UpdateParamType;
            funcParam.OnParamTypeChanged += pc.UpdateParamType;
            pc.OnUpdateParamTypeAction    = OnUpdateChildParamType;
            InsertChildNode(index, pc, mParamsPanel);
        }
Пример #9
0
        public async System.Threading.Tasks.Task AddGraphInParam(MethodInvokeParameterControl ctrl, CodeGenerateSystem.Base.LinkInfo info)
        {
            if (HostNodesContainer.IsLoading)
            {
                return;
            }
            if (mLinkedNodesContainer == null)
            {
                await InitializeLinkedNodesContainer();
            }

            var param = CSParam as MethodInvoke_DelegateControlConstructionParams;
            var func  = new CustomMethodInfo.FunctionParam();

            func.HostMethodInfo = param.DelegateMethodInfo;
            func.ParamName      = info.m_linkFromObjectInfo.HostNodeControl.GCode_GetValueName(info.m_linkFromObjectInfo, null);
            func.ParamType      = new VariableType(info.m_linkFromObjectInfo.HostNodeControl.GCode_GetType(info.m_linkFromObjectInfo, null), param.CSType);

            int insertIndex = -1;

            for (int i = 0; i < mChildNodes.Count; i++)
            {
                if (mChildNodes[i] == ctrl)
                {
                    insertIndex++;
                    if (insertIndex >= param.InParamIndexes.Count)
                    {
                        insertIndex = -1;

                        param.DelegateMethodInfo.InParams.Add(func);
                        param.InParamIndexes.Add(ctrl.Id);
                        param.DelegateMethodInfo._OnAddedInParam(func);
                    }
                    else
                    {
                        param.DelegateMethodInfo.InParams.Insert(insertIndex, func);
                        param.InParamIndexes.Insert(insertIndex, ctrl.Id);
                        param.DelegateMethodInfo._OnInsertInParam(insertIndex, func);
                    }
                    break;
                }
                else
                {
                    insertIndex = param.InParamIndexes.IndexOf(mChildNodes[i].Id);
                }
            }

            //for(int i=0; i< mLinkedNodesContainer.CtrlNodeList.Count; i++)
            //{
            //    var node = mLinkedNodesContainer.CtrlNodeList[i];
            //    if(node is MethodCustom)
            //    {
            //        var methodNode = node as MethodCustom;
            //        if(insertIndex < 0)
            //            await methodNode.OnAddedInParam(func);
            //        else
            //        {
            //            await methodNode.OnInsertInParam(insertIndex, func);
            //        }
            //        continue;
            //    }
            //    //else if(node is ReturnCustom)
            //    //{
            //    //    var retNode = node as ReturnCustom;
            //    //    retNode.ResetMethodInfo(param.DelegateMethodInfo);
            //    //}
            //}
        }
Пример #10
0
        public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(System.CodeDom.CodeTypeDeclaration codeClass, System.CodeDom.CodeStatementCollection codeStatementCollection, CodeGenerateSystem.Base.LinkPinControl element, CodeGenerateSystem.Base.GenerateCodeContext_Method context)
        {
            MethodInvokeParameterControl retCtrl = null;
            Dictionary <CodeGenerateSystem.Base.BaseNodeControl, System.CodeDom.CodeExpression> paramCodeExps = new Dictionary <CodeGenerateSystem.Base.BaseNodeControl, System.CodeDom.CodeExpression>();
            var rcParam = CSParam as ReturnCustomConstructParam;

            if (rcParam.MethodInfo.IsAsync)
            {
                // 异步不能有out,只能有一个返回值
                if (mChildNodes.Count == 1)
                {
                    retCtrl = mChildNodes[0] as MethodInvokeParameterControl;
                }
            }
            else
            {
                foreach (var paramNode in mChildNodes)
                {
                    if (paramNode is MethodInvokeParameterControl)
                    {
                        var pm    = paramNode as MethodInvokeParameterControl;
                        var param = pm.CSParam as MethodInvokeParameterControl.MethodInvokeParameterConstructionParams;
                        if (param.ParamInfo.ParamName == "Return")
                        {
                            retCtrl = pm;
                            continue;
                        }
                        if (pm.HasLink())
                        {
                            await pm.GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, pm.ParamPin, context);

                            var exp = new CodeGenerateSystem.CodeDom.CodeCastExpression(param.ParamInfo.ParameterType, pm.GCode_CodeDom_GetValue(pm.ParamPin, context));
                            paramCodeExps[paramNode] = exp;
                            codeStatementCollection.Add(new System.CodeDom.CodeAssignStatement(
                                                            new System.CodeDom.CodeVariableReferenceExpression(param.ParamInfo.ParamName),
                                                            exp));
                        }
                        else if (mTemplateClassInstance != null)
                        {
                            var    proInfo = mTemplateClassInstance.GetType().GetProperty(param.ParamInfo.ParamName);
                            object proValue;
                            if (proInfo == null)
                            {
                                proValue = CodeGenerateSystem.Program.GetDefaultValueFromType(param.ParamInfo.ParameterType);
                            }
                            else
                            {
                                proValue = proInfo.GetValue(mTemplateClassInstance);
                            }
                            var valueExp = Program.GetValueCode(codeStatementCollection, param.ParamInfo.ParameterType, proValue);
                            paramCodeExps[paramNode] = valueExp;
                            codeStatementCollection.Add(new System.CodeDom.CodeAssignStatement(new System.CodeDom.CodeVariableReferenceExpression(param.ParamInfo.ParamName), valueExp));
                        }
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
            }

            if (retCtrl != null)
            {
                if (retCtrl.HasLink())
                {
                    await retCtrl.GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, retCtrl.ParamPin, context);
                }

                System.CodeDom.CodeExpression retExp = null;
                if (retCtrl.HasLink())
                {
                    var retStatement = new System.CodeDom.CodeMethodReturnStatement();
                    retExp = retCtrl.GCode_CodeDom_GetValue(retCtrl.ParamPin, context);
                    paramCodeExps[retCtrl] = retExp;
                }
                else if (mTemplateClassInstance != null)
                {
                    var    param   = retCtrl.CSParam as MethodInvokeParameterControl.MethodInvokeParameterConstructionParams;
                    var    proInfo = mTemplateClassInstance.GetType().GetProperty(param.ParamInfo.ParamName);
                    object proValue;
                    if (proInfo == null)
                    {
                        proValue = CodeGenerateSystem.Program.GetDefaultValueFromType(param.ParamInfo.ParameterType);
                    }
                    else
                    {
                        proValue = proInfo.GetValue(mTemplateClassInstance);
                    }
                    retExp = Program.GetValueCode(codeStatementCollection, param.ParamInfo.ParameterType, proValue);
                    paramCodeExps[retCtrl] = retExp;
                }

                #region Debug
                var debugCodes = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection);
                foreach (var paramNode in mChildNodes)
                {
                    if (paramNode is MethodInvokeParameterControl)
                    {
                        var pm = paramNode as MethodInvokeParameterControl;
                        System.CodeDom.CodeExpression exp;
                        if (paramCodeExps.TryGetValue(paramNode, out exp))
                        {
                            CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodes, pm.ParamPin.GetLinkPinKeyName(), exp, pm.GCode_GetTypeString(pm.ParamPin, context), context);
                        }
                    }
                    else
                    {
                        throw new InvalidOperationException("未实现");
                    }
                }
                var breakCondStatement = CodeDomNode.BreakPoint.BreakCodeStatement(codeClass, debugCodes, HostNodesContainer.GUID, Id);
                CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodes);
                #endregion

                codeStatementCollection.Add(new System.CodeDom.CodeMethodReturnStatement(retExp));
            }
            else
            {
                #region Debug
                var debugCodes         = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection);
                var breakCondStatement = CodeDomNode.BreakPoint.BreakCodeStatement(codeClass, debugCodes, HostNodesContainer.GUID, Id);
                CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodes);
                #endregion
                codeStatementCollection.Add(new System.CodeDom.CodeMethodReturnStatement());
            }
        }
Пример #11
0
        // 这里不做参数在PropertyGrid中的显示设置,防止类似Ref参数被无意设置
        protected void SetParameters(MethodInfoAssist methodInfo)
        {
            var cpInfos = new List <CustomPropertyInfo>();

            mParamsPanel?.Children.Clear();
            var param = CSParam as ReturnConstructParam;

            // return
            if ((param.MethodInfo.ReturnType != typeof(void)) && (param.MethodInfo.ReturnType != typeof(System.Threading.Tasks.Task)))
            {
                var csParam = new MethodInvokeParameterControl.MethodInvokeParameterConstructionParams()
                {
                    CSType             = CSParam.CSType,
                    HostNodesContainer = CSParam.HostNodesContainer,
                    ConstructParam     = "",
                    ConstructType      = MethodInvokeNode.enParamConstructType.Return,
                    ParamInfo          = new MethodParamInfoAssist()
                    {
                        FieldDirection = System.CodeDom.FieldDirection.Out,
                        IsParamsArray  = false,
                        ParameterType  = param.MethodInfo.ReturnType,
                        ParamName      = "Return",
                    },
                };
                var ctrl = new MethodInvokeParameterControl(csParam);
                AddChildNode(ctrl, mParamsPanel);

                if (Program.IsTypeValidInPropertyGridShow(param.MethodInfo.ReturnType))
                {
                    var cpInfo = Program.GetFromParamInfo(csParam.ParamInfo);
                    cpInfos.Add(cpInfo);
                }
            }

            foreach (var methodParam in methodInfo.Params)
            {
                if (methodParam.FieldDirection != System.CodeDom.FieldDirection.Out)
                {
                    continue;
                }

                CodeGenerateSystem.Base.BaseNodeControl pc = null;
                if (methodParam.ParameterType.IsSubclassOf(typeof(System.Delegate)))
                {
                    var csParam = new MethodInvoke_DelegateControl.MethodInvoke_DelegateControlConstructionParams()
                    {
                        CSType             = CSParam.CSType,
                        HostNodesContainer = CSParam.HostNodesContainer,
                        ConstructParam     = this.NodeName,
                        ConstructType      = MethodInvokeNode.enParamConstructType.Return,
                        ParamInfo          = methodParam,
                    };
                    pc = new MethodInvoke_DelegateControl(csParam);
                }
                else
                {
                    if (methodParam.IsParamsArray)
                    {
                        var csParam = new ParamParameterControl.ParamParameterConstructionParams()
                        {
                            CSType             = CSParam.CSType,
                            HostNodesContainer = CSParam.HostNodesContainer,
                            ConstructParam     = "",
                            ConstructType      = MethodInvokeNode.enParamConstructType.Return,
                            ParamInfo          = methodParam,
                        };
                        pc = new ParamParameterControl(csParam);
                    }
                    else
                    {
                        var csParam = new MethodInvokeParameterControl.MethodInvokeParameterConstructionParams()
                        {
                            CSType             = CSParam.CSType,
                            HostNodesContainer = CSParam.HostNodesContainer,
                            ConstructParam     = "",
                            ConstructType      = MethodInvokeNode.enParamConstructType.Return,
                            ParamInfo          = methodParam,
                        };
                        pc = new MethodInvokeParameterControl(csParam);

                        if (Program.IsTypeValidInPropertyGridShow(methodParam.ParameterType))
                        {
                            var cpInfo = Program.GetFromParamInfo(methodParam);
                            cpInfos.Add(cpInfo);
                        }
                    }
                }
                AddChildNode(pc, mParamsPanel);
            }

            CreateTemplateClass(cpInfos);
        }