From 2fe1527ba20f0e460f99eced16e51c85e074d5b3 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Mon, 3 Nov 2025 14:09:49 +0100 Subject: [PATCH] Consistent pane close event handling --- sbapp/main.py | 99 +++++++++++++++---------------------------- sbapp/ui/utilities.py | 9 +++- 2 files changed, 42 insertions(+), 66 deletions(-) diff --git a/sbapp/main.py b/sbapp/main.py index 7853fb8..5decc71 100644 --- a/sbapp/main.py +++ b/sbapp/main.py @@ -1409,6 +1409,24 @@ class SidebandApp(MDApp): self.root.ids.nav_scrollview.effect_cls = ScrollEffect Clock.schedule_once(self.start_core, 0.25) + def close_handler(self): + if self.root.ids.screen_manager.current == "conversations_screen": + if self.include_conversations and not self.include_objects: self.quit_action(self) + else: self.conversations_action(direction="right") + elif self.root.ids.screen_manager.current == "hardware_rnode_screen": self.close_sub_hardware_action() + elif self.root.ids.screen_manager.current == "hardware_modem_screen": self.close_sub_hardware_action() + elif self.root.ids.screen_manager.current == "hardware_serial_screen": self.close_sub_hardware_action() + elif self.root.ids.screen_manager.current == "map_settings_screen": self.close_sub_map_action() + elif self.root.ids.screen_manager.current == "object_details_screen": self.object_details_screen.close_action() + elif self.root.ids.screen_manager.current == "sensors_screen": self.close_sub_telemetry_action() + elif self.root.ids.screen_manager.current == "icons_screen": self.close_sub_telemetry_action() + elif self.root.ids.screen_manager.current == "utilities_screen": self.close_any_action() + elif self.root.ids.screen_manager.current == "rnstatus_screen": self.utilities_screen.close_rnstatus_action() + elif self.root.ids.screen_manager.current == "logviewer_screen": self.close_sub_utilities_action() + elif self.root.ids.screen_manager.current == "advanced_screen": self.close_sub_utilities_action() + elif self.root.ids.screen_manager.current == "voice_settings_screen": self.close_sub_voice_action() + else: self.close_any_action() + def keyup_event(self, instance, keyboard, keycode): if self.keyboard_enabled: if self.root.ids.screen_manager.current == "messages_screen": @@ -1490,25 +1508,8 @@ class SidebandApp(MDApp): if text == "q": self.quit_action(self) - if text == "w": - if self.root.ids.screen_manager.current == "conversations_screen": - if self.include_conversations and not self.include_objects: - self.quit_action(self) - else: - self.conversations_action(direction="right") - elif self.root.ids.screen_manager.current == "map_settings_screen": - self.close_sub_map_action() - elif self.root.ids.screen_manager.current == "object_details_screen": - self.object_details_screen.close_action() - elif self.root.ids.screen_manager.current == "sensors_screen": - self.close_sub_telemetry_action() - elif self.root.ids.screen_manager.current == "icons_screen": - self.close_sub_telemetry_action() - elif self.root.ids.screen_manager.current == "utilities_screen": - self.close_sub_utilities_action() - else: - self.open_conversations(direction="right") - + if text == "w": self.close_handler() + if text == "s" or text == "d": if self.root.ids.screen_manager.current == "messages_screen": self.message_send_action() @@ -1594,38 +1595,12 @@ class SidebandApp(MDApp): # Handle escape/back if key == 27: if self.root.ids.screen_manager.current == "conversations_screen": - if not self.include_conversations and self.include_objects: - self.conversations_action(direction="right") + if not self.include_conversations and self.include_objects: self.conversations_action(direction="right") else: - if time.time() - self.last_exit_event < 2: - self.quit_action(self) - else: - self.last_exit_event = time.time() - - else: - if self.root.ids.screen_manager.current == "hardware_rnode_screen": - self.close_sub_hardware_action() - elif self.root.ids.screen_manager.current == "hardware_modem_screen": - self.close_sub_hardware_action() - elif self.root.ids.screen_manager.current == "hardware_serial_screen": - self.close_sub_hardware_action() - elif self.root.ids.screen_manager.current == "object_details_screen": - self.object_details_screen.close_action() - elif self.root.ids.screen_manager.current == "map_settings_screen": - self.close_sub_map_action() - elif self.root.ids.screen_manager.current == "sensors_screen": - self.close_sub_telemetry_action() - elif self.root.ids.screen_manager.current == "icons_screen": - self.close_sub_telemetry_action() - elif self.root.ids.screen_manager.current == "rnstatus_screen": - self.close_sub_utilities_action() - elif self.root.ids.screen_manager.current == "logviewer_screen": - self.close_sub_utilities_action() - elif self.root.ids.screen_manager.current == "voice_settings_screen": - self.close_sub_voice_action() - else: - self.open_conversations(direction="right") + if time.time() - self.last_exit_event < 2: self.quit_action(self) + else: self.last_exit_event = time.time() + else: self.close_handler() return True def widget_hide(self, w, hide=True): @@ -2782,20 +2757,17 @@ class SidebandApp(MDApp): dialog = MDDialog( title="Connectivity Status", text=str(self.get_connectivity_text()), - buttons=[full_button, yes_button], - # elevation=0, - ) - def cs_updater(dt): - dialog.text = str(self.get_connectivity_text()) + buttons=[full_button, yes_button]) + def cs_updater(dt): dialog.text = str(self.get_connectivity_text()) + def dl_yes(s): dialog.dismiss() - if self.connectivity_updater != None: - self.connectivity_updater.cancel() + if self.connectivity_updater != None: self.connectivity_updater.cancel() + def cb_rns(sender): dialog.dismiss() - if self.connectivity_updater != None: - self.connectivity_updater.cancel() - self.rnstatus_action() + if self.connectivity_updater != None: self.connectivity_updater.cancel() + self.rnstatus_action(from_conversations=True) yes_button.bind(on_release=dl_yes) full_button.bind(on_release=cb_rns) @@ -2807,12 +2779,11 @@ class SidebandApp(MDApp): self.connectivity_updater = Clock.schedule_interval(cs_updater, 2.0) else: - self.rnstatus_action() + self.rnstatus_action(from_conversations=True) - def rnstatus_action(self, sender=None): - if not self.utilities_ready: - self.utilities_init() - self.utilities_screen.rnstatus_action() + def rnstatus_action(self, sender=None, from_conversations=False): + if not self.utilities_ready: self.utilities_init() + self.utilities_screen.rnstatus_action(from_conversations=from_conversations) def ingest_lxm_action(self, sender): def cb(dt): diff --git a/sbapp/ui/utilities.py b/sbapp/ui/utilities.py index 80dd163..aa8da1b 100644 --- a/sbapp/ui/utilities.py +++ b/sbapp/ui/utilities.py @@ -81,13 +81,14 @@ class Utilities(): ### rnstatus screen ###################################### - def rnstatus_action(self, sender=None): + def rnstatus_action(self, sender=None, from_conversations=False): if not self.app.root.ids.screen_manager.has_screen("rnstatus_screen"): self.rnstatus_screen = Builder.load_string(layout_rnstatus_screen) self.rnstatus_screen.app = self.app self.rnstatus_screen.delegate = self self.app.root.ids.screen_manager.add_widget(self.rnstatus_screen) + self.rnstatus_screen.from_conversations = from_conversations self.app.root.ids.screen_manager.transition.direction = "left" self.app.root.ids.screen_manager.current = "rnstatus_screen" self.app.sideband.setstate("app.displaying", self.app.root.ids.screen_manager.current) @@ -97,6 +98,10 @@ class Utilities(): def update_rnstatus(self, sender=None): threading.Thread(target=self.update_rnstatus_job, daemon=True).start() + def close_rnstatus_action(self, sender=None): + if not self.rnstatus_screen.from_conversations: self.app.close_sub_utilities_action() + else: self.app.close_any_action() + def update_rnstatus_job(self, sender=None): if self.rnstatus_instance == None: import RNS.Utilities.rnstatus as rnstatus @@ -319,7 +324,7 @@ MDScreen: right_action_items: [ # ['refresh', lambda x: root.delegate.update_rnstatus()], - ['close', lambda x: root.app.close_sub_utilities_action(self)], + ['close', lambda x: root.delegate.close_rnstatus_action(self)], ] MDScrollView: