# Python imports import traceback # from pprint import pprint # Lib imports from libs.PyInquirer import style_from_dict, Token, prompt, Separator # Application imports class Menu: """ The menu class has sub methods that are called per run. """ def __init__(self, args, unknownargs): self.theme = settings_manager.call_method(settings_manager.get_styles(), args.theme) self._setup_styling() self._setup_signals() self._subscribe_to_events() self._load_widgets() self.run_loop() settings_manager.save_settings() def _setup_styling(self): ... def _setup_signals(self): ... def _subscribe_to_events(self): ... def _load_widgets(self): ... def run_loop(self): base_options = [ "[ TO MAIN MENU ]", "Favorites" ] body_menu = [ x.title() for x in settings.filters.__slots__ ] GROUPS = [ "Search...", "Favorites" ] + body_menu + [ "[ Set Favorites ]", "[ Exit ]" ] query = "" group = "" while True: try: group = self.get_group(GROUPS) results = self.load_group(group) if "CONTINUE" in results: continue if "BREAK" in results: break self.process_subgroup(base_options, group, results) except Exception as e: logger.debug(f"Traceback: {traceback.print_exc()}") def get_group(self, GROUPS): event_system.emit("clear_console") group = self.main_menu(GROUPS)["group"] event_system.emit("clear_console") return group def load_group(self, group): match group: case "Search...": query = self.search_menu()["query"] results = event_system.emit_and_await("get_search_results", (query.lower(),)) case "Favorites": results = event_system.emit_and_await("get_favorites_results", (group,)) case "[ Set Favorites ]": results = event_system.emit_and_await("get_search_results", ("",)) programs_list = [{"name" : "[ TO MAIN MENU ]"}] + [ {"name": prog, "checked": prog in settings.favorites["apps"]} for prog, exec in results ] favorites = self.set_favorites_menu(programs_list)["set_faves"] settings.favorites["apps"] = favorites results = ["CONTINUE"] case "[ Exit ]": results = ["BREAK"] case _: results = event_system.emit_and_await("get_sub_group", (group,)) return results def process_subgroup(self, base_options, group, results): programs_list = ["[ TO MAIN MENU ]"] + [prog for prog, exec in results] entry = self.sub_menu([group, programs_list])["prog"] if entry not in base_options: for prog, exec_ops in results: if prog == entry: event_system.emit("execute_program", (exec_ops,)) break def main_menu(self, _group_list = None): """ Displays the main menu using the defined GROUPS list... """ group_list = GROUPS if not _group_list else _group_list menu = { 'type': 'list', 'name': 'group', 'message': '[ MAIN MENU ]', 'choices': group_list } return prompt(menu, style=self.theme) def set_favorites_menu(self, _group_list = None): GROUPS = [{'name': '[ TO MAIN MENU ]'}, {'name': 'This is a stub method for Favorites...'}] group_list = GROUPS if not _group_list else _group_list menu = { 'type': 'checkbox', 'qmark': '>', 'message': 'Select Favorites', 'name': 'set_faves', 'choices': group_list } return prompt(menu, style=self.theme) def sub_menu(self, data = ["NO GROUP NAME", "NO PROGRAMS PASSED IN"]): group = data[0] prog_list = data[1] menu = { 'type': 'list', 'name': 'prog', 'message': f'[ {group} ]', 'choices': prog_list } return prompt(menu, style=self.theme) def search_menu(self): menu = { 'type': 'input', 'name': 'query', 'message': 'Program you\'re looking for: ', } return prompt(menu, style=self.theme)