@Alexeeys3223

Как создать правильный пользовательский интерфейс в консоли?

Доброго времени суток!
Столкнулся с проблемой, нужно сделать пользовательский интерфейс с помощью класса меню, вида: работа с проектами->[список уже созданных проектов; создать новый проект], при выборе проекта из списка [список его задач; создать задачу для проекта], при выборе задачи из списка [список подзадач задачи; добавить подзадачу]. Проект, задач, подзадача - мои классы, проекты, задачи, подзадачи хранятся в листе.
Код самого класса с меню:

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();
    }
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Alexeeys3223 Автор вопроса
Вопрос в реализации самого интерфейса. Не получается создать такую навигацию, чтобы все это работало с этим меню. Основная проблема - отслеживание в какой проект кидается задача, в какой проект и какую задачу кидается подзадача.
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Накидаю примерно за час, стало самому интересно
https://github.com/vkorotenko/ProjectExample
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы