From 0da55ae80942339c38d53b88ef7658d2790f49bd Mon Sep 17 00:00:00 2001 From: sbkelley Date: Fri, 5 Dec 2025 22:39:31 -0500 Subject: [PATCH] add stubs for tab panes --- src/obs_ctl/app.py | 6 ++-- .../molecule/settings_block/pane.pyi | 29 ++++++++++++++++ .../settings_block/settings_block.pyi | 34 +++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 src/obs_ctl/interface/molecule/settings_block/pane.pyi create mode 100644 src/obs_ctl/interface/molecule/settings_block/settings_block.pyi diff --git a/src/obs_ctl/app.py b/src/obs_ctl/app.py index 079cd9f..af00def 100644 --- a/src/obs_ctl/app.py +++ b/src/obs_ctl/app.py @@ -80,7 +80,7 @@ class OBSCtlApp(App): @on(RecordControls.OBSWSConnected, "#record_controls") def on_obs_ws_connected(self, message: RecordControls.OBSWSConnected): api: obs.API = self.query_exactly_one("#api") - obs_websocket_pane = self.query_exactly_one("#obs_websocket_pane") + obs_websocket_pane: OBSWebSocketPane = self.query_exactly_one("#obs_websocket_pane") host_setting = obs_websocket_pane.host port_setting = obs_websocket_pane.port password_setting = obs_websocket_pane.password @@ -93,7 +93,7 @@ class OBSCtlApp(App): @on(RecordControls.OBSWSDisconnected, "#record_controls") def on_obs_ws_disconnected(self, message: RecordControls.OBSWSDisconnected): api: obs.API = self.query_exactly_one("#api") - obs_websocket_pane = self.query_exactly_one("#obs_websocket_pane") + obs_websocket_pane: OBSWebSocketPane = self.query_exactly_one("#obs_websocket_pane") self._query_api("disconnect") if not api.is_connected: obs_websocket_pane.enable_contents() @@ -111,7 +111,7 @@ class OBSCtlApp(App): def update_monitors(self, obs_stats: obs.OBSStats): record_controls: RecordControls = self.query_exactly_one("#record_controls") - obs_settings = self.query_exactly_one("#obs_settings_pane") + obs_settings: OBSSettingsPane = self.query_exactly_one("#obs_settings_pane") stats_display: StatsDisplay = self.query_exactly_one("#stats_display") record_controls.obsws_connected = obs_stats.obsws_connection_active diff --git a/src/obs_ctl/interface/molecule/settings_block/pane.pyi b/src/obs_ctl/interface/molecule/settings_block/pane.pyi new file mode 100644 index 0000000..aad9354 --- /dev/null +++ b/src/obs_ctl/interface/molecule/settings_block/pane.pyi @@ -0,0 +1,29 @@ +from typing import Any, Self, TypeVar +from enum import Enum +from functools import partial +from textual.message import Message +from textual.widget import Widget +from textual.widgets import TabPane, Input +from ...message import MSGBase + +class SettingsMSGBase(MSGBase): + value: Any + def __init__(self: Self, control: Widget, value: any, _log_me: bool): ... + +class PaneBase(TabPane): + def disable_contents(self: Self) -> None: ... + def enable_contents(self: Self) -> None: ... + +class SettingsType(Enum): + STRING = None + FLOAT = None + INT = None + widget: partial[Widget] + type: type + msg: Message + expected_type: type + +class MakePaneSubclassResult(PaneBase): + DEFAULT_CSS: str + +def make_pane_subclass(cls_name: str, settings: list[str], settings_type_list: list[SettingsType], defaults_list: list[Any]) -> MakePaneSubclassResult: ... \ No newline at end of file diff --git a/src/obs_ctl/interface/molecule/settings_block/settings_block.pyi b/src/obs_ctl/interface/molecule/settings_block/settings_block.pyi new file mode 100644 index 0000000..80cbfe9 --- /dev/null +++ b/src/obs_ctl/interface/molecule/settings_block/settings_block.pyi @@ -0,0 +1,34 @@ +from typing import Self, TypeVar +from textual.containers import Container +from textual.widgets import TabPane +from textual.reactive import reactive +from textual.message import Message +from .pane import PaneBase, SettingsMSGBase, SettingsType + +class OBSSettingsPane(PaneBase): + record_path: reactive[str] + class RecordPathChanged(SettingsMSGBase): ... + def watch_record_path(self: Self, value: str): ... + def on_record_path_changed(self: Self, event: Message): ... + +class OBSWebSocketPane(PaneBase): + host: reactive[str] + port: reactive[int] + password: reactive[str] + timeout: reactive[float] + class HostChanged(SettingsMSGBase): ... + class PortChanged(SettingsMSGBase): ... + class PasswordChanged(SettingsMSGBase): ... + class TimeoutChanged(SettingsMSGBase): ... + def watch_host(self: Self, value: str): ... + def watch_port(self: Self, value: int): ... + def watch_password(self: Self, value: str): ... + def watch_timeout(self: Self, value: float): ... + def on_host_changed(self: Self, event: Message): ... + def on_port_changed(self: Self, event: Message): ... + def on_password_changed(self: Self, event: Message): ... + def on_timeout_changed(self: Self, event: Message): ... + +class OBSCTLPane(PaneBase): ... + +class SettingsBlock(Container): ... \ No newline at end of file -- 2.47.3