status_table.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # -*- coding: utf-8 -*-
  2. """
  3. Key-Value-Tabelle fuer Statusanzeigen.
  4. """
  5. from textual.widget import Widget
  6. from textual.app import RenderResult
  7. from rich.table import Table
  8. class StatusTable(Widget):
  9. """
  10. Formatierte Key-Value-Tabelle.
  11. Zeigt Daten als zweispaltige Tabelle an,
  12. ideal fuer Systemmetriken und Konfigurationswerte.
  13. """
  14. DEFAULT_CSS = """
  15. StatusTable {
  16. height: auto;
  17. margin: 0 1;
  18. }
  19. """
  20. def __init__(self, title: str = "", **kwargs) -> None:
  21. super().__init__(**kwargs)
  22. self._title = title
  23. self._rows: list[tuple[str, str]] = []
  24. def update_data(self, rows: list[tuple[str, str]]) -> None:
  25. """Aktualisiert die angezeigten Daten — nur bei tatsaechlicher Aenderung.
  26. Vermeidet unnoetige Re-Renderings wenn alle Werte identisch geblieben sind.
  27. """
  28. if rows == self._rows:
  29. return
  30. self._rows = rows
  31. self.refresh()
  32. def render(self) -> RenderResult:
  33. """Rendert die Tabelle."""
  34. table = Table(
  35. show_header=False,
  36. show_edge=False,
  37. pad_edge=False,
  38. expand=True,
  39. title=self._title if self._title else None,
  40. title_style="bold",
  41. )
  42. table.add_column("Key", style="bold cyan", ratio=1, no_wrap=True)
  43. table.add_column("Value", ratio=2)
  44. for key, value in self._rows:
  45. table.add_row(key, value)
  46. return table