neues Layout "Baufreigabe" hinzugefügt
This commit is contained in:
+191
-4
@@ -13,9 +13,13 @@ from sn_basis.functions.qt_wrapper import (
|
||||
QCheckBox,
|
||||
QHBoxLayout,
|
||||
QPushButton,
|
||||
QToolButton,
|
||||
ToolButtonTextBesideIcon,
|
||||
ArrowDown,
|
||||
ArrowRight,
|
||||
)
|
||||
from sn_basis.functions.qgiscore_wrapper import QgsProject
|
||||
from sn_basis.functions.qgisui_wrapper import iface
|
||||
from sn_basis.functions.qgiscore_wrapper import QgsProject, QgsMapLayerProxyModel
|
||||
from sn_basis.functions.qgisui_wrapper import iface, QgsMapLayerComboBox
|
||||
from sn_basis.functions.variable_wrapper import get_variable, set_variable
|
||||
from sn_basis.modules.Pruefmanager import Pruefmanager
|
||||
from sn_basis.modules.DataGrabber import DataGrabber
|
||||
@@ -39,6 +43,7 @@ KARTENNAME_VAR = "tab_b_kartenname"
|
||||
KARTENNAME_PLACEHOLDER = "Kartenname waehlen"
|
||||
KARTENNAME_38 = "§38"
|
||||
KARTENNAME_41 = "§41"
|
||||
KARTENNAME_BAUFREIGABE = "Anlage zur Baufreigabe"
|
||||
MASSSTAB_VAR = "tab_b_massstab"
|
||||
THEMA_VAR = "tab_b_thema"
|
||||
ZIELGROESSE_UI_VAR = "tab_b_zielgroesse"
|
||||
@@ -70,6 +75,10 @@ class PrintTab(QWidget):
|
||||
self._endlosrolle_cb: Optional[Any] = None
|
||||
self._druckpuffer_button: Optional[Any] = None
|
||||
self._btn_vorlage_erstellen: Optional[Any] = None
|
||||
self._atlas_layer_combo: Optional[Any] = None
|
||||
self._btn_auswahl_as_atlas: Optional[Any] = None
|
||||
self._atlas_button: Optional[Any] = None
|
||||
self._atlas_content: Optional[Any] = None
|
||||
|
||||
self._build_ui()
|
||||
self._restore_state()
|
||||
@@ -110,6 +119,7 @@ class PrintTab(QWidget):
|
||||
kartenname_combo.addItem(KARTENNAME_PLACEHOLDER)
|
||||
kartenname_combo.addItem(KARTENNAME_38)
|
||||
kartenname_combo.addItem(KARTENNAME_41)
|
||||
kartenname_combo.addItem(KARTENNAME_BAUFREIGABE)
|
||||
kartenname_combo.currentTextChanged.connect(self._on_kartenname_changed)
|
||||
self._kartenname_combo = kartenname_combo
|
||||
main_layout.addWidget(kartenname_combo)
|
||||
@@ -191,6 +201,49 @@ class PrintTab(QWidget):
|
||||
|
||||
main_layout.addLayout(druckbereich_row)
|
||||
|
||||
# Atlas-Bereich (einklappbar, analog Tab A)
|
||||
atlas_button = QToolButton()
|
||||
atlas_button.setText("Atlas")
|
||||
atlas_button.setCheckable(True)
|
||||
atlas_button.setChecked(False)
|
||||
atlas_button.setToolButtonStyle(ToolButtonTextBesideIcon)
|
||||
atlas_button.setArrowType(ArrowRight)
|
||||
atlas_button.setStyleSheet("font-weight: bold; margin-top: 6px;")
|
||||
atlas_button.toggled.connect(self._toggle_atlas)
|
||||
self._atlas_button = atlas_button
|
||||
main_layout.addWidget(atlas_button)
|
||||
|
||||
atlas_content = QWidget()
|
||||
atlas_layout = QVBoxLayout()
|
||||
atlas_layout.setSpacing(4)
|
||||
atlas_layout.setContentsMargins(10, 4, 4, 4)
|
||||
|
||||
atlas_layer_label = QLabel("Abdeckungslayer", self)
|
||||
atlas_layout.addWidget(atlas_layer_label)
|
||||
|
||||
atlas_layer_combo = QgsMapLayerComboBox(self)
|
||||
set_filters = getattr(atlas_layer_combo, "setFilters", None)
|
||||
if callable(set_filters):
|
||||
set_filters(QgsMapLayerProxyModel.VectorLayer)
|
||||
layer_changed = getattr(atlas_layer_combo, "layerChanged", None)
|
||||
if layer_changed is not None:
|
||||
try:
|
||||
layer_changed.connect(self._on_atlas_layer_changed)
|
||||
except Exception:
|
||||
pass
|
||||
self._atlas_layer_combo = atlas_layer_combo
|
||||
atlas_layout.addWidget(atlas_layer_combo)
|
||||
|
||||
btn_auswahl_as_atlas = QPushButton("Auswahl als Atlas anlegen", self)
|
||||
btn_auswahl_as_atlas.clicked.connect(self._on_auswahl_as_atlas_clicked)
|
||||
self._btn_auswahl_as_atlas = btn_auswahl_as_atlas
|
||||
atlas_layout.addWidget(btn_auswahl_as_atlas)
|
||||
|
||||
atlas_content.setLayout(atlas_layout)
|
||||
atlas_content.setVisible(False)
|
||||
self._atlas_content = atlas_content
|
||||
main_layout.addWidget(atlas_content)
|
||||
|
||||
btn_vorlage_erstellen = QPushButton("Vorlage erstellen", self)
|
||||
btn_vorlage_erstellen.clicked.connect(self._on_vorlage_erstellen)
|
||||
self._btn_vorlage_erstellen = btn_vorlage_erstellen
|
||||
@@ -208,7 +261,7 @@ class PrintTab(QWidget):
|
||||
return
|
||||
|
||||
saved_kartenname = get_variable(KARTENNAME_VAR, scope="project")
|
||||
if saved_kartenname in (KARTENNAME_38, KARTENNAME_41):
|
||||
if saved_kartenname in (KARTENNAME_38, KARTENNAME_41, KARTENNAME_BAUFREIGABE):
|
||||
self._kartenname_combo.setCurrentText(saved_kartenname)
|
||||
else:
|
||||
self._kartenname_combo.setCurrentText(KARTENNAME_PLACEHOLDER)
|
||||
@@ -252,12 +305,18 @@ class PrintTab(QWidget):
|
||||
druckpuffer_cm = DRUCKPUFFER_STANDARD_CM
|
||||
self._druckpuffer_button.setText(self._format_druckpuffer_label(max(0, druckpuffer_cm)))
|
||||
|
||||
self._restore_atlas_layer_selection()
|
||||
|
||||
def _on_kartenname_changed(self, value: str) -> None:
|
||||
if value in (KARTENNAME_38, KARTENNAME_41):
|
||||
if value in (KARTENNAME_38, KARTENNAME_41, KARTENNAME_BAUFREIGABE):
|
||||
set_variable(KARTENNAME_VAR, value, scope="project")
|
||||
else:
|
||||
set_variable(KARTENNAME_VAR, "", scope="project")
|
||||
|
||||
# Atlas-Bereich automatisch ein-/ausklappen je nach Kartenname.
|
||||
if self._atlas_button:
|
||||
self._atlas_button.setChecked(value == KARTENNAME_BAUFREIGABE)
|
||||
|
||||
if self.logic:
|
||||
self.logic.set_kartenname_for_auswahl(value)
|
||||
|
||||
@@ -358,6 +417,36 @@ class PrintTab(QWidget):
|
||||
self._connect_theme_collection_signals()
|
||||
self._restore_state()
|
||||
|
||||
def _toggle_atlas(self, checked: bool) -> None:
|
||||
if self._atlas_button:
|
||||
self._atlas_button.setArrowType(ArrowDown if checked else ArrowRight)
|
||||
if self._atlas_content:
|
||||
self._atlas_content.setVisible(checked)
|
||||
|
||||
def _restore_atlas_layer_selection(self) -> None:
|
||||
if not self._atlas_layer_combo:
|
||||
return
|
||||
|
||||
layer_id = (get_variable("sn_abdeckungslayer", scope="project") or "").strip()
|
||||
if not layer_id:
|
||||
return
|
||||
|
||||
try:
|
||||
layer = QgsProject.instance().mapLayer(layer_id)
|
||||
if layer is None:
|
||||
return
|
||||
|
||||
set_current_layer = getattr(self._atlas_layer_combo, "setLayer", None)
|
||||
if callable(set_current_layer):
|
||||
set_current_layer(layer)
|
||||
return
|
||||
|
||||
set_current_layer = getattr(self._atlas_layer_combo, "setCurrentLayer", None)
|
||||
if callable(set_current_layer):
|
||||
set_current_layer(layer)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _disconnect_theme_collection_signals(self) -> None:
|
||||
collection = self._connected_theme_collection
|
||||
if collection is not None:
|
||||
@@ -450,3 +539,101 @@ class PrintTab(QWidget):
|
||||
return float(scale) if scale else None
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def _on_atlas_layer_changed(self, layer_or_name: Any) -> None:
|
||||
"""Speichert den ausgewaehlten Atlas-Layer als Layer-ID in Projektvariablen."""
|
||||
if layer_or_name is None or layer_or_name == "":
|
||||
set_variable("sn_abdeckungslayer", "", scope="project")
|
||||
return
|
||||
|
||||
# Standardfall QgsMapLayerComboBox: echtes Layer-Objekt
|
||||
layer_id_getter = getattr(layer_or_name, "id", None)
|
||||
if callable(layer_id_getter):
|
||||
layer_id = layer_id_getter() or ""
|
||||
set_variable("sn_abdeckungslayer", layer_id, scope="project")
|
||||
return
|
||||
|
||||
# Fallback: ggf. Name aus Mock/anderen Widgets
|
||||
value = str(layer_or_name).strip()
|
||||
if not value:
|
||||
set_variable("sn_abdeckungslayer", "", scope="project")
|
||||
return
|
||||
|
||||
try:
|
||||
project = QgsProject.instance()
|
||||
map_layers = project.mapLayers()
|
||||
for layer_id, layer in map_layers.items():
|
||||
if getattr(layer, "name", lambda: "")() == value:
|
||||
set_variable("sn_abdeckungslayer", layer_id, scope="project")
|
||||
return
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _on_auswahl_as_atlas_clicked(self) -> None:
|
||||
"""Handler fuer Button 'Auswahl als Atlas anlegen'.
|
||||
|
||||
Erstellt einen neuen Layer 'Atlaslayer' aus der aktuellen Feature-Auswahl
|
||||
und traegt ihn ins Atlas-Dropdown ein.
|
||||
"""
|
||||
if not self.logic or not self.pruefmanager:
|
||||
return
|
||||
|
||||
atlas_layer, layer_id = self.logic.create_atlas_layer_from_selection()
|
||||
if atlas_layer is None or not layer_id:
|
||||
return
|
||||
|
||||
if self._atlas_button and self._atlas_content:
|
||||
self._atlas_button.setChecked(True)
|
||||
self._toggle_atlas(True)
|
||||
|
||||
# Neu erstellten Layer im Layer-Combo setzen
|
||||
if self._atlas_layer_combo:
|
||||
set_current_layer = getattr(self._atlas_layer_combo, "setLayer", None)
|
||||
if callable(set_current_layer):
|
||||
try:
|
||||
set_current_layer(atlas_layer)
|
||||
return
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
set_current_layer = getattr(self._atlas_layer_combo, "setCurrentLayer", None)
|
||||
if callable(set_current_layer):
|
||||
try:
|
||||
set_current_layer(atlas_layer)
|
||||
return
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Fallback nur fuer Mock/klassische ComboBox
|
||||
self._populate_atlas_layer_combo()
|
||||
|
||||
def _populate_atlas_layer_combo(self) -> None:
|
||||
"""Fallback-Befuellung, falls kein echtes QgsMapLayerComboBox Verhalten verfuegbar ist."""
|
||||
if not self._atlas_layer_combo:
|
||||
return
|
||||
|
||||
clear_fn = getattr(self._atlas_layer_combo, "clear", None)
|
||||
add_item_fn = getattr(self._atlas_layer_combo, "addItem", None)
|
||||
if not callable(clear_fn) or not callable(add_item_fn):
|
||||
return
|
||||
|
||||
self._atlas_layer_combo.blockSignals(True)
|
||||
clear_fn()
|
||||
add_item_fn("")
|
||||
|
||||
try:
|
||||
project = QgsProject.instance()
|
||||
map_layers = getattr(project, "mapLayers", None)
|
||||
if not callable(map_layers):
|
||||
self._atlas_layer_combo.blockSignals(False)
|
||||
return
|
||||
|
||||
layers = map_layers().values() if hasattr(map_layers(), "values") else map_layers()
|
||||
for layer in layers:
|
||||
layer_name = getattr(layer, "name", lambda: None)()
|
||||
if layer_name and layer_name not in ("", "Druckrechteck"):
|
||||
add_item_fn(layer_name)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
self._atlas_layer_combo.blockSignals(False)
|
||||
|
||||
Reference in New Issue
Block a user