| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- # -*- 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)
|