diff --git a/archinstall/lib/disk/partitioning_menu.py b/archinstall/lib/disk/partitioning_menu.py index a1a829594c..308b0d9cc7 100644 --- a/archinstall/lib/disk/partitioning_menu.py +++ b/archinstall/lib/disk/partitioning_menu.py @@ -58,7 +58,12 @@ def __init__(self, prompt: str, device: BDevice, device_partitions: list[Partiti } display_actions = list(self._actions.values()) - super().__init__(prompt, device_partitions, display_actions[:2], display_actions[3:]) + super().__init__( + device_partitions, + display_actions[:2], + display_actions[3:], + prompt + ) @override def selected_action_display(self, selection: PartitionModification) -> str: @@ -186,8 +191,8 @@ def _toggle_mount_option( def _set_btrfs_subvolumes(self, partition: PartitionModification) -> None: partition.btrfs_subvols = SubvolumeMenu( - str(_("Manage btrfs subvolumes for current partition")), - partition.btrfs_subvols + partition.btrfs_subvols, + None ).run() def _prompt_formatting(self, partition: PartitionModification) -> None: diff --git a/archinstall/lib/disk/subvolume_menu.py b/archinstall/lib/disk/subvolume_menu.py index 018e88dd5c..fdf14943bd 100644 --- a/archinstall/lib/disk/subvolume_menu.py +++ b/archinstall/lib/disk/subvolume_menu.py @@ -16,13 +16,23 @@ class SubvolumeMenu(ListManager): - def __init__(self, prompt: str, btrfs_subvols: list[SubvolumeModification]): + def __init__( + self, + btrfs_subvols: list[SubvolumeModification], + prompt: str | None = None + ): self._actions = [ str(_('Add subvolume')), str(_('Edit subvolume')), str(_('Delete subvolume')) ] - super().__init__(prompt, btrfs_subvols, [self._actions[0]], self._actions[1:]) + + super().__init__( + btrfs_subvols, + [self._actions[0]], + self._actions[1:], + prompt + ) @override def selected_action_display(self, selection: SubvolumeModification) -> str: diff --git a/archinstall/lib/interactions/manage_users_conf.py b/archinstall/lib/interactions/manage_users_conf.py index e2d73860f5..b997305705 100644 --- a/archinstall/lib/interactions/manage_users_conf.py +++ b/archinstall/lib/interactions/manage_users_conf.py @@ -26,7 +26,13 @@ def __init__(self, prompt: str, lusers: list[User]): str(_('Promote/Demote user')), str(_('Delete User')) ] - super().__init__(prompt, lusers, [self._actions[0]], self._actions[1:]) + + super().__init__( + lusers, + [self._actions[0]], + self._actions[1:], + prompt + ) @override def selected_action_display(self, selection: User) -> str: diff --git a/archinstall/lib/interactions/network_menu.py b/archinstall/lib/interactions/network_menu.py index ed7ad9c604..0f681d7c9f 100644 --- a/archinstall/lib/interactions/network_menu.py +++ b/archinstall/lib/interactions/network_menu.py @@ -24,7 +24,13 @@ def __init__(self, prompt: str, preset: list[Nic]): str(_('Edit interface')), str(_('Delete interface')) ] - super().__init__(prompt, preset, [self._actions[0]], self._actions[1:]) + + super().__init__( + preset, + [self._actions[0]], + self._actions[1:], + prompt + ) @override def selected_action_display(self, selection: Nic) -> str: diff --git a/archinstall/lib/menu/list_manager.py b/archinstall/lib/menu/list_manager.py index ad74dced34..8bd1dea2f9 100644 --- a/archinstall/lib/menu/list_manager.py +++ b/archinstall/lib/menu/list_manager.py @@ -16,10 +16,10 @@ class ListManager: def __init__( self, - prompt: str, entries: list[Any], base_actions: list[str], - sub_menu_actions: list[str] + sub_menu_actions: list[str], + prompt: str | None = None ): """ :param prompt: Text which will appear at the header @@ -38,8 +38,7 @@ def __init__( self._original_data = copy.deepcopy(entries) self._data = copy.deepcopy(entries) - explainer = str(_('\n Choose an object from the list, and select one of the available actions for it to execute')) - self._prompt = prompt if prompt else explainer + self._prompt: str | None = prompt self._separator = '' self._confirm_action = str(_('Confirm and exit')) @@ -66,8 +65,12 @@ def run(self) -> list[Any]: # and the value is the original value from the self._data container data_formatted = self.reformat(self._data) options = self._prepare_selection(data_formatted) + header = self._get_header(data_formatted) + if self._prompt is not None: + header = f'{self._prompt}\n\n{header}' + items = [MenuItem(o[0], value=o[1]) for o in options] group = MenuItemGroup(items, sort_items=False) @@ -76,7 +79,7 @@ def run(self) -> list[Any]: header=header, search_enabled=False, allow_skip=False, - alignment=Alignment.CENTER, + alignment=Alignment.CENTER ).run() match result.type_: @@ -149,16 +152,19 @@ def reformat(self, data: list[Any]) -> dict[str, Any | None]: Default implementation of the table to be displayed. Override if any custom formatting is needed """ - table = FormattedOutput.as_table(data) - rows = table.split('\n') + display_data: dict[str, Any | None] = {} + + if data: + table = FormattedOutput.as_table(data) + rows = table.split('\n') - # these are the header rows of the table and do not map to any User obviously - # we're adding 2 spaces as prefix because the menu selector '> ' will be put before - # the selectable rows so the header has to be aligned - display_data: dict[str, Any | None] = {f'{rows[0]}': None, f'{rows[1]}': None} + # these are the header rows of the table and do not map to any User obviously + # we're adding 2 spaces as prefix because the menu selector '> ' will be put before + # the selectable rows so the header has to be aligned + display_data = {f'{rows[0]}': None, f'{rows[1]}': None} - for row, entry in zip(rows[2:], data): - display_data[row] = entry + for row, entry in zip(rows[2:], data): + display_data[row] = entry return display_data diff --git a/archinstall/lib/mirrors.py b/archinstall/lib/mirrors.py index 198fe3e94f..a81544f6c6 100644 --- a/archinstall/lib/mirrors.py +++ b/archinstall/lib/mirrors.py @@ -129,11 +129,12 @@ def __init__(self, custom_mirrors: list[CustomMirror]): str(_('Change custom mirror')), str(_('Delete custom mirror')) ] + super().__init__( - '', custom_mirrors, [self._actions[0]], - self._actions[1:] + self._actions[1:], + '' ) @override