| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- # -*- 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)
|