From f65410995b0f0bd8d48e2727216209282ac3bd37 Mon Sep 17 00:00:00 2001 From: Cyrus Date: Mon, 30 Sep 2024 02:35:35 +0200 Subject: [PATCH] WIP new features --- config.py | 71 +++++++++++++++++------------------ menu.py | 108 ++++++++++++++++++++++++++++++++++++++++-------------- params.py | 21 +++++++++-- 3 files changed, 133 insertions(+), 67 deletions(-) diff --git a/config.py b/config.py index a97e581..871968f 100644 --- a/config.py +++ b/config.py @@ -31,36 +31,45 @@ def __init__(self): ], "phonemenu": { "init_screen": "main", - "transition_popup": 3, + "transition_popup": 1, "dialogs": { "call_incoming":{ "dialog": 1, - "popup": 4, + "window": 2, + "popup": 0, "choices": { - "ok_button": ["call_accept", None], - "cancel_button": ["call_accept", None], - "yes_button": ["call_hangup", None], + "yes_button": ["call_accept", None], "no_button": ["call_hangup", None] } }, "call_outgoing":{ "dialog": 2, - "popup": 1, + "window": 2, + "popup": 0, "choices": { - "yes_button": ["call_hangup", None], "no_button": ["call_hangup", None] } }, - "call_end":{ + "call_confirm":{ "dialog": 3, + "window": 2, + "popup": 0, + "choices": { + "yes_button": ["phonebook_call_active_entry", None], + "no_button": ["exit_dialogs", None] + } + }, + "call_end":{ + "dialog": 5, + "window": 2, "popup": 0, "choices": {} }, "call_start":{ "dialog": 4, - "popup": 1, + "window": 2, + "popup": 0, "choices": { - "yes_button": ["call_hangup", None], "no_button": ["call_hangup", None] } } @@ -68,42 +77,30 @@ def __init__(self): "screens": { "main": { "screenid": 1, - "selectors": { - "selector1": False, - "selector2": False, - "selector3": False, - "selector4": False - }, + "window": 0, + "popup": 0, + "selectors": {}, "choices": { - "yes_button": ["screen", "credits"], - "no_button": ["screen", "secretmenu"], - "ok_button": ["screen", "phonebook"], - "cancel_button": ["screen", "conference"] + "yes_button": ["screen", "phonebook"] } }, "phonebook": { "screenid": 2, - "selectors": { - "selector1": False, - "selector2": False, - "selector3": False, - "selector4": False - }, + "window": 0, + "popup": 0, + "selectors": {}, "choices": { - "yes_button": ["call_phonebook", 0], - "no_button": ["call_phonebook", 1], - "ok_button": ["call_phonebook", 2], - "cancel_button": ["screen", "main"] + "yes_button": ["phonebook_call_confirm_dialog", None], + "no_button": ["screen", "main"], + "ok_button": ["phonebook_next", None], + "cancel_button": ["phonebook_prev", None] } }, "credits": { - "screenid": 4, - "selectors": { - "selector1": False, - "selector2": False, - "selector3": False, - "selector4": False - }, + "screenid": 1, + "window": 1, + "popup": 0, + "selectors": {}, "choices": { "cancel_button": ["screen", "main"] } diff --git a/menu.py b/menu.py index f93ceb9..458b4aa 100644 --- a/menu.py +++ b/menu.py @@ -17,11 +17,21 @@ def __init__(self, config: Config, gui: Gui, osc: Osc, microsip: MicroSIP, osc_ self.active_screen: str = "" self.active_dialog: str = "" self.active_mode: int = 0 + self.active_phonebook_entry: int = 0 self.call_start_time: float = float() self.osc_integer_parameters: dict[str, str] = { - "screen": params.show_screen, - "dialog": params.show_dialog, - "popup": params.show_popup + "screen": params.active_screen, + "window": params.active_window, + "dialog": params.active_dialog, + "popup": params.active_popup, + "numberRow1Slot1": params.show_numberRow1Slot1, + "numberRow1Slot2": params.show_numberRow1Slot2, + "numberRow1Slot3": params.show_numberRow1Slot3, + "numberRow1Slot4": params.show_numberRow1Slot4, + "numberRow2Slot1": params.show_numberRow2Slot1, + "numberRow2Slot2": params.show_numberRow2Slot2, + "numberRow2Slot3": params.show_numberRow2Slot3, + "numberRow2Slot4": params.show_numberRow2Slot4 } self.osc_bool_parameters: dict[str, str] = { "selector1": params.show_selection1, @@ -51,12 +61,13 @@ def _initmenu(self): screen = self.config.get_by_key("phonemenu")["init_screen"] self._switch_screen(screen) self._reset_dialogs() - self.gui.print_terminal("log_verbose: Ingame menu initialized") if self.config.get_by_key("log_verbose") else None + self.gui.print_terminal("Menu: Avatar screen menu initialized") def _reset_dialogs(self): self.active_mode = 0 self.osc.client.send_message(self.osc_integer_parameters.get("dialog"), 0) self.osc.client.send_message(self.osc_integer_parameters.get("popup"), 0) + self.osc.client.send_message(self.osc_integer_parameters.get("window"), self.config.get_by_key("phonemenu")["screens"][self.active_screen]["window"]) for selector in self.config.get_by_key("phonemenu")["screens"][self.active_screen]["selectors"]: self.osc.client.send_message( self.osc_bool_parameters.get(selector), @@ -72,6 +83,7 @@ def _switch_screen(self, screen): self.active_screen = screen self.active_mode = 0 self.osc.client.send_message(self.osc_integer_parameters.get("screen"), self.config.get_by_key("phonemenu")["screens"][screen]["screenid"]) + self.osc.client.send_message(self.osc_integer_parameters.get("window"), self.config.get_by_key("phonemenu")["screens"][screen]["window"]) for selector in self.config.get_by_key("phonemenu")["screens"][screen]["selectors"]: self.osc.client.send_message( self.osc_bool_parameters.get(selector), @@ -84,6 +96,7 @@ def _show_dialog(self, dialog): self.active_mode = 1 self.osc.client.send_message(self.osc_integer_parameters.get("dialog"), self.config.get_by_key("phonemenu")["dialogs"][dialog]["dialog"]) self.osc.client.send_message(self.osc_integer_parameters.get("popup"), self.config.get_by_key("phonemenu")["dialogs"][dialog]["popup"]) + self.osc.client.send_message(self.osc_integer_parameters.get("window"), self.config.get_by_key("phonemenu")["dialogs"][dialog]["window"]) for selector in self.config.get_by_key("phonemenu")["screens"][self.active_screen]["selectors"]: self.osc.client.send_message( self.osc_bool_parameters.get(selector), @@ -93,6 +106,7 @@ def _show_dialog(self, dialog): def _redraw(self): self.gui.print_terminal("log_verbose: Redrawing screen") if self.config.get_by_key("log_verbose") else None self.osc.client.send_message(self.osc_integer_parameters.get("screen"), self.config.get_by_key("phonemenu")["screens"][self.active_screen]["screenid"]) + self.osc.client.send_message(self.osc_integer_parameters.get("window"), self.config.get_by_key("phonemenu")["screens"][self.active_screen]["window"]) if self.active_mode == 0 else None for selector in self.config.get_by_key("phonemenu")["screens"][self.active_screen]["selectors"]: self.osc.client.send_message( self.osc_bool_parameters.get(selector), @@ -101,9 +115,11 @@ def _redraw(self): if self.active_mode == 1: self.osc.client.send_message(self.osc_integer_parameters.get("dialog"), self.config.get_by_key("phonemenu")["dialogs"][self.active_dialog]["dialog"]) self.osc.client.send_message(self.osc_integer_parameters.get("popup"), self.config.get_by_key("phonemenu")["dialogs"][self.active_dialog]["popup"]) + self.osc.client.send_message(self.osc_integer_parameters.get("window"), self.config.get_by_key("phonemenu")["dialogs"][self.active_dialog]["window"]) if self.active_mode == 2: - self.osc.client.send_message(self.osc_integer_parameters.get("dialog"), 0) + self.osc.client.send_message(self.osc_integer_parameters.get("dialog"), self.config.get_by_key("phonemenu")["dialogs"][self.active_dialog]["dialog"]) self.osc.client.send_message(self.osc_integer_parameters.get("popup"), self.config.get_by_key("phonemenu")["transition_popup"]) + self.osc.client.send_message(self.osc_integer_parameters.get("window"), self.config.get_by_key("phonemenu")["dialogs"][self.active_dialog]["window"]) def _handle_choices(self, choice): match choice[0]: @@ -115,32 +131,24 @@ def _handle_choices(self, choice): self.microsip.run_phone_command("hangup") case "call_phonebook": self.microsip.run_phone_command("phonebook", choice[1]) + case "phonebook_next": + self._phonebook_switch_entry("next") + case "phonebook_prev": + self._phonebook_switch_entry("prev") + case "phonebook_call_confirm_dialog": + self._phonebook_call_confirm_dialog() + case "phonebook_call_active_entry": + self.microsip.run_phone_command("phonebook", self.active_phonebook_entry) + case "exit_dialogs": + self._reset_dialogs() case _: pass - def _input_worker(self): - while True: - try: - #Handle VRC queue - for address in self.osc_vrc_queue: - if address == self.osc.avatar_change_input: - self.handle_avatar_change() - else: - self.handle_button_input(self.vrc_button_mapping.get(address)) - self.osc_vrc_queue.discard(address) - #Handle Microsip queue - for address, caller in self.osc_microsip_queue: - self.handle_callback_input(self.microsip_dialog_mapping.get(address), caller) - self.osc_microsip_queue.discard((address, caller)) - except RuntimeError: - pass - time.sleep(.025) - - def handle_avatar_change(self): - self.gui.print_terminal("Avatar change detected") + def _handle_avatar_change(self): + self.gui.print_terminal("Menu: Avatar change detected, redrawing screen") self._redraw() - def handle_button_input(self, button): + def _handle_button_input(self, button): self.gui.print_terminal("log_verbose: Handle button input: {} active_mode: {}".format(button, self.active_mode)) if self.config.get_by_key("log_verbose") else None if self.active_mode == 0: if button in self.config.get_by_key("phonemenu")["screens"][self.active_screen]["choices"]: @@ -158,7 +166,7 @@ def handle_button_input(self, button): #Loading transition mode, we don't accept input here return - def handle_callback_input(self, command, caller): + def _handle_callback_input(self, command, caller): self.gui.print_terminal("log_verbose: Handle callback command: {}, caller: {} active_mode: {}".format(command, caller, self.active_mode)) if self.config.get_by_key("log_verbose") else None match command: case "call_end" | "call_busy": @@ -181,6 +189,52 @@ def handle_callback_input(self, command, caller): self.gui.print_terminal("log_verbose: Unhandled callback command: {}".format(command)) if self.config.get_by_key("log_verbose") else None return + def _phonebook_switch_entry(self, direction): + active_entry = self.active_phonebook_entry + len_entries = len(self.config.get_by_key("phonebook")) + match direction: + case "next": + if len_entries > 1: + if active_entry == len_entries - 1: + self.active_phonebook_entry = 0 + else: + self.active_phonebook_entry += 1 + else: + pass + case "prev": + if len_entries > 1: + if active_entry == 0: + self.active_phonebook_entry = len_entries - 1 + else: + self.active_phonebook_entry -= 1 + else: + pass + + def _phonebook_call_confirm_dialog(self): + self._show_dialog("call_confirm") + #phonebook_call_confirm_menu + pass + + def _input_worker(self): + while True: + try: + #Handle VRC queue + for address in self.osc_vrc_queue: + if address == self.osc.avatar_change_input: + self._handle_avatar_change() + else: + self._handle_button_input(self.vrc_button_mapping.get(address)) + self.osc_vrc_queue.discard(address) + #Handle Microsip queue + for address, caller in self.osc_microsip_queue: + self._handle_callback_input(self.microsip_dialog_mapping.get(address), caller) + self.osc_microsip_queue.discard((address, caller)) + #Handle call timer + #self._handle_calltimer() + except RuntimeError: + pass + time.sleep(.025) + def run(self): self._initmenu() threading.Thread(target=self._input_worker, daemon=True).start() diff --git a/params.py b/params.py index 503053e..541fa44 100644 --- a/params.py +++ b/params.py @@ -21,10 +21,25 @@ ### Outputs ### #Shape Key Menu Control -show_screen = "/avatar/parameters/ActiveScreen" -show_dialog = "/avatar/parameters/ActiveDialog" -show_popup = "/avatar/parameters/ActivePopup" +active_screen = "/avatar/parameters/ActiveScreen" +active_window = "/avatar/parameters/ActiveWindow" +active_dialog = "/avatar/parameters/ActiveDialog" +active_popup = "/avatar/parameters/ActivePopup" + +#Selectors (Not used in public avatar) show_selection1 = "/avatar/parameters/Selection1" show_selection2 = "/avatar/parameters/Selection2" show_selection3 = "/avatar/parameters/Selection3" show_selection4 = "/avatar/parameters/Selection4" + +#Number Row 1 +show_numberRow1Slot1 = "/avatar/parameters/NumberRow1Slot1" +show_numberRow1Slot2 = "/avatar/parameters/NumberRow1Slot2" +show_numberRow1Slot3 = "/avatar/parameters/NumberRow1Slot3" +show_numberRow1Slot4 = "/avatar/parameters/NumberRow1Slot4" + +#Number Row2 +show_numberRow2Slot1 = "/avatar/parameters/NumberRow2Slot1" +show_numberRow2Slot2 = "/avatar/parameters/NumberRow2Slot2" +show_numberRow2Slot3 = "/avatar/parameters/NumberRow2Slot3" +show_numberRow2Slot4 = "/avatar/parameters/NumberRow2Slot4" \ No newline at end of file