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 +16 -0
- PKG-INFO +1 -1
- bec_widgets/utils/crosshair.py +35 -11
- bec_widgets/widgets/plots/image/image.py +147 -11
- bec_widgets/widgets/plots/image/image_roi_plot.py +37 -0
- bec_widgets/widgets/plots/image/toolbar_bundles/image_selection.py +4 -3
- bec_widgets/widgets/plots/toolbar_bundles/mouse_interactions.py +1 -1
- {bec_widgets-2.6.0.dist-info → bec_widgets-2.7.0.dist-info}/METADATA +1 -1
- {bec_widgets-2.6.0.dist-info → bec_widgets-2.7.0.dist-info}/RECORD +13 -12
- pyproject.toml +1 -1
- {bec_widgets-2.6.0.dist-info → bec_widgets-2.7.0.dist-info}/WHEEL +0 -0
- {bec_widgets-2.6.0.dist-info → bec_widgets-2.7.0.dist-info}/entry_points.txt +0 -0
- {bec_widgets-2.6.0.dist-info → bec_widgets-2.7.0.dist-info}/licenses/LICENSE +0 -0
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
bec_widgets/utils/crosshair.py
CHANGED
@@ -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.
|
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.
|
199
|
+
if self.marker_2d_row is not None and self.marker_2d_col is not None:
|
199
200
|
continue
|
200
|
-
|
201
|
-
|
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.
|
204
|
-
self.plot_item.addItem(self.
|
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
|
-
|
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
|
-
|
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.
|
454
|
-
self.plot_item.removeItem(self.
|
455
|
-
self.
|
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.
|
220
|
-
|
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.
|
256
|
-
|
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=
|
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(
|
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=
|
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())
|
@@ -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=
|
5
|
+
CHANGELOG.md,sha256=RnEXyJT_0vMFYeinWyayLtZF9IYbWRTRWvsguApDIFE,287017
|
6
6
|
LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
|
7
|
-
PKG-INFO,sha256=
|
7
|
+
PKG-INFO,sha256=q_orCUbgBKXQm6s-Bz7BhApp1xrvFBCvDxSO0uhFjlU,1273
|
8
8
|
README.md,sha256=oY5Jc1uXehRASuwUJ0umin2vfkFh7tHF-LLruHTaQx0,3560
|
9
|
-
pyproject.toml,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.
|
407
|
-
bec_widgets-2.
|
408
|
-
bec_widgets-2.
|
409
|
-
bec_widgets-2.
|
410
|
-
bec_widgets-2.
|
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
File without changes
|
File without changes
|
File without changes
|