Combobox Ansicht hinzugefügt

This commit is contained in:
2026-03-20 10:37:08 +01:00
parent 5c00b4abee
commit a3b22d0444
2 changed files with 111 additions and 2 deletions

View File

@@ -8,9 +8,11 @@ from sn_basis.modules.Pruefmanager import Pruefmanager
KARTENNAME_VAR = "sn_kartenname" KARTENNAME_VAR = "sn_kartenname"
PLOTMASSSTAB_VAR = "sn_plotmassstab" PLOTMASSSTAB_VAR = "sn_plotmassstab"
VIEW_VAR = "sn_view"
THEMA_38 = "§38" THEMA_38 = "§38"
THEMA_41 = "§41" THEMA_41 = "§41"
MASSSTAB_WIE_KARTENFENSTER = "Wie Kartenfenster" MASSSTAB_WIE_KARTENFENSTER = "Wie Kartenfenster"
ANSICHT_WIE_KARTENFENSTER = "wie kartenfenster"
KARTENNAME_BY_THEMA = { KARTENNAME_BY_THEMA = {
THEMA_38: "Planungsübersicht §38 FlurbG", THEMA_38: "Planungsübersicht §38 FlurbG",
@@ -52,3 +54,11 @@ class TabBLogic:
value = PLOTMASSSTAB_BY_AUSWAHL.get(auswahl, "") value = PLOTMASSSTAB_BY_AUSWAHL.get(auswahl, "")
set_variable(PLOTMASSSTAB_VAR, value, scope="project") set_variable(PLOTMASSSTAB_VAR, value, scope="project")
def set_view_for_auswahl(self, auswahl: str) -> None:
"""Setzt ``sn_view`` auf ``aktuell`` oder den gewählten Layer/Themennamen."""
if auswahl == ANSICHT_WIE_KARTENFENSTER:
set_variable(VIEW_VAR, "aktuell", scope="project")
return
set_variable(VIEW_VAR, auswahl or "", scope="project")

View File

@@ -11,6 +11,7 @@ from sn_basis.functions.qt_wrapper import (
QLabel, QLabel,
QComboBox, QComboBox,
) )
from sn_basis.functions.qgiscore_wrapper import QgsProject
from sn_basis.functions.qgisui_wrapper import iface from sn_basis.functions.qgisui_wrapper import iface
from sn_basis.functions.variable_wrapper import get_variable, set_variable from sn_basis.functions.variable_wrapper import get_variable, set_variable
@@ -21,6 +22,7 @@ from sn_plan41.ui.tab_b_logic import (
TabBLogic, TabBLogic,
MASSSTAB_WIE_KARTENFENSTER, MASSSTAB_WIE_KARTENFENSTER,
PLOTMASSSTAB_BY_AUSWAHL, PLOTMASSSTAB_BY_AUSWAHL,
ANSICHT_WIE_KARTENFENSTER,
) )
@@ -29,6 +31,7 @@ THEMA_PLACEHOLDER = "Thema wählen"
THEMA_38 = "§38" THEMA_38 = "§38"
THEMA_41 = "§41" THEMA_41 = "§41"
MASSSTAB_VAR = "tab_b_massstab" MASSSTAB_VAR = "tab_b_massstab"
ANSICHT_VAR = "tab_b_ansicht"
class TabB(QWidget): class TabB(QWidget):
""" """
@@ -61,10 +64,13 @@ class TabB(QWidget):
self.logic: Optional[TabBLogic] = None self.logic: Optional[TabBLogic] = None
self._thema_combo: Optional[QComboBox] = None self._thema_combo: Optional[QComboBox] = None
self._massstab_combo: Optional[QComboBox] = None self._massstab_combo: Optional[QComboBox] = None
self._ansicht_combo: Optional[QComboBox] = None
self._theme_signal_connected = False
self._build_ui() self._build_ui()
self._restore_state() self._restore_state()
self._connect_theme_collection_signals()
def set_services(self, pruefmanager: Pruefmanager, data_grabber: DataGrabber) -> None: def set_services(self, pruefmanager: Pruefmanager, data_grabber: DataGrabber) -> None:
"""Injiziert Services vom übergeordneten DockWidget.""" """Injiziert Services vom übergeordneten DockWidget."""
@@ -79,6 +85,8 @@ class TabB(QWidget):
self._massstab_combo.currentText(), self._massstab_combo.currentText(),
self._get_current_canvas_scale(), self._get_current_canvas_scale(),
) )
if self._ansicht_combo:
self.logic.set_view_for_auswahl(self._ansicht_combo.currentText())
def _build_ui(self) -> None: def _build_ui(self) -> None:
"""Erstellt die reduzierte UI für die Themenauswahl.""" """Erstellt die reduzierte UI für die Themenauswahl."""
@@ -97,7 +105,7 @@ class TabB(QWidget):
self._thema_combo.currentTextChanged.connect(self._on_thema_changed) self._thema_combo.currentTextChanged.connect(self._on_thema_changed)
main_layout.addWidget(self._thema_combo) main_layout.addWidget(self._thema_combo)
massstab_label = QLabel("Massstab") massstab_label = QLabel("Maßstab")
massstab_label.setStyleSheet("font-weight: bold; margin-top: 6px;") massstab_label.setStyleSheet("font-weight: bold; margin-top: 6px;")
main_layout.addWidget(massstab_label) main_layout.addWidget(massstab_label)
@@ -107,12 +115,22 @@ class TabB(QWidget):
self._massstab_combo.currentTextChanged.connect(self._on_massstab_changed) self._massstab_combo.currentTextChanged.connect(self._on_massstab_changed)
main_layout.addWidget(self._massstab_combo) main_layout.addWidget(self._massstab_combo)
ansicht_label = QLabel("Ansicht")
ansicht_label.setStyleSheet("font-weight: bold; margin-top: 6px;")
main_layout.addWidget(ansicht_label)
self._ansicht_combo = QComboBox(self)
self._ansicht_combo.addItem(ANSICHT_WIE_KARTENFENSTER)
self._ansicht_combo.addItems(self._get_gespeicherte_ansichten())
self._ansicht_combo.currentTextChanged.connect(self._on_ansicht_changed)
main_layout.addWidget(self._ansicht_combo)
main_layout.addStretch(1) main_layout.addStretch(1)
self.setLayout(main_layout) self.setLayout(main_layout)
def _restore_state(self) -> None: def _restore_state(self) -> None:
"""Stellt die gespeicherten Combobox-Zustände wieder her.""" """Stellt die gespeicherten Combobox-Zustände wieder her."""
if not self._thema_combo or not self._massstab_combo: if not self._thema_combo or not self._massstab_combo or not self._ansicht_combo:
return return
saved_thema = get_variable(THEMA_VAR, scope="project") saved_thema = get_variable(THEMA_VAR, scope="project")
@@ -128,6 +146,16 @@ class TabB(QWidget):
else: else:
self._massstab_combo.setCurrentText(MASSSTAB_WIE_KARTENFENSTER) self._massstab_combo.setCurrentText(MASSSTAB_WIE_KARTENFENSTER)
aktuelle_themen = [ANSICHT_WIE_KARTENFENSTER, *self._get_gespeicherte_ansichten()]
self._ansicht_combo.clear()
self._ansicht_combo.addItems(aktuelle_themen)
saved_ansicht = get_variable(ANSICHT_VAR, scope="project")
if saved_ansicht in aktuelle_themen:
self._ansicht_combo.setCurrentText(saved_ansicht)
else:
self._ansicht_combo.setCurrentText(ANSICHT_WIE_KARTENFENSTER)
def _on_thema_changed(self, value: str) -> None: def _on_thema_changed(self, value: str) -> None:
"""Persistiert die Themenauswahl und setzt den Kartennamen.""" """Persistiert die Themenauswahl und setzt den Kartennamen."""
if value in (THEMA_38, THEMA_41): if value in (THEMA_38, THEMA_41):
@@ -145,6 +173,77 @@ class TabB(QWidget):
if self.logic: if self.logic:
self.logic.set_plotmassstab_for_auswahl(value, self._get_current_canvas_scale()) self.logic.set_plotmassstab_for_auswahl(value, self._get_current_canvas_scale())
def _on_ansicht_changed(self, value: str) -> None:
"""Persistiert die Ansichtsauswahl und setzt ``sn_view``."""
set_variable(ANSICHT_VAR, value, scope="project")
if self.logic:
self.logic.set_view_for_auswahl(value)
def _connect_theme_collection_signals(self) -> None:
"""Verbindet Signale der Theme-Collection für Live-Aktualisierung der Ansichtsliste."""
if self._theme_signal_connected:
return
try:
theme_collection = QgsProject.instance().mapThemeCollection()
except Exception:
return
if theme_collection is None:
return
connected_any = False
for signal_name in ("mapThemesChanged", "changed", "themeChanged"):
signal = getattr(theme_collection, signal_name, None)
if signal is None:
continue
try:
signal.connect(self._refresh_ansicht_combo_live)
connected_any = True
except Exception:
pass
self._theme_signal_connected = connected_any
def _refresh_ansicht_combo_live(self, *args) -> None:
"""Aktualisiert die Ansicht-Combobox bei Änderungen gespeicherter Layerthemen."""
_ = args
if not self._ansicht_combo:
return
vorherige_auswahl = self._ansicht_combo.currentText() or ANSICHT_WIE_KARTENFENSTER
eintraege = [ANSICHT_WIE_KARTENFENSTER, *self._get_gespeicherte_ansichten()]
self._ansicht_combo.blockSignals(True)
self._ansicht_combo.clear()
self._ansicht_combo.addItems(eintraege)
if vorherige_auswahl in eintraege:
self._ansicht_combo.setCurrentText(vorherige_auswahl)
else:
self._ansicht_combo.setCurrentText(ANSICHT_WIE_KARTENFENSTER)
self._ansicht_combo.blockSignals(False)
self._on_ansicht_changed(self._ansicht_combo.currentText())
def _get_gespeicherte_ansichten(self) -> list[str]:
"""Liefert die Namen der im Projekt gespeicherten Layerthemen."""
try:
theme_collection = QgsProject.instance().mapThemeCollection()
if theme_collection is None:
return []
themes = theme_collection.mapThemes()
except Exception:
return []
namen: list[str] = []
for theme_name in themes:
name = str(theme_name or "").strip()
if name and name not in namen:
namen.append(name)
return namen
def _get_current_canvas_scale(self) -> float | None: def _get_current_canvas_scale(self) -> float | None:
"""Liest den aktuellen Maßstab aus der Kartensicht.""" """Liest den aktuellen Maßstab aus der Kartensicht."""
try: try: