From 4ca66532a48b29639f1910170bdda53a1f697e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20M=C3=BCller?= Date: Mon, 5 Jul 2021 21:09:43 +0200 Subject: [PATCH] Refactoring charts --- NanoVNASaver/Charts/Chart.py | 77 ++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/NanoVNASaver/Charts/Chart.py b/NanoVNASaver/Charts/Chart.py index 136a856..97343aa 100644 --- a/NanoVNASaver/Charts/Chart.py +++ b/NanoVNASaver/Charts/Chart.py @@ -58,17 +58,51 @@ class ChartDragBox: move_x: int = -1 move_y: int = -1 -@dataclass -class ChartMarkerFlags: - draw_numbers: bool = False - filled: bool = False - at_tip: bool = False - @dataclass class ChartFlags: draw_lines: bool = False is_popout: bool = False +@dataclass +class ChartMarkerConfig: + draw_label: bool = False + fill: bool = False + at_tip: bool = False + size: int = 3 + color: QtGui.QColor = QtGui.QColor(QtCore.Qt.lightGray) + label_text: str = "" + +class ChartMarker(QtWidgets.QWidget): + def __init__(self, qp: QtGui.QPaintDevice, + defaults: ChartMarkerConfig=ChartMarkerConfig()): + super().__init__() + self.qp = qp + self.cfg = defaults + + def draw(self, x: int, y: int, color: QtGui.QColor = None, text: str = ""): + if self.cfg.at_tip: + y -= self.cfg.size + if not color: + color = self.cfg.color + pen = QtGui.QPen(color) + self.qp.setPen(pen) + qpp = QtGui.QPainterPath() + qpp.moveTo(x, y + self.cfg.size) + qpp.lineTo(x - self.cfg.size, y - self.cfg.size) + qpp.lineTo(x + self.cfg.size, y - self.cfg.size) + qpp.lineTo(x, y + self.cfg.size) + + if self.cfg.fill: + self.qp.fillPath(qpp, color) + else: + self.qp.drawPath(qpp) + + if not text: + text = self.cfg.label_text + if text and self.cfg.draw_label: + self.qp.drawText(x-3, y-3 - self.cfg.size, text) + + class Chart(QtWidgets.QWidget): bands: ClassVar[Any] = None popoutRequested: ClassVar[Any] = pyqtSignal(object) @@ -82,7 +116,7 @@ class Chart(QtWidgets.QWidget): self.dim = ChartDimensions() self.dragbox = ChartDragBox() self.flag = ChartFlags() - self.marker_flag = ChartMarkerFlags() + self.marker_cfg = ChartMarkerConfig() self.draggedMarker = None @@ -196,15 +230,15 @@ class Chart(QtWidgets.QWidget): self.update() def setDrawMarkerNumbers(self, draw_marker_numbers): - self.marker_flag.draw_numbers = draw_marker_numbers + self.marker_cfg.draw_label = draw_marker_numbers self.update() def setMarkerAtTip(self, marker_at_tip): - self.marker_flag.at_tip = marker_at_tip + self.marker_cfg.at_tip = marker_at_tip self.update() def setFilledMarkers(self, filled_markers): - self.marker_flag.filled = filled_markers + self.marker_cfg.fill = filled_markers self.update() def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: @@ -258,7 +292,7 @@ class Chart(QtWidgets.QWidget): new_chart.color = replace(self.color) new_chart.dim = replace(self.dim) new_chart.flag = replace(self.flag) - new_chart.marker_flag = replace(self.marker_flag) + new_chart.marker_cfg = replace(self.marker_cfg) new_chart.markers = self.markers new_chart.swrMarkers = self.swrMarkers new_chart.bands = self.bands @@ -291,25 +325,8 @@ class Chart(QtWidgets.QWidget): self.update() def drawMarker(self, x, y, qp: QtGui.QPainter, color: QtGui.QColor, number=0): - if self.marker_flag.at_tip: - y -= self.dim.marker - pen = QtGui.QPen(color) - qp.setPen(pen) - qpp = QtGui.QPainterPath() - qpp.moveTo(x, y + self.dim.marker) - qpp.lineTo(x - self.dim.marker, y - self.dim.marker) - qpp.lineTo(x + self.dim.marker, y - self.dim.marker) - qpp.lineTo(x, y + self.dim.marker) - - if self.marker_flag.filled: - qp.fillPath(qpp, color) - else: - qp.drawPath(qpp) - - if self.marker_flag.draw_numbers: - number_x = x - 3 - number_y = y - self.dim.marker - 3 - qp.drawText(number_x, number_y, str(number)) + cmarker = ChartMarker(qp, self.marker_cfg) + cmarker.draw(x, y, color, str(number)) def drawTitle(self, qp: QtGui.QPainter, position: QtCore.QPoint = None): if not self.sweepTitle: