using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ConsoleApp.Menu.Core; namespace ConsoleApp.Menu.Core { /// /// Define an Entry menu. ///
It allows you to navigate through the entries and completes them with a console input. ///
internal abstract partial class Entry : Menu { #region Attributes & Properties private List _steps; #endregion #region Constructors /// /// Constructor of the entry menu, based on the Menu constructor. /// /// The title of this menu. /// All the entries of this menu. protected Entry(string title, params EntryStep[] entrySteps) : base(title) { _steps = entrySteps.ToList(); _allSelectors = ConvertEntryStepsInSelector(); _selectList = _allSelectors; } #endregion #region Methods private List> ConvertEntryStepsInSelector() { List> newSelectors = new List>(); foreach (EntryStep step in _steps) { newSelectors.Add(new Selector(step, step.Description)); } return newSelectors; } #endregion #region IMenu implementation public override void WriteMenuMode(ConsoleKeyInfo cki) { if (!WriteMode && cki.Key == ConsoleKey.R) { EnableWriteMode(); return; } if (WriteMode) { if (cki.Key == ConsoleKey.Escape) { if (CurrentSelected is null) throw new ArgumentNullException("CurrentSelected"); CurrentSelected.Input = InputStr.ToString(); DisableWriteMode(); InputStr.Clear(); return; } if (cki.Key == ConsoleKey.Backspace && InputStr.Length > 0) { InputStr.Remove(InputStr.Length - 1, 1); return; } InputStr.Append(cki.KeyChar); } } public override void Update() { if (_selectList.Count == 0) { CurrentSelected = default; return; } CurrentSelected = _selectList[CurrentLine].Item; } public override void Display() { _screenDisplay.Clear(); Console.Clear(); _screenDisplay.AppendLine($"[ {Title} ]"); _screenDisplay.AppendLine("-------------------------------------------"); for (int i = 0; i < _selectList.Count; i++) { if (CurrentLine == i) if (WriteMode) _screenDisplay.Append($"W "); else _screenDisplay.Append($"> "); else _screenDisplay.Append($" "); _screenDisplay.Append($"{_selectList[i].Line} {_selectList[i].Item.Input}"); if (CurrentLine == i && WriteMode) _screenDisplay.Append(InputStr); _screenDisplay.AppendLine(); } if (_selectList.Count == 0) _screenDisplay.AppendLine("Empty..."); _screenDisplay.AppendLine( "\n\nHint:\n^:previous, v:next, <:ret, -enter-:return, r:write, -escape-:exit search mode"); Console.WriteLine(_screenDisplay); } #endregion } }