Доброго времени суток!
Столкнулся с проблемой, нужно сделать пользовательский интерфейс с помощью класса меню, вида: работа с проектами->[список уже созданных проектов; создать новый проект], при выборе проекта из списка [список его задач; создать задачу для проекта], при выборе задачи из списка [список подзадач задачи; добавить подзадачу]. Проект, задач, подзадача - мои классы, проекты, задачи, подзадачи хранятся в листе.
Код самого класса с меню:
public class Menu
{
public List<MenuItem> MenuItems { get; }
public int Index { get; private set; }
public Menu(MenuItem[] menuItems)
{
MenuItems = new List<MenuItem>();
MenuItems.AddRange(menuItems);
MenuItems.Add(new MenuItem("Back", null));
Index = 0;
menuItems[Index].IsCurrent = true;
}
public void AddItem(MenuItem menuItem)
{
MenuItems.Add(new MenuItem("Back", null));
for (int i = MenuItems.Count - 1; i > 0; i--)
{
MenuItems[i] = MenuItems[i - 1];
}
MenuItems[0] = menuItem;
MenuItems[Index + 1].IsCurrent = false;
MenuItems[0].IsCurrent = true;
Index = 0;
}
private void Draw()
{
Console.Clear();
foreach (var menuItem in MenuItems)
{
menuItem.Print();
}
}
private void SelectNext()
{
if (Index == MenuItems.Count - 1)
{
return;
}
MenuItems[Index].IsCurrent = false;
MenuItems[++Index].IsCurrent = true;
}
private void SelectPrevious()
{
if (Index == 0)
{
return;
}
MenuItems[Index].IsCurrent = false;
MenuItems[--Index].IsCurrent = true;
}
private void RunSelected() => MenuItems[Index].Run();
public void Create()
{
while (true)
{
Draw();
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.UpArrow:
SelectPrevious();
break;
case ConsoleKey.DownArrow:
SelectNext();
break;
case ConsoleKey.Enter:
if (Index == MenuItems.Count - 1)
{
MenuItems[Index].IsCurrent = false;
MenuItems[0].IsCurrent = true;
Index = 0;
return;
}
try
{
RunSelected();
}
catch (Exception)
{
MenuItems[Index].IsCurrent = false;
MenuItems[0].IsCurrent = true;
Index = 0;
return;
}
break;
default: break;
}
}
}
}
public class MenuItem
{
public static void PrintInColor(string toPrint, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.WriteLine(toPrint);
Console.ForegroundColor = ConsoleColor.White;
}
private readonly string text;
private readonly Action methodToCall;
public bool IsCurrent { get; set; }
public MenuItem(string text, Action methodToCall)
{
this.text = text;
this.methodToCall = methodToCall;
IsCurrent = false;
}
internal void Print()
{
if (IsCurrent)
{
PrintInColor($"> {text}", ConsoleColor.Cyan);
}
else
{
PrintInColor($" {text}", ConsoleColor.Yellow);
}
}
internal void Run() => methodToCall?.Invoke();
}