Files
yellowberry_WACCALauncher/MenuManager.cs
T
Zsolt Zitting dd7c2f2abe Add new IO4 code via LilyConsole, add game kill bind, QOL changes, etc.
Added ability to add panel color and console patterns to profiles.
Cleaned up a lot of code. Still lots to do before 1.0
2026-09-19 05:24:16 -07:00

124 lines
3.3 KiB
C#

using System;
using System.Collections.Generic;
namespace WACCALauncher
{
internal class MenuManager
{
private Menu _currentMenu;
private Stack<Tuple<Menu, int>> _menuLevels = new Stack<Tuple<Menu, int>>();
private WaccaList _list;
private MainForm _form;
internal IControlledMenuItem _controlledItem;
public MenuManager(Menu root, WaccaList list, MainForm form)
{
_currentMenu = root;
_list = list;
_list.AssignMenuManager(this);
_form = form;
UpdateList();
}
public void CursorUp()
{
// scroll options
if (_controlledItem != null)
{
_controlledItem.Back();
RefreshList();
return;
}
// move cursor up
var idx = (_list.SelectedIndex - 1 + _list.Items.Count) % _list.Items.Count;
_list.SelectedIndex = idx;
if (_list.Items[idx] is MenuSeparator) CursorUp();
}
public void CursorDown()
{
// scroll options
if (_controlledItem != null)
{
_controlledItem.Forward();
RefreshList();
return;
}
// move cursor down
var idx = (_list.SelectedIndex + 1) % _list.Items.Count;
_list.SelectedIndex = idx;
if (_list.Items[idx] is MenuSeparator) CursorDown();
}
public void MenuBack()
{
// back from current menu item
if (_menuLevels.Count < 1)
{
_form.State = LauncherState.Launching;
_form.MenuHide();
if (MainForm.DefaultProfile == null) _form.SetDefaultProfile();
}
else NavigateBack();
}
public void MenuSelect()
{
// select menu item
(_list.SelectedItem as IMenuItem)?.Select(_form);
}
public Menu GetCurrentMenu()
{
return _currentMenu;
}
public void NavigateToSubmenu(Menu menu)
{
_menuLevels.Push(new Tuple<Menu, int>(_currentMenu, _list.SelectedIndex));
_currentMenu = menu;
if (menu is ProfileMenu profileMenu) profileMenu.FillList();
UpdateList();
}
public void NavigateBack()
{
var back = _menuLevels.Pop();
_currentMenu = back.Item1;
UpdateList(back.Item2);
}
public void ReturnToRoot()
{
while(_menuLevels.Count > 0) NavigateBack();
}
private void UpdateList(int idx = 0)
{
_list.DataSource = _currentMenu.GetItems();
_form.MenuUpdateLabel(_currentMenu.Heading);
if (_list.Items.Count > 0) _list.SelectedIndex = idx;
}
internal void RefreshList()
{
_list.Invalidate();
}
internal void TakeControl(IControlledMenuItem item)
{
_controlledItem = item;
RefreshList();
}
internal void ReturnControl()
{
_controlledItem = null;
RefreshList();
}
}
}