Fix: beim Plugin-Reload werden neue Toolbars hinzugefügt aber keine gelöscht

Fix: Settings-Tab ist leer
Dokumentation begonnen
Pluginkonzept.md überarbeitet
This commit is contained in:
2026-01-09 15:19:25 +01:00
parent b805f78f02
commit 039c614592
6 changed files with 443 additions and 207 deletions

View File

@@ -1,122 +1,188 @@
+ PluginController
└─ GUIManager
└─ PrüfManager (koordiniert alle Prüfer)
├─ Dateiprüfer
├─ Linklistenprüfer
│ └─ Zeilenprüfer[n]
│ ├─ Linkprüfer
│ └─ Stilprüfer
└─ LayerLoader
└─ Logger
# WrapperArchitektur Übersicht
Die WrapperArchitektur von sn_basis bildet das Fundament für eine robuste, testbare und zukunftssichere QGISPluginEntwicklung.
Sie kapselt sämtliche QGIS und QtAbhängigkeiten hinter klar definierten Schnittstellen und ermöglicht dadurch:
Plan41_plugin/
├── plugin/ # Plugin-Code
│ ├── main_plugin.py # PluginController
│ ├── dock_widget.py # GUIManager
│ ├── pruefer/
│ │ ├── dateipruefer.py
│ │ ├── linklistenpruefer.py
│ │ ├── zeilenpruefer.py
│ │ ├── linkpruefer.py
│ │ └── stilpruefer.py
│ ├── loader.py
│ └── logger.py
├── tests/ # Unit-Tests
│ ├── __init__.py
│ ├── test_dateipruefer.py
│ ├── test_linklistenpruefer.py
│ ├── test_zeilenpruefer.py
│ ├── test_linkpruefer.py
│ ├── test_stilpruefer.py
│ ├── test_logger.py
│ └── run_tests.py # zentraler Test-Runner
├── requirements.txt
└── README.md
Mockfähige UnitTests ohne QGIS
PyQt5/6Kompatibilität ohne CodeÄnderungen
+------------------------------------+
| PluginController |
+------------------------------------+
| - Dock_widget: GUIManager |
| - pruef_manager: PruefManager |
| - loader: LayerLoader |
| - logger: Logger |
+------------------------------------+
| + start(): void |
+------------------------------------+
saubere Trennung von UI, Logik und Infrastruktur
+------------------------------------+
| GUIManager |
+------------------------------------+
| - dialog: QWidget |
+------------------------------------+
| + getParameter(): dict |
+------------------------------------+
stabile APIs, die unabhängig von QGISVersionen bleiben
+------------------------------------+
| PruefManager |
+------------------------------------+
| - dateipruefer: Dateipruefer |
| - linklistenpruefer: Linklisten... |
+------------------------------------+
| + pruefe_alle(parameter): list |
+------------------------------------+
klare Erweiterbarkeit für zukünftige Module und Plugins
+------------------------------------+
| Dateipruefer |
+------------------------------------+
| + pruefe(pfad: str): PruefErgebnis |
+------------------------------------+
Die WrapperSchicht ist das zentrale Bindeglied zwischen der PluginLogik und der QGIS/QtUmgebung.
+------------------------------------+
| Linklistenpruefer |
+------------------------------------+
| + pruefe(pfad: str): list[Zeile] |
+------------------------------------+
## Ziele der WrapperArchitektur
🎯 1. Entkopplung von QGIS und Qt
Alle direkten Importe wie from qgis.core import ... oder from qgis.PyQt.QtWidgets import ... verschwinden aus der PluginLogik.
Stattdessen werden sie über WrapperModule abstrahiert.
+------------------------------------+
| Zeilenpruefer |
+------------------------------------+
| - linkpruefer: Linkpruefer |
| - stilpruefer: Stilpruefer |
+------------------------------------+
| + pruefe(zeile: str): LayerAuftrag |
+------------------------------------+
🎯 2. Testbarkeit ohne QGIS
Im MockModus liefern die Wrapper:
+------------------------------------+
| Linkpruefer |
+------------------------------------+
| + pruefe(link: str): PruefErgebnis |
+------------------------------------+
DummyObjekte
+------------------------------------+
| Stilpruefer |
+------------------------------------+
| + pruefe(stilname: str): Pruef... |
+------------------------------------+
simulierte Rückgabewerte
+------------------------------------+
| LayerLoader |
+------------------------------------+
| + lade(layer_auftrag): void |
+------------------------------------+
speicherbare Zustände (z.B. Variablen, Layer, Nachrichten)
+------------------------------------+
| Logger |
+------------------------------------+
| + schreibe(msg: str): void |
| + exportiere(): file |
+------------------------------------+
Damit laufen Tests in jeder CIUmgebung.
+------------------------------------+
| PruefErgebnis |
+------------------------------------+
| - erfolgreich: bool |
| - daten: dict |
| - fehler: list[str] |
| - warnungen: list[str] |
+------------------------------------+
🎯 3. Einheitliche API für alle Plugins
Plugins greifen nicht mehr direkt auf QGIS zu, sondern nutzen:
Code
sn_basis.functions.qgiscore_wrapper
sn_basis.functions.qgisui_wrapper
sn_basis.functions.qt_wrapper
sn_basis.functions.variable_wrapper
sn_basis.functions.message_wrapper
sn_basis.functions.dialog_wrapper
🎯 4. Zukunftssicherheit
Ändert sich die QGIS oder QtAPI, wird nur der Wrapper angepasst, nicht jedes Plugin.
## Architekturüberblick
Die WrapperSchicht besteht aus mehreren Modulen, die jeweils einen klar abgegrenzten Verantwortungsbereich haben.
### 1. qt_wrapper QtAbstraktion
Kapselt alle QtWidgets, Dialoge und Konstanten:
QWidget, QDialog, QMessageBox, QToolBar, QMenu, …
Layouts, Buttons, Labels, LineEdits
QtKonstanten wie YES, NO, DockAreas
MockModus:
Stellt DummyWidgets bereit, die keine UI öffnen.
### 2. qgiscore_wrapper QGISCoreAbstraktion
Abstraktion für:
QgsProject
LayerZugriff
ProjektMetadaten
Pfade, CRS, FeatureZugriff
MockModus:
Simuliert ein Projekt und LayerContainer.
### 3. qgisui_wrapper QGISUIAbstraktion
Kapselt UIbezogene QGISFunktionen:
Zugriff auf iface
DockManagement
Menü und ToolbarIntegration
HauptfensterZugriff
MockModus:
Stellt ein DummyInterface bereit.
### 4. variable_wrapper QGISVariablen
Abstraktion für:
Projektvariablen (projectScope)
globale Variablen (globalScope)
MockSpeicher für Tests
Vorteile:
keine QGISAbhängigkeit in der Logik
testbare Variablenverwaltung
einheitliches API
### 5. message_wrapper Meldungen & Logging
Einheitliche Schnittstelle für:
Fehlermeldungen
Warnungen
InfoMeldungen
Logging
MockModus:
Speichert Nachrichten statt sie an QGIS zu senden.
### 6. dialog_wrapper BenutzerDialoge
Abstraktion für:
Ja/NeinDialoge
spätere Erweiterungen (Eingabedialoge, Dateidialoge, etc.)
MockModus:
Gibt DefaultWerte zurück, öffnet keine UI.
### 7. DockManager & Navigation
Diese Module nutzen die WrapperSchicht, um:
DockWidgets sicher zu verwalten
Toolbars und Menüs zu erzeugen
Reloadsichere UIStrukturen aufzubauen
Sie sind keine Wrapper, sondern WrapperKonsumenten.
## Designprinzipien
🧱 1. Single Source of Truth
Jede QGIS oder QtFunktionalität wird nur an einer Stelle implementiert.
🔄 2. Austauschbarkeit
MockModus und Echtmodus sind vollständig austauschbar.
🧪 3. Testbarkeit
Jede Funktion kann ohne QGIS getestet werden.
🧼 4. Saubere Trennung
UI → qt_wrapper
QGISCore → qgiscore_wrapper
QGISUI → qgisui_wrapper
Logik → settings_logic, layer_logic, prüfmanager, …
🔌 5. Erweiterbarkeit
Neue Wrapper können jederzeit ergänzt werden, ohne bestehende Plugins zu brechen.
## Vorteile für Entwickler
Keine QGISAbhängigkeiten in der Logik
IDEfreundlich (Pylance, Autocomplete, Typing)
CIfähig (Tests ohne QGIS)
saubere Architektur
leichte Wartbarkeit
klare Dokumentation
## Fazit
Die WrapperArchitektur ist das Herzstück von sn_basis.
Sie ermöglicht eine moderne, modulare und testbare QGISPluginEntwicklung, die unabhängig von QGISVersionen, QtVersionen und Entwicklungsumgebungen funktioniert.
Sie bildet die Grundlage für:
stabile APIs
saubere UIAbstraktion
automatisierte Tests
nachhaltige Weiterentwicklung