From 8253f4f86369dbaf3f134b0f821756862d0614ba Mon Sep 17 00:00:00 2001 From: KAI Date: Wed, 7 Oct 2026 20:12:29 +0200 Subject: [PATCH] Fassung 0.7.1: Liste der Geodienste gehoert zur Auswahl Nach einem Wechsel von Verfahren oder Landkreis blieb die geholte Liste stehen; "Ausgewaehlte laden" lud sie dann unter dem Namen der neuen Auswahl. Jetzt merkt sich die Seitenleiste, fuer welche Auswahl die Liste geholt wurde, und leert sie bei jedem Wechsel (auch beim stillen Wiederherstellen aus der Projektdatei). Ein Filter, der die Auswahl behaelt, laesst sie stehen. Die Meldung nach "Liste holen" nennt beim Landkreis den Landkreis statt "dieses Verfahren". Gefunden am 07.10.2026 bei der Aufnahme des Erklaervideos Linkliste. Co-Authored-By: Claude Opus 5.5 --- README.md | 3 ++- tools/headless_panel_test.py | 29 +++++++++++++++++++++++++++++ vln_karten/metadata.txt | 5 +++-- vln_karten/panel.py | 29 ++++++++++++++++++++++++++--- vln_karten/plugin.py | 5 +++-- 5 files changed, 63 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e9d260b..ff3b342 100644 --- a/README.md +++ b/README.md @@ -268,7 +268,8 @@ mit den Häkchen (Erik, 06.10.2026). - **Liste holen** ruft `GET /linkliste?vkz=…` — für ein Verfahren oder, seit 0.7.0, für einen ganzen Landkreis (Eintrag „… — Linkliste des Landkreises“ oben in der Auswahl). Die Liste - kommt fertig aufgelöst; je Zeile stehen Name, Gruppe › Untergruppe und Herkunft. + kommt fertig aufgelöst; je Zeile stehen Name, Gruppe › Untergruppe und Herkunft. Wechselt die + Auswahl, leert sich die Liste (seit 0.7.1) — „Liste holen“ holt sie für die neue Auswahl. - **Ausgewählte laden** hängt die angehakten Dienste schrittweise unter „Geodienste “ ein: Gruppe › Untergruppe › Layer (`linkliste.zielgruppe`); ohne Untergruppe direkt unter die Gruppe. Ein hinterlegter Stil kommt über `GET /linkliste/{id}/style.qml`. diff --git a/tools/headless_panel_test.py b/tools/headless_panel_test.py index d08fcf8..90fc2a5 100644 --- a/tools/headless_panel_test.py +++ b/tools/headless_panel_test.py @@ -109,7 +109,36 @@ pruefe(an() == [True, False], "neue Liste uebernimmt die Kartenwahl: %r" % an()) pruefe("Karten: Wertermittlung" in panel.dienste_liste.item(0).toolTip(), "Karten im Tooltip") for haken in panel.karten_haken.values(): haken.setChecked(False) + +print("== 0.7.1: die Liste gehoert zur Auswahl ==") +# Bis 0.7.0 blieb die Liste nach einem Wechsel stehen; „Ausgewaehlte laden“ lud sie dann unter +# dem Namen der neuen Auswahl (gefunden 07.10.2026 bei der Videoaufnahme). +dienste = [{"name": "LSG", "gruppe_name": "Natur", "herkunft_text": "landesweit"}, + {"name": "Biotope Punkte", "gruppe_name": "Natur", "untergruppe": "Biotope", + "herkunft_text": "landesweit"}] +panel.combo.setCurrentIndex(panel.combo.findData("27")) +panel.set_dienste(dienste, "27") +pruefe(panel.dienste_liste.count() == 2, "Liste fuer den Landkreis geholt") +panel.filter_feld.setText("meiß") +pruefe(panel.aktuelles_vkz() == "27" and panel.dienste_liste.count() == 2, + "Filter, der die Auswahl behaelt: Liste bleibt") +panel.filter_feld.clear() +pruefe(panel.aktuelles_vkz() == "27" and panel.dienste_liste.count() == 2, "Filter geleert: Liste bleibt") +panel.combo.setCurrentIndex(panel.combo.findData("27027")) +pruefe(panel.dienste_liste.count() == 0, "Wechsel zum Verfahren leert die Liste") +pruefe("Liste holen" in panel.status_zeile.text(), "Hinweis in der Statuszeile: %r" % panel.status_zeile.text()) +panel.set_dienste(dienste) # ohne vkz: gilt fuer die aktuelle Auswahl +panel.waehle_vkz("27027") +pruefe(panel.dienste_liste.count() == 2, "dieselbe Auswahl erneut gesetzt: Liste bleibt") +panel.waehle_vkz("31005") +pruefe(panel.dienste_liste.count() == 0, "stiller Wechsel (Projektdatei) leert ebenfalls") +panel.set_dienste(dienste) +panel.filter_feld.setText("gibtsnicht") +pruefe(panel.dienste_liste.count() == 0, "Filter ohne Treffer: keine Auswahl, keine Liste") +panel.filter_feld.clear() +panel.set_dienste(dienste) panel.set_angemeldet(False) +pruefe(panel.dienste_liste.count() == 0 and panel._dienste_vkz is None, "Abmelden leert Liste und Zuordnung") GERUFEN.clear() if not os.environ.get("VLN_TOKEN"): diff --git a/vln_karten/metadata.txt b/vln_karten/metadata.txt index bd5b7c2..2f67c60 100644 --- a/vln_karten/metadata.txt +++ b/vln_karten/metadata.txt @@ -5,7 +5,7 @@ qgisMaximumVersion=4.99 supportsQt6=True description=Karten des VLN Managers in QGIS: OGC API Features, alle Layer editierbar — von der Vorerhebung über das Maßnahmenblatt bis zu Widmungen und Verkehrszeichen. about=Anmeldung mit der Manager-Kennung (der API-Key wird gemerkt), Verfahrenslayer über die OGC API laden und bearbeiten (jede Änderung geht einzeln zurück), Geodienste aus der Linkliste, Stile vom Server. Verkehrszeichen und Widmungen lassen sich wie im Web setzen: Schild aus der Palette wählen, erster Klick Standort, zweiter Klick Blickrichtung; die Schildgrafiken kommen von der API und liegen danach lokal. -version=0.7.0 +version=0.7.1 author=Erik email=phpwelt@gmail.com tracker=https://entwicklung.flurneuordnung-sachsen.de/VLN_SN/API_Karte_QGISDemo/issues @@ -15,6 +15,7 @@ category=Web icon= experimental=True deprecated=False -changelog=0.7.0 Linkliste mit Untergruppen (Gruppe › Untergruppe › Layer), Kartenwahl (Wege- und Gewässerplan, Neugestaltungsgrundsätze, Wertermittlung) hakt passende Dienste vor, Linkliste auch für den ganzen Landkreis; Auswahl über /tgen/auswahl: als oFB die Verfahren des Landkreises „nur lesen“, Layer dort schreibgeschützt; ein 403 meldet nicht mehr ab. +changelog=0.7.1 Liste der Geodienste leert sich beim Wechsel von Verfahren oder Landkreis (bis 0.7.0 blieb die alte Liste stehen, „Ausgewählte laden“ lud sie unter dem neuen Namen); Meldung nach „Liste holen“ nennt beim Landkreis den Landkreis. + 0.7.0 Linkliste mit Untergruppen (Gruppe › Untergruppe › Layer), Kartenwahl (Wege- und Gewässerplan, Neugestaltungsgrundsätze, Wertermittlung) hakt passende Dienste vor, Linkliste auch für den ganzen Landkreis; Auswahl über /tgen/auswahl: als oFB die Verfahren des Landkreises „nur lesen“, Layer dort schreibgeschützt; ein 403 meldet nicht mehr ab. 0.6.0 Widmungen und Verkehrszeichen: eigene Layergruppe, Schildgrafiken vom Server (lokal abgelegt), Palette mit Suche, Werkzeuge „Schild setzen" und „Zusatzzeichen"; Seitenleiste rollt statt das QGIS-Fenster zu strecken (Issue #1). 0.5.0 Geodienste aus der Linkliste, Stile speichern, Seitenleiste statt Werkzeugleiste. diff --git a/vln_karten/panel.py b/vln_karten/panel.py index 4ee0fdd..331fd1c 100644 --- a/vln_karten/panel.py +++ b/vln_karten/panel.py @@ -72,6 +72,7 @@ class VlnPanel(QDockWidget): self._cb = callbacks or {} self._verfahren = [] # [(beschriftung, vkz)] — ungefiltert self._stumm = False # unterdrückt Signale beim programmatischen Füllen + self._dienste_vkz = None # Auswahl, für die die Liste der Geodienste geholt wurde inhalt = QWidget() aussen = QVBoxLayout(inhalt) @@ -330,9 +331,14 @@ class VlnPanel(QDockWidget): for eintrag, an in zip(eintraege, vorhaken(daten, self.gewaehlte_karten())): eintrag.setCheckState(Qt.CheckState.Checked if an else Qt.CheckState.Unchecked) - def set_dienste(self, dienste): + def set_dienste(self, dienste, vkz=None): """Die geholte Liste anzeigen: Name, Gruppe › Untergruppe und Herkunft, alle zunächst - angehakt.""" + angehakt. + + :param vkz: Verfahren oder Landkreis, für das die Liste geholt wurde (ohne Angabe: die + aktuelle Auswahl). Wechselt die Auswahl, leert sich die Liste (seit 0.7.1). + """ + self._dienste_vkz = self.combo.currentData() if vkz is None else vkz self.dienste_liste.clear() for d in dienste or []: gruppe = d.get("gruppe_name") or "" @@ -404,6 +410,7 @@ class VlnPanel(QDockWidget): self.combo.addItem("— bitte anmelden —", None) self.filter_feld.clear() self.dienste_liste.clear() + self._dienste_vkz = None self._stumm = False def set_verfahren(self, verfahren, aemter=()): @@ -441,11 +448,13 @@ class VlnPanel(QDockWidget): return {name for name, haken in self.gruppen_haken.items() if haken.isChecked()} def waehle_vkz(self, vkz): - """Setzt die Auswahl ohne Rückruf (Wiederherstellen aus der Projektdatei).""" + """Setzt die Auswahl ohne Rückruf (Wiederherstellen aus der Projektdatei); eine Liste + der Geodienste für eine andere Auswahl leert sich trotzdem.""" self._stumm = True index = self.combo.findData(vkz) if vkz else -1 self.combo.setCurrentIndex(index if index >= 0 else 0) self._stumm = False + self._dienste_zur_auswahl() def anzahl_eintraege(self): return self.combo.count() @@ -472,6 +481,7 @@ class VlnPanel(QDockWidget): index = self.combo.findData(vorher) if vorher else -1 self.combo.setCurrentIndex(index if index >= 0 else 0) self._stumm = False + self._dienste_zur_auswahl() if index < 0 and vorher: self._auswahl_geaendert(0) @@ -480,8 +490,21 @@ class VlnPanel(QDockWidget): def _auswahl_geaendert(self, _index): if not self._stumm: + self._dienste_zur_auswahl() self._ruf("verfahren_gewaehlt", self.combo.currentData()) + def _dienste_zur_auswahl(self): + """Die Liste der Geodienste gehört zu der Auswahl, für die sie geholt wurde. + + Nach einem Wechsel leert sie sich — sonst lüde „Ausgewählte laden“ die alte Liste unter + dem Namen der neuen Auswahl (bis 0.7.0). Ein Filter, der die Auswahl behält, lässt sie + stehen. + """ + if self.dienste_liste.count() and self.combo.currentData() != self._dienste_vkz: + self.dienste_liste.clear() + self._dienste_vkz = None + self.set_status("Auswahl gewechselt — „Liste holen“ zeigt die Geodienste.") + def _ruf(self, name, *args): rueckruf = self._cb.get(name) if rueckruf: diff --git a/vln_karten/plugin.py b/vln_karten/plugin.py index c930bae..720a3d0 100644 --- a/vln_karten/plugin.py +++ b/vln_karten/plugin.py @@ -403,14 +403,15 @@ class VlnKartenPlugin: self.panel.set_karten(linkliste.karten_laden(self.client)) except ApiError: self.panel.set_karten(linkliste.KARTEN_VORGABE) - self.panel.set_dienste(dienste) + self.panel.set_dienste(dienste, vkz) herkunft = {} for d in dienste: herkunft[d.get("herkunft_text") or "?"] = herkunft.get(d.get("herkunft_text") or "?", 0) + 1 text = ", ".join("%d %s" % (n, k) for k, n in herkunft.items()) or "nichts hinterlegt" self.panel.set_status("%d Geodienste: %s" % (len(dienste), text)) + wofuer = "diesen Landkreis" if ist_landkreis(vkz) else "dieses Verfahren" self.iface.messageBar().pushMessage( - "VLN Karten", "%d Geodienste für dieses Verfahren (%s)." % (len(dienste), text), + "VLN Karten", "%d Geodienste für %s (%s)." % (len(dienste), wofuer, text), level=Qgis.Info, duration=6) def run_dienste_laden(self):