1
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2026-03-05 00:12:49 +01:00

fix(image_roi_tree): rois signals are disconnected when roi tree widget is closed

This commit is contained in:
2025-07-17 11:38:08 +02:00
committed by Jan Wyzula
parent 62020f9965
commit 00e3713181
2 changed files with 48 additions and 0 deletions

View File

@@ -3,6 +3,7 @@ from __future__ import annotations
import math
from typing import TYPE_CHECKING
from bec_lib import bec_logger
from bec_qthemes import material_icon
from qtpy.QtCore import QEvent, Qt
from qtpy.QtGui import QColor
@@ -39,6 +40,9 @@ if TYPE_CHECKING:
from bec_widgets.widgets.plots.image.image import Image
logger = bec_logger.logger
class ROILockButton(QToolButton):
"""Keeps its icon and checked state in sync with a single ROI."""
@@ -447,6 +451,18 @@ class ROIPropertyTree(BECWidget, QWidget):
def cleanup(self):
self.cmap.close()
self.cmap.deleteLater()
if self.controller and hasattr(self.controller, "rois"):
for roi in self.controller.rois: # disconnect all signals from ROIs
try:
if isinstance(roi, RectangularROI):
roi.edgesChanged.disconnect()
else:
roi.centerChanged.disconnect()
roi.penChanged.disconnect()
roi.nameChanged.disconnect()
except (RuntimeError, TypeError) as e:
logger.error(f"Failed to disconnect roi qt signal: {e}")
super().cleanup()

View File

@@ -399,3 +399,35 @@ def test_new_roi_respects_global_lock(roi_tree, image_widget, qtbot):
assert not roi.movable
# Disable global lock again
roi_tree.lock_all_action.action.setChecked(False)
def test_cleanup_disconnect_signals(roi_tree, image_widget):
"""Test that cleanup disconnects ROI signals so further changes do not update the tree."""
# Add a rectangular ROI
roi = image_widget.add_roi(kind="rect", name="cleanup_test", pos=(10, 10), size=(20, 20))
item = roi_tree.roi_items[roi]
# Test that signals are connected before cleanup
pre_name = item.text(roi_tree.COL_ROI)
pre_coord = item.child(2).text(roi_tree.COL_PROPS)
# Change ROI properties to see updates
roi.label = "connected_name"
roi.setPos(30, 30)
# Verify that the tree item updated
assert item.text(roi_tree.COL_ROI) == "connected_name"
assert item.child(2).text(roi_tree.COL_PROPS) != pre_coord
# Perform cleanup to disconnect signals
roi_tree.cleanup()
# Store initial state
initial_name = item.text(roi_tree.COL_ROI)
initial_coord = item.child(2).text(roi_tree.COL_PROPS)
# Change ROI properties after cleanup
roi.label = "changed_name"
roi.setPos(50, 50)
# Verify that the tree item was not updated
assert item.text(roi_tree.COL_ROI) == initial_name
assert item.child(2).text(roi_tree.COL_PROPS) == initial_coord