diff --git a/tui/gniza.tcss b/tui/gniza.tcss index 86262e8..f27569e 100644 --- a/tui/gniza.tcss +++ b/tui/gniza.tcss @@ -86,25 +86,19 @@ Select { margin: 0; } -#settings-screen TabbedContent { - height: 1fr; -} - -#settings-screen ContentSwitcher { +.settings-section { + height: auto; border: round $accent; - padding: 1; + padding: 1 2; + margin: 0 0 1 0; } -#settings-screen TabPane { - padding: 0 1; +.settings-section Static { + margin: 0; } -#settings-screen TabPane Static { - margin: 0 0 0 0; -} - -#settings-screen TabPane Input, -#settings-screen TabPane Select { +.settings-section Input, +.settings-section Select { margin: 0 0 1 0; } diff --git a/tui/screens/settings.py b/tui/screens/settings.py index 3da6bb6..0ecfc46 100644 --- a/tui/screens/settings.py +++ b/tui/screens/settings.py @@ -1,6 +1,6 @@ from textual.app import ComposeResult from textual.screen import Screen -from textual.widgets import Header, Footer, Static, Button, Input, Select, TabbedContent, TabPane +from textual.widgets import Header, Footer, Static, Button, Input, Select from tui.widgets.header import GnizaHeader as Header # noqa: F811 from textual.containers import Vertical, Horizontal from textual import work @@ -22,61 +22,60 @@ class SettingsScreen(Screen): with Horizontal(classes="screen-with-docs"): with Vertical(id="settings-screen"): yield Static("Settings", id="screen-title") - with TabbedContent(): - with TabPane("General", id="tab-general"): - yield Static("Log Level:") - yield Select( - [("Debug", "debug"), ("Info", "info"), ("Warning", "warn"), ("Error", "error")], - id="set-loglevel", - value=settings.log_level.lower(), - ) - yield Static("Log Retention (days):") - yield Input(value=settings.log_retain, id="set-logretain") - yield Static("Default Retention Count:") - yield Input(value=settings.retention_count, id="set-retention") - yield Static("Default Bandwidth Limit (KB/s, 0=unlimited):") - yield Input(value=settings.bwlimit, id="set-bwlimit") - yield Static("Disk Usage Threshold (%, 0=disable):") - yield Input(value=settings.disk_usage_threshold, id="set-diskthreshold") - yield Static("Extra rsync options:") - yield Input(value=settings.rsync_extra_opts, id="set-rsyncopts") - with TabPane("Email", id="tab-email"): - yield Static("Notification Email:") - yield Input(value=settings.notify_email, id="set-email") - yield Static("Notify On:") - yield Select( - [("Always", "always"), ("Failure only", "failure"), ("Never", "never")], - id="set-notifyon", - value=settings.notify_on, - ) - yield Static("SMTP Host:") - yield Input(value=settings.smtp_host, id="set-smtphost") - yield Static("SMTP Port:") - yield Input(value=settings.smtp_port, id="set-smtpport") - yield Static("SMTP User:") - yield Input(value=settings.smtp_user, id="set-smtpuser") - yield Static("SMTP Password:") - yield Input(value=settings.smtp_password, password=True, id="set-smtppass") - yield Static("SMTP From:") - yield Input(value=settings.smtp_from, id="set-smtpfrom") - yield Static("SMTP Security:") - yield Select( - [("TLS", "tls"), ("SSL", "ssl"), ("None", "none")], - id="set-smtpsec", - value=settings.smtp_security, - ) - with TabPane("SSH", id="tab-ssh"): - yield Static("SSH Timeout:") - yield Input(value=settings.ssh_timeout, id="set-sshtimeout") - yield Static("SSH Retries:") - yield Input(value=settings.ssh_retries, id="set-sshretries") - with TabPane("Web Dashboard", id="tab-web"): - yield Static("Port:") - yield Input(value=settings.web_port, id="set-web-port") - yield Static("Host:") - yield Input(value=settings.web_host, id="set-web-host") - yield Static("API Key:") - yield Input(value=settings.web_api_key, password=True, id="set-web-key") + with Vertical(classes="settings-section", id="section-general"): + yield Static("Log Level:") + yield Select( + [("Debug", "debug"), ("Info", "info"), ("Warning", "warn"), ("Error", "error")], + id="set-loglevel", + value=settings.log_level.lower(), + ) + yield Static("Log Retention (days):") + yield Input(value=settings.log_retain, id="set-logretain") + yield Static("Default Retention Count:") + yield Input(value=settings.retention_count, id="set-retention") + yield Static("Default Bandwidth Limit (KB/s, 0=unlimited):") + yield Input(value=settings.bwlimit, id="set-bwlimit") + yield Static("Disk Usage Threshold (%, 0=disable):") + yield Input(value=settings.disk_usage_threshold, id="set-diskthreshold") + yield Static("Extra rsync options:") + yield Input(value=settings.rsync_extra_opts, id="set-rsyncopts") + with Vertical(classes="settings-section", id="section-email"): + yield Static("Notification Email:") + yield Input(value=settings.notify_email, id="set-email") + yield Static("Notify On:") + yield Select( + [("Always", "always"), ("Failure only", "failure"), ("Never", "never")], + id="set-notifyon", + value=settings.notify_on, + ) + yield Static("SMTP Host:") + yield Input(value=settings.smtp_host, id="set-smtphost") + yield Static("SMTP Port:") + yield Input(value=settings.smtp_port, id="set-smtpport") + yield Static("SMTP User:") + yield Input(value=settings.smtp_user, id="set-smtpuser") + yield Static("SMTP Password:") + yield Input(value=settings.smtp_password, password=True, id="set-smtppass") + yield Static("SMTP From:") + yield Input(value=settings.smtp_from, id="set-smtpfrom") + yield Static("SMTP Security:") + yield Select( + [("TLS", "tls"), ("SSL", "ssl"), ("None", "none")], + id="set-smtpsec", + value=settings.smtp_security, + ) + with Vertical(classes="settings-section", id="section-ssh"): + yield Static("SSH Timeout:") + yield Input(value=settings.ssh_timeout, id="set-sshtimeout") + yield Static("SSH Retries:") + yield Input(value=settings.ssh_retries, id="set-sshretries") + with Vertical(classes="settings-section", id="section-web"): + yield Static("Port:") + yield Input(value=settings.web_port, id="set-web-port") + yield Static("Host:") + yield Input(value=settings.web_host, id="set-web-host") + yield Static("API Key:") + yield Input(value=settings.web_api_key, password=True, id="set-web-key") with Horizontal(id="set-buttons"): yield Button("Save", variant="primary", id="btn-save") yield Button("Send Test Email", id="btn-test-email") @@ -84,6 +83,12 @@ class SettingsScreen(Screen): yield DocsPanel.for_screen("settings-screen") yield Footer() + def on_mount(self) -> None: + self.query_one("#section-general").border_title = "General" + self.query_one("#section-email").border_title = "Email Notifications" + self.query_one("#section-ssh").border_title = "SSH" + self.query_one("#section-web").border_title = "Web Dashboard" + def on_button_pressed(self, event: Button.Pressed) -> None: if event.button.id == "btn-back": self.app.pop_screen()