# -*- coding: utf-8 -*- """ Satellite SubView: Connection (F2). Zeigt Verbindungsinformationen pro Socket-Stream: Command, Audio Input, Audio Output, Music Output. """ from __future__ import annotations from textual.app import ComposeResult from textual.containers import Vertical from textual.widgets import Static from trixy_core.tui.views.base import MainView from trixy_core.tui.widgets.status_table import StatusTable class SatConnectionView(MainView): """F2 im Satellite-Kontext: Verbindungsinformationen.""" TITLE = "Verbindung" VIEW_ID = "sat_connection" def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self._sat_data: dict = {} self._detail_data: object | None = None self._refresh_counter: int = 0 def set_satellite(self, sat_data: dict) -> None: """Setzt die Satellite-Basisdaten.""" self._sat_data = sat_data def compose(self) -> ComposeResult: with Vertical(classes="section-box"): yield Static("[bold]Command Socket[/bold]", classes="section-header") yield StatusTable(id="sat-conn-command") with Vertical(classes="section-box"): yield Static("[bold]Audio Input Stream[/bold]", classes="section-header") yield StatusTable(id="sat-conn-audio-in") with Vertical(classes="section-box"): yield Static("[bold]Audio Output Stream[/bold]", classes="section-header") yield StatusTable(id="sat-conn-audio-out") with Vertical(classes="section-box"): yield Static("[bold]Music Output Stream[/bold]", classes="section-header") yield StatusTable(id="sat-conn-music-out") async def on_activate(self) -> None: """Laedt und zeigt die Verbindungsinfos.""" await self._load_detail() async def refresh_data(self) -> None: """Periodisches Update (alle 10 Sekunden).""" self._refresh_counter += 1 if self._refresh_counter % 5 == 0: await self._load_detail() async def _load_detail(self) -> None: """Laedt detaillierte Satellite-Daten vom Server.""" if not self.connection or not self._sat_data: return sat_id = self._sat_data.get("satellite_id", "") if not sat_id: return try: detail = await self.connection.request_satellite_detail(sat_id) except Exception: return if detail is None or detail.error: return self._detail_data = detail self._update_display() def _update_display(self) -> None: """Aktualisiert die Anzeige.""" d = self._detail_data if d is None: return sockets = d.sockets if hasattr(d, "sockets") else {} if isinstance(sockets, dict): self._update_socket_table("#sat-conn-command", sockets.get("command", {})) self._update_socket_table("#sat-conn-audio-in", sockets.get("audio_in", {})) self._update_socket_table("#sat-conn-audio-out", sockets.get("audio_out", {})) self._update_socket_table("#sat-conn-music-out", sockets.get("music_out", {})) def _update_socket_table(self, table_id: str, sock_info: dict) -> None: """Aktualisiert eine einzelne Socket-Tabelle.""" table = self.query_one(table_id, StatusTable) if not sock_info: table.update_data([("Status", "[dim]Keine Daten[/dim]")]) return connected = sock_info.get("connected", False) if connected: status = "[green]Verbunden[/green]" else: status = "[red]Getrennt[/red]" rows = [("Status", status)] ip = sock_info.get("ip", "") port = sock_info.get("port", 0) if ip: rows.append(("Adresse", f"{ip}:{port}")) table.update_data(rows)