From f9044996f6d62cdbb693149934b09625fb39fd55 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Tue, 10 Jun 2025 15:00:21 +0200 Subject: [PATCH] fix(roi): removed roi handle adding/removing inconsistencies --- bec_widgets/widgets/plots/image/image_base.py | 1 - .../image/setting_widgets/image_roi_tree.py | 1 - bec_widgets/widgets/plots/roi/image_roi.py | 37 +++++++++++++------ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/bec_widgets/widgets/plots/image/image_base.py b/bec_widgets/widgets/plots/image/image_base.py index 417347b9..e6bce71e 100644 --- a/bec_widgets/widgets/plots/image/image_base.py +++ b/bec_widgets/widgets/plots/image/image_base.py @@ -601,7 +601,6 @@ class ImageBase(PlotBase): # Add to plot and controller (controller assigns color) self.plot_item.addItem(roi) self.roi_controller.add_roi(roi) - roi.add_scale_handle() return roi def remove_roi(self, roi: int | str): diff --git a/bec_widgets/widgets/plots/image/setting_widgets/image_roi_tree.py b/bec_widgets/widgets/plots/image/setting_widgets/image_roi_tree.py index ea01af09..7a64c49c 100644 --- a/bec_widgets/widgets/plots/image/setting_widgets/image_roi_tree.py +++ b/bec_widgets/widgets/plots/image/setting_widgets/image_roi_tree.py @@ -235,7 +235,6 @@ class ROIPropertyTree(BECWidget, QWidget): self._temp_roi = None self._set_roi_draw_mode(None) # register via controller - final_roi.add_scale_handle() self.controller.add_roi(final_roi) return True return super().eventFilter(obj, event) diff --git a/bec_widgets/widgets/plots/roi/image_roi.py b/bec_widgets/widgets/plots/roi/image_roi.py index 9bd0d499..aa578ba3 100644 --- a/bec_widgets/widgets/plots/roi/image_roi.py +++ b/bec_widgets/widgets/plots/roi/image_roi.py @@ -127,6 +127,7 @@ class BaseROI(BECConnector): label: str | None = None, line_color: str | None = None, line_width: int = 5, + movable: bool = True, # all remaining pg.*ROI kwargs (pos, size, pen, …) **pg_kwargs, ): @@ -155,6 +156,7 @@ class BaseROI(BECConnector): gui_id=gui_id, removable=True, invertible=True, + movable=movable, **pg_kwargs, ) @@ -162,8 +164,13 @@ class BaseROI(BECConnector): self._line_color = line_color or "#ffffff" self._line_width = line_width self._description = True + self._movable = True # allow moving by default self.setPen(mkPen(self._line_color, width=self._line_width)) + # Reset Handles to avoid inherited handles from pyqtgraph + self.remove_scale_handles() # remove any existing handles from pyqtgraph.RectROI + self.add_scale_handle() # add custom scale handles + def set_parent(self, parent: Image): """ Sets the parent image for this ROI. @@ -337,8 +344,18 @@ class BaseROI(BECConnector): ) def add_scale_handle(self): + """Add scale handles to the ROI.""" return + def remove_scale_handles(self): + """Remove all scale handles from the ROI.""" + handles = self.handles + for i in range(len(handles)): + try: + self.removeHandle(0) + except IndexError: + continue + def set_position(self, x: float, y: float): """ Sets the position of the ROI. @@ -355,12 +372,7 @@ class BaseROI(BECConnector): if controller and self in controller.rois: controller.remove_roi(self) return # controller will call back into this method once deregistered - handles = self.handles - for i in range(len(handles)): - try: - self.removeHandle(0) - except IndexError: - continue + self.remove_scale_handles() self.rpc_register.remove_rpc(self) self.parent_image.plot_item.removeItem(self) viewBox = self.parent_plot_item.vb @@ -475,11 +487,6 @@ class RectangularROI(BaseROI, pg.RectROI): self.addScaleHandle([0, 0.5], [1, 0.5]) # left edge self.addScaleHandle([1, 0.5], [0, 0.5]) # right edge - self.handlePen = fn.mkPen("#ffff00", width=5) # bright yellow outline - self.handleHoverPen = fn.mkPen("#00ffff", width=4) # cyan, thicker when hovered - self.handleBrush = (200, 200, 0, 120) # semi-transparent fill - self.handleHoverBrush = (0, 255, 255, 160) - def _on_region_changed(self): """ Handles changes to the ROI's region. @@ -616,6 +623,14 @@ class CircularROI(BaseROI, pg.CircleROI): ) self.sigRegionChanged.connect(self._on_region_changed) self._adorner = LabelAdorner(self) + self.hoverPen = fn.mkPen(color=(255, 0, 0), width=3, style=QtCore.Qt.DashLine) + self.handleHoverPen = fn.mkPen("lime", width=4) + + def add_scale_handle(self): + """ + Adds scale handles to the circular ROI. + """ + self._addHandles() # wrapper around pg.CircleROI._addHandles def _on_region_changed(self): """