Source code for sec_interp.gui.legend_widget
from __future__ import annotations
"""Legend Widget Module."""
from typing import TYPE_CHECKING
from qgis.PyQt import QtCore
from qgis.PyQt.QtCore import QEvent, QObject, QRectF, Qt
from qgis.PyQt.QtGui import QPainter
from qgis.PyQt.QtWidgets import QWidget
if TYPE_CHECKING:
from sec_interp.gui.main_dialog import SecInterpDialog
from .preview_legend_renderer import PreviewLegendRenderer as Renderer
[docs]
class LegendWidget(QWidget):
"""Widget to display the geological legend over the map canvas."""
def __init__(self, dialog: SecInterpDialog) -> None:
super().__init__(dialog) # Use dialog as the parent
self.dialog = dialog # Store reference to the dialog
self.renderer: Renderer | None = None # Apply UP037
self.setAttribute(Qt.WA_TranslucentBackground)
self.setAttribute(Qt.WA_TransparentForMouseEvents) # Let clicks pass through
self.setAutoFillBackground(False) # Don't fill background
self.hide()
# Install event filter on parent to track resize
self.dialog.installEventFilter(self)
[docs]
def eventFilter(self, obj: QObject, event: QEvent) -> bool:
"""Handle parent resize events."""
if obj == self.dialog and event.type() == QtCore.QEvent.Resize:
self.resize(event.size())
return super().eventFilter(obj, event)
[docs]
def update_legend(self, renderer: Renderer, visible: bool = True) -> None:
"""Update legend with data from renderer."""
self.renderer = renderer
self.update()
if visible:
self.show()
else:
self.hide()
[docs]
def paintEvent(self, event: QEvent) -> None:
"""Handle paint event to draw the legend."""
if not self.renderer or not self.renderer.active_units:
return
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
# Draw legend using the shared method
self.renderer.draw_legend(painter, QRectF(self.rect()))