From a3b22d044405630c6292bc0ecc5635acedfb94d8 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 20 Mar 2026 10:37:08 +0100 Subject: [PATCH] =?UTF-8?q?Combobox=20Ansicht=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/tab_b_logic.py | 10 +++++ ui/tab_b_ui.py | 103 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 111 insertions(+), 2 deletions(-) diff --git a/ui/tab_b_logic.py b/ui/tab_b_logic.py index eea9e9e..6de350b 100644 --- a/ui/tab_b_logic.py +++ b/ui/tab_b_logic.py @@ -8,9 +8,11 @@ from sn_basis.modules.Pruefmanager import Pruefmanager KARTENNAME_VAR = "sn_kartenname" PLOTMASSSTAB_VAR = "sn_plotmassstab" +VIEW_VAR = "sn_view" THEMA_38 = "§38" THEMA_41 = "§41" MASSSTAB_WIE_KARTENFENSTER = "Wie Kartenfenster" +ANSICHT_WIE_KARTENFENSTER = "wie kartenfenster" KARTENNAME_BY_THEMA = { THEMA_38: "Planungsübersicht §38 FlurbG", @@ -51,4 +53,12 @@ class TabBLogic: value = PLOTMASSSTAB_BY_AUSWAHL.get(auswahl, "") 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") \ No newline at end of file diff --git a/ui/tab_b_ui.py b/ui/tab_b_ui.py index 02b6638..b3e7e9e 100644 --- a/ui/tab_b_ui.py +++ b/ui/tab_b_ui.py @@ -11,6 +11,7 @@ from sn_basis.functions.qt_wrapper import ( QLabel, QComboBox, ) +from sn_basis.functions.qgiscore_wrapper import QgsProject from sn_basis.functions.qgisui_wrapper import iface from sn_basis.functions.variable_wrapper import get_variable, set_variable @@ -21,6 +22,7 @@ from sn_plan41.ui.tab_b_logic import ( TabBLogic, MASSSTAB_WIE_KARTENFENSTER, PLOTMASSSTAB_BY_AUSWAHL, + ANSICHT_WIE_KARTENFENSTER, ) @@ -29,6 +31,7 @@ THEMA_PLACEHOLDER = "Thema wählen" THEMA_38 = "§38" THEMA_41 = "§41" MASSSTAB_VAR = "tab_b_massstab" +ANSICHT_VAR = "tab_b_ansicht" class TabB(QWidget): """ @@ -61,10 +64,13 @@ class TabB(QWidget): self.logic: Optional[TabBLogic] = None self._thema_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._restore_state() + self._connect_theme_collection_signals() def set_services(self, pruefmanager: Pruefmanager, data_grabber: DataGrabber) -> None: """Injiziert Services vom übergeordneten DockWidget.""" @@ -79,6 +85,8 @@ class TabB(QWidget): self._massstab_combo.currentText(), self._get_current_canvas_scale(), ) + if self._ansicht_combo: + self.logic.set_view_for_auswahl(self._ansicht_combo.currentText()) def _build_ui(self) -> None: """Erstellt die reduzierte UI für die Themenauswahl.""" @@ -97,7 +105,7 @@ class TabB(QWidget): self._thema_combo.currentTextChanged.connect(self._on_thema_changed) main_layout.addWidget(self._thema_combo) - massstab_label = QLabel("Massstab") + massstab_label = QLabel("Maßstab") massstab_label.setStyleSheet("font-weight: bold; margin-top: 6px;") main_layout.addWidget(massstab_label) @@ -107,12 +115,22 @@ class TabB(QWidget): self._massstab_combo.currentTextChanged.connect(self._on_massstab_changed) 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) self.setLayout(main_layout) def _restore_state(self) -> None: """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 saved_thema = get_variable(THEMA_VAR, scope="project") @@ -128,6 +146,16 @@ class TabB(QWidget): else: 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: """Persistiert die Themenauswahl und setzt den Kartennamen.""" if value in (THEMA_38, THEMA_41): @@ -145,6 +173,77 @@ class TabB(QWidget): if self.logic: 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: """Liest den aktuellen Maßstab aus der Kartensicht.""" try: