Пример #1
0
        /// <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;
                }
            }
        }