예제 #1
0
        public PrintNode() : base(NodeType.Function)
        {
            this.Name = "Print";

            Text = new CodeGenInputViewModel <ITypedExpression <string> >(PortType.String)
            {
                Name = "Text"
            };
            this.Inputs.Add(Text);

            Flow = new CodeGenOutputViewModel <IStatement>(PortType.Execution)
            {
                Name  = "",
                Value = this.Text.ValueChanged.Select(stringExpr => new FunctionCall
                {
                    FunctionName = "print",
                    Parameters   =
                    {
                        stringExpr ?? new StringLiteral {
                            Value = ""
                        }
                    }
                })
            };
            this.Outputs.Add(Flow);
        }
예제 #2
0
        public ForLoopNode() : base(NodeType.FlowControl)
        {
            this.Name = "For Loop";

            LoopBodyFlow = new CodeGenListInputViewModel <IStatement>(PortType.Execution)
            {
                Name = "Loop Body"
            };
            this.Inputs.Add(LoopBodyFlow);

            LoopEndFlow = new CodeGenListInputViewModel <IStatement>(PortType.Execution)
            {
                Name = "Loop End"
            };
            this.Inputs.Add(LoopEndFlow);

            FirstIndex = new CodeGenInputViewModel <ITypedExpression <int> >(PortType.Integer)
            {
                Name = "First Index"
            };
            this.Inputs.Add(FirstIndex);

            LastIndex = new CodeGenInputViewModel <ITypedExpression <int> >(PortType.Integer)
            {
                Name = "Last Index"
            };
            this.Inputs.Add(LastIndex);

            CurrentIndex = new CodeGenOutputViewModel <VariableReference <int> >(PortType.Integer)
            {
                Name = "Current Index"
            };
            this.Outputs.Add(CurrentIndex);

            var loopBodyChanged = LoopBodyFlow.Values.Changed.Select(_ => Unit.Default).StartWith(Unit.Default);
            var loopEndChanged  = LoopEndFlow.Values.Changed.Select(_ => Unit.Default).StartWith(Unit.Default);

            FlowIn = new CodeGenOutputViewModel <IStatement>(PortType.Execution)
            {
                Name  = "",
                Value = Observable.CombineLatest(loopBodyChanged, loopEndChanged, FirstIndex.ValueChanged, LastIndex.ValueChanged,
                                                 (bodyChange, endChange, firstI, lastI) => (BodyChange: bodyChange, EndChange: endChange, FirstI: firstI, LastI: lastI))
                        .Select(v => new ForLoop
                {
                    LoopBody   = new StatementSequence(LoopBodyFlow.Values),
                    LoopEnd    = new StatementSequence(LoopEndFlow.Values),
                    LowerBound = v.FirstI ?? new IntLiteral {
                        Value = 0
                    },
                    UpperBound = v.LastI ?? new IntLiteral {
                        Value = 1
                    }
                })
            };
            this.Outputs.Add(FlowIn);
        }
    }
예제 #3
0
        public QuestNode() : base(NodeType.Literal)
        {
            this.Name = NPCChooseEditor.NpcValue.Name;

            // HeaderIconButton action
            this.HeaderIconButton = ReactiveCommand.Create(() =>
            {
                // Call models function
                NPCChooseEditor.NpcSelectNew();
            });

            // Watch models selected value for change. Once changed, update the nodes icon
            this.WhenAnyValue(x => x.NPCChooseEditor.NpcValue).Subscribe(name => { SelectNPC(); });

            OutputB = new CodeGenOutputViewModel <ITypedExpression <bool> >(PortType.Boolean)
            {
                Name   = "Add / Remove (w/ Ctrl) Output",
                Editor = BoolEditor,
                Value  = BoolEditor.ValueChanged.Select(v => new BoolLiteral {
                    Value = v
                }),
            };
            this.Outputs.Add(OutputB);
            this.WhenAnyValue(x => x.BoolEditor.Value).Subscribe(x => ManageOutputs(x)); // Subcribe to every change of the state of the button


            Text = new CodeGenInputViewModel <ITypedExpression <string> >(PortType.String)
            {
                Editor = EditableLabelEditor
            };
            this.Inputs.Add(Text);


            Output = new CodeGenOutputViewModel <ITypedExpression <string> >(PortType.String)
            {
                Name   = "Value1",
                Editor = ValueEditor,
                Value  = ValueEditor.ValueChanged.Select(v => new StringLiteral {
                    Value = v
                })
            };
            this.Outputs.Add(Output);


            Output = new CodeGenOutputViewModel <ITypedExpression <string> >(PortType.String)
            {
                Name   = "Value2",
                Editor = ValueEditor1,
                Value  = ValueEditor.ValueChanged.Select(v => new StringLiteral {
                    Value = v
                })
            };
            this.Outputs.Add(Output);
        }
예제 #4
0
        public ForLoopNode() : base(NodeType.FlowControl)
        {
            var boundsGroup = new EndpointGroup("Bounds");

            var controlFlowGroup = new EndpointGroup("Control Flow");

            var controlFlowInputsGroup = new EndpointGroup(controlFlowGroup);

            this.Name = "For Loop";

            LoopBodyFlow = new CodeGenListInputViewModel <IStatement>(PortType.Execution)
            {
                Name  = "Loop Body",
                Group = controlFlowInputsGroup
            };
            this.Inputs.Add(LoopBodyFlow);

            LoopEndFlow = new CodeGenListInputViewModel <IStatement>(PortType.Execution)
            {
                Name  = "Loop End",
                Group = controlFlowInputsGroup
            };
            this.Inputs.Add(LoopEndFlow);


            FirstIndex = new CodeGenInputViewModel <ITypedExpression <int> >(PortType.Integer)
            {
                Name  = "First Index",
                Group = boundsGroup
            };
            this.Inputs.Add(FirstIndex);

            LastIndex = new CodeGenInputViewModel <ITypedExpression <int> >(PortType.Integer)
            {
                Name  = "Last Index",
                Group = boundsGroup
            };
            this.Inputs.Add(LastIndex);

            ForLoop value = new ForLoop();

            var loopBodyChanged = LoopBodyFlow.Values.Connect().Select(_ => Unit.Default).StartWith(Unit.Default);
            var loopEndChanged  = LoopEndFlow.Values.Connect().Select(_ => Unit.Default).StartWith(Unit.Default);

            FlowIn = new CodeGenOutputViewModel <IStatement>(PortType.Execution)
            {
                Name  = "",
                Value = Observable.CombineLatest(loopBodyChanged, loopEndChanged, FirstIndex.ValueChanged, LastIndex.ValueChanged,
                                                 (bodyChange, endChange, firstI, lastI) => (BodyChange: bodyChange, EndChange: endChange, FirstI: firstI, LastI: lastI))
                        .Select(v => {
                    value.LoopBody   = new StatementSequence(LoopBodyFlow.Values.Items);
                    value.LoopEnd    = new StatementSequence(LoopEndFlow.Values.Items);
                    value.LowerBound = v.FirstI ?? new IntLiteral {
                        Value = 0
                    };
                    value.UpperBound = v.LastI ?? new IntLiteral {
                        Value = 1
                    };
                    return(value);
                }),
                Group = controlFlowGroup
            };
            this.Outputs.Add(FlowIn);

            CurrentIndex = new CodeGenOutputViewModel <ITypedExpression <int> >(PortType.Integer)
            {
                Name  = "Current Index",
                Value = Observable.Return(new VariableReference <int> {
                    LocalVariable = value.CurrentIndex
                })
            };
            this.Outputs.Add(CurrentIndex);
        }
    }