/
karachi
/
KPO_CP_CrossyRoad
Обзор
Документация
Войти
/
karachi
/
KPO_CP_CrossyRoad
Код
Запросы
5
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
base
Model/Menu/Menu.cs
100 строк
3 KB
karachi-23
base
10 янв 2025, 23:55
10 янв 2025, 23:55
f5bd4ec
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Model.Menu { /// <summary> /// Меню /// </summary> public class Menu { /// <summary> /// Необходимость перерисовки /// </summary> public event Action? NeedRedraw = null; /// <summary> /// Список элементов меню /// </summary> private readonly Dictionary<int, MenuItem> _menuItems = new(); /// <summary> /// ID пункта меню в фокусе /// </summary> public int FocusItemIndex { get; protected set; } = -1; /// <summary> /// Элементы пунта меню /// </summary> public IList<MenuItem> Items => _menuItems.Values.ToList(); /// <summary> /// Использование пунта меню с помощью ID /// </summary> /// <param name="parId">ID пунта меню</param> /// <returns></returns> public MenuItem this[int parId] { get => _menuItems[parId]; } /// <summary> /// Добавление пункта меню в список /// </summary> /// <param name="parMenuItem">Пункт меню</param> /// <returns></returns> public MenuItem AddItem(MenuItem parMenuItem) { _menuItems.Add(parMenuItem.ID, parMenuItem); return parMenuItem; } /// <summary> /// Смена фокуса на предыдущий пункт меню /// </summary> public void FocusPrevious() { int focusedPreviousItemIndex = FocusItemIndex; FocusItemIndex = FocusItemIndex > 0 ? FocusItemIndex - 1 : _menuItems.Count - 1; _menuItems[FocusItemIndex].State = MenuItem.MenuItemState.Focused; _menuItems[focusedPreviousItemIndex].State = MenuItem.MenuItemState.Normal; NeedRedraw?.Invoke(); } /// <summary> /// Смена фокуса на следующий пункт меню /// </summary> public void FocusNext() { int focusedPreviousItemIndex = FocusItemIndex; FocusItemIndex = FocusItemIndex < _menuItems.Count - 1 ? FocusItemIndex + 1 : 0; _menuItems[FocusItemIndex].State = MenuItem.MenuItemState.Focused; _menuItems[focusedPreviousItemIndex].State = MenuItem.MenuItemState.Normal; NeedRedraw?.Invoke(); } /// <summary> /// Установка пункта меню в фокус /// </summary> /// <param name="parId"></param> public void FocusById(int parId) { int saveFocusedIndex = FocusItemIndex; MenuItem item = this[parId]; FocusItemIndex = Items.IndexOf(item); if(saveFocusedIndex != -1) { _menuItems[saveFocusedIndex].State = MenuItem.MenuItemState.Normal; } _menuItems[FocusItemIndex].State = MenuItem.MenuItemState.Focused; NeedRedraw?.Invoke(); } /// <summary> /// Активация элемента, установленного в фокус /// </summary> public void SelectedFocusedElement() { _menuItems[FocusItemIndex].State = MenuItem.MenuItemState.Selected; } } }