# -*- coding: utf-8 -*- """ Plugin SubView: Info (F1). Zeigt allgemeine Informationen zum ausgewaehlten Plugin: Name, Version, Autor, Status, registrierte Intents und Events. """ 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 PluginInfoView(MainView): """F1 im Plugin-Kontext: Allgemeine Informationen.""" TITLE = "Info" VIEW_ID = "plugin_info" def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self._plugin_data: dict = {} self._detail_data: object | None = None self._refresh_counter: int = 0 def set_plugin(self, plugin_data: dict) -> None: """Setzt die Plugin-Basisdaten.""" self._plugin_data = plugin_data self._detail_data = None def compose(self) -> ComposeResult: with Vertical(classes="section-box"): yield Static("[bold]Allgemein[/bold]", classes="section-header") yield StatusTable(id="plugin-info-general") with Vertical(classes="section-box"): yield Static("[bold]Status[/bold]", classes="section-header") yield StatusTable(id="plugin-info-status") with Vertical(classes="section-box"): yield Static("[bold]Intents[/bold]", classes="section-header") yield Static("", id="plugin-info-intents") with Vertical(classes="section-box"): yield Static("[bold]Event-Handler[/bold]", classes="section-header") yield Static("", id="plugin-info-events") async def on_activate(self) -> None: """Laedt und zeigt die Plugin-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 Plugin-Daten vom Server.""" if not self.connection or not self._plugin_data: return name = self._plugin_data.get("name", "") if not name: return try: detail = await self.connection.request_plugin_detail(name) 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("#plugin-info-general", StatusTable) general.update_data([ ("Name", d.plugin_name or "Unbekannt"), ("Version", d.version or "Unbekannt"), ("Beschreibung", d.description or "Keine"), ("Autor", d.author or "Unbekannt"), ]) # Status status = self.query_one("#plugin-info-status", StatusTable) if d.enabled: enabled_str = "[green]Aktiviert[/green]" else: enabled_str = "[red]Deaktiviert[/red]" if d.loaded: loaded_str = "[green]Geladen[/green]" else: loaded_str = "[dim]Nicht geladen[/dim]" status.update_data([ ("Aktiviert", enabled_str), ("Geladen", loaded_str), ]) # Intents intents_widget = self.query_one("#plugin-info-intents", Static) if d.intents: lines = [f" [cyan]{name}[/cyan]" for name in d.intents] intents_widget.update("\n".join(lines)) else: intents_widget.update("[dim]Keine Intents registriert[/dim]") # Event-Handler events_widget = self.query_one("#plugin-info-events", Static) if d.event_handlers: lines = [f" [yellow]{name}[/yellow]" for name in d.event_handlers] events_widget.update("\n".join(lines)) else: events_widget.update("[dim]Keine Event-Handler registriert[/dim]")