# -*- coding: utf-8 -*- """ F3: Plugin-Auswahl — Checkboxen gruppiert nach Kategorie. Liest plugins.json im Format: { "PluginList": [ { "name": "Kategorie", "plugins": [ { "name": "...", "description": "...", "recommended": true, "checked": true } ]} ] } """ from __future__ import annotations import json from pathlib import Path from textual.widgets import Checkbox, Label, Static from .base import InstallerView class PluginsView(InstallerView): """Plugin-Auswahl (F3).""" TITLE = "Plugins" VIEW_ID = "plugins" MODES = ["server", "standalone"] def __init__(self, installer_config, **kwargs) -> None: super().__init__(installer_config, **kwargs) self._plugin_list: list[dict] = [] self._load_plugins() def _load_plugins(self) -> None: """Laedt Plugin-Metadaten aus plugins.json.""" plugins_json = Path(__file__).parent.parent / "plugins.json" if plugins_json.is_file(): with open(plugins_json) as f: data = json.load(f) self._plugin_list = data.get("PluginList", []) # Initiale Auswahl aus checked-Feld setzen if not self._config.selected_plugins: for category in self._plugin_list: for plugin in category.get("plugins", []): if plugin.get("checked", False): self._config.selected_plugins.append(plugin["name"]) def compose(self): yield Static("── Plugin-Auswahl ──", classes="section-header") yield Label("Waehle die Plugins fuer die Installation:\n") if not self._plugin_list: yield Label("Keine Plugin-Daten gefunden (plugins.json fehlt)") return for category in self._plugin_list: cat_name = category.get("name", "Sonstige") plugins = category.get("plugins", []) yield Static(f"\n {cat_name}", classes="section-header") for plugin in plugins: name = plugin["name"] desc = plugin.get("description", "") recommended = plugin.get("recommended", False) is_selected = name in self._config.selected_plugins label = name if desc: label += f" — {desc}" if recommended: label += " [empfohlen]" yield Checkbox( label, value=is_selected, id=f"plugin-{name}", ) def on_checkbox_changed(self, event: Checkbox.Changed) -> None: cb_id = event.checkbox.id or "" if not cb_id.startswith("plugin-"): return plugin_name = cb_id[7:] # "plugin-" entfernen if event.value: if plugin_name not in self._config.selected_plugins: self._config.selected_plugins.append(plugin_name) else: if plugin_name in self._config.selected_plugins: self._config.selected_plugins.remove(plugin_name)