satellite_detail_view.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- coding: utf-8 -*-
  2. """
  3. Satellite-Detail SubMainView.
  4. Zeigt detaillierte Informationen zu einem einzelnen Satellite.
  5. Wird als F3-SubMainView (Server) oder als direkter MainView (Client) angezeigt.
  6. """
  7. from __future__ import annotations
  8. from textual.app import ComposeResult
  9. from textual.containers import Vertical
  10. from textual.widgets import Static
  11. from trixy_core.tui.views.base import MainView
  12. from trixy_core.tui.widgets.status_table import StatusTable
  13. class SatelliteDetailView(MainView):
  14. """
  15. Detail-Ansicht fuer einen einzelnen Satellite.
  16. Zeigt Verbindungsinfo, Raum, MAC-Adresse, Version und
  17. Konversations-Status. Wird periodisch aktualisiert.
  18. """
  19. TITLE = "Satellite"
  20. VIEW_ID = "satellite_detail"
  21. def __init__(self, sat_data: dict | None = None, **kwargs) -> None:
  22. super().__init__(**kwargs)
  23. self._sat_data: dict = sat_data or {}
  24. self._refresh_counter: int = 0
  25. @property
  26. def sat_data(self) -> dict:
  27. """Satellite-Daten."""
  28. return self._sat_data
  29. @sat_data.setter
  30. def sat_data(self, value: dict) -> None:
  31. self._sat_data = value
  32. def compose(self) -> ComposeResult:
  33. with Vertical(classes="section-box"):
  34. yield Static("[bold]Info[/bold]", classes="section-header")
  35. yield StatusTable(id="sat-detail-info")
  36. with Vertical(classes="section-box"):
  37. yield Static("[bold]Verbindung[/bold]", classes="section-header")
  38. yield StatusTable(id="sat-detail-connection")
  39. with Vertical(classes="section-box"):
  40. yield Static("[bold]Konversation[/bold]", classes="section-header")
  41. yield StatusTable(id="sat-detail-conversation")
  42. async def on_activate(self) -> None:
  43. """Zeigt die Satellite-Details an."""
  44. self._update_display()
  45. async def refresh_data(self) -> None:
  46. """Periodisches Update (alle 10 Sekunden)."""
  47. self._refresh_counter += 1
  48. if self._refresh_counter % 5 == 0:
  49. await self._reload_satellite()
  50. async def _reload_satellite(self) -> None:
  51. """Laedt aktualisierte Satellite-Daten vom Server."""
  52. if not self.connection or not self._sat_data:
  53. return
  54. try:
  55. response = await self.connection.request_satellites()
  56. except Exception:
  57. return
  58. if response is None:
  59. return
  60. # Unseren Satellite in der Liste finden
  61. sat_id = self._sat_data.get("satellite_id", "")
  62. for sat in response.satellites:
  63. if sat.get("satellite_id") == sat_id:
  64. self._sat_data = sat
  65. self._update_display()
  66. return
  67. def _update_display(self) -> None:
  68. """Aktualisiert die Anzeige mit den aktuellen Daten."""
  69. sat = self._sat_data
  70. if not sat:
  71. return
  72. # Info-Tabelle
  73. info_table = self.query_one("#sat-detail-info", StatusTable)
  74. info_table.update_data([
  75. ("Alias", sat.get("alias", "Unbekannt")),
  76. ("Raum", sat.get("room_id", "")),
  77. ("MAC-Adresse", sat.get("mac_address", "")),
  78. ("Version", sat.get("version", "") or "Unbekannt"),
  79. ("Registriert", sat.get("registered_at", "") or "Unbekannt"),
  80. ])
  81. # Verbindungs-Tabelle
  82. conn_table = self.query_one("#sat-detail-connection", StatusTable)
  83. connected = sat.get("connected", False)
  84. if connected:
  85. status = "[green]Verbunden[/green]"
  86. else:
  87. status = "[red]Getrennt[/red]"
  88. conn_rows = [
  89. ("Status", status),
  90. ("IP-Adresse", sat.get("ip_address", "") or "Unbekannt"),
  91. ]
  92. connected_at = sat.get("connected_at", "")
  93. if connected_at:
  94. conn_rows.append(("Verbunden seit", connected_at))
  95. conn_table.update_data(conn_rows)
  96. # Konversations-Tabelle
  97. conv_table = self.query_one("#sat-detail-conversation", StatusTable)
  98. has_conv = sat.get("has_active_conversation", False)
  99. if has_conv:
  100. conv_status = "[yellow]Aktiv[/yellow]"
  101. else:
  102. conv_status = "Keine"
  103. conv_table.update_data([
  104. ("Konversation", conv_status),
  105. ])
  106. def update_satellite(self, sat_data: dict) -> None:
  107. """Setzt neue Satellite-Daten und aktualisiert die Anzeige."""
  108. self._sat_data = sat_data
  109. self._update_display()