0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 03:31:50 +02:00

fix: bubble-up signals

This commit is contained in:
2024-08-21 21:37:21 +02:00
parent f0203d9bf6
commit 2fe72c9ccb
3 changed files with 41 additions and 18 deletions

View File

@ -4,6 +4,7 @@ from typing import Literal, Optional
import pyqtgraph as pg
from pydantic import BaseModel, Field
from qtpy.QtCore import Signal, Slot
from qtpy.QtWidgets import QWidget
from bec_widgets.utils import BECConnector, ConnectionConfig
@ -55,6 +56,8 @@ class BECViewBox(pg.ViewBox):
class BECPlotBase(BECConnector, pg.GraphicsLayout):
crosshair_coordinates_changed = Signal(tuple)
crosshair_coordinates_clicked = Signal(tuple)
USER_ACCESS = [
"_config_dict",
"set",
@ -325,10 +328,18 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout):
"""Hook the crosshair to all plots."""
if self.crosshair is None:
self.crosshair = Crosshair(self.plot_item, precision=3)
self.crosshair.coordinatesChanged1D.connect(self.crosshair_coordinates_changed)
self.crosshair.coordinatesClicked1D.connect(self.crosshair_coordinates_clicked)
self.crosshair.coordinatesChanged2D.connect(self.crosshair_coordinates_changed)
self.crosshair.coordinatesClicked2D.connect(self.crosshair_coordinates_clicked)
def unhook_crosshair(self) -> None:
"""Unhook the crosshair from all plots."""
if self.crosshair is not None:
self.crosshair.coordinatesChanged1D.disconnect(self.crosshair_coordinates_changed)
self.crosshair.coordinatesClicked1D.disconnect(self.crosshair_coordinates_clicked)
self.crosshair.coordinatesChanged2D.disconnect(self.crosshair_coordinates_changed)
self.crosshair.coordinatesClicked2D.disconnect(self.crosshair_coordinates_clicked)
self.crosshair.cleanup()
self.crosshair.deleteLater()
self.crosshair = None
@ -340,6 +351,12 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout):
self.unhook_crosshair()
@Slot()
def reset(self) -> None:
"""Reset the plot widget."""
if self.crosshair is not None:
self.crosshair.clear_markers()
def export(self):
"""Show the Export Dialog of the plot widget."""
scene = self.plot_item.scene()

View File

@ -14,7 +14,7 @@ from qtpy.QtCore import Signal as pyqtSignal
from qtpy.QtWidgets import QWidget
from bec_widgets.qt_utils.error_popups import SafeSlot as Slot
from bec_widgets.utils import Colors, Crosshair, EntryValidator
from bec_widgets.utils import Colors, EntryValidator
from bec_widgets.widgets.figure.plots.plot_base import BECPlotBase, SubplotConfig
from bec_widgets.widgets.figure.plots.waveform.waveform_curve import (
BECCurve,
@ -77,6 +77,7 @@ class BECWaveform(BECPlotBase):
dap_params_update = pyqtSignal(dict)
dap_summary_update = pyqtSignal(dict)
autorange_signal = pyqtSignal()
new_scan = pyqtSignal()
def __init__(
self,
@ -408,23 +409,6 @@ class BECWaveform(BECPlotBase):
"""
self.plot_item.enableAutoRange(axis, enabled)
@Slot()
def auto_range(self):
self.plot_item.autoRange()
def set_auto_range(self, enabled: bool, axis: str = "xy"):
"""
Set the auto range of the plot widget.
Args:
enabled(bool): If True, enable the auto range.
axis(str, optional): The axis to enable the auto range.
- "xy": Enable auto range for both x and y axis.
- "x": Enable auto range for x axis.
- "y": Enable auto range for y axis.
"""
self.plot_item.enableAutoRange(axis, enabled)
def add_curve_custom(
self,
x: list | np.ndarray,
@ -935,6 +919,8 @@ class BECWaveform(BECPlotBase):
return
if current_scan_id != self.scan_id:
self.reset()
self.new_scan.emit()
self.set_auto_range(True, "xy")
self.old_scan_id = self.scan_id
self.scan_id = current_scan_id

View File

@ -5,6 +5,7 @@ from typing import Literal
import numpy as np
import pyqtgraph as pg
from qtpy.QtCore import Signal
from qtpy.QtWidgets import QVBoxLayout, QWidget
from bec_widgets.qt_utils.error_popups import SafeSlot, WarningPopupUtility
@ -56,6 +57,14 @@ class BECWaveformWidget(BECWidget, QWidget):
"export",
"export_to_matplotlib",
]
scan_signal_update = Signal()
async_signal_update = Signal()
dap_params_update = Signal(dict)
dap_summary_update = Signal(dict)
autorange_signal = Signal()
new_scan = Signal()
crosshair_coordinates_changed = Signal(tuple)
crosshair_coordinates_clicked = Signal(tuple)
def __init__(
self,
@ -118,8 +127,19 @@ class BECWaveformWidget(BECWidget, QWidget):
self.config = config
self.hook_waveform_signals()
self._hook_actions()
def hook_waveform_signals(self):
self.waveform.scan_signal_update.connect(self.scan_signal_update)
self.waveform.async_signal_update.connect(self.async_signal_update)
self.waveform.dap_params_update.connect(self.dap_params_update)
self.waveform.dap_summary_update.connect(self.dap_summary_update)
self.waveform.autorange_signal.connect(self.autorange_signal)
self.waveform.new_scan.connect(self.new_scan)
self.waveform.crosshair_coordinates_changed.connect(self.crosshair_coordinates_changed)
self.waveform.crosshair_coordinates_clicked.connect(self.crosshair_coordinates_clicked)
def _hook_actions(self):
self.toolbar.widgets["save"].action.triggered.connect(self.export)
self.toolbar.widgets["matplotlib"].action.triggered.connect(self.export_to_matplotlib)