forked from AG_QGIS/Plugin_SN_Basis
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:
@@ -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
|
||||
# Wrapper‑Architektur – Übersicht
|
||||
Die Wrapper‑Architektur von sn_basis bildet das Fundament für eine robuste, testbare und zukunftssichere QGIS‑Plugin‑Entwicklung.
|
||||
Sie kapselt sämtliche QGIS‑ und Qt‑Abhä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
|
||||
Mock‑fähige Unit‑Tests ohne QGIS
|
||||
|
||||
PyQt5/6‑Kompatibilitä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 QGIS‑Versionen 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 Wrapper‑Schicht ist das zentrale Bindeglied zwischen der Plugin‑Logik und der QGIS‑/Qt‑Umgebung.
|
||||
|
||||
+------------------------------------+
|
||||
| Linklistenpruefer |
|
||||
+------------------------------------+
|
||||
| + pruefe(pfad: str): list[Zeile] |
|
||||
+------------------------------------+
|
||||
## Ziele der Wrapper‑Architektur
|
||||
🎯 1. Entkopplung von QGIS und Qt
|
||||
Alle direkten Importe wie from qgis.core import ... oder from qgis.PyQt.QtWidgets import ... verschwinden aus der Plugin‑Logik.
|
||||
Stattdessen werden sie über Wrapper‑Module abstrahiert.
|
||||
|
||||
+------------------------------------+
|
||||
| Zeilenpruefer |
|
||||
+------------------------------------+
|
||||
| - linkpruefer: Linkpruefer |
|
||||
| - stilpruefer: Stilpruefer |
|
||||
+------------------------------------+
|
||||
| + pruefe(zeile: str): LayerAuftrag |
|
||||
+------------------------------------+
|
||||
🎯 2. Testbarkeit ohne QGIS
|
||||
Im Mock‑Modus liefern die Wrapper:
|
||||
|
||||
+------------------------------------+
|
||||
| Linkpruefer |
|
||||
+------------------------------------+
|
||||
| + pruefe(link: str): PruefErgebnis |
|
||||
+------------------------------------+
|
||||
Dummy‑Objekte
|
||||
|
||||
+------------------------------------+
|
||||
| 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 CI‑Umgebung.
|
||||
|
||||
+------------------------------------+
|
||||
| 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 Qt‑API, wird nur der Wrapper angepasst, nicht jedes Plugin.
|
||||
|
||||
## Architekturüberblick
|
||||
Die Wrapper‑Schicht besteht aus mehreren Modulen, die jeweils einen klar abgegrenzten Verantwortungsbereich haben.
|
||||
|
||||
### 1. qt_wrapper – Qt‑Abstraktion
|
||||
Kapselt alle Qt‑Widgets, Dialoge und Konstanten:
|
||||
|
||||
QWidget, QDialog, QMessageBox, QToolBar, QMenu, …
|
||||
|
||||
Layouts, Buttons, Labels, LineEdits
|
||||
|
||||
Qt‑Konstanten wie YES, NO, Dock‑Areas
|
||||
|
||||
Mock‑Modus:
|
||||
Stellt Dummy‑Widgets bereit, die keine UI öffnen.
|
||||
|
||||
### 2. qgiscore_wrapper – QGIS‑Core‑Abstraktion
|
||||
Abstraktion für:
|
||||
|
||||
QgsProject
|
||||
|
||||
Layer‑Zugriff
|
||||
|
||||
Projekt‑Metadaten
|
||||
|
||||
Pfade, CRS, Feature‑Zugriff
|
||||
|
||||
Mock‑Modus:
|
||||
Simuliert ein Projekt und Layer‑Container.
|
||||
|
||||
### 3. qgisui_wrapper – QGIS‑UI‑Abstraktion
|
||||
Kapselt UI‑bezogene QGIS‑Funktionen:
|
||||
|
||||
Zugriff auf iface
|
||||
|
||||
Dock‑Management
|
||||
|
||||
Menü‑ und Toolbar‑Integration
|
||||
|
||||
Hauptfenster‑Zugriff
|
||||
|
||||
Mock‑Modus:
|
||||
Stellt ein Dummy‑Interface bereit.
|
||||
|
||||
### 4. variable_wrapper – QGIS‑Variablen
|
||||
Abstraktion für:
|
||||
|
||||
Projektvariablen (projectScope)
|
||||
|
||||
globale Variablen (globalScope)
|
||||
|
||||
Mock‑Speicher für Tests
|
||||
|
||||
Vorteile:
|
||||
|
||||
keine QGIS‑Abhängigkeit in der Logik
|
||||
|
||||
testbare Variablenverwaltung
|
||||
|
||||
einheitliches API
|
||||
|
||||
### 5. message_wrapper – Meldungen & Logging
|
||||
Einheitliche Schnittstelle für:
|
||||
|
||||
Fehlermeldungen
|
||||
|
||||
Warnungen
|
||||
|
||||
Info‑Meldungen
|
||||
|
||||
Logging
|
||||
|
||||
Mock‑Modus:
|
||||
Speichert Nachrichten statt sie an QGIS zu senden.
|
||||
|
||||
### 6. dialog_wrapper – Benutzer‑Dialoge
|
||||
Abstraktion für:
|
||||
|
||||
Ja/Nein‑Dialoge
|
||||
|
||||
spätere Erweiterungen (Eingabedialoge, Dateidialoge, etc.)
|
||||
|
||||
Mock‑Modus:
|
||||
Gibt Default‑Werte zurück, öffnet keine UI.
|
||||
|
||||
### 7. DockManager & Navigation
|
||||
Diese Module nutzen die Wrapper‑Schicht, um:
|
||||
|
||||
DockWidgets sicher zu verwalten
|
||||
|
||||
Toolbars und Menüs zu erzeugen
|
||||
|
||||
Reload‑sichere UI‑Strukturen aufzubauen
|
||||
|
||||
Sie sind keine Wrapper, sondern Wrapper‑Konsumenten.
|
||||
|
||||
## Designprinzipien
|
||||
🧱 1. Single Source of Truth
|
||||
Jede QGIS‑ oder Qt‑Funktionalität wird nur an einer Stelle implementiert.
|
||||
|
||||
🔄 2. Austauschbarkeit
|
||||
Mock‑Modus und Echtmodus sind vollständig austauschbar.
|
||||
|
||||
🧪 3. Testbarkeit
|
||||
Jede Funktion kann ohne QGIS getestet werden.
|
||||
|
||||
🧼 4. Saubere Trennung
|
||||
UI → qt_wrapper
|
||||
|
||||
QGIS‑Core → qgiscore_wrapper
|
||||
|
||||
QGIS‑UI → 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 QGIS‑Abhängigkeiten in der Logik
|
||||
|
||||
IDE‑freundlich (Pylance, Autocomplete, Typing)
|
||||
|
||||
CI‑fähig (Tests ohne QGIS)
|
||||
|
||||
saubere Architektur
|
||||
|
||||
leichte Wartbarkeit
|
||||
|
||||
klare Dokumentation
|
||||
|
||||
## Fazit
|
||||
Die Wrapper‑Architektur ist das Herzstück von sn_basis.
|
||||
Sie ermöglicht eine moderne, modulare und testbare QGIS‑Plugin‑Entwicklung, die unabhängig von QGIS‑Versionen, Qt‑Versionen und Entwicklungsumgebungen funktioniert.
|
||||
|
||||
Sie bildet die Grundlage für:
|
||||
|
||||
stabile APIs
|
||||
|
||||
saubere UI‑Abstraktion
|
||||
|
||||
automatisierte Tests
|
||||
|
||||
nachhaltige Weiterentwicklung
|
||||
Reference in New Issue
Block a user