using System.Data; 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 List> _selectList = new List>(); public string Title { get; private set; } public StringBuilder InputStr { get; set; } private int _currentLine; public int CurrentLine { get => _currentLine; private set { _currentLine = value; if (_currentLine <= 0) _currentLine = 0; else if (_currentLine >= _selectList.Count) _currentLine = _selectList.Count-1; } } public T? CurrentSelected { get; protected set; } public bool WriteMode { get; set; } protected Menu(string title) { Title = title; CurrentLine = 0; WriteMode = false; _screenDisplay = new StringBuilder(); InputStr = new StringBuilder(); } protected Menu(string title, params Selector[] selections ) : this(title) { if (selections == null || selections.Length == 0) { Console.WriteLine("Empty menu..."); return; } _selectList = selections.ToList(); CurrentSelected = _selectList[0].Item; } public abstract void Update(); public abstract void Return(); public virtual void Display() { _screenDisplay.Clear(); Console.Clear(); _screenDisplay.AppendLine($"[ {Title} ]"); _screenDisplay.AppendLine("-------------------------------------------"); if (WriteMode) { _screenDisplay.Append("Search: "); _screenDisplay.AppendLine(InputStr.ToString()); } for (int i = 0; i < _selectList.Count; i++) { if (CurrentLine == i) _screenDisplay.Append($"> "); else _screenDisplay.Append($" "); _screenDisplay.AppendLine($"{_selectList[i].Line}"); } if (_selectList == null || _selectList.Count == 0) _screenDisplay.AppendLine("Empty..."); Console.WriteLine(_screenDisplay); } 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 void ToggleWriteMode() { if (WriteMode) DisableWriteMode(); else EnableWriteMode(); } } }