vpn/app/screens/components.py
2026-09-23 01:19:36 +00:00

52 lines
1.7 KiB
Python

from __future__ import annotations
from collections.abc import Callable
import flet as ft
from app.models import EngineState, RunMode
from app.theme import card
def connection_card(
state: EngineState,
mode: RunMode,
backend: str,
on_slide: Callable[[ft.ControlEvent], object],
enabled: bool = True,
) -> ft.Control:
labels = {
EngineState.STOPPED: "Отключено",
EngineState.STARTING: "Подключение…",
EngineState.RUNNING: "Подключено",
EngineState.STOPPING: "Отключение…",
EngineState.ERROR: "Ошибка",
EngineState.UNSUPPORTED: "Недоступно",
}
return card(
ft.Column(
[
ft.Text(labels[state], size=26, weight=ft.FontWeight.W_600),
ft.Text(f"{backend} · {mode.value}", color=ft.Colors.OUTLINE),
ft.Slider(
min=0,
max=1,
divisions=1,
value=1 if state in {EngineState.RUNNING, EngineState.STARTING} else 0,
label="Подключено"
if state is EngineState.RUNNING
else "Проведите для подключения" if enabled else "Недоступно",
disabled=not enabled,
on_change=on_slide if enabled else None,
),
],
spacing=8,
)
)
def section_title(title: str, subtitle: str | None = None) -> ft.Control:
controls: list[ft.Control] = [ft.Text(title, size=20, weight=ft.FontWeight.W_600)]
if subtitle:
controls.append(ft.Text(subtitle, color=ft.Colors.OUTLINE))
return ft.Column(controls, spacing=2)