Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Llácer <wllacer@gmail.com>2022-03-10 09:42:03 +0100
committerGitHub <noreply@github.com>2022-03-10 09:42:03 +0100
commita6b1cab0779c534543ab385649dcd5cbdd83f3bf (patch)
tree5d58c9e2d12836d8817cd988bb69d2603d10e4be
parentf7aba1d31c0556b38ee48270ba530359bc274ebf (diff)
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
-rw-r--r--archinstall/lib/disk/btrfs.py2
-rw-r--r--archinstall/lib/menu/list_manager.py31
-rw-r--r--archinstall/lib/menu/menu.py15
3 files changed, 33 insertions, 15 deletions
diff --git a/archinstall/lib/disk/btrfs.py b/archinstall/lib/disk/btrfs.py
index f2da957f..33f59721 100644
--- a/archinstall/lib/disk/btrfs.py
+++ b/archinstall/lib/disk/btrfs.py
@@ -25,7 +25,7 @@ class BtrfsSubvolume:
root :bool = False
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]
struct['source'] = struct['source'].replace(f"[{subvolume}]", "")
yield BtrfsSubvolume(
diff --git a/archinstall/lib/menu/list_manager.py b/archinstall/lib/menu/list_manager.py
index e307e41f..bacfc60e 100644
--- a/archinstall/lib/menu/list_manager.py
+++ b/archinstall/lib/menu/list_manager.py
@@ -90,9 +90,10 @@ from .menu import Menu
from ..general import RequirementError
from os import system
from copy import copy
+from typing import Union
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
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.
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:
@@ -117,9 +121,13 @@ class ListManager:
self.prompt = prompt if prompt else _('Choose an object from the list')
self.null_action = str(null_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:
- 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.confirm_action = str(_('Confirm and exit'))
self.separator = '==>'
@@ -140,23 +148,24 @@ class ListManager:
self.data_formatted = self.reformat()
options = self.data_formatted + [self.separator]
if self.default_action:
- options += [self.default_action]
+ options += self.default_action
options += self.bottom_list
system('clear')
target = Menu(self.prompt,
options,
sort=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:
break
if target and target == self.separator:
continue
- if target and target == self.default_action:
+ if target and target in self.default_action:
+ self.action = target
target = None
self.target = None
- self.action = self.default_action
self.exec_action()
continue
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)
"""
# TODO guarantee unicity
-
if isinstance(self.data,list):
if self.action == str(_('Add')):
self.target = TextInput(_('Add :'),None).run()
@@ -264,6 +272,7 @@ if __name__ == "__main__":
# opciones = ['uno','dos','tres','cuatro']
# opciones = archinstall.list_mirrors()
opciones = {'uno':1,'dos':2,'tres':3,'cuatro':4}
- # acciones = ['editar','borrar','añadir']
- opciones = ListManager('Vamos alla',opciones,None,_('Add')).run()
+ acciones = ['editar','borrar','añadir']
+ 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)
diff --git a/archinstall/lib/menu/menu.py b/archinstall/lib/menu/menu.py
index c52ed8f3..d254e0f9 100644
--- a/archinstall/lib/menu/menu.py
+++ b/archinstall/lib/menu/menu.py
@@ -26,6 +26,7 @@ class Menu(TerminalMenu):
preview_command=None,
preview_size=0.75,
preview_title='Info',
+ header :Union[List[str],str] = None,
**kwargs
):
"""
@@ -65,6 +66,9 @@ class Menu(TerminalMenu):
:param preview_title: Title of the preview window
:type preview_title: str
+ param: header one or more header lines for the menu
+ type param: string or list
+
:param kwargs : any SimpleTerminal parameter
"""
# we guarantee the inmutability of the options outside the class.
@@ -104,10 +108,15 @@ class Menu(TerminalMenu):
self.default_option = default_option
self.multi = multi
menu_title = f'\n{title}\n\n'
-
- if skip:
+ if header:
+ 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"))
-
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