Source code for sec_interp.gui.ui.pages.section_page

from __future__ import annotations

"""Cross-section configuration page."""

from typing import Any

from qgis.core import QgsMapLayerProxyModel
from qgis.gui import QgsDoubleSpinBox, QgsMapLayerComboBox
from qgis.PyQt.QtCore import QCoreApplication
from qgis.PyQt.QtWidgets import QGridLayout, QLabel

from .base_page import BasePage


[docs] class SectionPage(BasePage): """Configuration page for Cross Section settings.""" def __init__(self, parent: Any = None) -> None: super().__init__(QCoreApplication.translate("SectionPage", "Cross Section Line"), parent) def _setup_ui(self) -> None: super()._setup_ui() self.group_layout = QGridLayout(self.group_box) self.group_layout.setSpacing(6) # Row 0: Section Line Layer self.group_layout.addWidget(QLabel(self.tr("Section Line *")), 0, 0) self.line_combo = QgsMapLayerComboBox() # Use modern flags if available (QGIS 3.32+) try: from qgis.core import Qgis # noqa: PLC0415 self.line_combo.setFilters(Qgis.LayerFilters(Qgis.LayerFilter.LineLayer)) except (ImportError, AttributeError, TypeError): self.line_combo.setFilters(QgsMapLayerProxyModel.LineLayer) self.line_combo.setAllowEmptyLayer(True) self.line_combo.setToolTip(self.tr("Select the line layer defining the cross-section")) self.line_combo.setCurrentIndex(0) self.group_layout.addWidget(self.line_combo, 0, 1) self.lbl_section_status = QLabel() self.lbl_section_status.setFixedSize(16, 16) self.group_layout.addWidget(self.lbl_section_status, 0, 2) # Row 1: Buffer Distance self.group_layout.addWidget(QLabel(self.tr("Buffer Dist. (m)")), 1, 0) self.buffer_spin = QgsDoubleSpinBox() self.buffer_spin.setRange(0.0, 10000.0) self.buffer_spin.setValue(100.0) # Default self.buffer_spin.setSuffix(self.tr(" m")) self.buffer_spin.setToolTip( self.tr("Distance to include structures around the section line") ) self.group_layout.addWidget(self.buffer_spin, 1, 1)
[docs] def get_data(self) -> dict[str, Any]: """Get section configuration.""" return { "crossline_layer": self.line_combo.currentLayer(), "buffer_distance": self.buffer_spin.value(), }
[docs] def validate(self) -> tuple[bool, str]: """Validate page settings. Returns: Tuple of (success, error message). """ if not self.line_combo.currentLayer(): return False, self.tr("Section line layer is required") return True, ""
[docs] def is_complete(self) -> bool: """Check if required fields are filled.""" return bool(self.line_combo.currentLayer())