11from __future__ import annotations
22
3- from typing import TYPE_CHECKING , Literal , cast
3+ from typing import TYPE_CHECKING , Literal
44
5+ import useq
56from qtpy .QtCore import (
67 QEvent ,
78 QItemSelection ,
@@ -62,6 +63,8 @@ def __init__(self, canvas: SceneCanvas) -> None:
6263 self ._roi_visuals : dict [ROI , RoiPolygon ] = {}
6364
6465 self ._fov_size : tuple [float , float ] | None = None
66+ self ._scan_overlap : float | tuple [float , float ] = 0.0
67+ self ._scan_mode : useq .OrderMode = useq .OrderMode .row_wise_snake
6568
6669 self .roi_model = QROIModel ()
6770 self .selection_model = QItemSelectionModel (self .roi_model )
@@ -122,7 +125,7 @@ def update_fovs(self, fov: tuple[float, float]) -> None:
122125 """Update the FOVs of all ROIs."""
123126 self ._fov_size = fov
124127 for row in range (self .roi_model .rowCount ()):
125- roi = cast ( "ROI" , self .roi_model .index (row ). internalPointer () )
128+ roi = self .roi_model .getRoi (row )
126129 roi .fov_size = fov
127130 self .roi_model .emitDataChange (roi )
128131
@@ -149,9 +152,35 @@ def canvas_to_world(self, point: QPointF) -> tuple[float, float]:
149152 def selected_rois (self ) -> list [ROI ]:
150153 """Return a list of selected ROIs."""
151154 return [
152- index .internalPointer () for index in self .selection_model .selectedIndexes ()
155+ index .data (QROIModel .ROI_ROLE )
156+ for index in self .selection_model .selectedIndexes ()
153157 ]
154158
159+ def all_rois (self ) -> list [ROI ]:
160+ """Return a list of all ROIs."""
161+ return [self .roi_model .getRoi (row ) for row in range (self .roi_model .rowCount ())]
162+
163+ @property
164+ def scan_overlap (self ) -> float | tuple [float , float ]:
165+ """Return the current scan overlap."""
166+ return self ._scan_overlap
167+
168+ @property
169+ def scan_mode (self ) -> useq .OrderMode :
170+ """Return the current scan order mode."""
171+ return self ._scan_mode
172+
173+ def set_scan_options (
174+ self ,
175+ overlap : float | tuple [float , float ],
176+ mode : useq .OrderMode ,
177+ ) -> None :
178+ """Set scan overlap and mode, then refresh all ROI visuals."""
179+ self ._scan_overlap = overlap
180+ self ._scan_mode = mode
181+ for roi in self .all_rois ():
182+ self .roi_model .emitDataChange (roi )
183+
155184 def delete_selected_rois (self ) -> None :
156185 """Delete the selected ROIs from the model."""
157186 for roi in self .selected_rois ():
@@ -168,7 +197,7 @@ def _on_rows_about_to_be_removed(
168197 ) -> None :
169198 # Remove the ROIs from the canvas
170199 for row in range (first , last + 1 ):
171- roi = self .roi_model .index (row ). internalPointer ( )
200+ roi = self .roi_model .getRoi (row )
172201 self ._remove_roi_from_canvas (roi )
173202
174203 def _on_data_changed (
@@ -181,24 +210,24 @@ def _on_data_changed(
181210
182211 # Update the ROI on the canvas
183212 for row in range (top_left .row (), bottom_right .row () + 1 ):
184- roi = self .roi_model .index (row ).internalPointer ()
185- do_update (roi )
213+ if roi : = self .roi_model .index (row ).data ( QROIModel . ROI_ROLE ):
214+ do_update (roi )
186215
187216 def _on_selection_changed (
188217 self , selected : QItemSelection , deselected : QItemSelection
189218 ) -> None :
190219 for index in deselected .indexes ():
191- roi = cast ( "ROI" , self .roi_model .index (index .row ()). internalPointer ())
220+ roi = self .roi_model .getRoi (index .row ())
192221 if visual := self ._roi_visuals .get (roi ):
193222 visual .set_selected (False )
194223 for index in selected .indexes ():
195- roi = cast ( "ROI" , self .roi_model .index (index .row ()). internalPointer ())
224+ roi = self .roi_model .getRoi (index .row ())
196225 if visual := self ._roi_visuals .get (roi ):
197226 visual .set_selected (True )
198227
199228 def _on_rows_inserted (self , parent : QModelIndex , first : int , last : int ) -> None :
200229 for row in range (first , last + 1 ):
201- roi = self .roi_model .index (row ). internalPointer ( )
230+ roi = self .roi_model .getRoi (row )
202231 self ._add_roi_to_scene (roi )
203232
204233 def _add_roi_to_scene (self , roi : ROI ) -> None :
@@ -214,12 +243,16 @@ def _remove_roi_from_canvas(self, roi: ROI) -> None:
214243 def _update_roi_visual (self , roi : ROI ) -> None :
215244 # Update the the full ROI visual already on the canvas
216245 if visual := self ._roi_visuals .get (roi ):
217- visual .update_from_roi (roi )
246+ visual .update_from_roi (
247+ roi , overlap = self ._scan_overlap , mode = self ._scan_mode
248+ )
218249
219250 def _update_roi_vertices (self , roi : ROI ) -> None :
220251 # Update the only vertices of the ROI visual
221252 if visual := self ._roi_visuals .get (roi ):
222- visual .update_vertices (roi .vertices )
253+ visual .update_vertices (
254+ roi .vertices , overlap = self ._scan_overlap , mode = self ._scan_mode
255+ )
223256
224257
225258class ROIScene (QWidget ):
0 commit comments