# -*- coding: utf-8 -*- """ Satellite SubView: Info (F1). Zeigt allgemeine Informationen zum ausgewaehlten Satellite: Uptime, Hostname, IP, Ping, MAC, Version, OS. """ 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 SatInfoView(MainView): """F1 im Satellite-Kontext: Allgemeine Informationen.""" TITLE = "Info" VIEW_ID = "sat_info" 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]Allgemein[/bold]", classes="section-header") yield StatusTable(id="sat-info-general") with Vertical(classes="section-box"): yield Static("[bold]System[/bold]", classes="section-header") yield StatusTable(id="sat-info-system") with Vertical(classes="section-box"): yield Static("[bold]Netzwerk[/bold]", classes="section-header") yield StatusTable(id="sat-info-network") async def on_activate(self) -> None: """Laedt und zeigt die Satellite-Infos.""" 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 # Allgemein general = self.query_one("#sat-info-general", StatusTable) general.update_data([ ("Alias", d.alias or "Unbekannt"), ("Raum", d.room_id or ""), ("MAC-Adresse", d.mac_address or ""), ("Version", d.version or "Unbekannt"), ]) # System system = self.query_one("#sat-info-system", StatusTable) hostname = d.hostname or "Unbekannt" os_info = "" if d.os_name: os_info = d.os_name if d.os_version: os_info += f" {d.os_version}" uptime_str = "" if d.uptime_seconds > 0: hours = int(d.uptime_seconds // 3600) minutes = int((d.uptime_seconds % 3600) // 60) uptime_str = f"{hours}h {minutes}m" system.update_data([ ("Hostname", hostname), ("Betriebssystem", os_info or "Unbekannt"), ("Uptime", uptime_str or "Unbekannt"), ]) # Netzwerk network = self.query_one("#sat-info-network", StatusTable) ping_str = "" if d.ping_ms >= 0: ping_str = f"{d.ping_ms:.0f} ms" network.update_data([ ("IP-Adresse", d.ip_address or "Unbekannt"), ("Ping", ping_str or "Unbekannt"), ])