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>
113 lines
4.5 KiB
Python
113 lines
4.5 KiB
Python
"""sn_verfahrensgebiet/ui/eigentuemer_anzeige.py – Anzeigefenster für den Eigentümer (#56).
|
||
|
||
Das Fenster ist für einen zweiten Bildschirm gedacht, den nur der Eigentümer
|
||
sieht. Es zeigt ausschließlich Name, Anschrift und E-Mail der vom Bearbeiter
|
||
gewählten Einträge – keine Konten, keine Kennzeichen, keine anderen Treffer.
|
||
Ohne Inhalt zeigt es nur einen neutralen Platzhalter.
|
||
|
||
Das Fenster öffnet immer als normales Fenster mit Rahmen; der Bearbeiter
|
||
schiebt es selbst auf den Bildschirm des Eigentümers und kann es dort
|
||
maximieren. Eine automatische Bildschirmwahl mit Vollbild hat sich im QGIS-Test
|
||
nicht bewährt: Das Fenster landete stets auf dem Hauptbildschirm und ließ sich
|
||
im Vollbild weder verschieben noch schließen (siehe ``fallstricke.md``).
|
||
"""
|
||
|
||
import html
|
||
from typing import Callable, Optional, Sequence
|
||
|
||
from sn_basis.functions.qt_wrapper import QWidget, QVBoxLayout, QLabel, Qt
|
||
|
||
from sn_verfahrensgebiet.functions.eigentuemer_suche import Eigentuemer
|
||
|
||
PLATZHALTER = "Datenabgleich"
|
||
OHNE_EMAIL = "keine angegeben"
|
||
STANDARDGROESSE = (900, 650)
|
||
|
||
|
||
def _ortsteil(text: str) -> str:
|
||
return text if not text or text.upper().startswith("OT") else f"OT {text}"
|
||
|
||
|
||
def anzeige_html(eintraege: Sequence[Eigentuemer]) -> str:
|
||
"""HTML für das Anzeigefenster; alle Werte sind maskiert.
|
||
|
||
Je Eintrag eine Tabelle mit Name, Anschrift (mehrzeilig) und E-Mail. Eine
|
||
fehlende E-Mail wird ausdrücklich genannt, damit der Eigentümer sie ergänzen
|
||
kann. Ohne Einträge nur der Platzhalter.
|
||
"""
|
||
if not eintraege:
|
||
return f"<p style='color:#888888;'>{html.escape(PLATZHALTER)}</p>"
|
||
|
||
bloecke = []
|
||
for e in eintraege:
|
||
name = " ".join(t for t in (e.anrede, e.titel, e.vorname, e.nachname) if t)
|
||
ort = " ".join(t for t in (e.plz, e.wohnort) if t)
|
||
anschrift = "<br/>".join(html.escape(t) for t in (e.strasse, ort, _ortsteil(e.ortsteil)) if t)
|
||
email = html.escape(", ".join(e.emails)) if e.emails else f"<i>{OHNE_EMAIL}</i>"
|
||
bloecke.append(
|
||
"<table cellpadding='6'>"
|
||
f"<tr><td style='color:#666666;'>Name</td><td><b>{html.escape(name)}</b></td></tr>"
|
||
f"<tr><td style='color:#666666;' valign='top'>Anschrift</td><td>{anschrift}</td></tr>"
|
||
f"<tr><td style='color:#666666;'>E-Mail</td><td>{email}</td></tr>"
|
||
"</table>"
|
||
)
|
||
return "<hr/>".join(bloecke)
|
||
|
||
|
||
class EigentuemerAnzeige(QWidget):
|
||
"""Eigenes Fenster (nicht im Dock) mit großer Schrift für den Eigentümer.
|
||
|
||
``beim_schliessen`` wird aufgerufen, wenn das Fenster von außen geschlossen
|
||
wird (z. B. Alt+F4), damit der Tab die Sitzung als beendet führt.
|
||
"""
|
||
|
||
def __init__(self, parent=None):
|
||
super().__init__(parent, Qt.WindowType.Window)
|
||
self.beim_schliessen: Optional[Callable[[], None]] = None
|
||
self.setWindowTitle(PLATZHALTER)
|
||
self.setStyleSheet("background-color: white; color: black;")
|
||
|
||
layout = QVBoxLayout(self)
|
||
layout.setContentsMargins(60, 50, 60, 50)
|
||
self._text = QLabel()
|
||
self._text.setTextFormat(Qt.TextFormat.RichText)
|
||
self._text.setWordWrap(True)
|
||
self._text.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft)
|
||
self._text.setStyleSheet("font-size: 26pt;")
|
||
layout.addWidget(self._text)
|
||
self.leeren()
|
||
|
||
def zeige(self, eintraege: Sequence[Eigentuemer]) -> None:
|
||
"""Ersetzt den Inhalt durch die Einträge."""
|
||
self._text.setText(anzeige_html(eintraege))
|
||
|
||
def leeren(self) -> None:
|
||
"""Zeigt nur noch den neutralen Platzhalter."""
|
||
self._text.setText(anzeige_html([]))
|
||
|
||
def closeEvent(self, event): # noqa: N802 (Qt-Name)
|
||
rueckruf, self.beim_schliessen = self.beim_schliessen, None
|
||
if rueckruf is not None:
|
||
rueckruf()
|
||
super().closeEvent(event)
|
||
|
||
|
||
def zeige_anzeigefenster(fenster, geometrie=None) -> None:
|
||
"""Zeigt das Anzeigefenster als normales Fenster mit Rahmen, nie im Vollbild.
|
||
|
||
Mit ``geometrie`` (aus ``saveGeometry()`` der letzten Sitzung) erscheint es
|
||
wieder dort, wohin der Bearbeiter es geschoben hatte; sonst in
|
||
Standardgröße an der von Qt gewählten Stelle.
|
||
"""
|
||
wiederhergestellt = False
|
||
if geometrie is not None:
|
||
try:
|
||
wiederhergestellt = bool(fenster.restoreGeometry(geometrie))
|
||
except Exception:
|
||
wiederhergestellt = False
|
||
if not wiederhergestellt:
|
||
fenster.resize(*STANDARDGROESSE)
|
||
fenster.show()
|
||
fenster.raise_()
|
||
fenster.activateWindow()
|