mirror of
https://github.com/onyx-and-iris/q3rcon-tui.git
synced 2026-02-26 11:09:11 +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