tui: arcade management view

This commit is contained in:
2025-09-17 18:08:34 -04:00
parent c92ede9e55
commit 5ec6cc0398

208
tui.py
View File

@ -164,9 +164,9 @@ class MainView(Frame):
def _quit():
raise StopApplication("User pressed quit")
class ManageUser(Frame):
class ManageUserView(Frame):
def __init__(self, screen: Screen):
super(ManageUser, self).__init__(
super(ManageUserView, self).__init__(
screen,
screen.height * 2 // 3,
screen.width * 2 // 3,
@ -251,9 +251,9 @@ class ManageUser(Frame):
self.save()
raise NextScene("Main")
class ManageCard(Frame):
class ManageCardView(Frame):
def __init__(self, screen: Screen):
super(ManageCard, self).__init__(
super(ManageCardView, self).__init__(
screen,
screen.height * 2 // 3,
screen.width * 2 // 3,
@ -416,6 +416,19 @@ class SearchResultsView(Frame):
name = usr['username'][:5] + "..."
opts.append((f"{usr['id']:05d} | {name} | {usr['permissions']:08b} | {usr['email']}", state.SelectedUser(usr["id"], str(usr['username']))))
elif state.search_type == "arcade":
layout.add_widget(Label(" ID | Name | Country | # Machines "))
layout.add_widget(Divider())
for ac in state.search_results:
name = str(ac['name'])
if len(name) < 8:
name = str(ac['name']) + ' ' * (8 - len(name))
elif len(name) > 8:
name = ac['name'][:5] + "..."
opts.append((f"{ac['id']:04X} | {name} | {ac['country']} | {usr['mech_ct']}", state.SelectedArcade(ac["id"], ac['country'], str(ac['name']))))
layout.add_widget(RadioButtons(opts, "", "selopt"))
@ -424,12 +437,25 @@ class SearchResultsView(Frame):
def _select_current(self):
self.save()
a = self.data.get('selopt')
state.set_user(a.id, a.name)
raise NextScene("User Management")
if state.search_type == "user":
state.set_user(a.id, a.name)
raise NextScene("User Management")
elif state.search_type == "arcade":
state.set_arcade(a.id, a.country, a.name)
raise NextScene("Arcade Management")
def _cancel(self):
state.clear_last_err()
raise NextScene("User Management")
if state.search_type == "user":
raise NextScene("User Management")
elif state.search_type == "arcade":
raise NextScene("Arcade Management")
def _back(self):
self.save()
raise NextScene("Main")
class LookupUserView(Frame):
def __init__(self, screen):
@ -612,15 +638,179 @@ class EditUserView(Frame):
self.find_widget('status').value = state.last_err
raise NextScene("User Management")
class ManageArcadeView(Frame):
def __init__(self, screen: Screen):
super(ManageArcadeView, self).__init__(
screen,
screen.height * 2 // 3,
screen.width * 2 // 3,
hover_focus=True,
can_scroll=False,
title="Arcade Management",
on_load=self._redraw
)
layout = Layout([3])
self.add_layout(layout)
layout.add_widget(Button("Create Arcade", self._create_arcade))
layout.add_widget(Button("Lookup Arcade", self._lookup))
def _redraw(self):
self._layouts = [self._layouts[0]]
layout = Layout([3])
self.add_layout(layout)
layout.add_widget(Button("Edit Arcade", self._edit_arcade, disabled=state.selected_arcade.id == 0 or state.selected_arcade.id is None))
layout.add_widget(Button("Delete Arcade", self._del_arcade, disabled=state.selected_arcade.id == 0 or state.selected_arcade.id is None))
layout.add_widget((Divider()))
layout2 = Layout([1, 1, 1])
self.add_layout(layout2)
a = Text("", f"status", readonly=True, disabled=True)
a.value = f"Selected Arcade: {state.selected_arcade}"
layout2.add_widget(a)
layout2.add_widget(Button("Back", self._back), 2)
self.fix()
def _create_arcade(self):
self.save()
raise NextScene("Create Arcade")
def _lookup(self):
self.save()
raise NextScene("Lookup Arcade")
def _edit_arcade(self):
self.save()
raise NextScene("Edit Arcade")
def _del_arcade(self):
self.save()
raise NextScene("Delete Arcade")
def _back(self):
self.save()
raise NextScene("Main")
class LookupArcadeView(Frame):
def __init__(self, screen):
super(LookupArcadeView, self).__init__(
screen,
screen.height * 2 // 3,
screen.width * 2 // 3,
hover_focus=True,
can_scroll=False,
title="Lookup Arcade"
)
layout = Layout([1, 1], fill_frame=True)
self.add_layout(layout)
layout.add_widget(RadioButtons([
("Name", "1"),
("Serial", "2"),
("Place ID", "3"),
("Arcade ID", "4"),
], "Search By:", "search_type"))
layout.add_widget(Text("Search:", "search_str"), 1)
layout3 = Layout([100])
self.add_layout(layout3)
layout3.add_widget(Text("", f"status", readonly=True, disabled=True))
layout2 = Layout([1, 1, 1, 1])
self.add_layout(layout2)
layout2.add_widget(Button("Search", self._lookup), 0)
layout2.add_widget(Button("Cancel", self._cancel), 3)
self.fix()
def _lookup(self):
self.save()
if not self.data.get("search_str"):
state.set_last_err("Search cannot be blank")
self.find_widget('status').value = state.last_err
self.screen.reset()
return
state.clear_last_err()
self.find_widget('status').value = state.last_err
search_type = self.data.get("search_type")
if search_type == "1":
loop.run_until_complete(self._lookup_arcade_by_name(self.data.get("search_str")))
elif search_type == "2":
loop.run_until_complete(self._lookup_arcade_by_serial(self.data.get("search_str")))
elif search_type == "3":
real_id = int(self.data.get("search_str"), 16)
loop.run_until_complete(self._lookup_arcade_by_id(real_id))
elif search_type == "4":
loop.run_until_complete(self._lookup_arcade_by_id(self.data.get("search_str")))
else:
state.set_last_err("Unknown search type")
self.find_widget('status').value = state.last_err
self.screen.reset()
return
if len(state.search_results) < 1:
state.set_last_err("Search returned no results")
self.find_widget('status').value = state.last_err
self.screen.reset()
return
state.search_type = "user"
raise NextScene("Search Results")
async def _lookup_arcade_by_id(self, ac_id: str):
ac = await data.arcade.get_arcade(ac_id)
if ac is not None:
res = ac._asdict()
num_cabs = await data.arcade.get_arcade_machines(ac_id)
res['mech_ct'] = len(num_cabs) if num_cabs else 0
state.search_results = [res]
async def _lookup_arcade_by_name(self, name: str):
ac = await data.arcade.get_arcade_by_name(name)
if ac is not None:
res = []
for ac_res in ac:
t = ac_res._asdict()
num_cabs = await data.arcade.get_arcade_machines(t['id'])
t['mech_ct'] = len(num_cabs) if num_cabs else 0
res.append(t)
state.search_results = res
async def _lookup_arcade_by_serial(self, serial: str):
mech = await data.arcade.get_machine(serial)
if mech is not None:
ac = await data.arcade.get_arcade(mech['arcade'])
if ac is not None:
res = ac._asdict()
num_cabs = await data.arcade.get_arcade_machines(mech['arcade'])
res['mech_ct'] = len(num_cabs) if num_cabs else 0
state.search_results = [res]
def _cancel(self):
state.clear_last_err()
self.find_widget('status').value = state.last_err
raise NextScene("Arcade Management")
def demo(screen:Screen, scene: Scene):
scenes = [
Scene([MainView(screen)], -1, name="Main"),
Scene([ManageUser(screen)], -1, name="User Management"),
Scene([ManageUserView(screen)], -1, name="User Management"),
Scene([CreateUserView(screen)], -1, name="Create User"),
Scene([LookupUserView(screen)], -1, name="Lookup User"),
Scene([SearchResultsView(screen)], -1, name="Search Results"),
Scene([ManageCard(screen)], -1, name="Card Management"),
Scene([ManageCardView(screen)], -1, name="Card Management"),
Scene([EditUserView(screen)], -1, name="Edit User"),
Scene([ManageArcadeView(screen)], -1, name="Arcade Management"),
Scene([LookupArcadeView(screen)], -1, name="Lookup Arcade"),
]
screen.play(scenes, stop_on_resize=False, start_scene=scene, allow_int=True)