Basemap-Legende: Auswertung und Legendenelement im Drucklayout (#88)

Beim Erstellen einer §38-/§41-Vorlage wertet BasemapLegende die Kacheln des sichtbaren
basemap.de-Layers im Verfahrensgebiet (wahlweise Druckbereich) kachelweise über
selectByGeometry aus, prüft die Renderer-Styles mit derselben Zoomlogik wie QGIS und
bildet daraus Legendeneinträge. Ein Mehrfachauswahl-Dialog (neu: ask_mehrfachauswahl)
lässt Kategorien abwählen; die Auswahl wird im Projekt gemerkt. Die gewählten Einträge
stehen mit der Signatur des Projektlayers (zoomabhängige Werte festgeschrieben) in
einem eigenen Legendenelement über der Quellenangabe. Ein eigenes Element ist nötig,
weil die nach Karteninhalt filternde Hauptlegende die Hilfslayer ausblenden würde.

Wrapper um die nötigen QGIS-/Qt-Symbole mit Mock ergänzt (eigener Block in
qgiscore_wrapper; QgsRectangle hatte bisher keinen Mock).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 11:57:09 +02:00
co-authored by Claude Opus 5.5
parent 7408740dfe
commit b549cb8a5a
11 changed files with 2223 additions and 0 deletions
+28
View File
@@ -55,6 +55,7 @@ QTableWidget: Type[Any] = object
QTableWidgetItem: Type[Any] = object
QTableWidgetSelectionRange: Type[Any] = object
QIcon: Type[Any] = object
QSize: Type[Any] = object
def exec_dialog(dialog: Any) -> Any:
@@ -125,6 +126,7 @@ try:
Qt as _Qt,
QVariant as _QVariant,
QSettings as _QSettings,
QSize as _QSize,
)
from qgis.PyQt.QtNetwork import (
QNetworkRequest as _QNetworkRequest,
@@ -175,6 +177,7 @@ try:
QTableWidgetItem = _QTableWidgetItem
QTableWidgetSelectionRange = _QTableWidgetSelectionRange
QIcon = _QIcon
QSize = _QSize
# ✅ QT6 ENUMS
YES = QMessageBox.StandardButton.Yes
NO = QMessageBox.StandardButton.No
@@ -200,6 +203,11 @@ try:
SelectRows = QAbstractItemView.SelectionBehavior.SelectRows
NoEditTriggers = QAbstractItemView.EditTrigger.NoEditTriggers
AscendingOrder = Qt.SortOrder.AscendingOrder
ItemIsUserCheckable = Qt.ItemFlag.ItemIsUserCheckable
ItemIsEnabled = Qt.ItemFlag.ItemIsEnabled
CheckStateChecked = Qt.CheckState.Checked
CheckStateUnchecked = Qt.CheckState.Unchecked
UserRole = Qt.ItemDataRole.UserRole
def exec_dialog(dialog: Any) -> Any:
return dialog.exec()
@@ -249,6 +257,7 @@ except (ImportError, AttributeError):
Qt as _Qt,
QVariant as _QVariant,
QSettings as _QSettings,
QSize as _QSize,
)
from PyQt5.QtNetwork import (
QNetworkRequest as _QNetworkRequest,
@@ -297,6 +306,7 @@ except (ImportError, AttributeError):
QTableWidgetItem = _QTableWidgetItem
QTableWidgetSelectionRange = _QTableWidgetSelectionRange
QIcon = _QIcon
QSize = _QSize
# ✅ PYQT5 ENUMS
YES = QMessageBox.Yes
@@ -324,6 +334,11 @@ except (ImportError, AttributeError):
SelectRows = QAbstractItemView.SelectRows
NoEditTriggers = QAbstractItemView.NoEditTriggers
AscendingOrder = Qt.AscendingOrder
ItemIsUserCheckable = Qt.ItemIsUserCheckable
ItemIsEnabled = Qt.ItemIsEnabled
CheckStateChecked = Qt.Checked
CheckStateUnchecked = Qt.Unchecked
UserRole = Qt.UserRole
def exec_dialog(dialog: Any) -> Any:
return dialog.exec_()
@@ -687,6 +702,19 @@ except (ImportError, AttributeError):
SelectRows = 1
NoEditTriggers = 0
AscendingOrder = 0
ItemIsUserCheckable = 16
ItemIsEnabled = 32
CheckStateChecked = 2
CheckStateUnchecked = 0
UserRole = 256
class _MockQSize:
def __init__(self, width: int = 0, height: int = 0):
self._width, self._height = width, height
def width(self) -> int: return self._width
def height(self) -> int: return self._height
QSize = _MockQSize
class _MockQDialog(_MockWidget):
DialogCode = type("DialogCode", (), {"Accepted": DialogAccepted, "Rejected": 0})