/// <summary> /// Displays the <see cref="IInteractive"/> in the system <see cref="Console"/>. /// </summary> /// <param name="widget">The widget to be displayed.</param> private void DrawInteractiveWidget(IInteractive widget) { widget.Workflow.Start(); var actions = widget.InputActions().ToArray(); int ix = 0; do { switch (widget.Workflow.NextState()) { case FlowStates.Input: CaptureStep(actions[ix]); break; case FlowStates.Error: ErrorStep(actions[ix]); break; case FlowStates.Control: if (ix < actions.Length - 1) { ix++; widget.Workflow.Action = FlowActions.Continue; } else { widget.Workflow.Action = FlowActions.Ok; } break; } } while (widget.Workflow.State != FlowStates.End); // Displays Input on capture messages. void CaptureStep(InputAction action) { int startRow = InputEngine.Instance.Cursor.Y; this.DrawBasicWidget(widget as ITWidget); int size = InputEngine.Instance.Cursor.Y - startRow; // Set cursor position InputEngine.Instance.Cursor = new ConsoleCursor( widget.CursorPosition.X, startRow + widget.CursorPosition.Y ); // Perform capture InputEngine.Instance.Capture(action.Id, action.Method); // Restore drawing position InputEngine.Instance.Cursor = new ConsoleCursor( 0, startRow + size ); } // Displays Input Errors void ErrorStep(InputAction action) { if (action.Action != ErrorAction.Ignore) { var g = GetNewGraphics(); widget.DrawError(g, _errorMessages); this.Display(g); } if (action.Action == ErrorAction.Repeat) { widget.Workflow.Action = FlowActions.Ok; } else { widget.Workflow.Action = FlowActions.Continue; } } }