| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- # -*- 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]")
|