diff --git a/ceo/tui/CeoFrame.py b/ceo/tui/CeoFrame.py index c18e0c4..1a30d21 100644 --- a/ceo/tui/CeoFrame.py +++ b/ceo/tui/CeoFrame.py @@ -110,7 +110,10 @@ class CeoFrame(Frame): layout.add_widget(Divider()) def _back(): - raise NextScene(self._model.scene_stack.pop()) + last_scene = self._model.scene_stack.pop() + if last_scene == 'Welcome': + self._model.reset() + raise NextScene(last_scene) def _next(): if on_next_excl is not None: diff --git a/ceo/tui/WelcomeView.py b/ceo/tui/WelcomeView.py index df800a7..5e4fce1 100644 --- a/ceo/tui/WelcomeView.py +++ b/ceo/tui/WelcomeView.py @@ -1,5 +1,3 @@ -import functools - from asciimatics.widgets import ListBox, Layout, Divider, Button, Label from asciimatics.exceptions import NextScene, StopApplication @@ -23,40 +21,50 @@ class WelcomeView(CeoFrame): ('Change login shell', 'ChangeLoginShell'), ('Set forwarding addresses', 'SetForwardingAddresses'), ] - members_menu = self._create_menu( - members_menu_items, 'members', self._members_menu_select) groups_menu_items = [ ('Add group', 'AddGroup'), ('Get group members', 'GetGroup'), ('Add member to group', 'AddMemberToGroup'), ('Remove member from group', 'RemoveMemberFromGroup'), ] - groups_menu = self._create_menu(groups_menu_items, 'groups') db_menu_items = [ ('Create MySQL database', 'CreateMySQL'), ('Reset MySQL password', 'ResetMySQLPassword'), ('Create PostgreSQL database', 'CreatePostgreSQL'), ('Reset PostgreSQL password', 'ResetPostgreSQLPassword'), ] - db_menu = self._create_menu( - db_menu_items, 'databases', self._db_menu_select) positions_menu_items = [ ('Get positions', 'GetPositions'), ('Set positions', 'SetPositions'), ] - positions_menu = self._create_menu(positions_menu_items, 'positions') - self._menu_groups = { - 'members': members_menu_items, - 'groups': groups_menu_items, - 'databases': db_menu_items, - 'positions': positions_menu_items, - } - layout = Layout([1, 4, 1], fill_frame=True) + self.menu_items = [ + ('members', members_menu_items), + ('groups', groups_menu_items), + ('databases', db_menu_items), + ('positions', positions_menu_items), + ] + self.menu_items_dict = dict(self.menu_items) + flat_menu_items = [item for name, items in self.menu_items for item in items] + menu = ListBox( + len(flat_menu_items), + [ + (desc, i) for i, (desc, view) in + enumerate(flat_menu_items) + ], + name='menu', + on_select=self._menu_select, + ) + labels = [] + for name, items in self.menu_items: + labels.append(Label(name.capitalize(), align='>')) + for _ in range(len(items) - 1): + labels.append(Label('')) + + layout = Layout([5, 1, 8], fill_frame=True) self.add_layout(layout) - layout.add_widget(members_menu, 1) - layout.add_widget(groups_menu, 1) - layout.add_widget(db_menu, 1) - layout.add_widget(positions_menu, 1) + layout.add_widget(menu, 2) + for label in labels: + layout.add_widget(label, 0) layout = Layout([100]) self.add_layout(layout) @@ -68,37 +76,20 @@ class WelcomeView(CeoFrame): layout.add_widget(Button("Quit", self._quit), 2) self.fix() - def _create_menu(self, menu_items, name, on_select=None): - if on_select is None: - on_select = functools.partial(self._generic_menu_select, name) - return ListBox( - len(menu_items), - [ - (desc, i) for i, (desc, view) in - enumerate(menu_items) - ], - name=name, - label=name.capitalize(), - on_select=on_select, - ) - - def _get_menu_item_desc_view(self, menu_name: str): + def _menu_select(self): self.save() - item_id = self.data[menu_name] - menu_items = self._menu_groups[menu_name] - return menu_items[item_id] - - def _members_menu_select(self): - desc, view = self._get_menu_item_desc_view('members') - if desc.endswith('club rep'): - self._model.is_club_rep = True - self._welcomeview_go_to_next_scene(desc, view) - - def _db_menu_select(self): - pass - - def _generic_menu_select(self, menu_name): - desc, view = self._get_menu_item_desc_view('groups') + item_id = self.data['menu'] + # find which submenu the item belongs to + counter = 0 + for name, items in self.menu_items: + if item_id < counter + len(items): + break + counter += len(items) + submenu_idx = item_id - counter + desc, view = items[submenu_idx] + if name == 'members': + if desc.endswith('club rep'): + self._model.is_club_rep = True self._welcomeview_go_to_next_scene(desc, view) def _welcomeview_go_to_next_scene(self, desc, view):