Anzeigefenster immer mit Rahmen, Pfad der Korrektur-Datei im Tab (#56)

Befund aus dem QGIS-Test: Die Bildschirmwahl wirkte nicht, das Fenster
erschien immer auf dem Hauptbildschirm. Im Vollbild ließ es sich weder
verschieben noch schließen und verdeckte QGIS; nur ein hartes Beenden
von QGIS half.

Bildschirmwahl und Vollbild entfallen. Das Anzeigefenster öffnet als
normales Fenster mit Rahmen; der Bearbeiter schiebt es auf den Bildschirm
des Eigentümers und kann es dort maximieren. Größe und Lage werden beim
Beenden gemerkt und in der nächsten Sitzung wiederhergestellt (bis zum
Neustart von QGIS).

Unter den Knöpfen steht jetzt Pfad und Name der Korrektur-Datei, mit
Hinweis, solange sie noch nicht angelegt ist oder erst abgefragt wird.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 13:44:18 +02:00
co-authored by Claude Opus 5.5
parent e547cb90c5
commit 87341a7278
5 changed files with 189 additions and 201 deletions
+63 -34
View File
@@ -8,11 +8,13 @@ Zwei Bereiche:
- **Eigentümersuche:** Eigentümerdatei (CSV-Layer) wählen, Name und/oder Vorname
eingeben, „Suchen“ öffnet die Trefferliste.
Logik: :mod:`sn_verfahrensgebiet.functions.eigentuemer_suche`.
- **Anzeige für den Eigentümer:** Bildschirm wählen, Sitzung beginnen und
beenden, Anzeige leeren, angezeigte Daten korrigieren. „Daten anzeigen“ in
der Trefferliste füllt das Anzeigefenster (und beginnt bei Bedarf die
Sitzung). Korrekturen landen in einer Korrektur-CSV neben der
Eigentümerdatei (:mod:`sn_verfahrensgebiet.functions.eigentuemer_korrektur`).
- **Anzeige für den Eigentümer:** Sitzung beginnen und beenden, Anzeige
leeren, angezeigte Daten korrigieren. „Daten anzeigen“ in der Trefferliste
füllt das Anzeigefenster (und beginnt bei Bedarf die Sitzung). Das Fenster
schiebt der Bearbeiter selbst auf den Bildschirm des Eigentümers; Größe und
Lage gelten für die nächste Sitzung weiter. Korrekturen landen in einer
Korrektur-CSV neben der Eigentümerdatei, deren Pfad unter den Knöpfen steht
(:mod:`sn_verfahrensgebiet.functions.eigentuemer_korrektur`).
"""
import os
@@ -44,12 +46,7 @@ from sn_verfahrensgebiet.functions.eigentuemer_korrektur import (
wende_an,
)
from sn_verfahrensgebiet.ui.eigentuemer_treffer import EigentuemerTrefferFenster
from sn_verfahrensgebiet.ui.eigentuemer_anzeige import (
BildschirmAuswahl,
EigentuemerAnzeige,
qgis_bildschirm,
zeige_auf_bildschirm,
)
from sn_verfahrensgebiet.ui.eigentuemer_anzeige import EigentuemerAnzeige, zeige_anzeigefenster
from sn_verfahrensgebiet.ui.eigentuemer_korrektur_dialog import frage_korrektur
_TITEL_SUCHE = "Flurstückssuche"
@@ -158,18 +155,12 @@ class EigentuemerTab(QWidget):
titel_anzeige.setStyleSheet("margin-top: 12px;")
layout.addWidget(titel_anzeige)
zeile_bildschirm = QHBoxLayout()
zeile_bildschirm.addWidget(QLabel("Bildschirm:"))
self.bildschirm_combo = BildschirmAuswahl()
self.bildschirm_combo.setToolTip(
"Bildschirm, den der Eigentümer sieht. Auf einem anderen Bildschirm als QGIS "
"öffnet die Anzeige im Vollbild."
)
zeile_bildschirm.addWidget(self.bildschirm_combo, 1)
layout.addLayout(zeile_bildschirm)
zeile_sitzung = QHBoxLayout()
self.btn_sitzung = QPushButton("Sitzung beginnen")
self.btn_sitzung.setToolTip(
"Öffnet das Anzeigefenster. Es auf den Bildschirm des Eigentümers schieben; "
"Größe und Lage gelten für die nächste Sitzung weiter."
)
self.btn_anzeige_leeren = QPushButton("Anzeige leeren")
self.btn_anzeige_leeren.setToolTip(
"Entfernt die Daten aus dem Anzeigefenster, ohne es zu schließen – "
@@ -187,19 +178,27 @@ class EigentuemerTab(QWidget):
self.sitzung_label.setWordWrap(True)
layout.addWidget(self.sitzung_label)
self.korrektur_label = QLabel()
self.korrektur_label.setWordWrap(True)
self.korrektur_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
layout.addWidget(self.korrektur_label)
self.btn_sitzung.clicked.connect(self._on_sitzung_umschalten)
self.btn_anzeige_leeren.clicked.connect(self._on_anzeige_leeren)
self.btn_korrigieren.clicked.connect(self._on_korrigieren)
self.eigentuemer_layer_combo.currentIndexChanged.connect(
lambda _index: self._aktualisiere_korrektur_label()
)
self._trefferfenster = None
self._treffer_layer_id = None
self._anzeige = None
self._anzeige_geometrie = None
self._sitzung_seit = None
self._angezeigt = []
self._anzeige_layer_id = None
self._korrektur_pfade = {}
self.eigentuemer_layer_combo.aktualisieren()
self.bildschirm_combo.aktualisieren()
self._aktualisiere_sitzungsstatus()
self.setLayout(layout)
@@ -292,12 +291,10 @@ class EigentuemerTab(QWidget):
self._sitzung_beenden()
def _sitzung_beginnen(self) -> None:
"""Öffnet das Anzeigefenster leer auf dem gewählten Bildschirm."""
bildschirm = self.bildschirm_combo.gewaehlter_bildschirm()
"""Öffnet das Anzeigefenster leer, mit Rahmen, an der Stelle der letzten Sitzung."""
anzeige = EigentuemerAnzeige(self)
anzeige.beim_schliessen = self._anzeige_wurde_geschlossen
vollbild = bildschirm is not None and bildschirm is not qgis_bildschirm()
zeige_auf_bildschirm(anzeige, bildschirm, vollbild)
zeige_anzeigefenster(anzeige, self._anzeige_geometrie)
self._anzeige = anzeige
self._sitzung_seit = datetime.now()
self._angezeigt = []
@@ -312,6 +309,11 @@ class EigentuemerTab(QWidget):
anzeige.close()
def _anzeige_wurde_geschlossen(self) -> None:
if self._anzeige is not None:
try:
self._anzeige_geometrie = self._anzeige.saveGeometry()
except Exception:
pass
self._anzeige = None
self._sitzung_seit = None
self._angezeigt = []
@@ -349,6 +351,36 @@ class EigentuemerTab(QWidget):
inhalt = "leer" if not anzahl else ("1 Eintrag" if anzahl == 1 else f"{anzahl} Einträge")
text = f"Sitzung seit {self._sitzung_seit:%H:%M} Uhr – Anzeige: {inhalt}"
self.sitzung_label.setText(text)
self._aktualisiere_korrektur_label()
def _korrektur_layer_id(self):
"""Eigentümerdatei, zu der Korrekturen gehören: die angezeigte, sonst die gesuchte, sonst die gewählte."""
return self._anzeige_layer_id or self._treffer_layer_id or self.eigentuemer_layer_combo.currentData()
def _korrektur_vorschau(self):
"""Pfad der Korrektur-CSV ohne Rückfrage, oder ``None``, wenn er erst beim Speichern erfragt wird."""
layer_id = self._korrektur_layer_id()
if layer_id in self._korrektur_pfade:
return self._korrektur_pfade[layer_id]
layer = hole_layer(layer_id)
vorschlag = korrektur_pfad(layer.source()) if layer is not None else None
ordner = os.path.dirname(vorschlag) if vorschlag else ""
if vorschlag and os.path.isdir(ordner) and os.access(ordner, os.W_OK):
return vorschlag
return None
def _aktualisiere_korrektur_label(self) -> None:
"""Zeigt unter den Knöpfen, wohin Korrekturen geschrieben werden."""
if not self._korrektur_layer_id():
text = "Korrektur-Datei: – (keine Eigentümerdatei gewählt)"
else:
pfad = self._korrektur_vorschau()
if pfad is None:
text = "Korrektur-Datei: wird beim ersten Speichern abgefragt"
else:
zusatz = "" if os.path.exists(pfad) else " (wird beim ersten Speichern angelegt)"
text = f"Korrektur-Datei: {os.path.normpath(pfad)}{zusatz}"
self.korrektur_label.setText(text)
# ------------------------------------------------------------------
# Korrekturen
@@ -382,6 +414,7 @@ class EigentuemerTab(QWidget):
self._angezeigt[index] = wende_an(eintrag, aenderungen)
if self._anzeige is not None:
self._anzeige.zeige(self._angezeigt)
self._aktualisiere_korrektur_label()
anzahl = len(aenderungen)
text = "1 Änderung" if anzahl == 1 else f"{anzahl} Änderungen"
success(_TITEL_ANZEIGE, f"{text} in „{os.path.basename(pfad)}“ festgehalten.")
@@ -394,14 +427,10 @@ class EigentuemerTab(QWidget):
für die Eigentümerdatei, solange der Tab besteht.
"""
layer_id = self._anzeige_layer_id
if layer_id in self._korrektur_pfade:
return self._korrektur_pfade[layer_id]
layer = hole_layer(layer_id)
vorschlag = korrektur_pfad(layer.source()) if layer is not None else None
ordner = os.path.dirname(vorschlag) if vorschlag else ""
if vorschlag and os.path.isdir(ordner) and os.access(ordner, os.W_OK):
pfad = vorschlag
else:
pfad = self._korrektur_vorschau() if layer_id == self._korrektur_layer_id() else None
if pfad is None:
layer = hole_layer(layer_id)
vorschlag = korrektur_pfad(layer.source()) if layer is not None else None
pfad, _ = QFileDialog.getSaveFileName(
self, "Korrektur-CSV wählen", vorschlag or os.path.expanduser("~"), "CSV-Dateien (*.csv)"
)