From 96a7f91cf5080133d7f298f3517a96c31839cf3b Mon Sep 17 00:00:00 2001 From: sbkelley Date: Tue, 2 Dec 2025 20:37:09 -0500 Subject: [PATCH] Reorganize SettingsBlock etc --- src/obs_ctl/app.py | 26 +++++++---------- src/obs_ctl/interface/__init__.py | 3 +- src/obs_ctl/interface/element/bool_control.py | 2 +- src/obs_ctl/interface/message.py | 2 +- src/obs_ctl/interface/molecule/__init__.py | 5 ++-- .../interface/molecule/record_controls.py | 2 +- .../molecule/settings_block/__init__.py | 1 + .../molecule/settings_block/pane/__init__.py | 1 + .../pane/obs_settings.py} | 29 ++++++++++++------- .../molecule/settings_block/settings_block.py | 15 ++++++++++ src/obs_ctl/interface/obs/obs.py | 2 +- 11 files changed, 55 insertions(+), 33 deletions(-) create mode 100644 src/obs_ctl/interface/molecule/settings_block/__init__.py create mode 100644 src/obs_ctl/interface/molecule/settings_block/pane/__init__.py rename src/obs_ctl/interface/molecule/{settings_pane.py => settings_block/pane/obs_settings.py} (61%) create mode 100644 src/obs_ctl/interface/molecule/settings_block/settings_block.py diff --git a/src/obs_ctl/app.py b/src/obs_ctl/app.py index b86a80d..7788982 100644 --- a/src/obs_ctl/app.py +++ b/src/obs_ctl/app.py @@ -1,14 +1,16 @@ import importlib.resources +from logging import getLogger from textual import on from textual.app import App -from textual.containers import Vertical, Horizontal, ScrollableContainer -from textual.widgets import Footer, Header, Placeholder, TabbedContent, TabPane +from textual.containers import Horizontal, ScrollableContainer +from textual.widgets import Footer, Header -from . import log, data -from .interface import RecordControls, StatsDisplay, OBSSettingsPane, obs +# need to import log to initalize logging +from . import data, log +from .interface import RecordControls, StatsDisplay, SettingsBlock, obs, settings_block -logger = log.getLogger(__name__) +logger = getLogger(__name__) class OBSCtlApp(App): @@ -22,13 +24,7 @@ class OBSCtlApp(App): with ScrollableContainer(id="content_container"): with Horizontal(id="blocks_h_container1", classes="blocks_h_containers"): yield RecordControls(id="record_controls") - with TabbedContent(id="settings_container", classes="blocks"): - with TabPane("OBS Settings", id="settings-tab"): - yield OBSSettingsPane(id="settings-content") - with TabPane("OBS Connection", id="connection-tab"): - yield Placeholder("CONNECTION BLOCK", id="conection-plc") - with TabPane("obs-ctl Settings", id="clients-tab"): - yield Placeholder("CLIENT SETTINGS BLOCK", id="client-plc") + yield SettingsBlock(id="settings_container") yield StatsDisplay(id="stats_display") @@ -82,15 +78,15 @@ class OBSCtlApp(App): getattr(api, query)(*args, **kwargs) - @on(OBSSettingsPane.RecordPathChanged, "#settings-content") - def on_settings_record_path_changed(self, message: OBSSettingsPane.RecordPathChanged): + @on(settings_block.pane.OBSSettings.RecordPathChanged, "#settings-content") + def on_settings_record_path_changed(self, message: settings_block.pane.OBSSettings.RecordPathChanged): api: obs.API = self.query_exactly_one("#api") api.set_record_path(message.record_path) def update_monitors(self, obs_stats: obs.OBSStats): record_controls: RecordControls = self.query_exactly_one("#record_controls") - obs_settings: OBSSettingsPane = self.query_exactly_one("#settings-content") + obs_settings: settings_block.pane.OBSSettings.RecordPathChanged = self.query_exactly_one("#settings-content") 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/__init__.py b/src/obs_ctl/interface/__init__.py index 71bdecc..fb735f2 100644 --- a/src/obs_ctl/interface/__init__.py +++ b/src/obs_ctl/interface/__init__.py @@ -1,3 +1,4 @@ """Provides RecordControls, OBSSettingsPane, StatsDisplay, and the obs module""" -from .molecule import RecordControls, OBSSettingsPane, StatsDisplay +from .molecule import RecordControls, SettingsBlock, StatsDisplay +from .molecule import settings_block from . import obs \ No newline at end of file diff --git a/src/obs_ctl/interface/element/bool_control.py b/src/obs_ctl/interface/element/bool_control.py index e7084e2..776bd70 100644 --- a/src/obs_ctl/interface/element/bool_control.py +++ b/src/obs_ctl/interface/element/bool_control.py @@ -6,7 +6,7 @@ from textual.reactive import reactive from textual.widgets import Button, RadioButton from ..message import MSGBase -from ...log import getLogger +from logging import getLogger logger = getLogger(__name__) diff --git a/src/obs_ctl/interface/message.py b/src/obs_ctl/interface/message.py index 583094d..e99cb64 100644 --- a/src/obs_ctl/interface/message.py +++ b/src/obs_ctl/interface/message.py @@ -1,7 +1,7 @@ from textual.message import Message from textual.widget import Widget -from ..log import getLogger +from logging import getLogger logger = getLogger(__name__) diff --git a/src/obs_ctl/interface/molecule/__init__.py b/src/obs_ctl/interface/molecule/__init__.py index f9c5df8..a880ff2 100644 --- a/src/obs_ctl/interface/molecule/__init__.py +++ b/src/obs_ctl/interface/molecule/__init__.py @@ -3,5 +3,6 @@ Uses obs_ctl.interface.element """ from .record_controls import RecordControls -from .settings_pane import OBSSettingsPane -from .stats_display import StatsDisplay \ No newline at end of file +from .settings_block import SettingsBlock +from .stats_display import StatsDisplay +from .settings_block import pane \ No newline at end of file diff --git a/src/obs_ctl/interface/molecule/record_controls.py b/src/obs_ctl/interface/molecule/record_controls.py index 9b1c4e2..ccea563 100644 --- a/src/obs_ctl/interface/molecule/record_controls.py +++ b/src/obs_ctl/interface/molecule/record_controls.py @@ -3,7 +3,7 @@ from textual.reactive import reactive from ..message import MSGBase from ..element import BoolControl -from ...log import getLogger +from logging import getLogger logger=getLogger(__name__) class RecordControls(ScrollableContainer): diff --git a/src/obs_ctl/interface/molecule/settings_block/__init__.py b/src/obs_ctl/interface/molecule/settings_block/__init__.py new file mode 100644 index 0000000..fc1939d --- /dev/null +++ b/src/obs_ctl/interface/molecule/settings_block/__init__.py @@ -0,0 +1 @@ +from .settings_block import SettingsBlock \ No newline at end of file diff --git a/src/obs_ctl/interface/molecule/settings_block/pane/__init__.py b/src/obs_ctl/interface/molecule/settings_block/pane/__init__.py new file mode 100644 index 0000000..df9cf12 --- /dev/null +++ b/src/obs_ctl/interface/molecule/settings_block/pane/__init__.py @@ -0,0 +1 @@ +from .obs_settings import OBSSettings \ No newline at end of file diff --git a/src/obs_ctl/interface/molecule/settings_pane.py b/src/obs_ctl/interface/molecule/settings_block/pane/obs_settings.py similarity index 61% rename from src/obs_ctl/interface/molecule/settings_pane.py rename to src/obs_ctl/interface/molecule/settings_block/pane/obs_settings.py index ea9c2b2..da897b9 100644 --- a/src/obs_ctl/interface/molecule/settings_pane.py +++ b/src/obs_ctl/interface/molecule/settings_block/pane/obs_settings.py @@ -1,13 +1,13 @@ from textual.containers import VerticalScroll, Grid from textual.message import Message from textual.reactive import reactive -from textual.widgets import Label, Input +from textual.widgets import Label, Input, TabPane -from ... import log +from logging import getLogger -logger = log.getLogger(__name__) +logger = getLogger(__name__) -class OBSSettingsPane(VerticalScroll): +class OBSSettings(TabPane): DEFAULT_CSS = """ .obssettingspane--input { width:1fr; @@ -28,22 +28,29 @@ class OBSSettingsPane(VerticalScroll): record_path: reactive[str] = reactive("") class RecordPathChanged(Message): - control: "OBSSettingsPane" = None + control: "OBSSettings" = None record_path: str = None def __init__(self, ctrl, path): super().__init__() self.control = ctrl self.record_path = path + + def __init__(self, *args, **kwargs): + super().__init__("OBS Settings", *args, **kwargs) + + def compose(self): - with Grid(): - yield Label("Record path:") - yield Input("path", id="input_record_path", classes="obssettingspane--input", compact=True) - + with VerticalScroll(): + with Grid(): + yield Label("Record path:") + yield Input("path", id="input_record_path", classes="obssettingspane--input", compact=True) + + def on_input_submitted(self, event:Input.Submitted): - self.set_reactive(OBSSettingsPane.record_path, event.value) + self.set_reactive(OBSSettings.record_path, event.value) if event.control.id == "input_record_path": - self.post_message(OBSSettingsPane.RecordPathChanged(self, event.value)) + self.post_message(OBSSettings.RecordPathChanged(self, event.value)) def watch_record_path(self, value): input: Input = self.query_exactly_one("#input_record_path") diff --git a/src/obs_ctl/interface/molecule/settings_block/settings_block.py b/src/obs_ctl/interface/molecule/settings_block/settings_block.py new file mode 100644 index 0000000..581405e --- /dev/null +++ b/src/obs_ctl/interface/molecule/settings_block/settings_block.py @@ -0,0 +1,15 @@ +from textual.widgets import TabbedContent, TabPane, Placeholder +from textual.containers import Container + +from . import pane + + +class SettingsBlock(Container): + + def compose(self): + with TabbedContent(classes="settings_block--tabbed-content"): + yield pane.OBSSettings(id="settings-content", classes="settings_block--obs_settings") + with TabPane("OBS Connection", id="connection-tab"): + yield Placeholder("CONNECTION BLOCK", id="conection-plc") + with TabPane("obs-ctl Settings", id="clients-tab"): + yield Placeholder("CLIENT SETTINGS BLOCK", id="client-plc") \ No newline at end of file diff --git a/src/obs_ctl/interface/obs/obs.py b/src/obs_ctl/interface/obs/obs.py index 92b30bc..2ae4e24 100644 --- a/src/obs_ctl/interface/obs/obs.py +++ b/src/obs_ctl/interface/obs/obs.py @@ -12,7 +12,7 @@ from textual.timer import Timer from textual.reactive import reactive from textual.widgets import Static -from ...log import getLogger +from logging import getLogger from ..message import MSGBase MS_TO_HOURS = 1 / 1000 / 60 / 60 -- 2.47.3