bec-widgets 2.6.0__py3-none-any.whl → 2.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
CHANGELOG.md CHANGED
@@ -1,6 +1,22 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v2.7.0 (2025-05-26)
5
+
6
+ ### Bug Fixes
7
+
8
+ - **image/image_selecetion**: Toolbar selection tool size adjusted
9
+ ([`e12e9e5`](https://github.com/bec-project/bec_widgets/commit/e12e9e534d6913223b741bff31bed6674ae4c0e6))
10
+
11
+ - **plot_base/mouse_interactions.py**: Fixed parent
12
+ ([`66e9445`](https://github.com/bec-project/bec_widgets/commit/66e9445760f2796c008d08feba54c3d48e4a9cfb))
13
+
14
+ ### Features
15
+
16
+ - **image**: Roi plots with crosshair cuts added
17
+ ([`ce88787`](https://github.com/bec-project/bec_widgets/commit/ce88787e881d12384dd3a25b75fadda1f2280c81))
18
+
19
+
4
20
  ## v2.6.0 (2025-05-26)
5
21
 
6
22
  ### Bug Fixes
PKG-INFO CHANGED
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: BEC Widgets
5
5
  Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec_widgets/issues
6
6
  Project-URL: Homepage, https://gitlab.psi.ch/bec/bec_widgets
@@ -85,7 +85,8 @@ class Crosshair(QObject):
85
85
  self.items = []
86
86
  self.marker_moved_1d = {}
87
87
  self.marker_clicked_1d = {}
88
- self.marker_2d = None
88
+ self.marker_2d_row = None
89
+ self.marker_2d_col = None
89
90
  self.update_markers()
90
91
  self.check_log()
91
92
  self.check_derivatives()
@@ -195,13 +196,23 @@ class Crosshair(QObject):
195
196
  marker_clicked_list.append(marker_clicked)
196
197
  self.marker_clicked_1d[name] = marker_clicked_list
197
198
  elif isinstance(item, pg.ImageItem): # 2D plot
198
- if self.marker_2d is not None:
199
+ if self.marker_2d_row is not None and self.marker_2d_col is not None:
199
200
  continue
200
- self.marker_2d = pg.ROI(
201
- [0, 0], size=[1, 1], pen=pg.mkPen("r", width=2), movable=False
201
+ # Create horizontal ROI for row highlighting
202
+ if item.image is None:
203
+ continue
204
+ self.marker_2d_row = pg.ROI(
205
+ [0, 0], size=[item.image.shape[0], 1], pen=pg.mkPen("r", width=2), movable=False
206
+ )
207
+ self.marker_2d_row.skip_auto_range = True
208
+ self.plot_item.addItem(self.marker_2d_row)
209
+
210
+ # Create vertical ROI for column highlighting
211
+ self.marker_2d_col = pg.ROI(
212
+ [0, 0], size=[1, item.image.shape[1]], pen=pg.mkPen("r", width=2), movable=False
202
213
  )
203
- self.marker_2d.skip_auto_range = True
204
- self.plot_item.addItem(self.marker_2d)
214
+ self.marker_2d_col.skip_auto_range = True
215
+ self.plot_item.addItem(self.marker_2d_col)
205
216
 
206
217
  def snap_to_data(
207
218
  self, x: float, y: float
@@ -243,6 +254,8 @@ class Crosshair(QObject):
243
254
  elif isinstance(item, pg.ImageItem): # 2D plot
244
255
  name = item.config.monitor or str(id(item))
245
256
  image_2d = item.image
257
+ if image_2d is None:
258
+ continue
246
259
  # Clip the x and y values to the image dimensions to avoid out of bounds errors
247
260
  y_values[name] = int(np.clip(y, 0, image_2d.shape[1] - 1))
248
261
  x_values[name] = int(np.clip(x, 0, image_2d.shape[0] - 1))
@@ -330,7 +343,10 @@ class Crosshair(QObject):
330
343
  x, y = x_snap_values[name], y_snap_values[name]
331
344
  if x is None or y is None:
332
345
  continue
333
- self.marker_2d.setPos([x, y])
346
+ # Set position of horizontal ROI (row)
347
+ self.marker_2d_row.setPos([0, y])
348
+ # Set position of vertical ROI (column)
349
+ self.marker_2d_col.setPos([x, 0])
334
350
  coordinate_to_emit = (name, x, y)
335
351
  self.coordinatesChanged2D.emit(coordinate_to_emit)
336
352
  else:
@@ -384,7 +400,10 @@ class Crosshair(QObject):
384
400
  x, y = x_snap_values[name], y_snap_values[name]
385
401
  if x is None or y is None:
386
402
  continue
387
- self.marker_2d.setPos([x, y])
403
+ # Set position of horizontal ROI (row)
404
+ self.marker_2d_row.setPos([0, y])
405
+ # Set position of vertical ROI (column)
406
+ self.marker_2d_col.setPos([x, 0])
388
407
  coordinate_to_emit = (name, x, y)
389
408
  self.coordinatesClicked2D.emit(coordinate_to_emit)
390
409
  else:
@@ -428,6 +447,8 @@ class Crosshair(QObject):
428
447
  for item in self.items:
429
448
  if isinstance(item, pg.ImageItem):
430
449
  image = item.image
450
+ if image is None:
451
+ continue
431
452
  ix = int(np.clip(x, 0, image.shape[0] - 1))
432
453
  iy = int(np.clip(y, 0, image.shape[1] - 1))
433
454
  intensity = image[ix, iy]
@@ -450,9 +471,12 @@ class Crosshair(QObject):
450
471
  self.clear_markers()
451
472
 
452
473
  def cleanup(self):
453
- if self.marker_2d is not None:
454
- self.plot_item.removeItem(self.marker_2d)
455
- self.marker_2d = None
474
+ if self.marker_2d_row is not None:
475
+ self.plot_item.removeItem(self.marker_2d_row)
476
+ self.marker_2d_row = None
477
+ if self.marker_2d_col is not None:
478
+ self.plot_item.removeItem(self.marker_2d_col)
479
+ self.marker_2d_col = None
456
480
  self.plot_item.removeItem(self.v_line)
457
481
  self.plot_item.removeItem(self.h_line)
458
482
  self.plot_item.removeItem(self.coord_label)
@@ -13,8 +13,10 @@ from qtpy.QtWidgets import QDialog, QVBoxLayout, QWidget
13
13
  from bec_widgets.utils import ConnectionConfig
14
14
  from bec_widgets.utils.colors import Colors
15
15
  from bec_widgets.utils.error_popups import SafeProperty, SafeSlot
16
+ from bec_widgets.utils.side_panel import SidePanel
16
17
  from bec_widgets.utils.toolbar import MaterialIconAction, SwitchableToolBarAction
17
18
  from bec_widgets.widgets.plots.image.image_item import ImageItem
19
+ from bec_widgets.widgets.plots.image.image_roi_plot import ImageROIPlot
18
20
  from bec_widgets.widgets.plots.image.setting_widgets.image_roi_tree import ROIPropertyTree
19
21
  from bec_widgets.widgets.plots.image.toolbar_bundles.image_selection import (
20
22
  MonitorSelectionToolbarBundle,
@@ -123,6 +125,7 @@ class Image(PlotBase):
123
125
  "rois",
124
126
  ]
125
127
  sync_colorbar_with_autorange = Signal()
128
+ image_updated = Signal()
126
129
 
127
130
  def __init__(
128
131
  self,
@@ -139,6 +142,8 @@ class Image(PlotBase):
139
142
  self._color_bar = None
140
143
  self._main_image = ImageItem()
141
144
  self.roi_controller = ROIController(colormap="viridis")
145
+ self.x_roi = None
146
+ self.y_roi = None
142
147
  super().__init__(
143
148
  parent=parent, config=config, client=client, gui_id=gui_id, popups=popups, **kwargs
144
149
  )
@@ -150,24 +155,60 @@ class Image(PlotBase):
150
155
  # Default Color map to plasma
151
156
  self.color_map = "plasma"
152
157
 
158
+ # Initialize ROI plots and side panels
159
+ self._add_roi_plots()
160
+
153
161
  self.roi_manager_dialog = None
154
162
 
163
+ # Refresh theme for ROI plots
164
+ self._update_theme()
165
+
155
166
  ################################################################################
156
167
  # Widget Specific GUI interactions
157
168
  ################################################################################
169
+ def apply_theme(self, theme: str):
170
+ super().apply_theme(theme)
171
+ if self.x_roi is not None and self.y_roi is not None:
172
+ self.x_roi.apply_theme(theme)
173
+ self.y_roi.apply_theme(theme)
174
+
158
175
  def _init_toolbar(self):
159
176
 
160
177
  # add to the first position
161
178
  self.selection_bundle = MonitorSelectionToolbarBundle(
162
179
  bundle_id="selection", target_widget=self
163
180
  )
164
- self.toolbar.add_bundle(self.selection_bundle, self)
181
+ self.toolbar.add_bundle(bundle=self.selection_bundle, target_widget=self)
165
182
 
166
183
  super()._init_toolbar()
167
184
 
168
185
  # Image specific changes to PlotBase toolbar
169
186
  self.toolbar.widgets["reset_legend"].action.setVisible(False)
170
187
 
188
+ # ROI Bundle replacement with switchable crosshair
189
+ self.toolbar.remove_bundle("roi")
190
+ crosshair = MaterialIconAction(
191
+ icon_name="point_scan", tooltip="Show Crosshair", checkable=True
192
+ )
193
+ crosshair_roi = MaterialIconAction(
194
+ icon_name="my_location",
195
+ tooltip="Show Crosshair with ROI plots",
196
+ checkable=True,
197
+ parent=self,
198
+ )
199
+ crosshair_roi.action.toggled.connect(self.toggle_roi_panels)
200
+ crosshair.action.toggled.connect(self.toggle_crosshair)
201
+ switch_crosshair = SwitchableToolBarAction(
202
+ actions={"crosshair_simple": crosshair, "crosshair_roi": crosshair_roi},
203
+ initial_action="crosshair_simple",
204
+ tooltip="Crosshair",
205
+ checkable=True,
206
+ parent=self,
207
+ )
208
+ self.toolbar.add_action(
209
+ action_id="switch_crosshair", action=switch_crosshair, target_widget=self
210
+ )
211
+
171
212
  # Lock aspect ratio button
172
213
  self.lock_aspect_ratio_action = MaterialIconAction(
173
214
  icon_name="aspect_ratio", tooltip="Lock Aspect Ratio", checkable=True, parent=self
@@ -216,11 +257,8 @@ class Image(PlotBase):
216
257
  parent=self,
217
258
  )
218
259
 
219
- self.toolbar.add_action_to_bundle(
220
- bundle_id="roi",
221
- action_id="autorange_image",
222
- action=self.autorange_switch,
223
- target_widget=self,
260
+ self.toolbar.add_action(
261
+ action_id="autorange_image", action=self.autorange_switch, target_widget=self
224
262
  )
225
263
 
226
264
  self.autorange_mean_action.action.toggled.connect(
@@ -252,11 +290,8 @@ class Image(PlotBase):
252
290
  parent=self,
253
291
  )
254
292
 
255
- self.toolbar.add_action_to_bundle(
256
- bundle_id="roi",
257
- action_id="switch_colorbar",
258
- action=self.colorbar_switch,
259
- target_widget=self,
293
+ self.toolbar.add_action(
294
+ action_id="switch_colorbar", action=self.colorbar_switch, target_widget=self
260
295
  )
261
296
 
262
297
  self.simple_colorbar_action.action.toggled.connect(
@@ -430,6 +465,101 @@ class Image(PlotBase):
430
465
  else:
431
466
  raise ValueError("roi must be an int index or str name")
432
467
 
468
+ def _add_roi_plots(self):
469
+ """
470
+ Initialize the ROI plots and side panels.
471
+ """
472
+ # Create ROI plot widgets
473
+ self.x_roi = ImageROIPlot(parent=self)
474
+ self.y_roi = ImageROIPlot(parent=self)
475
+ self.x_roi.apply_theme("dark")
476
+ self.y_roi.apply_theme("dark")
477
+
478
+ # Set titles for the plots
479
+ self.x_roi.plot_item.setTitle("X ROI")
480
+ self.y_roi.plot_item.setTitle("Y ROI")
481
+
482
+ # Create side panels
483
+ self.side_panel_x = SidePanel(
484
+ parent=self, orientation="bottom", panel_max_width=200, show_toolbar=False
485
+ )
486
+ self.side_panel_y = SidePanel(
487
+ parent=self, orientation="left", panel_max_width=200, show_toolbar=False
488
+ )
489
+
490
+ # Add ROI plots to side panels
491
+ self.x_panel_index = self.side_panel_x.add_menu(widget=self.x_roi)
492
+ self.y_panel_index = self.side_panel_y.add_menu(widget=self.y_roi)
493
+
494
+ # # Add side panels to the layout
495
+ self.layout_manager.add_widget_relative(
496
+ self.side_panel_x, self.round_plot_widget, position="bottom", shift_direction="down"
497
+ )
498
+ self.layout_manager.add_widget_relative(
499
+ self.side_panel_y, self.round_plot_widget, position="left", shift_direction="right"
500
+ )
501
+
502
+ def toggle_roi_panels(self, checked: bool):
503
+ """
504
+ Show or hide the ROI panels based on the test action toggle state.
505
+
506
+ Args:
507
+ checked (bool): Whether the test action is checked.
508
+ """
509
+ if checked:
510
+ # Show the ROI panels
511
+ self.hook_crosshair()
512
+ self.side_panel_x.show_panel(self.x_panel_index)
513
+ self.side_panel_y.show_panel(self.y_panel_index)
514
+ self.crosshair.coordinatesChanged2D.connect(self.update_image_slices)
515
+ self.image_updated.connect(self.update_image_slices)
516
+ else:
517
+ self.unhook_crosshair()
518
+ # Hide the ROI panels
519
+ self.side_panel_x.hide_panel()
520
+ self.side_panel_y.hide_panel()
521
+ self.image_updated.disconnect(self.update_image_slices)
522
+
523
+ @SafeSlot()
524
+ def update_image_slices(self, coordinates: tuple[int, int, int] = None):
525
+ """
526
+ Update the image slices based on the crosshair position.
527
+
528
+ Args:
529
+ coordinates(tuple): The coordinates of the crosshair.
530
+ """
531
+ if coordinates is None:
532
+ # Try to get coordinates from crosshair position (like in crosshair mouse_moved)
533
+ if (
534
+ hasattr(self, "crosshair")
535
+ and hasattr(self.crosshair, "v_line")
536
+ and hasattr(self.crosshair, "h_line")
537
+ ):
538
+ x = int(round(self.crosshair.v_line.value()))
539
+ y = int(round(self.crosshair.h_line.value()))
540
+ else:
541
+ return
542
+ else:
543
+ x = coordinates[1]
544
+ y = coordinates[2]
545
+ image = self._main_image.image
546
+ if image is None:
547
+ return
548
+ max_row, max_col = image.shape[0] - 1, image.shape[1] - 1
549
+ row, col = x, y
550
+ if not (0 <= row <= max_row and 0 <= col <= max_col):
551
+ return
552
+ # Horizontal slice
553
+ h_slice = image[:, col]
554
+ x_axis = np.arange(h_slice.shape[0])
555
+ self.x_roi.plot_item.clear()
556
+ self.x_roi.plot_item.plot(x_axis, h_slice, pen=pg.mkPen(self.x_roi.curve_color, width=3))
557
+ # Vertical slice
558
+ v_slice = image[row, :]
559
+ y_axis = np.arange(v_slice.shape[0])
560
+ self.y_roi.plot_item.clear()
561
+ self.y_roi.plot_item.plot(v_slice, y_axis, pen=pg.mkPen(self.y_roi.curve_color, width=3))
562
+
433
563
  ################################################################################
434
564
  # Widget Specific Properties
435
565
  ################################################################################
@@ -984,6 +1114,7 @@ class Image(PlotBase):
984
1114
  self._main_image.set_data(image_buffer)
985
1115
  if self._color_bar is not None:
986
1116
  self._color_bar.blockSignals(False)
1117
+ self.image_updated.emit()
987
1118
 
988
1119
  def adjust_image_buffer(self, image: ImageItem, new_data: np.ndarray) -> np.ndarray:
989
1120
  """
@@ -1035,6 +1166,7 @@ class Image(PlotBase):
1035
1166
  self._main_image.set_data(data)
1036
1167
  if self._color_bar is not None:
1037
1168
  self._color_bar.blockSignals(False)
1169
+ self.image_updated.emit()
1038
1170
 
1039
1171
  ################################################################################
1040
1172
  # Clean up
@@ -1090,6 +1222,10 @@ class Image(PlotBase):
1090
1222
  self.toolbar.widgets["monitor"].widget.close()
1091
1223
  self.toolbar.widgets["monitor"].widget.deleteLater()
1092
1224
 
1225
+ # ROI plots cleanup
1226
+ self.x_roi.cleanup_pyqtgraph()
1227
+ self.y_roi.cleanup_pyqtgraph()
1228
+
1093
1229
  super().cleanup()
1094
1230
 
1095
1231
 
@@ -0,0 +1,37 @@
1
+ import pyqtgraph as pg
2
+
3
+ from bec_widgets.utils.round_frame import RoundedFrame
4
+ from bec_widgets.widgets.plots.plot_base import BECViewBox
5
+
6
+
7
+ class ImageROIPlot(RoundedFrame):
8
+ """
9
+ A widget for displaying an image with a region of interest (ROI) overlay.
10
+ """
11
+
12
+ def __init__(self, parent=None):
13
+ super().__init__(parent=parent)
14
+
15
+ self.content_widget = pg.GraphicsLayoutWidget(self)
16
+ self.layout.addWidget(self.content_widget)
17
+ self.plot_item = pg.PlotItem(viewBox=BECViewBox(enableMenu=True))
18
+ self.content_widget.addItem(self.plot_item)
19
+ self.curve_color = "w"
20
+
21
+ self.apply_plot_widget_style()
22
+
23
+ def apply_theme(self, theme: str):
24
+ if theme == "dark":
25
+ self.curve_color = "w"
26
+ else:
27
+ self.curve_color = "k"
28
+ for curve in self.plot_item.curves:
29
+ curve.setPen(pg.mkPen(self.curve_color, width=3))
30
+ super().apply_theme(theme)
31
+
32
+ def cleanup_pyqtgraph(self):
33
+ """Cleanup pyqtgraph items."""
34
+ self.plot_item.vb.menu.close()
35
+ self.plot_item.vb.menu.deleteLater()
36
+ self.plot_item.ctrlMenu.close()
37
+ self.plot_item.ctrlMenu.deleteLater()
@@ -35,19 +35,20 @@ class MonitorSelectionToolbarBundle(ToolbarBundle):
35
35
  self.device_combo_box.addItem("", None)
36
36
  self.device_combo_box.setCurrentText("")
37
37
  self.device_combo_box.setToolTip("Select Device")
38
+ self.device_combo_box.setFixedWidth(150)
38
39
  self.device_combo_box.setItemDelegate(NoCheckDelegate(self.device_combo_box))
39
40
 
40
- self.add_action("monitor", WidgetAction(widget=self.device_combo_box, adjust_size=True))
41
+ self.add_action("monitor", WidgetAction(widget=self.device_combo_box, adjust_size=False))
41
42
 
42
43
  # 2) Dimension combo box
43
44
  self.dim_combo_box = QComboBox(parent=self.target_widget)
44
45
  self.dim_combo_box.addItems(["auto", "1d", "2d"])
45
46
  self.dim_combo_box.setCurrentText("auto")
46
47
  self.dim_combo_box.setToolTip("Monitor Dimension")
47
- self.dim_combo_box.setFixedWidth(60)
48
+ self.dim_combo_box.setFixedWidth(100)
48
49
  self.dim_combo_box.setItemDelegate(NoCheckDelegate(self.dim_combo_box))
49
50
 
50
- self.add_action("dim_combo", WidgetAction(widget=self.dim_combo_box, adjust_size=True))
51
+ self.add_action("dim_combo", WidgetAction(widget=self.dim_combo_box, adjust_size=False))
51
52
 
52
53
  # Connect slots, a device will be connected upon change of any combobox
53
54
  self.device_combo_box.currentTextChanged.connect(lambda: self.connect_monitor())
@@ -44,7 +44,7 @@ class MouseInteractionToolbarBundle(ToolbarBundle):
44
44
  initial_action="drag_mode",
45
45
  tooltip="Mouse Modes",
46
46
  checkable=True,
47
- parent=self,
47
+ parent=self.target_widget,
48
48
  )
49
49
 
50
50
  # Add them to the bundle
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: BEC Widgets
5
5
  Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec_widgets/issues
6
6
  Project-URL: Homepage, https://gitlab.psi.ch/bec/bec_widgets
@@ -2,11 +2,11 @@
2
2
  .gitlab-ci.yml,sha256=1nMYldzVk0tFkBWYTcUjumOrdSADASheWOAc0kOFDYs,9509
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=ivqg3HTaOxNbEW3bzWh9MXAkrekuGoNdj0Mj3SdRYuw,639
5
- CHANGELOG.md,sha256=UMAxyGL8L3SEVLaiIRGwj-WIvOosd4LpvLf-QLbOCek,286468
5
+ CHANGELOG.md,sha256=RnEXyJT_0vMFYeinWyayLtZF9IYbWRTRWvsguApDIFE,287017
6
6
  LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
7
- PKG-INFO,sha256=pua05uKIy7F948gBaM-0CScT8KHdQ5FJWYokhts7U88,1273
7
+ PKG-INFO,sha256=q_orCUbgBKXQm6s-Bz7BhApp1xrvFBCvDxSO0uhFjlU,1273
8
8
  README.md,sha256=oY5Jc1uXehRASuwUJ0umin2vfkFh7tHF-LLruHTaQx0,3560
9
- pyproject.toml,sha256=l_INkmUxwZGkuSlmSFcZzy-W0fbEzhG1vm4CNuqg7Qw,2902
9
+ pyproject.toml,sha256=DvXMh73EMRWBgfztGZvR9qx1bYkxiVBpN1yEbI2s0e8,2902
10
10
  .git_hooks/pre-commit,sha256=n3RofIZHJl8zfJJIUomcMyYGFi_rwq4CC19z0snz3FI,286
11
11
  .github/pull_request_template.md,sha256=F_cJXzooWMFgMGtLK-7KeGcQt0B4AYFse5oN0zQ9p6g,801
12
12
  .github/ISSUE_TEMPLATE/bug_report.yml,sha256=WdRnt7HGxvsIBLzhkaOWNfg8IJQYa_oV9_F08Ym6znQ,1081
@@ -71,7 +71,7 @@ bec_widgets/utils/collapsible_panel_manager.py,sha256=tvv77-9YTfYpsU6M_Le3bHR6wt
71
71
  bec_widgets/utils/colors.py,sha256=4Oms3kcstf7-WddGMB2TZXPqJwFMGVjFyBO8tHZHnxk,18308
72
72
  bec_widgets/utils/compact_popup.py,sha256=xVK_lQqL5Hy1ZnUzHXB8GU-Ru-mXevKcdM8ync3ssiA,10269
73
73
  bec_widgets/utils/container_utils.py,sha256=J8YXombOlAPa3M8NGZdhntp2NirBu4raDEQZOgP4elM,3791
74
- bec_widgets/utils/crosshair.py,sha256=z2Db0tz-SqDGn3wwyCOuQ5mZn9gQU8wQ7YrCVAAAU_A,18892
74
+ bec_widgets/utils/crosshair.py,sha256=zWz4rkVD_HQYWhYzX8asjjb1z_G0V3QqyrOXx6f4xXI,20106
75
75
  bec_widgets/utils/entry_validator.py,sha256=lwT8HP0RDG1FXENIeZ3IDEF2DQmD8KXGkRxPoMXbryk,1817
76
76
  bec_widgets/utils/error_popups.py,sha256=UBAmD1YlAgKodpihudyf0VWtI59KGFiLgnjiKmKGjgk,13254
77
77
  bec_widgets/utils/expandable_frame.py,sha256=VV4mgwz4lXbO3r-dNCX2QFUguwWCCXSUkXyjDSTJHbU,2345
@@ -259,16 +259,17 @@ bec_widgets/widgets/games/register_minesweeper.py,sha256=8fgMBD3yB-5_eGqhG_qxpj3
259
259
  bec_widgets/widgets/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
260
260
  bec_widgets/widgets/plots/plot_base.py,sha256=NliWkXihJIPHRJHe-CNIrdjgxONk7uExG_3SsIpyoRQ,33848
261
261
  bec_widgets/widgets/plots/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
262
- bec_widgets/widgets/plots/image/image.py,sha256=R0S1mvjGOo-1uLe4IGG4aYJO4n-K7ewawPuYBvr8wpA,36784
262
+ bec_widgets/widgets/plots/image/image.py,sha256=FA2a583iWkDi_zydw_OYi4NEiGHXtM_O0PxxSmdgUiY,42042
263
263
  bec_widgets/widgets/plots/image/image.pyproject,sha256=_sRCIu4MNgToaB4D7tUMWq3xKX6T2VoRS3UzGNIseHQ,23
264
264
  bec_widgets/widgets/plots/image/image_item.py,sha256=2bn9H5YLmo7ohQnnf1mLlL24TASnlZNzMvF7buMutmI,8728
265
265
  bec_widgets/widgets/plots/image/image_plugin.py,sha256=R0Hzh2GgYlfZLPZwOMgqLKKIA5DxEnTcSrbI7zTe-tI,1204
266
266
  bec_widgets/widgets/plots/image/image_processor.py,sha256=0qsQIyB__xxBwNIoXhFbB0wSiB8n7n_oX4cvfFsUzOs,4304
267
+ bec_widgets/widgets/plots/image/image_roi_plot.py,sha256=5CWy_eC-GS2ZLJTj2ItrVCoKhPN2g3fx6L4ktf5yVFQ,1191
267
268
  bec_widgets/widgets/plots/image/register_image.py,sha256=0rvFyAMGRZcknc7nMVwsMGSfY8L2j9cdtQhbO5TMzeM,455
268
269
  bec_widgets/widgets/plots/image/setting_widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
269
270
  bec_widgets/widgets/plots/image/setting_widgets/image_roi_tree.py,sha256=nlllg-yTNCjG5DxCEDSGzCNabNSTJ3TZn9mawzIiAq4,14255
270
271
  bec_widgets/widgets/plots/image/toolbar_bundles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
271
- bec_widgets/widgets/plots/image/toolbar_bundles/image_selection.py,sha256=hSYCbbzrlSh29VVm7AqK6hi4VHW242ILYRYBXoB04bI,2594
272
+ bec_widgets/widgets/plots/image/toolbar_bundles/image_selection.py,sha256=gJhDAdHB4cAsPw7E6W6Y2iR3nF_3n_v-ElGqj4TgIGo,2646
272
273
  bec_widgets/widgets/plots/image/toolbar_bundles/processing.py,sha256=A_8_8oDogypmRv8NCDwjO524LJAjgZ7viE1Nz5U__y8,3052
273
274
  bec_widgets/widgets/plots/motor_map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
275
  bec_widgets/widgets/plots/motor_map/motor_map.py,sha256=pcQStrIJJOsxC2sW3FDMDIFmFXM94uXQVdAjPi-vBvM,29209
@@ -307,7 +308,7 @@ bec_widgets/widgets/plots/setting_menus/axis_settings.py,sha256=v-esAvJG8SeVv3hW
307
308
  bec_widgets/widgets/plots/setting_menus/axis_settings_horizontal.ui,sha256=v8jJfPLnhORVfJukhRmygrPobMmJLufA4e3C08QeO-o,9526
308
309
  bec_widgets/widgets/plots/setting_menus/axis_settings_vertical.ui,sha256=k4vsQgZyKZkK3JiOXaQmvgR3IHy90mb4upGAtIwBOsA,9104
309
310
  bec_widgets/widgets/plots/toolbar_bundles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
310
- bec_widgets/widgets/plots/toolbar_bundles/mouse_interactions.py,sha256=zYNyB5Low_Ar34UmQqi1YEjvchJF19hSrNBwO08sn1k,4155
311
+ bec_widgets/widgets/plots/toolbar_bundles/mouse_interactions.py,sha256=gdQ6Ggdq0rhELncCCUBXwi_k16xXWAgHOtgNmND58cA,4169
311
312
  bec_widgets/widgets/plots/toolbar_bundles/plot_export.py,sha256=43JnNwmp0lAVvSArZ0qa8SWwEAHwrZWBUse0nhlqMkA,3049
312
313
  bec_widgets/widgets/plots/toolbar_bundles/roi_bundle.py,sha256=tBJOhdfbg70uAcLruEdTIUTB7_qbKcswwinsI2tZNDc,1256
313
314
  bec_widgets/widgets/plots/toolbar_bundles/save_state.py,sha256=H3fu-bRzNIycCUFb2wDQU7BRrN8M56P961sZ7vwzrEo,1734
@@ -403,8 +404,8 @@ bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py,sha256=O
403
404
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject,sha256=Lbi9zb6HNlIq14k6hlzR-oz6PIFShBuF7QxE6d87d64,34
404
405
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py,sha256=CzChz2SSETYsR8-36meqWnsXCT-FIy_J_xeU5coWDY8,1350
405
406
  bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py,sha256=rMpZ1CaoucwobgPj1FuKTnt07W82bV1GaSYdoqcdMb8,521
406
- bec_widgets-2.6.0.dist-info/METADATA,sha256=pua05uKIy7F948gBaM-0CScT8KHdQ5FJWYokhts7U88,1273
407
- bec_widgets-2.6.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
408
- bec_widgets-2.6.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
409
- bec_widgets-2.6.0.dist-info/licenses/LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
410
- bec_widgets-2.6.0.dist-info/RECORD,,
407
+ bec_widgets-2.7.0.dist-info/METADATA,sha256=q_orCUbgBKXQm6s-Bz7BhApp1xrvFBCvDxSO0uhFjlU,1273
408
+ bec_widgets-2.7.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
409
+ bec_widgets-2.7.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
410
+ bec_widgets-2.7.0.dist-info/licenses/LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
411
+ bec_widgets-2.7.0.dist-info/RECORD,,
pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_widgets"
7
- version = "2.6.0"
7
+ version = "2.7.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [