bec-widgets 0.89.0__py3-none-any.whl → 0.90.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.
Files changed (36) hide show
  1. CHANGELOG.md +30 -34
  2. PKG-INFO +1 -1
  3. bec_widgets/assets/designer_icons/image.png +0 -0
  4. bec_widgets/assets/toolbar_icons/auto_range.svg +1 -1
  5. bec_widgets/assets/toolbar_icons/compare.svg +3 -0
  6. bec_widgets/assets/toolbar_icons/fft.svg +11 -0
  7. bec_widgets/assets/toolbar_icons/image_autorange.svg +3 -0
  8. bec_widgets/assets/toolbar_icons/line_curve.svg +3 -0
  9. bec_widgets/assets/toolbar_icons/lock_aspect_ratio.svg +3 -0
  10. bec_widgets/assets/toolbar_icons/log_scale.png +0 -0
  11. bec_widgets/assets/toolbar_icons/reset_settings.svg +3 -0
  12. bec_widgets/assets/toolbar_icons/rotate_left.svg +3 -0
  13. bec_widgets/assets/toolbar_icons/rotate_right.svg +3 -0
  14. bec_widgets/assets/toolbar_icons/transform.svg +3 -0
  15. bec_widgets/cli/client.py +187 -2
  16. bec_widgets/examples/jupyter_console/jupyter_console_window.py +18 -19
  17. bec_widgets/widgets/figure/figure.py +1 -3
  18. bec_widgets/widgets/figure/plots/axis_settings.ui +86 -100
  19. bec_widgets/widgets/figure/plots/image/image.py +85 -3
  20. bec_widgets/widgets/figure/plots/image/image_item.py +14 -0
  21. bec_widgets/widgets/image/__init__.py +0 -0
  22. bec_widgets/widgets/image/bec_image_widget.pyproject +1 -0
  23. bec_widgets/widgets/image/bec_image_widget_plugin.py +59 -0
  24. bec_widgets/widgets/image/image_widget.py +475 -0
  25. bec_widgets/widgets/image/register_bec_image_widget.py +15 -0
  26. {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/METADATA +1 -1
  27. {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/RECORD +36 -19
  28. pyproject.toml +1 -1
  29. tests/unit_tests/client_mocks.py +9 -1
  30. tests/unit_tests/test_bec_image_widget.py +218 -0
  31. tests/unit_tests/test_device_input_base.py +1 -1
  32. tests/unit_tests/test_device_input_widgets.py +2 -0
  33. tests/unit_tests/test_waveform_widget.py +1 -1
  34. {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/WHEEL +0 -0
  35. {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/entry_points.txt +0 -0
  36. {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,475 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ from typing import Literal, Optional
5
+
6
+ import pyqtgraph as pg
7
+ from qtpy.QtWidgets import QVBoxLayout, QWidget
8
+
9
+ from bec_widgets.qt_utils.error_popups import SafeSlot, WarningPopupUtility
10
+ from bec_widgets.qt_utils.settings_dialog import SettingsDialog
11
+ from bec_widgets.qt_utils.toolbar import (
12
+ DeviceSelectionAction,
13
+ IconAction,
14
+ ModularToolBar,
15
+ SeparatorAction,
16
+ )
17
+ from bec_widgets.utils.bec_widget import BECWidget
18
+ from bec_widgets.widgets.device_combobox.device_combobox import DeviceComboBox
19
+ from bec_widgets.widgets.figure import BECFigure
20
+ from bec_widgets.widgets.figure.plots.axis_settings import AxisSettings
21
+ from bec_widgets.widgets.figure.plots.image.image import ImageConfig
22
+ from bec_widgets.widgets.figure.plots.image.image_item import BECImageItem
23
+
24
+
25
+ class BECImageWidget(BECWidget, QWidget):
26
+ USER_ACCESS = [
27
+ "image",
28
+ "set",
29
+ "set_title",
30
+ "set_x_label",
31
+ "set_y_label",
32
+ "set_x_scale",
33
+ "set_y_scale",
34
+ "set_x_lim",
35
+ "set_y_lim",
36
+ "set_vrange",
37
+ "set_fft",
38
+ "set_transpose",
39
+ "set_rotation",
40
+ "set_log",
41
+ "set_grid",
42
+ "lock_aspect_ratio",
43
+ ]
44
+
45
+ def __init__(
46
+ self,
47
+ parent: QWidget | None = None,
48
+ config: ImageConfig | dict = None,
49
+ client=None,
50
+ gui_id: str | None = None,
51
+ ) -> None:
52
+ if config is None:
53
+ config = ImageConfig(widget_class=self.__class__.__name__)
54
+ else:
55
+ if isinstance(config, dict):
56
+ config = ImageConfig(**config)
57
+ super().__init__(client=client, gui_id=gui_id)
58
+ QWidget.__init__(self, parent)
59
+ self.layout = QVBoxLayout(self)
60
+ self.layout.setSpacing(0)
61
+ self.layout.setContentsMargins(0, 0, 0, 0)
62
+
63
+ self.fig = BECFigure()
64
+ self.toolbar = ModularToolBar(
65
+ actions={
66
+ "monitor": DeviceSelectionAction(
67
+ "Monitor:", DeviceComboBox(device_filter="Device")
68
+ ),
69
+ "connect": IconAction(icon_path="connection.svg", tooltip="Connect Device"),
70
+ "separator_0": SeparatorAction(),
71
+ "save": IconAction(icon_path="save.svg", tooltip="Open Export Dialog"),
72
+ "separator_1": SeparatorAction(),
73
+ "drag_mode": IconAction(
74
+ icon_path="drag_pan_mode.svg", tooltip="Drag Mouse Mode", checkable=True
75
+ ),
76
+ "rectangle_mode": IconAction(
77
+ icon_path="rectangle_mode.svg", tooltip="Rectangle Zoom Mode", checkable=True
78
+ ),
79
+ "auto_range": IconAction(icon_path="auto_range.svg", tooltip="Autorange Plot"),
80
+ "auto_range_image": IconAction(
81
+ icon_path="image_autorange.svg",
82
+ tooltip="Autorange Image Intensity",
83
+ checkable=True,
84
+ ),
85
+ "aspect_ratio": IconAction(
86
+ icon_path="lock_aspect_ratio.svg",
87
+ tooltip="Lock image aspect ratio",
88
+ checkable=True,
89
+ ),
90
+ "separator_2": SeparatorAction(),
91
+ "FFT": IconAction(icon_path="fft.svg", tooltip="Toggle FFT", checkable=True),
92
+ "log": IconAction(
93
+ icon_path="log_scale.png", tooltip="Toggle log scale", checkable=True
94
+ ),
95
+ "transpose": IconAction(
96
+ icon_path="transform.svg", tooltip="Transpose Image", checkable=True
97
+ ),
98
+ "rotate_right": IconAction(
99
+ icon_path="rotate_right.svg", tooltip="Rotate image clockwise by 90 deg"
100
+ ),
101
+ "rotate_left": IconAction(
102
+ icon_path="rotate_left.svg", tooltip="Rotate image counterclockwise by 90 deg"
103
+ ),
104
+ "reset": IconAction(icon_path="reset_settings.svg", tooltip="Reset Image Settings"),
105
+ "separator_3": SeparatorAction(),
106
+ "axis_settings": IconAction(
107
+ icon_path="settings.svg", tooltip="Open Configuration Dialog"
108
+ ),
109
+ },
110
+ target_widget=self,
111
+ )
112
+
113
+ self.layout.addWidget(self.toolbar)
114
+ self.layout.addWidget(self.fig)
115
+
116
+ self.warning_util = WarningPopupUtility(self)
117
+
118
+ self._image = self.fig.image()
119
+ self._image.apply_config(config)
120
+ self.rotation = 0
121
+
122
+ self.config = config
123
+
124
+ self._hook_actions()
125
+
126
+ self.toolbar.widgets["drag_mode"].action.setChecked(True)
127
+ self.toolbar.widgets["auto_range_image"].action.setChecked(True)
128
+
129
+ def _hook_actions(self):
130
+ self.toolbar.widgets["connect"].action.triggered.connect(self._connect_action)
131
+ # sepatator
132
+ self.toolbar.widgets["save"].action.triggered.connect(self.export)
133
+ # sepatator
134
+ self.toolbar.widgets["drag_mode"].action.triggered.connect(self.enable_mouse_pan_mode)
135
+ self.toolbar.widgets["rectangle_mode"].action.triggered.connect(
136
+ self.enable_mouse_rectangle_mode
137
+ )
138
+ self.toolbar.widgets["auto_range"].action.triggered.connect(self.toggle_auto_range)
139
+ self.toolbar.widgets["auto_range_image"].action.triggered.connect(
140
+ self.toggle_image_autorange
141
+ )
142
+ self.toolbar.widgets["aspect_ratio"].action.triggered.connect(self.toggle_aspect_ratio)
143
+ # sepatator
144
+ self.toolbar.widgets["FFT"].action.triggered.connect(self.toggle_fft)
145
+ self.toolbar.widgets["log"].action.triggered.connect(self.toggle_log)
146
+ self.toolbar.widgets["transpose"].action.triggered.connect(self.toggle_transpose)
147
+ self.toolbar.widgets["rotate_left"].action.triggered.connect(self.rotate_left)
148
+ self.toolbar.widgets["rotate_right"].action.triggered.connect(self.rotate_right)
149
+ self.toolbar.widgets["reset"].action.triggered.connect(self.reset_settings)
150
+ # sepatator
151
+ self.toolbar.widgets["axis_settings"].action.triggered.connect(self.show_axis_settings)
152
+
153
+ ###################################
154
+ # Dialog Windows
155
+ ###################################
156
+ @SafeSlot(popup_error=True)
157
+ def _connect_action(self):
158
+ monitor_combo = self.toolbar.widgets["monitor"].device_combobox
159
+ monitor_name = monitor_combo.currentText()
160
+ self.image(monitor_name)
161
+ monitor_combo.setStyleSheet("QComboBox { background-color: " "; }")
162
+
163
+ def show_axis_settings(self):
164
+ dialog = SettingsDialog(
165
+ self,
166
+ settings_widget=AxisSettings(),
167
+ window_title="Axis Settings",
168
+ config=self._config_dict["axis"],
169
+ )
170
+ dialog.exec()
171
+
172
+ ###################################
173
+ # User Access Methods from image
174
+ ###################################
175
+ @SafeSlot(popup_error=True)
176
+ def image(
177
+ self,
178
+ monitor: str,
179
+ color_map: Optional[str] = "magma",
180
+ color_bar: Optional[Literal["simple", "full"]] = "full",
181
+ downsample: Optional[bool] = True,
182
+ opacity: Optional[float] = 1.0,
183
+ vrange: Optional[tuple[int, int]] = None,
184
+ # post_processing: Optional[PostProcessingConfig] = None,
185
+ **kwargs,
186
+ ) -> BECImageItem:
187
+ if self.toolbar.widgets["monitor"].device_combobox.currentText() != monitor:
188
+ self.toolbar.widgets["monitor"].device_combobox.setCurrentText(monitor)
189
+ self.toolbar.widgets["monitor"].device_combobox.setStyleSheet(
190
+ "QComboBox {{ background-color: " "; }}"
191
+ )
192
+ return self._image.image(
193
+ monitor=monitor,
194
+ color_map=color_map,
195
+ color_bar=color_bar,
196
+ downsample=downsample,
197
+ opacity=opacity,
198
+ vrange=vrange,
199
+ **kwargs,
200
+ )
201
+
202
+ def set_vrange(self, vmin: float, vmax: float, name: str = None):
203
+ """
204
+ Set the range of the color bar.
205
+ If name is not specified, then set vrange for all images.
206
+
207
+ Args:
208
+ vmin(float): Minimum value of the color bar.
209
+ vmax(float): Maximum value of the color bar.
210
+ name(str): The name of the image. If None, apply to all images.
211
+ """
212
+ self._image.set_vrange(vmin, vmax, name)
213
+
214
+ def set_color_map(self, color_map: str, name: str = None):
215
+ """
216
+ Set the color map of the image.
217
+ If name is not specified, then set color map for all images.
218
+
219
+ Args:
220
+ cmap(str): The color map of the image.
221
+ name(str): The name of the image. If None, apply to all images.
222
+ """
223
+ self._image.set_color_map(color_map, name)
224
+
225
+ def set_fft(self, enable: bool = False, name: str = None):
226
+ """
227
+ Set the FFT of the image.
228
+ If name is not specified, then set FFT for all images.
229
+
230
+ Args:
231
+ enable(bool): Whether to perform FFT on the monitor data.
232
+ name(str): The name of the image. If None, apply to all images.
233
+ """
234
+ self._image.set_fft(enable, name)
235
+ self.toolbar.widgets["FFT"].action.setChecked(enable)
236
+
237
+ def set_transpose(self, enable: bool = False, name: str = None):
238
+ """
239
+ Set the transpose of the image.
240
+ If name is not specified, then set transpose for all images.
241
+
242
+ Args:
243
+ enable(bool): Whether to transpose the monitor data before displaying.
244
+ name(str): The name of the image. If None, apply to all images.
245
+ """
246
+ self._image.set_transpose(enable, name)
247
+ self.toolbar.widgets["transpose"].action.setChecked(enable)
248
+
249
+ def set_rotation(self, deg_90: int = 0, name: str = None):
250
+ """
251
+ Set the rotation of the image.
252
+ If name is not specified, then set rotation for all images.
253
+
254
+ Args:
255
+ deg_90(int): The rotation angle of the monitor data before displaying.
256
+ name(str): The name of the image. If None, apply to all images.
257
+ """
258
+ self._image.set_rotation(deg_90, name)
259
+
260
+ def set_log(self, enable: bool = False, name: str = None):
261
+ """
262
+ Set the log of the image.
263
+ If name is not specified, then set log for all images.
264
+
265
+ Args:
266
+ enable(bool): Whether to perform log on the monitor data.
267
+ name(str): The name of the image. If None, apply to all images.
268
+ """
269
+ self._image.set_log(enable, name)
270
+ self.toolbar.widgets["log"].action.setChecked(enable)
271
+
272
+ ###################################
273
+ # User Access Methods from Plotbase
274
+ ###################################
275
+
276
+ def set(self, **kwargs):
277
+ """
278
+ Set the properties of the plot widget.
279
+
280
+ Args:
281
+ **kwargs: Keyword arguments for the properties to be set.
282
+
283
+ Possible properties:
284
+ - title: str
285
+ - x_label: str
286
+ - y_label: str
287
+ - x_scale: Literal["linear", "log"]
288
+ - y_scale: Literal["linear", "log"]
289
+ - x_lim: tuple
290
+ - y_lim: tuple
291
+ - legend_label_size: int
292
+ """
293
+ self._image.set(**kwargs)
294
+
295
+ def set_title(self, title: str):
296
+ """
297
+ Set the title of the plot widget.
298
+
299
+ Args:
300
+ title(str): Title of the plot.
301
+ """
302
+ self._image.set_title(title)
303
+
304
+ def set_x_label(self, x_label: str):
305
+ """
306
+ Set the x-axis label of the plot widget.
307
+
308
+ Args:
309
+ x_label(str): Label of the x-axis.
310
+ """
311
+ self._image.set_x_label(x_label)
312
+
313
+ def set_y_label(self, y_label: str):
314
+ """
315
+ Set the y-axis label of the plot widget.
316
+
317
+ Args:
318
+ y_label(str): Label of the y-axis.
319
+ """
320
+ self._image.set_y_label(y_label)
321
+
322
+ def set_x_scale(self, x_scale: Literal["linear", "log"]):
323
+ """
324
+ Set the scale of the x-axis of the plot widget.
325
+
326
+ Args:
327
+ x_scale(Literal["linear", "log"]): Scale of the x-axis.
328
+ """
329
+ self._image.set_x_scale(x_scale)
330
+
331
+ def set_y_scale(self, y_scale: Literal["linear", "log"]):
332
+ """
333
+ Set the scale of the y-axis of the plot widget.
334
+
335
+ Args:
336
+ y_scale(Literal["linear", "log"]): Scale of the y-axis.
337
+ """
338
+ self._image.set_y_scale(y_scale)
339
+
340
+ def set_x_lim(self, x_lim: tuple):
341
+ """
342
+ Set the limits of the x-axis of the plot widget.
343
+
344
+ Args:
345
+ x_lim(tuple): Limits of the x-axis.
346
+ """
347
+ self._image.set_x_lim(x_lim)
348
+
349
+ def set_y_lim(self, y_lim: tuple):
350
+ """
351
+ Set the limits of the y-axis of the plot widget.
352
+
353
+ Args:
354
+ y_lim(tuple): Limits of the y-axis.
355
+ """
356
+ self._image.set_y_lim(y_lim)
357
+
358
+ def set_grid(self, x_grid: bool, y_grid: bool):
359
+ """
360
+ Set the grid visibility of the plot widget.
361
+
362
+ Args:
363
+ x_grid(bool): Visibility of the x-axis grid.
364
+ y_grid(bool): Visibility of the y-axis grid.
365
+ """
366
+ self._image.set_grid(x_grid, y_grid)
367
+
368
+ def lock_aspect_ratio(self, lock: bool):
369
+ """
370
+ Lock the aspect ratio of the plot widget.
371
+
372
+ Args:
373
+ lock(bool): Lock the aspect ratio.
374
+ """
375
+ self._image.lock_aspect_ratio(lock)
376
+
377
+ ###################################
378
+ # Toolbar Actions
379
+ ###################################
380
+ @SafeSlot()
381
+ def toggle_auto_range(self):
382
+ """
383
+ Set the auto range of the plot widget from the toolbar.
384
+ """
385
+ self._image.set_auto_range(True, "xy")
386
+
387
+ @SafeSlot()
388
+ def toggle_fft(self):
389
+ checked = self.toolbar.widgets["FFT"].action.isChecked()
390
+ self.set_fft(checked)
391
+
392
+ @SafeSlot()
393
+ def toggle_log(self):
394
+ checked = self.toolbar.widgets["log"].action.isChecked()
395
+ self.set_log(checked)
396
+
397
+ @SafeSlot()
398
+ def toggle_transpose(self):
399
+ checked = self.toolbar.widgets["transpose"].action.isChecked()
400
+ self.set_transpose(checked)
401
+
402
+ @SafeSlot()
403
+ def rotate_left(self):
404
+ self.rotation = (self.rotation + 1) % 4
405
+ self.set_rotation(self.rotation)
406
+
407
+ @SafeSlot()
408
+ def rotate_right(self):
409
+ self.rotation = (self.rotation - 1) % 4
410
+ self.set_rotation(self.rotation)
411
+
412
+ @SafeSlot()
413
+ def reset_settings(self):
414
+ self.set_log(False)
415
+ self.set_fft(False)
416
+ self.set_transpose(False)
417
+ self.rotation = 0
418
+ self.set_rotation(0)
419
+
420
+ self.toolbar.widgets["FFT"].action.setChecked(False)
421
+ self.toolbar.widgets["log"].action.setChecked(False)
422
+ self.toolbar.widgets["transpose"].action.setChecked(False)
423
+
424
+ @SafeSlot()
425
+ def toggle_image_autorange(self):
426
+ """
427
+ Enable the auto range of the image intensity.
428
+ """
429
+ checked = self.toolbar.widgets["auto_range_image"].action.isChecked()
430
+ self._image.set_autorange(checked)
431
+
432
+ @SafeSlot()
433
+ def toggle_aspect_ratio(self):
434
+ """
435
+ Enable the auto range of the image intensity.
436
+ """
437
+ checked = self.toolbar.widgets["aspect_ratio"].action.isChecked()
438
+ self._image.lock_aspect_ratio(checked)
439
+
440
+ @SafeSlot()
441
+ def enable_mouse_rectangle_mode(self):
442
+ self.toolbar.widgets["rectangle_mode"].action.setChecked(True)
443
+ self.toolbar.widgets["drag_mode"].action.setChecked(False)
444
+ self._image.plot_item.getViewBox().setMouseMode(pg.ViewBox.RectMode)
445
+
446
+ @SafeSlot()
447
+ def enable_mouse_pan_mode(self):
448
+ self.toolbar.widgets["drag_mode"].action.setChecked(True)
449
+ self.toolbar.widgets["rectangle_mode"].action.setChecked(False)
450
+ self._image.plot_item.getViewBox().setMouseMode(pg.ViewBox.PanMode)
451
+
452
+ def export(self):
453
+ """
454
+ Show the export dialog for the plot widget.
455
+ """
456
+ self._image.export()
457
+
458
+ def cleanup(self):
459
+ self.fig.cleanup()
460
+ self.client.shutdown()
461
+ return super().cleanup()
462
+
463
+
464
+ def main(): # pragma: no cover
465
+
466
+ from qtpy.QtWidgets import QApplication
467
+
468
+ app = QApplication(sys.argv)
469
+ widget = BECImageWidget()
470
+ widget.show()
471
+ sys.exit(app.exec_())
472
+
473
+
474
+ if __name__ == "__main__": # pragma: no cover
475
+ main()
@@ -0,0 +1,15 @@
1
+ def main(): # pragma: no cover
2
+ from qtpy import PYSIDE6
3
+
4
+ if not PYSIDE6:
5
+ print("PYSIDE6 is not available in the environment. Cannot patch designer.")
6
+ return
7
+ from PySide6.QtDesigner import QPyDesignerCustomWidgetCollection
8
+
9
+ from bec_widgets.widgets.image.bec_image_widget_plugin import BECImageWidgetPlugin
10
+
11
+ QPyDesignerCustomWidgetCollection.addCustomWidget(BECImageWidgetPlugin())
12
+
13
+
14
+ if __name__ == "__main__": # pragma: no cover
15
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.89.0
3
+ Version: 0.90.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=zvb4A6QI5lQTsdfI5nPPL-tUNfcrz__SQjxW03QZ5Ek,8204
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
5
- CHANGELOG.md,sha256=uhv8_onBdbN8kbinnOHiodr8sl-DDkSCsFvFX4GXxEM,7659
5
+ CHANGELOG.md,sha256=eO6xwW2pmYK8Q53H99wjv3k8tkwL_YvQvLUDbNfeiAg,7844
6
6
  LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
7
- PKG-INFO,sha256=xS4mgn3bfKA_F-CdVYwrnxYLxp8jCUKIgRaj_Ql1soo,1308
7
+ PKG-INFO,sha256=n3d7ArMWgPK6AqsR95K6p5oCT1T4lcatx-ewRBQhEJU,1308
8
8
  README.md,sha256=Od69x-RS85Hph0-WwWACwal4yUd67XkEn4APEfHhHFw,2649
9
- pyproject.toml,sha256=8JPjxFvrTYYu0RcGWXX1mIR8VEzXaEH7ZlXEmhyrepo,2357
9
+ pyproject.toml,sha256=0iY_eFlvtu2I8a-9yn-2_VGyOIJT4eojBe44VlJnz-U,2357
10
10
  .git_hooks/pre-commit,sha256=n3RofIZHJl8zfJJIUomcMyYGFi_rwq4CC19z0snz3FI,286
11
11
  .gitlab/issue_templates/bug_report_template.md,sha256=gAuyEwl7XlnebBrkiJ9AqffSNOywmr8vygUFWKTuQeI,386
12
12
  .gitlab/issue_templates/documentation_update_template.md,sha256=FHLdb3TS_D9aL4CYZCjyXSulbaW5mrN2CmwTaeLPbNw,860
@@ -17,24 +17,35 @@ bec_widgets/assets/app_icons/bec_widgets_icon.png,sha256=K8dgGwIjalDh9PRHUsSQBqg
17
17
  bec_widgets/assets/app_icons/terminal_icon.png,sha256=bJl7Tft4Fi2uxvuXI8o14uMHnI9eAWKSU2uftXCH9ws,3889
18
18
  bec_widgets/assets/designer_icons/BECWaveformWidget.png,sha256=QKocOi6e1frT6anrTwIQqQEwkalbl2AoOrTpvN1dr90,3764
19
19
  bec_widgets/assets/designer_icons/colormap_selector.png,sha256=KULLUA5T9SLhcSyrdouG07nXHZtE-LNNOn0ghG7T-OQ,6831
20
+ bec_widgets/assets/designer_icons/image.png,sha256=0Kppbe2BBcsXzSHjqHxjrRgBE6DUT-ZF7xNPMMI2bxA,3984
20
21
  bec_widgets/assets/designer_icons/motor_map.png,sha256=8iqST5mTnZfv9rN9rx3D-XBm232Mwvzz9D0Wx6QaT8I,7293
21
22
  bec_widgets/assets/toolbar_icons/add.svg,sha256=Co1Iueh0sqQ1LMQcvNXPLg6tC6MLtQviH-F79uhM2o0,228
22
- bec_widgets/assets/toolbar_icons/auto_range.svg,sha256=hq6YMySVWF01SeEXzpF_h7BaqUPdsipTk_Z3nOjD8bg,487
23
+ bec_widgets/assets/toolbar_icons/auto_range.svg,sha256=vX_1qIl1dK6QEmEdp9OAw5SRcEugKvV_B5a2z8_jAtA,258
24
+ bec_widgets/assets/toolbar_icons/compare.svg,sha256=se1AHEq0tpPueVLC05QsYXMiWbzff3sgUs_KUGXkmR0,351
23
25
  bec_widgets/assets/toolbar_icons/connection.svg,sha256=czIb1BnshmxJnER8ssU3WcLENrFSIUfMwberajWOGAk,341
24
26
  bec_widgets/assets/toolbar_icons/drag_pan_mode.svg,sha256=ruinkJ0dVEPSH7ll4Pufl9c7oTwVXvcN57oTgiVRY5I,470
25
27
  bec_widgets/assets/toolbar_icons/export.svg,sha256=-kDEfxzloR1fOpZ5d4KIkxGH7wS_4Z1uJImtnKA5XxU,371
28
+ bec_widgets/assets/toolbar_icons/fft.svg,sha256=fX31gulUsQTtpqbGbw4lpB1UwmIXh2LX2y4B2jPzyuo,2704
26
29
  bec_widgets/assets/toolbar_icons/fitting_parameters.svg,sha256=k57fFm2xPyYQD0y1K4Mb-7uqDeVA6GBWq_oh4-rQQeE,366
27
30
  bec_widgets/assets/toolbar_icons/history.svg,sha256=bd6p5saxRiNRpd5OsSwIOvRWvel0WFEHul9zw4y9vH0,392
31
+ bec_widgets/assets/toolbar_icons/image_autorange.svg,sha256=f9AkVTlHM8voRdHEdzkSdcKjSNVHqIvPxeXQgp76tN4,809
28
32
  bec_widgets/assets/toolbar_icons/import.svg,sha256=57-0ahjyIng5d3c0pSVCC2YwEYmQSyVVUdWkQXiVEVY,377
29
33
  bec_widgets/assets/toolbar_icons/line_axis.svg,sha256=uguelNycsOl6DmjYfUPnPnkIxfrDHEiLCpHW7iKEyfk,450
34
+ bec_widgets/assets/toolbar_icons/line_curve.svg,sha256=3Zt0Jv3et5o6QCONmHoYU1Lq-cDqIEpCeUZ1hxJhbC4,319
35
+ bec_widgets/assets/toolbar_icons/lock_aspect_ratio.svg,sha256=hq6YMySVWF01SeEXzpF_h7BaqUPdsipTk_Z3nOjD8bg,487
36
+ bec_widgets/assets/toolbar_icons/log_scale.png,sha256=pFYt9wn988rd-RHnyCuMw0WnIQY61UmEDvAHaiTs5dA,6453
30
37
  bec_widgets/assets/toolbar_icons/photo_library.svg,sha256=weiDCYiHh9dzcA21D-37zpYts2CyoGAd9x-N_h292Mo,564
31
38
  bec_widgets/assets/toolbar_icons/rectangle_mode.svg,sha256=N7AXB3da-RW8OpjLFeOUh1SDKVQ-9SWGPUjkryujyeE,946
32
39
  bec_widgets/assets/toolbar_icons/remove.svg,sha256=K1g1KmNyp32WlAZpR9w5HezYhtxbqXo_2goimkxwPaw,357
40
+ bec_widgets/assets/toolbar_icons/reset_settings.svg,sha256=ygMTbJ0TWfABNGvquvDr4AAr7bUYmy9xAGNcgsUGQ_g,733
41
+ bec_widgets/assets/toolbar_icons/rotate_left.svg,sha256=wzW8cRvyeLWyxC8ghqiUZcDLmNoRvuqyMgmzmOGewTs,811
42
+ bec_widgets/assets/toolbar_icons/rotate_right.svg,sha256=xhL9MKBARe5j4SPaYIgcHdXugTSnBWfknay141Q-E2k,815
33
43
  bec_widgets/assets/toolbar_icons/save.svg,sha256=rexWzbFExkh-NiAFP1909-1mm1BKU76cxQBwdAVvtHo,621
34
44
  bec_widgets/assets/toolbar_icons/settings.svg,sha256=ro30oa9CF1YijOXoUl-hz2DilJcqTy4rlTrMYhggumQ,1473
45
+ bec_widgets/assets/toolbar_icons/transform.svg,sha256=Fgug9wCi1FONy08nssEvnoDDDBbSrlNPu_pBF85GzgY,518
35
46
  bec_widgets/cli/__init__.py,sha256=d0Q6Fn44e7wFfLabDOBxpcJ1DPKWlFunGYDUBmO-4hA,22
36
47
  bec_widgets/cli/auto_updates.py,sha256=DyBV3HnjMSH-cvVkYNcDiYKVf0Xut4Qy2qGQqkW47Bw,4833
37
- bec_widgets/cli/client.py,sha256=RfaS3iyxPG8yUXDdFo-b0S9F4S62f7cwbAgDTO47tOs,70757
48
+ bec_widgets/cli/client.py,sha256=GH9huoGEYoKacsQY3bA53wvmyzJCSchP-7KuOlCIrdk,76055
38
49
  bec_widgets/cli/client_utils.py,sha256=cDhabblwaP88a0jlVpbn_RWWKVbsyjhmmGtMh9gesEw,12388
39
50
  bec_widgets/cli/generate_cli.py,sha256=Ea5px9KblUlcGg-1JbJBTIU7laGg2n8PM7Efw9WVVzM,5889
40
51
  bec_widgets/cli/rpc_register.py,sha256=QxXUZu5XNg00Yf5O3UHWOXg3-f_pzKjjoZYMOa-MOJc,2216
@@ -42,7 +53,7 @@ bec_widgets/cli/rpc_wigdet_handler.py,sha256=6kQng2DyS6rhLJqSJ7xa0kdgSxp-35A2upc
42
53
  bec_widgets/cli/server.py,sha256=y0GrBpDF3bHvYFZM20j2eDlsYxb-hT1ki_zmVI_OEiM,7752
43
54
  bec_widgets/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
55
  bec_widgets/examples/jupyter_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- bec_widgets/examples/jupyter_console/jupyter_console_window.py,sha256=a0eTHk91ZTb5RT-e099Isx3q4adYmM7zvKnNIWhJgFw,6849
56
+ bec_widgets/examples/jupyter_console/jupyter_console_window.py,sha256=zzeSE4SS-B6p7LTqS91oGbEmYEtEQHewndVscJywL8I,6766
46
57
  bec_widgets/examples/plugin_example_pyside/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
58
  bec_widgets/examples/plugin_example_pyside/main.py,sha256=xdC6RWSRt1rW8Prj0CsDeCPct6-_j3__oJmdgogB5PI,505
48
59
  bec_widgets/examples/plugin_example_pyside/registertictactoe.py,sha256=VNFkHc5Sc30lRKzOFJbhArCHGkp_wRxOeJjZbmaAHRU,448
@@ -124,20 +135,25 @@ bec_widgets/widgets/dock/__init__.py,sha256=B7foHt02gnhM7mFksa7GJVwT7n0j_JvYDCt6
124
135
  bec_widgets/widgets/dock/dock.py,sha256=2KJCLGIqmuMBOYVZCfJMFfYW3IXsIO0SuyebI_ktZKg,7648
125
136
  bec_widgets/widgets/dock/dock_area.py,sha256=Sv4SEntiJ67VNnup5XfZpBIIHBxyuRvYZigUXKf9E3E,7974
126
137
  bec_widgets/widgets/figure/__init__.py,sha256=3hGx_KOV7QHCYAV06aNuUgKq4QIYCjUTad-DrwkUaBM,44
127
- bec_widgets/widgets/figure/figure.py,sha256=IP8Kr8mWOBRSeWsB17UYoU5bpE4WcrOCuN5HpJOdzfk,28768
138
+ bec_widgets/widgets/figure/figure.py,sha256=ei--FpbgRgqlx_G6wrWitr1DAnSzu8dcxUi-xyn7YFk,28726
128
139
  bec_widgets/widgets/figure/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
140
  bec_widgets/widgets/figure/plots/axis_settings.py,sha256=_z20SrMu5iRM0eqhQjsCV1MDOY80hN2dqtvkeofXs0w,3510
130
- bec_widgets/widgets/figure/plots/axis_settings.ui,sha256=zMKZK6lH_3KJGO4RA_paXAH7UzZJ4Snlil3MK4pK3L8,11589
141
+ bec_widgets/widgets/figure/plots/axis_settings.ui,sha256=a2qIuK9lyi9HCyrSvPr6wxzmm1FymaWcpmyOhMIiFt8,11013
131
142
  bec_widgets/widgets/figure/plots/plot_base.py,sha256=AxzH2J-bLngxlWcgWWgNpLhIQxQzFz-H6yLf5Dou93Y,10921
132
143
  bec_widgets/widgets/figure/plots/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
- bec_widgets/widgets/figure/plots/image/image.py,sha256=CoD1ODroBL0M-9xCyAyELz-UBSHGMoXqe_1GqhGrRN0,21294
134
- bec_widgets/widgets/figure/plots/image/image_item.py,sha256=TyarahdWEn0jgalj5fqSAmcznXSbENkqHrrlL2GVdU4,10558
144
+ bec_widgets/widgets/figure/plots/image/image.py,sha256=xxowHo9LctrX3BQoVo9hWvj9FjALa0FIicFF39zZ3B8,24334
145
+ bec_widgets/widgets/figure/plots/image/image_item.py,sha256=RljjbkqJEr2cKDlqj1j5GQ1h89jpqOV-OpFz1TbED8I,10937
135
146
  bec_widgets/widgets/figure/plots/image/image_processor.py,sha256=GeTtWjbldy6VejMwPGQgM-o3d6bmLglCjdoktu19xfA,5262
136
147
  bec_widgets/widgets/figure/plots/motor_map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
148
  bec_widgets/widgets/figure/plots/motor_map/motor_map.py,sha256=IjCwVNb9DlujIDF9rlI7fOAM7udKpt0wL5hAGo2-MUw,18202
138
149
  bec_widgets/widgets/figure/plots/waveform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
150
  bec_widgets/widgets/figure/plots/waveform/waveform.py,sha256=HRU3d6nhr6DnfDc2N4VTTSABk9veTnnsBOnfc1UbamQ,51720
140
151
  bec_widgets/widgets/figure/plots/waveform/waveform_curve.py,sha256=ZwRxSfPHbMWEvgUC-mL2orpZvtxR-DcrYAFikkdWEzk,8654
152
+ bec_widgets/widgets/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
+ bec_widgets/widgets/image/bec_image_widget.pyproject,sha256=PHisdBo5_5UCApd27GkizzqgfdjsDx2bFZa_p9LiSW8,30
154
+ bec_widgets/widgets/image/bec_image_widget_plugin.py,sha256=B7whBMsoQ85MyCR_C6YHBl2s1T7odOJJYeiHaLXzmcM,1387
155
+ bec_widgets/widgets/image/image_widget.py,sha256=ef8Fg35Oy_rx3qSHpeIA2E4pNIY0BgbDdBmVviQjizo,16255
156
+ bec_widgets/widgets/image/register_bec_image_widget.py,sha256=01YLZQTMSSIXvH1TSL-1AYsRs1a4EbSwKLVAwh9AjeA,478
141
157
  bec_widgets/widgets/jupyter_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
158
  bec_widgets/widgets/jupyter_console/jupyter_console.py,sha256=mBKM89H6SuHuFy1lQg1n8s1gQiN5QEkZf0xua8aPDns,2402
143
159
  bec_widgets/widgets/motor_map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -252,13 +268,14 @@ tests/references/SpinnerWidget/SpinnerWidget_linux.png,sha256=OyiGxyQx0XCKEa1OeA
252
268
  tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png,sha256=NA7dOdKY-leFv8JI_5x3OIIY-XlSXSTIflVquz0UUZc,13784
253
269
  tests/references/SpinnerWidget/SpinnerWidget_started_linux.png,sha256=NA7dOdKY-leFv8JI_5x3OIIY-XlSXSTIflVquz0UUZc,13784
254
270
  tests/unit_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
255
- tests/unit_tests/client_mocks.py,sha256=nyI1Qi5ZcDtdfYdNjf46rrL5d5vkVxXcgG0hIZRolO8,5051
271
+ tests/unit_tests/client_mocks.py,sha256=4pS4KvvFGY9hjphds9i-GoIjVWVkax4XpDnVp6Mctfw,5275
256
272
  tests/unit_tests/conftest.py,sha256=KrnktXPWmZhnKNue-xGWOLD1XGEvdz9Vf7V2eO3XQ3A,596
257
273
  tests/unit_tests/test_bec_connector.py,sha256=zGDfNHwLFZTbpyX6-yc7Pwzr2jWO_HGZ8T4NFCNo4IE,2444
258
274
  tests/unit_tests/test_bec_dispatcher.py,sha256=rYPiRizHaswhGZw55IBMneDFxmPiCCLAZQBqjEkpdyY,3992
259
275
  tests/unit_tests/test_bec_dock.py,sha256=BXKXpuyIYj-l6KSyhQtM_p3kRFCRECIoXLzvkcJZDlM,3611
260
276
  tests/unit_tests/test_bec_figure.py,sha256=8AojxszCIzMi6EYB5mVFMQjk4pjgBCSp6PH2JZsuDkw,8724
261
277
  tests/unit_tests/test_bec_image.py,sha256=mjvcrHgOF_FCj6WbUyxvZH9HL63QGA5C0PNZ5dXYn50,2541
278
+ tests/unit_tests/test_bec_image_widget.py,sha256=4-fdbsJsPuzJs8EFw9C1llcF4Zmv3vzJcA9t34J0WD4,7478
262
279
  tests/unit_tests/test_bec_motor_map.py,sha256=dSYopbZS8lGD9cB26Kwmqw5zBoKCZs8t7DEEr50ug-g,8532
263
280
  tests/unit_tests/test_bec_queue.py,sha256=u-uc-iZeGAS8P90o6Cxy5oz_60zHpirGAu04OgQPDXw,4598
264
281
  tests/unit_tests/test_bec_status_box.py,sha256=gZdjyy9DNuUP9UwleTLj2Dp5HUImiqnkHjXWiqL0Q-o,4868
@@ -267,8 +284,8 @@ tests/unit_tests/test_color_map_selector.py,sha256=tsfCwHnEQoQhzA1ZpLhbGCMPqDX5h
267
284
  tests/unit_tests/test_color_validation.py,sha256=xbFbtFDia36XLgaNrX2IwvAX3IDC_Odpj5BGoJSgiIE,2389
268
285
  tests/unit_tests/test_crosshair.py,sha256=3OMAJ2ZaISYXMOtkXf1rPdy94vCr8njeLi6uHblBL9Q,5045
269
286
  tests/unit_tests/test_device_box.py,sha256=q9IVFpt1NF3TBF0Jhk-I-LRiuvvHG3FGUalw4jEYwVo,3431
270
- tests/unit_tests/test_device_input_base.py,sha256=Unw-CdRwXYdHBKRDWOEYoenLBjtFktbrzpjUx3lFIkM,2601
271
- tests/unit_tests/test_device_input_widgets.py,sha256=39MtgF-Q67UWz6qapyYP4ukDEUOD81iEJ_jhATyG7dM,5889
287
+ tests/unit_tests/test_device_input_base.py,sha256=Ui45hkt-S_t_5_O1BMPBO9Ieh0IGOQasl1pDHtMYk5w,2611
288
+ tests/unit_tests/test_device_input_widgets.py,sha256=GeM9Ed5jmPvSQTHUl3nAZuQRfSD-ryA_w9kocjPXiwk,5935
272
289
  tests/unit_tests/test_error_utils.py,sha256=LQOxz29WCGOe0qwFkaPDixjUmdnF3qeAGxD4A3t9IKg,2108
273
290
  tests/unit_tests/test_generate_cli_client.py,sha256=ng-eV5iF7Dhm-6YpxYo99CMY0KgqoaZBQNkMeKULDBU,3355
274
291
  tests/unit_tests/test_generate_plugin.py,sha256=9603ucZChM-pYpHadzsR94U1Zec1KZT34WedX9qzgMo,4464
@@ -288,7 +305,7 @@ tests/unit_tests/test_text_box_widget.py,sha256=cT0uEHt_6d-FwST0A_wE9sFW9E3F_nJb
288
305
  tests/unit_tests/test_toggle.py,sha256=Amzgres7te0tTQIDR2WMKSx9Kce44TxMpIPR6HZygXQ,832
289
306
  tests/unit_tests/test_vscode_widget.py,sha256=G1G7nCQGXFUn0BnMECE7mHmAm0C6pYx1JpEi_XEhodY,2682
290
307
  tests/unit_tests/test_waveform1d.py,sha256=ZuHCvGubMuaLIzaMWDvmBUhgzUHCDLdvTZqIOfBKaZg,22713
291
- tests/unit_tests/test_waveform_widget.py,sha256=6jNmJJXCm28Owrs8vEYzP0OX8lFE6T5c7OUNjV6CiB4,8592
308
+ tests/unit_tests/test_waveform_widget.py,sha256=ipUKnHvQ1SBpenO9ZhQOsT-L_nkDElH3XxVUknCSp_4,8592
292
309
  tests/unit_tests/test_website_widget.py,sha256=fBADIJJBAHU4Ro7u95kdemFVNv196UOcuO9oLHuHt8A,761
293
310
  tests/unit_tests/test_widget_io.py,sha256=FeL3ZYSBQnRt6jxj8VGYw1cmcicRQyHKleahw7XIyR0,3475
294
311
  tests/unit_tests/test_yaml_dialog.py,sha256=SEvUgC_poWC6fAoHVWolaORpgMFc7c0Xqqk9cFvHSvo,5826
@@ -297,8 +314,8 @@ tests/unit_tests/test_configs/config_device_no_entry.yaml,sha256=hdvue9KLc_kfNzG
297
314
  tests/unit_tests/test_configs/config_scan.yaml,sha256=vo484BbWOjA_e-h6bTjSV9k7QaQHrlAvx-z8wtY-P4E,1915
298
315
  tests/unit_tests/test_msgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
316
  tests/unit_tests/test_msgs/available_scans_message.py,sha256=m_z97hIrjHXXMa2Ex-UvsPmTxOYXfjxyJaGkIY6StTY,46532
300
- bec_widgets-0.89.0.dist-info/METADATA,sha256=xS4mgn3bfKA_F-CdVYwrnxYLxp8jCUKIgRaj_Ql1soo,1308
301
- bec_widgets-0.89.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
302
- bec_widgets-0.89.0.dist-info/entry_points.txt,sha256=3otEkCdDB9LZJuBLzG4pFLK5Di0CVybN_12IsZrQ-58,166
303
- bec_widgets-0.89.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
304
- bec_widgets-0.89.0.dist-info/RECORD,,
317
+ bec_widgets-0.90.0.dist-info/METADATA,sha256=n3d7ArMWgPK6AqsR95K6p5oCT1T4lcatx-ewRBQhEJU,1308
318
+ bec_widgets-0.90.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
319
+ bec_widgets-0.90.0.dist-info/entry_points.txt,sha256=3otEkCdDB9LZJuBLzG4pFLK5Di0CVybN_12IsZrQ-58,166
320
+ bec_widgets-0.90.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
321
+ bec_widgets-0.90.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 = "0.89.0"
7
+ version = "0.90.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [