| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- # -*- coding: utf-8 -*-
- """
- Satellite-Detail SubMainView.
- Zeigt detaillierte Informationen zu einem einzelnen Satellite.
- Wird als F3-SubMainView (Server) oder als direkter MainView (Client) angezeigt.
- """
- 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 SatelliteDetailView(MainView):
- """
- Detail-Ansicht fuer einen einzelnen Satellite.
- Zeigt Verbindungsinfo, Raum, MAC-Adresse, Version und
- Konversations-Status. Wird periodisch aktualisiert.
- """
- TITLE = "Satellite"
- VIEW_ID = "satellite_detail"
- def __init__(self, sat_data: dict | None = None, **kwargs) -> None:
- super().__init__(**kwargs)
- self._sat_data: dict = sat_data or {}
- self._refresh_counter: int = 0
- @property
- def sat_data(self) -> dict:
- """Satellite-Daten."""
- return self._sat_data
- @sat_data.setter
- def sat_data(self, value: dict) -> None:
- self._sat_data = value
- def compose(self) -> ComposeResult:
- with Vertical(classes="section-box"):
- yield Static("[bold]Info[/bold]", classes="section-header")
- yield StatusTable(id="sat-detail-info")
- with Vertical(classes="section-box"):
- yield Static("[bold]Verbindung[/bold]", classes="section-header")
- yield StatusTable(id="sat-detail-connection")
- with Vertical(classes="section-box"):
- yield Static("[bold]Konversation[/bold]", classes="section-header")
- yield StatusTable(id="sat-detail-conversation")
- async def on_activate(self) -> None:
- """Zeigt die Satellite-Details an."""
- self._update_display()
- async def refresh_data(self) -> None:
- """Periodisches Update (alle 10 Sekunden)."""
- self._refresh_counter += 1
- if self._refresh_counter % 5 == 0:
- await self._reload_satellite()
- async def _reload_satellite(self) -> None:
- """Laedt aktualisierte Satellite-Daten vom Server."""
- if not self.connection or not self._sat_data:
- return
- try:
- response = await self.connection.request_satellites()
- except Exception:
- return
- if response is None:
- return
- # Unseren Satellite in der Liste finden
- sat_id = self._sat_data.get("satellite_id", "")
- for sat in response.satellites:
- if sat.get("satellite_id") == sat_id:
- self._sat_data = sat
- self._update_display()
- return
- def _update_display(self) -> None:
- """Aktualisiert die Anzeige mit den aktuellen Daten."""
- sat = self._sat_data
- if not sat:
- return
- # Info-Tabelle
- info_table = self.query_one("#sat-detail-info", StatusTable)
- info_table.update_data([
- ("Alias", sat.get("alias", "Unbekannt")),
- ("Raum", sat.get("room_id", "")),
- ("MAC-Adresse", sat.get("mac_address", "")),
- ("Version", sat.get("version", "") or "Unbekannt"),
- ("Registriert", sat.get("registered_at", "") or "Unbekannt"),
- ])
- # Verbindungs-Tabelle
- conn_table = self.query_one("#sat-detail-connection", StatusTable)
- connected = sat.get("connected", False)
- if connected:
- status = "[green]Verbunden[/green]"
- else:
- status = "[red]Getrennt[/red]"
- conn_rows = [
- ("Status", status),
- ("IP-Adresse", sat.get("ip_address", "") or "Unbekannt"),
- ]
- connected_at = sat.get("connected_at", "")
- if connected_at:
- conn_rows.append(("Verbunden seit", connected_at))
- conn_table.update_data(conn_rows)
- # Konversations-Tabelle
- conv_table = self.query_one("#sat-detail-conversation", StatusTable)
- has_conv = sat.get("has_active_conversation", False)
- if has_conv:
- conv_status = "[yellow]Aktiv[/yellow]"
- else:
- conv_status = "Keine"
- conv_table.update_data([
- ("Konversation", conv_status),
- ])
- def update_satellite(self, sat_data: dict) -> None:
- """Setzt neue Satellite-Daten und aktualisiert die Anzeige."""
- self._sat_data = sat_data
- self._update_display()
|