From 4b4473632df0fbc92e85f6e32f6e940ad4fb6fa7 Mon Sep 17 00:00:00 2001 From: Werner Llácer Date: Mon, 28 Mar 2022 13:55:15 +0200 Subject: Subvolume User Interface (#1032) * Deflate the user interactions file * Fix flake8 * GlobalMenu split from selection_menu.py * Upgrades to ListManager: Can now show an empty list if there is no null action. More information to the user at the header * Put only_hd.py and swiss.py to use new config printing mechanism Solved a couple of bugs at ListManager adding a str and a DeferredTranslation ManageUser was missing an self argument in _check ... * Create list and menus to manage subvolumes in btrfs partitions Needed to modify manage_new_and_existing_partitions Added a new parameter filter to select_partition, to allow filtering there * Update internationalization strings Co-authored-by: Daniel Girtler Co-authored-by: Anton Hvornum --- .../lib/user_interaction/subvolume_config.py | 129 +++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 archinstall/lib/user_interaction/subvolume_config.py (limited to 'archinstall/lib/user_interaction/subvolume_config.py') diff --git a/archinstall/lib/user_interaction/subvolume_config.py b/archinstall/lib/user_interaction/subvolume_config.py new file mode 100644 index 00000000..6de8d0ef --- /dev/null +++ b/archinstall/lib/user_interaction/subvolume_config.py @@ -0,0 +1,129 @@ +from ..menu.list_manager import ListManager +from ..menu.selection_menu import Selector, GeneralMenu +from ..menu.text_input import TextInput +from ..menu import Menu +""" +UI classes +""" + +class SubvolumeList(ListManager): + def __init__(self,prompt,list): + self.ObjectNullAction = None # str(_('Add')) + self.ObjectDefaultAction = str(_('Add')) + super().__init__(prompt,list,None,self.ObjectNullAction,self.ObjectDefaultAction) + + def reformat(self): + def presentation(key,value): + text = _(" Subvolume :{:16}").format(key) + if isinstance(value,str): + text += _(" mounted at {:16}").format(value) + else: + if value.get('mountpoint'): + text += _(" mounted at {:16}").format(value['mountpoint']) + else: + text += (' ' * 28) + if value.get('options',[]): + text += _(" with option {}").format(', '.join(value['options'])) + return text + + return sorted(list(map(lambda x:presentation(x,self.data[x]),self.data))) + + def action_list(self): + return super().action_list() + + def exec_action(self): + if self.target: + origkey,origval = list(self.target.items())[0] + else: + origkey = None + + if self.action == str(_('Delete')): + del self.data[origkey] + return True + + if self.action == str(_('Add')): + self.target = {} + print(_('\n Fill the desired values for a new subvolume \n')) + with SubvolumeMenu(self.target,self.action) as add_menu: + for data in ['name','mountpoint','options']: + add_menu.exec_option(data) + else: + SubvolumeMenu(self.target,self.action).run() + self.data.update(self.target) + + return True + +class SubvolumeMenu(GeneralMenu): + def __init__(self,parameters,action=None): + self.data = parameters + self.action = action + self.ds = {} + self.ds['name'] = None + self.ds['mountpoint'] = None + self.ds['options'] = None + if self.data: + origkey,origval = list(self.data.items())[0] + self.ds['name'] = origkey + if isinstance(origval,str): + self.ds['mountpoint'] = origval + else: + self.ds['mountpoint'] = self.data[origkey].get('mountpoint') + self.ds['options'] = self.data[origkey].get('options') + + super().__init__(data_store=self.ds) + + def _setup_selection_menu_options(self): + # [str(_('Add')),str(_('Copy')),str(_('Edit')),str(_('Delete'))] + self._menu_options['name'] = Selector(str(_('Subvolume name ')), + self._select_subvolume_name if not self.action or self.action in (str(_('Add')),str(_('Copy'))) else None, + mandatory=True, + enabled=True) + self._menu_options['mountpoint'] = Selector(str(_('Subvolume mountpoint')), + self._select_subvolume_mount_point if not self.action or self.action in (str(_('Add')),str(_('Edit'))) else None, + enabled=True) + self._menu_options['options'] = Selector(str(_('Subvolume options')), + self._select_subvolume_options if not self.action or self.action in (str(_('Add')),str(_('Edit'))) else None, + enabled=True) + self._menu_options['save'] = Selector(str(_('Save')), + exec_func=lambda n,v:True, + enabled=True) + self._menu_options['cancel'] = Selector(str(_('Cancel')), + # func = lambda pre:True, + exec_func=lambda n,v:self.fast_exit(n), + enabled=True) + self.cancel_action = 'cancel' + self.save_action = 'save' + self.bottom_list = [self.save_action,self.cancel_action] + + def fast_exit(self,accion): + if self.option(accion).get_selection(): + for item in self.list_options(): + if self.option(item).is_mandatory(): + self.option(item).set_mandatory(False) + return True + + def exit_callback(self): + # we exit without moving data + if self.option(self.cancel_action).get_selection(): + return + if not self.ds['name']: + return + else: + key = self.ds['name'] + value = {} + if self.ds['mountpoint']: + value['mountpoint'] = self.ds['mountpoint'] + if self.ds['options']: + value['options'] = self.ds['options'] + self.data.update({key : value}) + + def _select_subvolume_name(self,value): + return TextInput(str(_("Subvolume name :")),value).run() + + def _select_subvolume_mount_point(self,value): + return TextInput(str(_("Select a mount point :")),value).run() + + def _select_subvolume_options(self,value): + # def __init__(self, title, p_options, skip=True, multi=False, default_option=None, sort=True): + return Menu(str(_("Select the desired subvolume options ")),['nodatacow','compress'], + skip=True,preset_values=value,multi=True).run() -- cgit v1.2.3-70-g09d2