Additions to Listmgr et alia (#1028)
* Permit multiple default actions as a list * Define headers for list at ListManager and Menu * small corrections for default values * Make subvolume info work. The real marker that signifies that a mounted subvolume exist is the bracket notation nor the at sign
This commit is contained in:
parent
f7aba1d31c
commit
a6b1cab077
|
|
@ -25,7 +25,7 @@ class BtrfsSubvolume:
|
||||||
root :bool = False
|
root :bool = False
|
||||||
|
|
||||||
def get_subvolumes_from_findmnt(struct :Dict[str, Any], index=0) -> Iterator[BtrfsSubvolume]:
|
def get_subvolumes_from_findmnt(struct :Dict[str, Any], index=0) -> Iterator[BtrfsSubvolume]:
|
||||||
if '@' in struct['source']:
|
if '[' in struct['source']:
|
||||||
subvolume = re.findall(r'\[.*?\]', struct['source'])[0][1:-1]
|
subvolume = re.findall(r'\[.*?\]', struct['source'])[0][1:-1]
|
||||||
struct['source'] = struct['source'].replace(f"[{subvolume}]", "")
|
struct['source'] = struct['source'].replace(f"[{subvolume}]", "")
|
||||||
yield BtrfsSubvolume(
|
yield BtrfsSubvolume(
|
||||||
|
|
|
||||||
|
|
@ -90,9 +90,10 @@ from .menu import Menu
|
||||||
from ..general import RequirementError
|
from ..general import RequirementError
|
||||||
from os import system
|
from os import system
|
||||||
from copy import copy
|
from copy import copy
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
class ListManager:
|
class ListManager:
|
||||||
def __init__(self,prompt :str, base_list :list ,base_actions :list = None,null_action :str = None, default_action :str = None):
|
def __init__(self,prompt :str, base_list :Union[list,dict] ,base_actions :list = None,null_action :str = None, default_action :Union[str,list] = None, header :Union[str,list] = None):
|
||||||
"""
|
"""
|
||||||
param :prompt Text which will appear at the header
|
param :prompt Text which will appear at the header
|
||||||
type param: string | DeferredTranslation
|
type param: string | DeferredTranslation
|
||||||
|
|
@ -108,7 +109,10 @@ class ListManager:
|
||||||
|
|
||||||
param: default_action action which will be presented at the bottom of the list. Shouldn't need a target. If not present, null_action is set there.
|
param: default_action action which will be presented at the bottom of the list. Shouldn't need a target. If not present, null_action is set there.
|
||||||
Both Null and Default actions can be defined outside the base_actions list, as long as they are launched in exec_action
|
Both Null and Default actions can be defined outside the base_actions list, as long as they are launched in exec_action
|
||||||
type param: string
|
type param: string or list
|
||||||
|
|
||||||
|
param: header one or more header lines for the list
|
||||||
|
type param: string or list
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not null_action and len(base_list) == 0:
|
if not null_action and len(base_list) == 0:
|
||||||
|
|
@ -117,9 +121,13 @@ class ListManager:
|
||||||
self.prompt = prompt if prompt else _('Choose an object from the list')
|
self.prompt = prompt if prompt else _('Choose an object from the list')
|
||||||
self.null_action = str(null_action)
|
self.null_action = str(null_action)
|
||||||
if not default_action:
|
if not default_action:
|
||||||
self.default_action = self.null_action
|
self.default_action = [self.null_action,]
|
||||||
|
elif isinstance(default_action,(list,tuple)):
|
||||||
|
self.default_action = default_action
|
||||||
else:
|
else:
|
||||||
self.default_action = str(default_action)
|
self.default_action = [str(default_action),]
|
||||||
|
|
||||||
|
self.header = header if header else None
|
||||||
self.cancel_action = str(_('Cancel'))
|
self.cancel_action = str(_('Cancel'))
|
||||||
self.confirm_action = str(_('Confirm and exit'))
|
self.confirm_action = str(_('Confirm and exit'))
|
||||||
self.separator = '==>'
|
self.separator = '==>'
|
||||||
|
|
@ -140,23 +148,24 @@ class ListManager:
|
||||||
self.data_formatted = self.reformat()
|
self.data_formatted = self.reformat()
|
||||||
options = self.data_formatted + [self.separator]
|
options = self.data_formatted + [self.separator]
|
||||||
if self.default_action:
|
if self.default_action:
|
||||||
options += [self.default_action]
|
options += self.default_action
|
||||||
options += self.bottom_list
|
options += self.bottom_list
|
||||||
system('clear')
|
system('clear')
|
||||||
target = Menu(self.prompt,
|
target = Menu(self.prompt,
|
||||||
options,
|
options,
|
||||||
sort=False,
|
sort=False,
|
||||||
clear_screen=False,
|
clear_screen=False,
|
||||||
clear_menu_on_exit=False).run()
|
clear_menu_on_exit=False,
|
||||||
|
header=self.header).run()
|
||||||
|
|
||||||
if not target or target in self.bottom_list:
|
if not target or target in self.bottom_list:
|
||||||
break
|
break
|
||||||
if target and target == self.separator:
|
if target and target == self.separator:
|
||||||
continue
|
continue
|
||||||
if target and target == self.default_action:
|
if target and target in self.default_action:
|
||||||
|
self.action = target
|
||||||
target = None
|
target = None
|
||||||
self.target = None
|
self.target = None
|
||||||
self.action = self.default_action
|
|
||||||
self.exec_action()
|
self.exec_action()
|
||||||
continue
|
continue
|
||||||
if isinstance(self.data,dict):
|
if isinstance(self.data,dict):
|
||||||
|
|
@ -216,7 +225,6 @@ class ListManager:
|
||||||
The basic code is useful for simple lists and dictionaries (key:value pairs, both strings)
|
The basic code is useful for simple lists and dictionaries (key:value pairs, both strings)
|
||||||
"""
|
"""
|
||||||
# TODO guarantee unicity
|
# TODO guarantee unicity
|
||||||
|
|
||||||
if isinstance(self.data,list):
|
if isinstance(self.data,list):
|
||||||
if self.action == str(_('Add')):
|
if self.action == str(_('Add')):
|
||||||
self.target = TextInput(_('Add :'),None).run()
|
self.target = TextInput(_('Add :'),None).run()
|
||||||
|
|
@ -264,6 +272,7 @@ if __name__ == "__main__":
|
||||||
# opciones = ['uno','dos','tres','cuatro']
|
# opciones = ['uno','dos','tres','cuatro']
|
||||||
# opciones = archinstall.list_mirrors()
|
# opciones = archinstall.list_mirrors()
|
||||||
opciones = {'uno':1,'dos':2,'tres':3,'cuatro':4}
|
opciones = {'uno':1,'dos':2,'tres':3,'cuatro':4}
|
||||||
# acciones = ['editar','borrar','añadir']
|
acciones = ['editar','borrar','añadir']
|
||||||
opciones = ListManager('Vamos alla',opciones,None,_('Add')).run()
|
cabecera = ["En Jaen Donde Resido","Vive don Lope de Sosa"]
|
||||||
|
opciones = ListManager('Vamos alla',opciones,None,_('Add'),default_action=acciones,header=cabecera).run()
|
||||||
print(opciones)
|
print(opciones)
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ class Menu(TerminalMenu):
|
||||||
preview_command=None,
|
preview_command=None,
|
||||||
preview_size=0.75,
|
preview_size=0.75,
|
||||||
preview_title='Info',
|
preview_title='Info',
|
||||||
|
header :Union[List[str],str] = None,
|
||||||
**kwargs
|
**kwargs
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
|
|
@ -65,6 +66,9 @@ class Menu(TerminalMenu):
|
||||||
:param preview_title: Title of the preview window
|
:param preview_title: Title of the preview window
|
||||||
:type preview_title: str
|
:type preview_title: str
|
||||||
|
|
||||||
|
param: header one or more header lines for the menu
|
||||||
|
type param: string or list
|
||||||
|
|
||||||
:param kwargs : any SimpleTerminal parameter
|
:param kwargs : any SimpleTerminal parameter
|
||||||
"""
|
"""
|
||||||
# we guarantee the inmutability of the options outside the class.
|
# we guarantee the inmutability of the options outside the class.
|
||||||
|
|
@ -104,10 +108,15 @@ class Menu(TerminalMenu):
|
||||||
self.default_option = default_option
|
self.default_option = default_option
|
||||||
self.multi = multi
|
self.multi = multi
|
||||||
menu_title = f'\n{title}\n\n'
|
menu_title = f'\n{title}\n\n'
|
||||||
|
if header:
|
||||||
if skip:
|
separator = '\n '
|
||||||
|
if not isinstance(header,(list,tuple)):
|
||||||
|
header = [header,]
|
||||||
|
if skip:
|
||||||
|
menu_title += str(_("Use ESC to skip\n"))
|
||||||
|
menu_title += separator + separator.join(header)
|
||||||
|
elif skip:
|
||||||
menu_title += str(_("Use ESC to skip\n\n"))
|
menu_title += str(_("Use ESC to skip\n\n"))
|
||||||
|
|
||||||
if default_option:
|
if default_option:
|
||||||
# if a default value was specified we move that one
|
# if a default value was specified we move that one
|
||||||
# to the top of the list and mark it as default as well
|
# to the top of the list and mark it as default as well
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue