52 lines
1.7 KiB
Python
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)
|