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); }
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); } }
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); }
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); } }