mirror of
https://github.com/onyx-and-iris/q3rcon-tui.git
synced 2026-02-26 03:09:09 +00:00
move settings and configscreen into their own files
rename tcss file
This commit is contained in:
parent
c62d18289b
commit
8d11f60201
64
src/q3rcon_tui/configscreen.py
Normal file
64
src/q3rcon_tui/configscreen.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
from textual.app import ComposeResult
|
||||||
|
from textual.containers import Horizontal, Vertical
|
||||||
|
from textual.screen import ModalScreen
|
||||||
|
from textual.widgets import Button, Input, Label, Static
|
||||||
|
|
||||||
|
from .settings import settings
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigScreen(ModalScreen[bool]):
|
||||||
|
"""Modal dialog for configuring connection settings."""
|
||||||
|
|
||||||
|
def __init__(self, current_host: str, current_port: int, current_password: str):
|
||||||
|
super().__init__()
|
||||||
|
self.current_host = current_host
|
||||||
|
self.current_port = current_port
|
||||||
|
self.current_password = current_password
|
||||||
|
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
with Vertical(id='config-dialog'):
|
||||||
|
yield Static('Connection Configuration', id='config-title')
|
||||||
|
with Vertical(id='config-form'):
|
||||||
|
yield Label('Host:')
|
||||||
|
yield Input(
|
||||||
|
value=self.current_host, placeholder='localhost', id='host-input'
|
||||||
|
)
|
||||||
|
yield Label('Port:')
|
||||||
|
yield Input(
|
||||||
|
value=str(self.current_port), placeholder='28960', id='port-input'
|
||||||
|
)
|
||||||
|
yield Label('Password:')
|
||||||
|
yield Input(
|
||||||
|
value=self.current_password,
|
||||||
|
placeholder='Enter password',
|
||||||
|
password=True,
|
||||||
|
id='password-input',
|
||||||
|
)
|
||||||
|
with Horizontal(id='config-buttons'):
|
||||||
|
yield Button('Save', variant='success', id='config-save')
|
||||||
|
yield Button('Cancel', variant='error', id='config-cancel')
|
||||||
|
|
||||||
|
def on_button_pressed(self, event: Button.Pressed) -> None:
|
||||||
|
if event.button.id == 'config-save':
|
||||||
|
try:
|
||||||
|
new_host = (
|
||||||
|
self.query_one('#host-input', Input).value.strip() or 'localhost'
|
||||||
|
)
|
||||||
|
new_port = int(self.query_one('#port-input', Input).value or '28960')
|
||||||
|
new_password = self.query_one('#password-input', Input).value
|
||||||
|
|
||||||
|
if new_port < 1 or new_port > 65535:
|
||||||
|
raise ValueError('Port must be between 1 and 65535')
|
||||||
|
|
||||||
|
if len(new_password) < 8:
|
||||||
|
raise ValueError('Password must be at least 8 characters long')
|
||||||
|
|
||||||
|
settings.host = new_host
|
||||||
|
settings.port = new_port
|
||||||
|
settings.password = new_password
|
||||||
|
|
||||||
|
self.dismiss(True)
|
||||||
|
except ValueError:
|
||||||
|
self.app.bell()
|
||||||
|
elif event.button.id == 'config-cancel':
|
||||||
|
self.dismiss(False)
|
||||||
67
src/q3rcon_tui/settings.py
Normal file
67
src/q3rcon_tui/settings.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from typing import Annotated, Type
|
||||||
|
|
||||||
|
from loguru import logger
|
||||||
|
from pydantic import AfterValidator, BeforeValidator
|
||||||
|
from pydantic_settings import BaseSettings, CliSettingsSource, SettingsConfigDict
|
||||||
|
|
||||||
|
from .__about__ import __version__ as version
|
||||||
|
|
||||||
|
|
||||||
|
def version_callback(value: bool) -> bool | None:
|
||||||
|
if value:
|
||||||
|
print(f'q3rcon-tui version: {version}')
|
||||||
|
raise SystemExit(0)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_valid_password(password: str) -> str | None:
|
||||||
|
if len(password) < 8:
|
||||||
|
raise ValueError('Password must be at least 8 characters long')
|
||||||
|
return password
|
||||||
|
|
||||||
|
|
||||||
|
class Settings(BaseSettings):
|
||||||
|
host: str = 'localhost'
|
||||||
|
port: int = 28960
|
||||||
|
password: Annotated[str, AfterValidator(is_valid_password)] = ''
|
||||||
|
append: bool = False
|
||||||
|
raw: bool = False
|
||||||
|
version: Annotated[bool, BeforeValidator(version_callback)] = False
|
||||||
|
|
||||||
|
model_config = SettingsConfigDict(
|
||||||
|
env_file=(
|
||||||
|
'.env',
|
||||||
|
Path.home() / '.config' / 'q3rcon-tui' / 'config.env',
|
||||||
|
),
|
||||||
|
env_file_encoding='utf-8',
|
||||||
|
env_prefix='Q3RCON_TUI_',
|
||||||
|
cli_prefix='',
|
||||||
|
cli_parse_args=True,
|
||||||
|
cli_implicit_flags=True,
|
||||||
|
validate_assignment=False,
|
||||||
|
frozen=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def settings_customise_sources(
|
||||||
|
cls,
|
||||||
|
settings_cls: Type[BaseSettings],
|
||||||
|
init_settings: ...,
|
||||||
|
env_settings: ...,
|
||||||
|
dotenv_settings: ...,
|
||||||
|
file_secret_settings: ...,
|
||||||
|
) -> tuple:
|
||||||
|
return (
|
||||||
|
CliSettingsSource(settings_cls),
|
||||||
|
env_settings,
|
||||||
|
dotenv_settings,
|
||||||
|
init_settings,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
settings = Settings()
|
||||||
|
except ValueError as e:
|
||||||
|
logger.error(e)
|
||||||
|
raise SystemExit(1)
|
||||||
Loading…
x
Reference in New Issue
Block a user