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)