using ConsoleApp.Menu; using Model; using DataPersistence; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ConsoleApp.Menu.Core; using Model.Managers; namespace ConsoleApp { /// /// Manage the menus of the console application. /// internal class MenuManager { #region Attributes & Properties /// /// The manager that contains usefull data taken from the model. /// public MasterManager MasterMgr { get; private set; } /// /// Each menu called are push in this stack. Then, to return back, we pop this stack to retrive the previous menu. /// public Stack MenuCallStack { get; set; } #endregion #region Constructors /// /// Constructor of the MenuManager class. This constructor allows you to give the first menu of the call stack, wich is usefull for testing. /// /// The data manager needed by the menus inside. /// The starting menu, the first that will be push on the call stack. public MenuManager(MasterManager masterManager, IMenu firstMenu) { MasterMgr = masterManager; MenuCallStack = new Stack(); MenuCallStack.Push(firstMenu); } /// /// Constructor of the MenuManager class. /// /// The data manager needed by the menus inside. public MenuManager(MasterManager masterManager) : this(masterManager, new MainMenu(masterManager)) { } #endregion #region Methods /// /// Main loop. Loop while the menu call stack is not empty. /// public void Loop() { ConsoleKeyInfo cki; IMenu menuOnHead; do { menuOnHead = MenuCallStack.Peek(); menuOnHead.Update(); menuOnHead.Display(); cki = Console.ReadKey(true); switch (cki.Key) { case ConsoleKey.DownArrow: menuOnHead.SelectNext(); break; case ConsoleKey.UpArrow: menuOnHead.SelectPrevious(); break; case ConsoleKey.Enter: IMenu? retMenu = menuOnHead.Return(); if (retMenu is null) MenuCallStack.Pop(); else MenuCallStack.Push(retMenu); break; case ConsoleKey.LeftArrow: MenuCallStack.Pop(); break; default: menuOnHead.WriteMenuMode(cki); break; } } while (MenuCallStack.Count > 0); } #endregion } }