Replace tabs with bordered titled sections in settings screen
Use border-title panels (General, Email Notifications, SSH, Web Dashboard) instead of TabbedContent for a cleaner visual layout. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user