diff --git a/Probleme.txt b/Probleme.txt index 46130d4..f851a12 100644 --- a/Probleme.txt +++ b/Probleme.txt @@ -2,5 +2,3 @@ Beim Hinzufügen von Features fehlte das layer.updateFields() Beim Hinzufügen von Features fehlte wurde versucht eine viel zu große Pegelonline 'number' in einen Int zu stecken. War schwierig zu entdecken => provider.errors() DockWidget wurde in der Höhe ziemlich voll → Weiteres Widget nur für Grafen - -(De-)Selekt aus Layer-Liste mitbekommen \ No newline at end of file diff --git a/po_runner.py b/po_runner.py index d1445b4..08a00ac 100644 --- a/po_runner.py +++ b/po_runner.py @@ -2,7 +2,7 @@ import os.path from typing import Callable from PyQt5 import QtGui -from PyQt5.QtWidgets import QAction +from PyQt5.QtWidgets import QAction, QCheckBox from qgis._core import QgsVectorLayer, QgsProject, QgsLayerTreeLayer, QgsPalLayerSettings, QgsVectorLayerSimpleLabeling, QgsStyle, QgsSymbol, QgsRendererCategory, QgsCategorizedSymbolRenderer from .map_tips import WATERLEVELS_MAP_TIPS, STATIONS_MAP_TIPS, BASEMAP_MAP_TIPS @@ -77,9 +77,11 @@ class PoRunner(object): :param disconnect: Methode die Aufgerufen wird, wenn der Layer gelöscht wird :type disconnect: Callable[[], None] :param map_tips: HTML Code für die QGIS-Map-Tips + :param checkbox: Sichtbarkeit-Checkbox um sie via Signal upzudaten + :type checkbox: QCheckBox """ - def _basemap_create(self, path, name, disconnect: Callable[[], None], map_tips) -> None | QgsVectorLayer: + def _basemap_create(self, path, name, disconnect: Callable[[], None], map_tips, checkbox) -> None | QgsVectorLayer: print("_basemap_create: %s" % (name,)) path = os.path.join(self.local_dir, "basemap", path) basemap = QgsVectorLayer(path, name, "ogr") @@ -102,6 +104,9 @@ class PoRunner(object): layer_tree = self.iface.layerTreeCanvasBridge().rootGroup() layer_tree.insertChildNode(-1, QgsLayerTreeLayer(basemap)) # am unteren Ende anhängen → liegt somit unter stations/waterlevels + # Signal zur Erkennung von Sichtbarkeitsänderungen verbinden + self._connect_layer_list_visibility_signal(basemap, checkbox) + return basemap """ @@ -122,8 +127,14 @@ class PoRunner(object): print("_cbBasemapLines_toggled: %s" % (checked,)) if self.lines is None and checked: - # Flüsse sind noch nicht als Layer angelegt → Anlegen - self.lines = self._basemap_create("waters.gpkg|layername=water_l", "Flüsse", self._basemap_disconnect_lines, BASEMAP_MAP_TIPS) + # Flüsse sind noch nicht als Layer geladen → Laden + self.lines = self._basemap_create( + "waters.gpkg|layername=water_l", + "Flüsse", + self._basemap_disconnect_lines, + BASEMAP_MAP_TIPS, + self.ui.cbBasemapLines, + ) if self.lines is not None: # Flüsse sind (bereits) angelegt → setze Sichtbarkeit wie gefordert @@ -139,8 +150,14 @@ class PoRunner(object): print("_cbBasemapAreas_toggled: %s" % (checked,)) if self.areas is None and checked: - # Flächen sind noch nicht als Layer angelegt → Anlegen - self.areas = self._basemap_create("waters.gpkg|layername=water_f", "Flächen", self._basemap_disconnect_areas, BASEMAP_MAP_TIPS) + # Flächen sind noch nicht als Layer geladen → Laden + self.areas = self._basemap_create( + "waters.gpkg|layername=water_f", + "Flächen", + self._basemap_disconnect_areas, + BASEMAP_MAP_TIPS, + self.ui.cbBasemapAreas, + ) if self.areas is not None: # Flächen sind (bereits) angelegt → setze Sichtbarkeit wie gefordert @@ -232,11 +249,11 @@ class PoRunner(object): print("_cbStationsVisible_toggled: %s" % (visible,)) if self.stations is None and visible: - # Stationen sind noch nicht als Layer angelegt → Anlegen + # Stationen sind noch nicht als Layer geladen → Laden reader = PoStationReaderQgs() features = reader.get_features() self.stations = self._layer_create_from_features(reader.fields, reader.crs, features, "Stationen", STATIONS_MAP_TIPS) - self._layer_add_to_instance(self.stations, self._stations_disconnect) + self._layer_add_to_instance(self.stations, self._stations_disconnect, self.ui.cbStationsVisible) if self.stations is not None: # Stationen sind (bereits) angelegt → setze Sichtbarkeit wie gefordert @@ -402,11 +419,11 @@ class PoRunner(object): print("_cbWaterlevelsVisible_toggled: %s" % (visible,)) if self.waterlevels is None and visible: - # Pegelstände sind noch nicht als Layer angelegt → Anlegen + # Pegelstände sind noch nicht als Layer geladen → Laden reader = PoWaterlevelReaderQgs() features = reader.get_features() self.waterlevels = self._layer_create_from_features(reader.fields, reader.crs, features, "Pegelstände", WATERLEVELS_MAP_TIPS) - self._layer_add_to_instance(self.waterlevels, self.waterlevels_disconnect) + self._layer_add_to_instance(self.waterlevels, self.waterlevels_disconnect, self.ui.cbWaterlevelsVisible) if self.waterlevels is not None: # Pegelstände sind (bereits) angelegt → setze Sichtbarkeit wie gefordert @@ -603,9 +620,11 @@ class PoRunner(object): :type layer: QgsVectorLayer :param disconnect: Methode die Aufgerufen wird, wenn der Layer gelöscht wird :type disconnect: Callable[[], None] + :param checkbox: Sichtbarkeit-Checkbox um sie via Signal upzudaten + :type checkbox: QCheckBox """ - def _layer_add_to_instance(self, layer: QgsVectorLayer, disconnect: Callable[[], None]): + def _layer_add_to_instance(self, layer: QgsVectorLayer, disconnect: Callable[[], None], checkbox: QCheckBox): print("_layer_add_to_instance") if layer is None: # Kein Layer mitgegeben → Abbruch @@ -623,6 +642,42 @@ class PoRunner(object): layer_tree = self.iface.layerTreeCanvasBridge().rootGroup() layer_tree.insertChildNode(0, QgsLayerTreeLayer(layer)) # am oberen Ende anhängen → liegt somit über basemap + # Signal zur Erkennung von Sichtbarkeitsänderungen verbinden + self._connect_layer_list_visibility_signal(layer, checkbox) + + """ + Verbinde das Layer-Sichtbarkeit-Signal der QGIS-Layer-Liste mit unserer Layer-Referenz und unserer Checkbox + :param layer: Zu behandelnder Layer + :type layer: QgsVectorLayer + :param checkbox: Sichtbarkeit-Checkbox um sie via Signal upzudaten + :type checkbox: QCheckBox + """ + + def _connect_layer_list_visibility_signal(self, layer, checkbox): + root = QgsProject.instance().layerTreeRoot() + node = root.findLayer(layer.id()) + if node: + # Node existiert → Signal verbinden + node.visibilityChanged.connect(lambda: self._layer_set_visible_includingCheckbox(layer, node.isVisible(), checkbox)) + print("_layer_add_to_instance: Layer-Sichtbarkeits-Signal verbunden!") + else: + # Node nicht gefunden → ignorieren (Programmierfehler) + print("_layer_add_to_instance: Fehler: Node im Tree nicht gefunden!") + + """ + Setzt die Sichtbarkeit des gegebenen Layers (inklusive gegebener Checkbox) + :param layer: Zu behandelnder Layer + :type layer: QgsVectorLayer + :param visible: Sichtbarkeit + :type visible: bool + :param checkbox: Sichtbarkeit-Checkbox um sie via Signal upzudaten + :type checkbox: QCheckBox + """ + + def _layer_set_visible_includingCheckbox(self, layer, visible: bool, checkbox: QCheckBox): + checkbox.setChecked(visible) + self._layer_set_visible(layer, visible) + """ Aktualisiert die Labels eines Layers :param layer: Zu behandelnder Layer