mirror of
https://gitea.tendokyu.moe/yellowberry/WACCALauncher.git
synced 2026-09-22 22:58:00 +03:00
Added ability to add panel color and console patterns to profiles. Cleaned up a lot of code. Still lots to do before 1.0
124 lines
3.3 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|