plugin_info_view.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # -*- coding: utf-8 -*-
  2. """
  3. Plugin SubView: Info (F1).
  4. Zeigt allgemeine Informationen zum ausgewaehlten Plugin:
  5. Name, Version, Autor, Status, registrierte Intents und Events.
  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 PluginInfoView(MainView):
  14. """F1 im Plugin-Kontext: Allgemeine Informationen."""
  15. TITLE = "Info"
  16. VIEW_ID = "plugin_info"
  17. def __init__(self, **kwargs) -> None:
  18. super().__init__(**kwargs)
  19. self._plugin_data: dict = {}
  20. self._detail_data: object | None = None
  21. self._refresh_counter: int = 0
  22. def set_plugin(self, plugin_data: dict) -> None:
  23. """Setzt die Plugin-Basisdaten."""
  24. self._plugin_data = plugin_data
  25. self._detail_data = None
  26. def compose(self) -> ComposeResult:
  27. with Vertical(classes="section-box"):
  28. yield Static("[bold]Allgemein[/bold]", classes="section-header")
  29. yield StatusTable(id="plugin-info-general")
  30. with Vertical(classes="section-box"):
  31. yield Static("[bold]Status[/bold]", classes="section-header")
  32. yield StatusTable(id="plugin-info-status")
  33. with Vertical(classes="section-box"):
  34. yield Static("[bold]Intents[/bold]", classes="section-header")
  35. yield Static("", id="plugin-info-intents")
  36. with Vertical(classes="section-box"):
  37. yield Static("[bold]Event-Handler[/bold]", classes="section-header")
  38. yield Static("", id="plugin-info-events")
  39. async def on_activate(self) -> None:
  40. """Laedt und zeigt die Plugin-Infos."""
  41. await self._load_detail()
  42. async def refresh_data(self) -> None:
  43. """Periodisches Update (alle 10 Sekunden)."""
  44. self._refresh_counter += 1
  45. if self._refresh_counter % 5 == 0:
  46. await self._load_detail()
  47. async def _load_detail(self) -> None:
  48. """Laedt detaillierte Plugin-Daten vom Server."""
  49. if not self.connection or not self._plugin_data:
  50. return
  51. name = self._plugin_data.get("name", "")
  52. if not name:
  53. return
  54. try:
  55. detail = await self.connection.request_plugin_detail(name)
  56. except Exception:
  57. return
  58. if detail is None or detail.error:
  59. return
  60. self._detail_data = detail
  61. self._update_display()
  62. def _update_display(self) -> None:
  63. """Aktualisiert die Anzeige."""
  64. d = self._detail_data
  65. if d is None:
  66. return
  67. # Allgemein
  68. general = self.query_one("#plugin-info-general", StatusTable)
  69. general.update_data([
  70. ("Name", d.plugin_name or "Unbekannt"),
  71. ("Version", d.version or "Unbekannt"),
  72. ("Beschreibung", d.description or "Keine"),
  73. ("Autor", d.author or "Unbekannt"),
  74. ])
  75. # Status
  76. status = self.query_one("#plugin-info-status", StatusTable)
  77. if d.enabled:
  78. enabled_str = "[green]Aktiviert[/green]"
  79. else:
  80. enabled_str = "[red]Deaktiviert[/red]"
  81. if d.loaded:
  82. loaded_str = "[green]Geladen[/green]"
  83. else:
  84. loaded_str = "[dim]Nicht geladen[/dim]"
  85. status.update_data([
  86. ("Aktiviert", enabled_str),
  87. ("Geladen", loaded_str),
  88. ])
  89. # Intents
  90. intents_widget = self.query_one("#plugin-info-intents", Static)
  91. if d.intents:
  92. lines = [f" [cyan]{name}[/cyan]" for name in d.intents]
  93. intents_widget.update("\n".join(lines))
  94. else:
  95. intents_widget.update("[dim]Keine Intents registriert[/dim]")
  96. # Event-Handler
  97. events_widget = self.query_one("#plugin-info-events", Static)
  98. if d.event_handlers:
  99. lines = [f" [yellow]{name}[/yellow]" for name in d.event_handlers]
  100. events_widget.update("\n".join(lines))
  101. else:
  102. events_widget.update("[dim]Keine Event-Handler registriert[/dim]")