Source code for whitecanvas.backend.pyqtgraph.band

from __future__ import annotations

import numpy as np
from numpy.typing import NDArray

from qtpy import QtGui
import pyqtgraph as pg
from whitecanvas.protocols import BandProtocol, check_protocol
from whitecanvas.types import LineStyle, FacePattern, Orientation
from whitecanvas.backend.pyqtgraph._base import PyQtLayer
from ._qt_utils import (
    array_to_qcolor,
    from_qt_line_style,
    to_qt_line_style,
    from_qt_brush_style,
    to_qt_brush_style,
)


[docs]@check_protocol(BandProtocol) class Band(pg.FillBetweenItem, PyQtLayer): def __init__(self, t, ydata0, ydata1, orient: Orientation): if orient.is_vertical: c0 = pg.PlotCurveItem(t, ydata0) c1 = pg.PlotCurveItem(t, ydata1) else: c0 = pg.PlotCurveItem(ydata0, t) c1 = pg.PlotCurveItem(ydata1, t) pen = QtGui.QPen(QtGui.QColor(0, 0, 0)) pen.setCosmetic(True) super().__init__(c0, c1, pen=pen, brush=QtGui.QBrush(QtGui.QColor(0, 0, 0))) ##### XYDataProtocol ##### def _plt_get_vertical_data(self): c0: pg.PlotCurveItem = self.curves[0] c1: pg.PlotCurveItem = self.curves[1] return c0.xData, c0.yData, c1.yData def _plt_set_vertical_data(self, t, ydata0, ydata1): c0: pg.PlotCurveItem = self.curves[0] c1: pg.PlotCurveItem = self.curves[1] c0.setData(t, ydata0) c1.setData(t, ydata1) def _plt_get_horizontal_data(self): c0: pg.PlotCurveItem = self.curves[0] c1: pg.PlotCurveItem = self.curves[1] return c0.yData, c0.xData, c1.xData def _plt_set_horizontal_data(self, y, xdata0, xdata1): c0: pg.PlotCurveItem = self.curves[0] c1: pg.PlotCurveItem = self.curves[1] c0.setData(xdata0, y) c1.setData(xdata1, y) ##### HasFace protocol ##### def _get_brush(self) -> QtGui.QBrush: return self.brush() def _plt_get_face_color(self) -> NDArray[np.float32]: rgba = self._get_brush().color().getRgbF() return np.array(rgba) def _plt_set_face_color(self, color: NDArray[np.float32]): brush = self._get_brush() brush.setColor(array_to_qcolor(color)) self.setBrush(brush) def _plt_get_face_pattern(self) -> FacePattern: return from_qt_brush_style(self._get_brush().style()) def _plt_set_face_pattern(self, pattern: FacePattern): brush = self._get_brush() brush.setStyle(to_qt_brush_style(pattern)) self.setBrush(brush) ##### HasEdges protocol ##### def _get_pen(self) -> QtGui.QPen: return self.pen() def _plt_get_edge_color(self) -> NDArray[np.float32]: rgba = self._get_pen().color().getRgbF() return np.array(rgba) def _plt_set_edge_color(self, color: NDArray[np.float32]): pen = self._get_pen() pen.setColor(array_to_qcolor(color)) self.setPen(pen) def _plt_get_edge_width(self) -> float: return self._get_pen().widthF() def _plt_set_edge_width(self, width: float): pen = self._get_pen() pen.setWidthF(width) self.setPen(pen) def _plt_get_edge_style(self) -> LineStyle: return from_qt_line_style(self._get_pen().style()) def _plt_set_edge_style(self, style: LineStyle): pen = self._get_pen() pen.setStyle(to_qt_line_style(style)) self.setPen(pen)