Source code for sec_interp.gui.ui.pages.preview_page
from __future__ import annotations
"""Preview area widget."""
from typing import Any
from qgis.core import QgsApplication
from qgis.gui import QgsCollapsibleGroupBox, QgsMapCanvas
from qgis.PyQt.QtGui import QColor
from qgis.PyQt.QtWidgets import (
QCheckBox,
QFrame,
QHBoxLayout,
QLabel,
QPushButton,
QSpinBox,
QTextEdit,
QVBoxLayout,
QWidget,
)
[docs]
class PreviewWidget(QWidget):
"""Widget for profile preview and controls."""
def __init__(self, parent: Any = None) -> None:
super().__init__(parent)
self._setup_ui()
def _setup_ui(self) -> None:
layout = QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
# Frame for preview (optional visual container)
self.frame = QFrame()
self.frame.setFrameShape(QFrame.StyledPanel)
self.frame_layout = QVBoxLayout(self.frame)
self._setup_canvas_area()
self._setup_action_buttons()
self._setup_lod_controls()
self._setup_layer_checkboxes()
self._setup_results_area()
layout.addWidget(self.frame)
# Setup connections
self.canvas.xyCoordinates.connect(self._update_coords)
self.canvas.scaleChanged.connect(self._update_scale)
def _setup_canvas_area(self):
"""Set up map canvas and status bar."""
self.canvas = QgsMapCanvas()
self.canvas.setCanvasColor(QColor(255, 255, 255))
self.canvas.setMinimumHeight(300)
self.frame_layout.addWidget(self.canvas, stretch=10)
# -- Status Bar --
status_layout = QHBoxLayout()
status_layout.setContentsMargins(5, 0, 5, 0)
self.lbl_coords = QLabel(self.tr("Coords: - , -"))
self.lbl_scale = QLabel(self.tr("Scale 1: -"))
self.lbl_crs = QLabel(self.tr("CRS: -"))
for lbl in [self.lbl_coords, self.lbl_scale, self.lbl_crs]:
lbl.setStyleSheet("color: #666; font-size: 9pt;")
status_layout.addWidget(self.lbl_coords)
status_layout.addStretch()
status_layout.addWidget(self.lbl_scale)
status_layout.addStretch()
status_layout.addWidget(self.lbl_crs)
self.frame_layout.addLayout(status_layout)
def _setup_action_buttons(self):
"""Set up preview, measure, and export buttons."""
btn_layout = QHBoxLayout()
self.btn_preview = QPushButton(self.tr("Preview"))
self.btn_preview.setIcon(QgsApplication.getThemeIcon("mActionRefresh.svg"))
self.btn_export = QPushButton(self.tr("Export"))
self.btn_export.setToolTip(self.tr("Export preview to file"))
self.btn_export.setIcon(QgsApplication.getThemeIcon("mActionSaveMapAsImage.svg"))
self.btn_measure = QPushButton(self.tr("Measure"))
self.btn_measure.setCheckable(True)
self.btn_measure.setToolTip(self.tr("Measure distance and slope"))
self.btn_measure.setIcon(QgsApplication.getThemeIcon("mActionMeasure.svg"))
self.btn_interpret = QPushButton(self.tr("Interpret"))
self.btn_interpret.setCheckable(True)
self.btn_interpret.setToolTip(self.tr("Draw interpretation polygons"))
self.btn_interpret.setIcon(QgsApplication.getThemeIcon("mActionAddPolygon.svg"))
self.btn_finalize = QPushButton(self.tr("Finalize"))
self.btn_finalize.setToolTip(self.tr("Finalize multi-point measurement"))
self.btn_finalize.setVisible(False)
self.btn_finalize.setIcon(QgsApplication.getThemeIcon("mActionCheck.svg"))
btn_layout.addWidget(self.btn_preview)
btn_layout.addWidget(self.btn_measure)
btn_layout.addWidget(self.btn_interpret)
btn_layout.addWidget(self.btn_finalize)
btn_layout.addWidget(self.btn_export)
self.frame_layout.addLayout(btn_layout)
def _setup_lod_controls(self):
"""Set up level of detail controls."""
lod_layout = QHBoxLayout()
lod_layout.addWidget(QLabel(self.tr("Max Points:")))
self.spin_max_points = QSpinBox()
self.spin_max_points.setRange(100, 10000)
self.spin_max_points.setValue(1000)
self.spin_max_points.setSingleStep(100)
self.spin_max_points.setToolTip(
self.tr("Maximum points to render in preview (LOD Optimization)")
)
lod_layout.addWidget(self.spin_max_points)
self.chk_auto_lod = QCheckBox(self.tr("Auto"))
self.chk_auto_lod.setToolTip(self.tr("Automatically adjust details based on preview size"))
self.chk_auto_lod.toggled.connect(self._toggle_lod_spin)
lod_layout.addWidget(self.chk_auto_lod)
self.chk_adaptive_sampling = QCheckBox(self.tr("Adaptive"))
self.chk_adaptive_sampling.setToolTip(
self.tr("Use adaptive sampling based on curvature (Phase 2)")
)
self.chk_adaptive_sampling.setChecked(True)
lod_layout.addWidget(self.chk_adaptive_sampling)
lod_layout.addStretch()
self.frame_layout.addLayout(lod_layout)
def _setup_layer_checkboxes(self):
"""Set up checkboxes for layer visibility."""
chk_layout = QHBoxLayout()
self.chk_topo = QCheckBox(self.tr("Show Topography"))
self.chk_topo.setChecked(True)
self.chk_geol = QCheckBox(self.tr("Show Geology"))
self.chk_geol.setChecked(True)
self.chk_struct = QCheckBox(self.tr("Show Structures"))
self.chk_struct.setChecked(True)
self.chk_drillholes = QCheckBox(self.tr("Show Drillholes"))
self.chk_drillholes.setChecked(True)
self.chk_interpretations = QCheckBox(self.tr("Show Interpretations"))
self.chk_interpretations.setChecked(True)
self.chk_legend = QCheckBox(self.tr("Show Legend"))
self.chk_legend.setChecked(True)
chk_layout.addWidget(self.chk_topo)
chk_layout.addWidget(self.chk_geol)
chk_layout.addWidget(self.chk_struct)
chk_layout.addWidget(self.chk_drillholes)
chk_layout.addWidget(self.chk_interpretations)
chk_layout.addWidget(self.chk_legend)
self.frame_layout.addLayout(chk_layout)
def _setup_results_area(self):
"""Set up results group and text display."""
self.results_group = QgsCollapsibleGroupBox(self.tr("Results"))
results_layout = QVBoxLayout(self.results_group)
self.results_text = QTextEdit()
self.results_text.setReadOnly(True)
self.results_text.setMaximumHeight(100)
results_layout.addWidget(self.results_text)
self.frame_layout.addWidget(self.results_group)
def _update_coords(self, point: Any) -> None:
"""Update coordinate label."""
self.lbl_coords.setText(f"{point.x():.2f}, {point.y():.2f}")
def _update_scale(self, scale: float) -> None:
"""Update scale label."""
self.lbl_scale.setText(self.tr("Scale 1:{}").format(int(scale)))
def _toggle_lod_spin(self, checked: bool) -> None:
"""Enable/disable max points spinbox based on auto checkbox."""
self.spin_max_points.setEnabled(not checked)