Landkreis-Dropdown, BROR-Mehrfachauswahl-Dialog und UX-Fixes

- Landkreis-Feld in den Projekteigenschaften als Dropdown statt Freitext,
  Landkreiskennzahl zusätzlich als eigene Projektvariable verfügbar.
- ask_bror_kombination(en) auf echte Mehrfachauswahl umgestellt, inkl.
  Titel, Wappen-Icon, kompakter/anpassbarer Größe und Scrollbar-Fix.
- Neuer Dialog ask_landkreis_objekte für die landkreisweite Objektsuche
  (Mehrfachauswahl, "Alle auswählen", "Nur laden ohne weiteren Ablauf").
- qt_wrapper um QDialog/QDialogButtonBox/QListWidget/QListWidgetItem/
  QAbstractItemView/QIcon sowie QComboBox-userData/currentData erweitert.
This commit is contained in:
Michael Otto
2026-08-27 15:13:43 +02:00
parent 7a5ed12797
commit 749d6d6f52
7 changed files with 362 additions and 49 deletions
+42 -11
View File
@@ -1,5 +1,5 @@
"""
sn_basis/ui/tabs/settings_tab.py Einstellungen-Tab für Projekteinformationen.
sn_basis/ui/tabs/settings_tab.py Einstellungen-Tab für Projektinformationen.
Verwaltet benutzerspezifische und projektspezifische Einstellungen.
"""
@@ -8,28 +8,33 @@ from sn_basis.functions.qt_wrapper import (
QGridLayout,
QLabel,
QLineEdit,
QComboBox,
QGroupBox,
QVBoxLayout,
QPushButton,
)
from sn_basis.functions.settings_logic import SettingsLogic
from sn_basis.functions.landkreise import LANDKREISE
#: Feldschlüssel, die als Landkreis-Dropdown (statt Freitext) dargestellt werden.
_LANDKREIS_DROPDOWN_FELDER = {"landkreis_user"}
class SettingsTab(QWidget):
"""
Tab-Widget für die Verwaltung von Projekt- und Benutzereinstellungen.
Attributes:
tab_title: Anzeigetitel des Tabs ("Projekteigenschaften")
logic: SettingsLogic-Instanz für persistente Einstellungen
"""
tab_title = "Projekteigenschaften"
def __init__(self, parent=None):
"""
Initialisiert den Settings-Tab mit Eingabefeldern.
Args:
parent: Übergeordnetes Widget (Standard: None)
"""
@@ -64,7 +69,7 @@ class SettingsTab(QWidget):
self.user_inputs = {}
for row, (key, label) in enumerate(self.user_fields.items()):
input_widget = QLineEdit()
input_widget = self._build_input(key)
self.user_inputs[key] = input_widget
user_layout.addWidget(QLabel(label), row, 0)
@@ -80,7 +85,7 @@ class SettingsTab(QWidget):
self.project_inputs = {}
for row, (key, label) in enumerate(self.project_fields.items()):
input_widget = QLineEdit()
input_widget = self._build_input(key)
self.project_inputs[key] = input_widget
project_layout.addWidget(QLabel(label), row, 0)
@@ -107,14 +112,35 @@ class SettingsTab(QWidget):
# Daten laden
self.load_data()
# ---------------------------------------------------------
# Eingabewidget je Feld erzeugen
# ---------------------------------------------------------
def _build_input(self, key: str):
if key in _LANDKREIS_DROPDOWN_FELDER:
combo = QComboBox()
combo.addItem("", None) # Platzhalter: keine Vorbelegung bei leerem Projekt
for kennzahl, name in LANDKREISE:
combo.addItem(name, kennzahl)
return combo
return QLineEdit()
# ---------------------------------------------------------
# Speichern
# ---------------------------------------------------------
def save_data(self):
fields = {
key: widget.text()
for key, widget in {**self.user_inputs, **self.project_inputs}.items()
}
fields = {}
for key, widget in {**self.user_inputs, **self.project_inputs}.items():
if isinstance(widget, QComboBox):
fields[key] = widget.currentText()
else:
fields[key] = widget.text()
# Landkreiskennzahl aus der Dropdown-Auswahl zusätzlich als eigene
# Variable bereitstellen (siehe landkreise.py).
landkreis_widget = self.user_inputs.get("landkreis_user")
if isinstance(landkreis_widget, QComboBox):
fields["landkreis_kennzahl"] = landkreis_widget.currentData() or ""
self.logic.save(fields)
# ---------------------------------------------------------
@@ -123,4 +149,9 @@ class SettingsTab(QWidget):
def load_data(self):
data = self.logic.load()
for key, widget in {**self.user_inputs, **self.project_inputs}.items():
widget.setText(data.get(key, ""))
if isinstance(widget, QComboBox):
gespeicherter_name = data.get(key, "")
index = widget.findText(gespeicherter_name)
widget.setCurrentIndex(index if index >= 0 else 0)
else:
widget.setText(data.get(key, ""))