diff --git a/tui.py b/tui.py index 58d062f..0982625 100644 --- a/tui.py +++ b/tui.py @@ -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)