build: add pyqtgraph 0.14 compatibility updates

This commit is contained in:
copilot-swe-agent[bot]
2026-05-27 21:31:48 +00:00
committed by wyzula-jan
parent c9fc0a82b9
commit 28546f4dfd
3 changed files with 43 additions and 67 deletions
+9 -4
View File
@@ -429,10 +429,10 @@ class Crosshair(QObject):
if event is None:
return # nothing to do
scene_pos = event[0] # SignalProxy bundle
if not self.plot_item.vb.sceneBoundingRect().contains(scene_pos):
return
view_pos = self.plot_item.vb.mapSceneToView(scene_pos)
x, y = view_pos.x(), view_pos.y()
if not self._is_within_view_range(x, y):
return
# Update crosshair visuals
self.v_line.setPos(x)
@@ -493,8 +493,9 @@ class Crosshair(QObject):
if event.button() != Qt.MouseButton.LeftButton:
return
self.update_markers()
if self.plot_item.vb.sceneBoundingRect().contains(event._scenePos):
mouse_point = self.plot_item.vb.mapSceneToView(event._scenePos)
scene_pos = event.scenePos() if hasattr(event, "scenePos") else event._scenePos
mouse_point = self.plot_item.vb.mapSceneToView(scene_pos)
if self._is_within_view_range(mouse_point.x(), mouse_point.y()):
x, y = mouse_point.x(), mouse_point.y()
scaled_x, scaled_y = self.scale_emitted_coordinates(mouse_point.x(), mouse_point.y())
self.crosshairClicked.emit((scaled_x, scaled_y))
@@ -545,6 +546,10 @@ class Crosshair(QObject):
else:
continue
def _is_within_view_range(self, x: float, y: float) -> bool:
x_range, y_range = self.plot_item.vb.viewRange()
return min(x_range) <= x <= max(x_range) and min(y_range) <= y <= max(y_range)
def _get_transformed_position(
self, x: float, y: float, transform: QTransform
) -> tuple[QPointF, QPointF]:
+1 -1
View File
@@ -23,7 +23,7 @@ dependencies = [
"ophyd_devices~=1.29, >=1.29.1",
"pydantic~=2.0",
"pylsp-bec~=1.2",
"pyqtgraph==0.13.7",
"pyqtgraph~=0.14.0",
"qtconsole~=5.5, >=5.5.1", # needed for jupyter console
"qtmonaco~=0.8, >=0.8.1",
"qtpy~=2.4",
+33 -62
View File
@@ -14,6 +14,18 @@ from .conftest import create_widget
# pylint: disable = redefined-outer-name
class _FakeMouseClickEvent:
def __init__(self, scene_pos: QPointF, button: Qt.MouseButton = Qt.LeftButton):
self._scene_pos = scene_pos
self._button = button
def button(self):
return self._button
def scenePos(self):
return self._scene_pos
@pytest.fixture
def plot_widget_with_crosshair(qtbot):
widget = pg.PlotWidget()
@@ -44,14 +56,10 @@ def image_widget_with_crosshair(qtbot):
def test_mouse_moved_lines(plot_widget_with_crosshair):
crosshair, plot_item = plot_widget_with_crosshair
pos_in_view = QPointF(2, 5)
pos_in_scene = plot_item.vb.mapViewToScene(pos_in_view)
event_mock = [pos_in_scene]
crosshair, _ = plot_widget_with_crosshair
# Simulate mouse movement
crosshair.mouse_moved(event_mock)
crosshair.mouse_moved(manual_pos=(2, 5))
# Check that the vertical line is indeed at x=2
assert np.isclose(crosshair.v_line.pos().x(), 2)
@@ -59,7 +67,7 @@ def test_mouse_moved_lines(plot_widget_with_crosshair):
def test_mouse_moved_signals(plot_widget_with_crosshair):
crosshair, plot_item = plot_widget_with_crosshair
crosshair, _ = plot_widget_with_crosshair
emitted_values_1D = []
@@ -68,18 +76,14 @@ def test_mouse_moved_signals(plot_widget_with_crosshair):
crosshair.coordinatesChanged1D.connect(slot)
pos_in_view = QPointF(2, 5)
pos_in_scene = plot_item.vb.mapViewToScene(pos_in_view)
event_mock = [pos_in_scene]
crosshair.mouse_moved(event_mock)
crosshair.mouse_moved(manual_pos=(2, 5))
# Assert the expected behavior
assert emitted_values_1D == [("Curve 1", 2, 5)]
def test_mouse_moved_signals_outside(plot_widget_with_crosshair):
crosshair, plot_item = plot_widget_with_crosshair
crosshair, _ = plot_widget_with_crosshair
# Create a slot that will store the emitted values as tuples
emitted_values_1D = []
@@ -91,12 +95,8 @@ def test_mouse_moved_signals_outside(plot_widget_with_crosshair):
crosshair.coordinatesChanged1D.connect(slot)
# Simulate a mouse moved event at a specific position
pos_in_view = QPointF(22, 55)
pos_in_scene = plot_item.vb.mapViewToScene(pos_in_view)
event_mock = [pos_in_scene]
# Call the mouse_moved method
crosshair.mouse_moved(event_mock)
crosshair.mouse_moved(manual_pos=(22, 55))
# Assert the expected behavior
assert emitted_values_1D == []
@@ -113,17 +113,13 @@ def test_mouse_moved_signals_2D(image_widget_with_crosshair):
crosshair.coordinatesChanged2D.connect(slot)
pos_in_view = QPointF(21.0, 55.0)
pos_in_scene = plot_item.vb.mapViewToScene(pos_in_view)
event_mock = [pos_in_scene]
crosshair.mouse_moved(event_mock)
crosshair.mouse_moved(manual_pos=(21.0, 55.0))
assert emitted_values_2D == [("ImageItem", 21, 55)]
def test_mouse_moved_signals_2D_outside(image_widget_with_crosshair):
crosshair, plot_item = image_widget_with_crosshair
crosshair, _ = image_widget_with_crosshair
emitted_values_2D = []
@@ -132,23 +128,14 @@ def test_mouse_moved_signals_2D_outside(image_widget_with_crosshair):
crosshair.coordinatesChanged2D.connect(slot)
pos_in_view = QPointF(220.0, 555.0)
pos_in_scene = plot_item.vb.mapViewToScene(pos_in_view)
event_mock = [pos_in_scene]
crosshair.mouse_moved(manual_pos=(220.0, 555.0))
crosshair.mouse_moved(event_mock)
assert emitted_values_2D == []
assert emitted_values_2D == [("ImageItem", 99, 99)]
def test_marker_positions_after_mouse_move(plot_widget_with_crosshair):
crosshair, plot_item = plot_widget_with_crosshair
pos_in_view = QPointF(2, 5)
pos_in_scene = plot_item.vb.mapViewToScene(pos_in_view)
event_mock = [pos_in_scene]
crosshair.mouse_moved(event_mock)
crosshair, _ = plot_widget_with_crosshair
crosshair.mouse_moved(manual_pos=(2, 5))
marker = crosshair.marker_moved_1d["Curve 1"]
marker_x, marker_y = marker.getData()
@@ -172,7 +159,7 @@ def test_scale_emitted_coordinates(plot_widget_with_crosshair):
def test_crosshair_changed_signal(plot_widget_with_crosshair):
crosshair, plot_item = plot_widget_with_crosshair
crosshair, _ = plot_widget_with_crosshair
emitted_positions = []
@@ -181,11 +168,7 @@ def test_crosshair_changed_signal(plot_widget_with_crosshair):
crosshair.crosshairChanged.connect(slot)
pos_in_view = QPointF(2, 5)
pos_in_scene = plot_item.vb.mapViewToScene(pos_in_view)
event_mock = [pos_in_scene]
crosshair.mouse_moved(event_mock)
crosshair.mouse_moved(manual_pos=(2, 5))
x, y = emitted_positions[0]
@@ -203,23 +186,15 @@ def test_crosshair_clicked_signal(qtbot, plot_widget_with_crosshair):
crosshair.crosshairClicked.connect(slot)
x_data = 2
y_data = 5
# Map data coordinates to scene coordinates
pos_in_scene = plot_item.vb.mapViewToScene(QPointF(x_data, y_data))
# Map scene coordinates to widget coordinates
graphics_view = plot_item.vb.scene().views()[0]
qtbot.waitExposed(graphics_view)
pos_in_widget = graphics_view.mapFromScene(pos_in_scene)
# Simulate mouse click
qtbot.mouseClick(graphics_view.viewport(), Qt.LeftButton, pos=pos_in_widget)
pos_in_scene = plot_item.vb.sceneBoundingRect().center()
expected_point = plot_item.vb.mapSceneToView(pos_in_scene)
crosshair.mouse_clicked(_FakeMouseClickEvent(pos_in_scene))
x, y = emitted_positions[0]
assert np.isclose(round(x, 1), 2)
assert np.isclose(round(y, 1), 5)
assert np.isclose(x, expected_point.x())
assert np.isclose(y, expected_point.y())
def test_update_coord_label_1D(plot_widget_with_crosshair):
@@ -361,18 +336,14 @@ def test_ignore_invisible_curves_on_move(qtbot, mocked_client):
wf.hook_crosshair()
# # Simulate a mouse move at (2,5)
pos_in_view = QPointF(2, 5)
pos_in_scene = wf.plot_item.vb.mapViewToScene(pos_in_view)
event_mock = [pos_in_scene]
# 1) Both curves visible: expect markers for both
wf.crosshair.clear_markers()
wf.crosshair.mouse_moved(event_mock)
wf.crosshair.mouse_moved(manual_pos=(2, 5))
assert set(wf.crosshair.marker_moved_1d.keys()) == {"Curve_0", "Curve_1"}
# 2) Hide Curve B and repeat: only Curve_0 should remain
c1.setVisible(False)
wf.crosshair.clear_markers()
wf.crosshair.mouse_moved(event_mock)
wf.crosshair.mouse_moved(manual_pos=(2, 5))
qtbot.wait(200)
assert set(wf.crosshair.marker_moved_1d.keys()) == {"Curve_0"}