use single ListBox in WelcomeView
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Max Erenberg 2021-09-11 17:24:23 -04:00
parent 33323fd112
commit ad38588141
2 changed files with 44 additions and 50 deletions

View File

@ -110,7 +110,10 @@ class CeoFrame(Frame):
layout.add_widget(Divider()) layout.add_widget(Divider())
def _back(): 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(): def _next():
if on_next_excl is not None: if on_next_excl is not None:

View File

@ -1,5 +1,3 @@
import functools
from asciimatics.widgets import ListBox, Layout, Divider, Button, Label from asciimatics.widgets import ListBox, Layout, Divider, Button, Label
from asciimatics.exceptions import NextScene, StopApplication from asciimatics.exceptions import NextScene, StopApplication
@ -23,40 +21,50 @@ class WelcomeView(CeoFrame):
('Change login shell', 'ChangeLoginShell'), ('Change login shell', 'ChangeLoginShell'),
('Set forwarding addresses', 'SetForwardingAddresses'), ('Set forwarding addresses', 'SetForwardingAddresses'),
] ]
members_menu = self._create_menu(
members_menu_items, 'members', self._members_menu_select)
groups_menu_items = [ groups_menu_items = [
('Add group', 'AddGroup'), ('Add group', 'AddGroup'),
('Get group members', 'GetGroup'), ('Get group members', 'GetGroup'),
('Add member to group', 'AddMemberToGroup'), ('Add member to group', 'AddMemberToGroup'),
('Remove member from group', 'RemoveMemberFromGroup'), ('Remove member from group', 'RemoveMemberFromGroup'),
] ]
groups_menu = self._create_menu(groups_menu_items, 'groups')
db_menu_items = [ db_menu_items = [
('Create MySQL database', 'CreateMySQL'), ('Create MySQL database', 'CreateMySQL'),
('Reset MySQL password', 'ResetMySQLPassword'), ('Reset MySQL password', 'ResetMySQLPassword'),
('Create PostgreSQL database', 'CreatePostgreSQL'), ('Create PostgreSQL database', 'CreatePostgreSQL'),
('Reset PostgreSQL password', 'ResetPostgreSQLPassword'), ('Reset PostgreSQL password', 'ResetPostgreSQLPassword'),
] ]
db_menu = self._create_menu(
db_menu_items, 'databases', self._db_menu_select)
positions_menu_items = [ positions_menu_items = [
('Get positions', 'GetPositions'), ('Get positions', 'GetPositions'),
('Set positions', 'SetPositions'), ('Set positions', 'SetPositions'),
] ]
positions_menu = self._create_menu(positions_menu_items, 'positions') self.menu_items = [
self._menu_groups = { ('members', members_menu_items),
'members': members_menu_items, ('groups', groups_menu_items),
'groups': groups_menu_items, ('databases', db_menu_items),
'databases': db_menu_items, ('positions', positions_menu_items),
'positions': positions_menu_items, ]
} self.menu_items_dict = dict(self.menu_items)
layout = Layout([1, 4, 1], fill_frame=True) 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) self.add_layout(layout)
layout.add_widget(members_menu, 1) layout.add_widget(menu, 2)
layout.add_widget(groups_menu, 1) for label in labels:
layout.add_widget(db_menu, 1) layout.add_widget(label, 0)
layout.add_widget(positions_menu, 1)
layout = Layout([100]) layout = Layout([100])
self.add_layout(layout) self.add_layout(layout)
@ -68,37 +76,20 @@ class WelcomeView(CeoFrame):
layout.add_widget(Button("Quit", self._quit), 2) layout.add_widget(Button("Quit", self._quit), 2)
self.fix() self.fix()
def _create_menu(self, menu_items, name, on_select=None): def _menu_select(self):
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):
self.save() self.save()
item_id = self.data[menu_name] item_id = self.data['menu']
menu_items = self._menu_groups[menu_name] # find which submenu the item belongs to
return menu_items[item_id] counter = 0
for name, items in self.menu_items:
def _members_menu_select(self): if item_id < counter + len(items):
desc, view = self._get_menu_item_desc_view('members') break
if desc.endswith('club rep'): counter += len(items)
self._model.is_club_rep = True submenu_idx = item_id - counter
self._welcomeview_go_to_next_scene(desc, view) desc, view = items[submenu_idx]
if name == 'members':
def _db_menu_select(self): if desc.endswith('club rep'):
pass self._model.is_club_rep = True
def _generic_menu_select(self, menu_name):
desc, view = self._get_menu_item_desc_view('groups')
self._welcomeview_go_to_next_scene(desc, view) self._welcomeview_go_to_next_scene(desc, view)
def _welcomeview_go_to_next_scene(self, desc, view): def _welcomeview_go_to_next_scene(self, desc, view):