From 239dae3fd65b23b822a31aec69288116e85d3d94 Mon Sep 17 00:00:00 2001 From: sbkelley Date: Fri, 5 Dec 2025 20:30:22 -0500 Subject: [PATCH] Finish connection settings --- src/obs_ctl/app.py | 4 ++-- .../interface/molecule/settings_block/pane.py | 15 ++++++++++++--- src/obs_ctl/interface/obs/obs.py | 6 +++++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/obs_ctl/app.py b/src/obs_ctl/app.py index 2660c23..079cd9f 100644 --- a/src/obs_ctl/app.py +++ b/src/obs_ctl/app.py @@ -87,7 +87,7 @@ class OBSCtlApp(App): timeout_setting = obs_websocket_pane.timeout self._query_api("connect", host=host_setting, port=port_setting, password=password_setting, timeout=timeout_setting) if api.is_connected: - obs_websocket_pane.disabled = True + obs_websocket_pane.disable_contents() @on(RecordControls.OBSWSDisconnected, "#record_controls") @@ -96,7 +96,7 @@ class OBSCtlApp(App): obs_websocket_pane = self.query_exactly_one("#obs_websocket_pane") self._query_api("disconnect") if not api.is_connected: - obs_websocket_pane.disabled = False + obs_websocket_pane.enable_contents() def _query_api(self, query: str, *args, **kwargs): diff --git a/src/obs_ctl/interface/molecule/settings_block/pane.py b/src/obs_ctl/interface/molecule/settings_block/pane.py index c61d49f..ed3739d 100644 --- a/src/obs_ctl/interface/molecule/settings_block/pane.py +++ b/src/obs_ctl/interface/molecule/settings_block/pane.py @@ -17,6 +17,15 @@ class SettingsMSGBase(MSGBase): super().__init__(control, _log_me=_log_me) self.value = value +class PaneBase(TabPane): + def disable_contents(self): + container: ScrollableContainer = self.query_exactly_one(".--container") + container.disabled = True + + def enable_contents(self): + container: ScrollableContainer = self.query_exactly_one(".--container") + container.disabled = False + class SettingsType(Enum): """(widget_class, setting type, listener message, widget-expected type)""" STRING = (partial(Input, compact=True), str, Input.Submitted, str) @@ -44,7 +53,7 @@ class SettingsType(Enum): return self.value[3] -def make_pane_subclass(cls_name: str, settings_list: list, settings_type_list: list, defaults_list) -> TabPane: +def make_pane_subclass(cls_name: str, settings_list: list, settings_type_list: list, defaults_list) -> PaneBase: """Creates a new TabPane subclass with cls_name as its name. settings_list should be a list of names for settings. @@ -79,7 +88,7 @@ def make_pane_subclass(cls_name: str, settings_list: list, settings_type_list: l def make_compose(): def output_func(self): - with ScrollableContainer(): + with ScrollableContainer(classes="--container"): with Grid(): for setting, control_and_type, setting_default in loop_list: ctrl_id = f"{setting_type.widget.func.__name__.lower()}_{setting}" @@ -120,7 +129,7 @@ def make_pane_subclass(cls_name: str, settings_list: list, settings_type_list: l new_dict["compose"] = make_compose() # Construct the actual class and return it - new_pane = type(cls_name, (TabPane,), new_dict) + new_pane = type(cls_name, (PaneBase,), new_dict) return new_pane def snake_to_camel(string: str): diff --git a/src/obs_ctl/interface/obs/obs.py b/src/obs_ctl/interface/obs/obs.py index b49a5d8..656a746 100644 --- a/src/obs_ctl/interface/obs/obs.py +++ b/src/obs_ctl/interface/obs/obs.py @@ -316,6 +316,10 @@ class API(Static): port = self.ws_port if port is None else port password = self.ws_password if password is None else password timeout = self.ws_timeout if timeout is None else timeout + self.ws_host = host + self.ws_port = port + self.ws_password = password + self.ws_timeout = timeout try: logger.info(f"Connecting to OBS WebSocket at {host}:{port}") self.request_client = obs.ReqClient( @@ -330,7 +334,7 @@ class API(Static): password=password, timeout=timeout ) - except ConnectionRefusedError as err: + except (ConnectionRefusedError, TimeoutError) as err: logger.debug(err) else: self.is_connected = True -- 2.47.3