92 lines
2.4 KiB
Python
92 lines
2.4 KiB
Python
from archinstall.lib.menu.simple_menu import TerminalMenu
|
|
|
|
|
|
class Menu(TerminalMenu):
|
|
def __init__(self, title, options, skip=True, multi=False, default_option=None, sort=True):
|
|
"""
|
|
Creates a new menu
|
|
|
|
:param title: Text that will be displayed above the menu
|
|
:type title: str
|
|
|
|
:param options: Options to be displayed in the menu to chose from;
|
|
if dict is specified then the keys of such will be used as options
|
|
:type options: list, dict
|
|
|
|
:param skip: Indicate if the selection is not mandatory and can be skipped
|
|
:type skip: bool
|
|
|
|
:param multi: Indicate if multiple options can be selected
|
|
:type multi: bool
|
|
|
|
:param default_option: The default option to be used in case the selection processes is skipped
|
|
:type default_option: str
|
|
|
|
:param sort: Indicate if the options should be sorted alphabetically before displaying
|
|
:type sort: bool
|
|
"""
|
|
|
|
if isinstance(options, dict):
|
|
options = list(options)
|
|
|
|
if sort:
|
|
options = sorted(options)
|
|
|
|
self.menu_options = options
|
|
self.skip = skip
|
|
self.default_option = default_option
|
|
self.multi = multi
|
|
|
|
menu_title = f'\n{title}\n\n'
|
|
|
|
if skip:
|
|
menu_title += "Use ESC to skip\n\n"
|
|
|
|
if default_option:
|
|
# if a default value was specified we move that one
|
|
# to the top of the list and mark it as default as well
|
|
default = f'{default_option} (default)'
|
|
self.menu_options = [default] + [o for o in self.menu_options if default_option != o]
|
|
|
|
cursor = "> "
|
|
main_menu_cursor_style = ("fg_cyan", "bold")
|
|
main_menu_style = ("bg_blue", "fg_gray")
|
|
|
|
super().__init__(
|
|
menu_entries=self.menu_options,
|
|
title=menu_title,
|
|
menu_cursor=cursor,
|
|
menu_cursor_style=main_menu_cursor_style,
|
|
menu_highlight_style=main_menu_style,
|
|
cycle_cursor=True,
|
|
clear_screen=True,
|
|
multi_select=multi,
|
|
show_search_hint=True
|
|
)
|
|
|
|
def _show(self):
|
|
idx = self.show()
|
|
if idx is not None:
|
|
if isinstance(idx, (list, tuple)):
|
|
return [self.default_option if ' (default)' in self.menu_options[i] else self.menu_options[i] for i in idx]
|
|
else:
|
|
selected = self.menu_options[idx]
|
|
if ' (default)' in selected and self.default_option:
|
|
return self.default_option
|
|
return selected
|
|
else:
|
|
if self.default_option:
|
|
if self.multi:
|
|
return [self.default_option]
|
|
else:
|
|
return self.default_option
|
|
return None
|
|
|
|
def run(self):
|
|
ret = self._show()
|
|
|
|
if ret is None and not self.skip:
|
|
return self.run()
|
|
|
|
return ret
|