Files
Plugin_SN_Verfahrensgebiet/ui/eigentuemer_anzeige.py
T
DanielandClaude Opus 5.5 87341a7278 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>
2026-10-06 13:44:18 +02:00

113 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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()