using Model; using System; using System.Collections.Generic; using System.ComponentModel.Design; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp.Menu { internal abstract class Menu : IMenu where T : notnull { protected StringBuilder _screenDisplay; protected readonly List>? _selectList; public string Title { get; private set; } public StringBuilder InputStr { get; set; } public int CurrentLine { get; private set; } public T? CurrentSelected { get; private set; } public bool WriteMode { get; set; } private Menu(string title) { Title = title; CurrentLine = 0; WriteMode = false; _screenDisplay = new StringBuilder(); InputStr = new StringBuilder(); } public Menu(string title, params Selector[] selections ) : this(title) { if (selections == null || selections.Length == 0) throw new ArgumentException("Error: a menu must contain at least 1 selection"); _selectList = selections.ToList(); CurrentSelected = _selectList[0].Item; } public virtual void Display() { Console.WriteLine(_screenDisplay); } public virtual void Update() { _screenDisplay.AppendLine($"[ {Title} ]"); _screenDisplay.AppendLine("-------------------------------------------\n"); foreach (Selector selector in _selectList) { if (selector.Equals(CurrentSelected)) _screenDisplay.Append($"> "); else _screenDisplay.Append($" "); _screenDisplay.AppendLine($"{selector.Line}"); } } public void SelectNext() { CurrentSelected = _selectList[++CurrentLine].Item; } public void SelectPrevious() { CurrentSelected = _selectList[--CurrentLine].Item; } public void EnableWriteMode() { WriteMode = true; } public void DisableWriteMode() { WriteMode = false; } public abstract void Return(); } }