Source code for pyqt_reactive.widgets.shared.scoped_table_widget

"""Scope-aware table widgets."""

from __future__ import annotations

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QTableWidget, QWidget

from pyqt_reactive.widgets.shared.scope_border_renderer import ScopeBorderRenderer
from pyqt_reactive.widgets.shared.scope_color_receiver import ScopeColorSchemeReceiver
from pyqt_reactive.widgets.shared.scope_visual_config import ScopeColorScheme


class _ScopedTableBorderOverlay(QWidget):
    """Transparent paint surface for scoped table borders."""

    def __init__(self, parent: QTableWidget) -> None:
        super().__init__(parent)
        self._scope_color_scheme: ScopeColorScheme | None = None
        self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents, True)
        self.setAttribute(Qt.WidgetAttribute.WA_NoSystemBackground, True)
        self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, True)

    def set_scope_color_scheme(self, scheme: ScopeColorScheme | None) -> None:
        self._scope_color_scheme = scheme
        self.setVisible(scheme is not None and bool(scheme.step_border_layers))
        self.update()

    def paintEvent(self, event) -> None:
        del event
        if self._scope_color_scheme is None:
            return
        ScopeBorderRenderer.paint_border_layers(
            self,
            self._scope_color_scheme,
            self.rect(),
            radius=3,
        )


[docs] class ScopedTableWidget(QTableWidget): """QTableWidget that paints the shared scoped patterned border."""
[docs] def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self._base_style_sheet = self.styleSheet() self._scope_color_scheme: ScopeColorScheme | None = None self._border_overlay = _ScopedTableBorderOverlay(self) self._border_overlay.hide()
[docs] def set_scope_color_scheme(self, scheme: ScopeColorScheme | None) -> None: """Apply or clear scope-border styling.""" self._scope_color_scheme = scheme if scheme is None or not scheme.step_border_layers: self.setStyleSheet(self._base_style_sheet) self._border_overlay.set_scope_color_scheme(None) self.update() return border_width = ScopeBorderRenderer.border_width(scheme) self.setStyleSheet( f"{self._base_style_sheet}\n" "QTableWidget { " f"border: {border_width}px solid transparent; " "border-radius: 3px; " "}" ) self._border_overlay.setGeometry(self.rect()) self._border_overlay.raise_() self._border_overlay.set_scope_color_scheme(scheme) self.update()
[docs] def resizeEvent(self, event) -> None: super().resizeEvent(event) self._border_overlay.setGeometry(self.rect()) self._border_overlay.raise_()
ScopeColorSchemeReceiver.register(ScopedTableWidget)