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.
- CHANGELOG.md +30 -34
- PKG-INFO +1 -1
- bec_widgets/assets/designer_icons/image.png +0 -0
- bec_widgets/assets/toolbar_icons/auto_range.svg +1 -1
- bec_widgets/assets/toolbar_icons/compare.svg +3 -0
- bec_widgets/assets/toolbar_icons/fft.svg +11 -0
- bec_widgets/assets/toolbar_icons/image_autorange.svg +3 -0
- bec_widgets/assets/toolbar_icons/line_curve.svg +3 -0
- bec_widgets/assets/toolbar_icons/lock_aspect_ratio.svg +3 -0
- bec_widgets/assets/toolbar_icons/log_scale.png +0 -0
- bec_widgets/assets/toolbar_icons/reset_settings.svg +3 -0
- bec_widgets/assets/toolbar_icons/rotate_left.svg +3 -0
- bec_widgets/assets/toolbar_icons/rotate_right.svg +3 -0
- bec_widgets/assets/toolbar_icons/transform.svg +3 -0
- bec_widgets/cli/client.py +187 -2
- bec_widgets/examples/jupyter_console/jupyter_console_window.py +18 -19
- bec_widgets/widgets/figure/figure.py +1 -3
- bec_widgets/widgets/figure/plots/axis_settings.ui +86 -100
- bec_widgets/widgets/figure/plots/image/image.py +85 -3
- bec_widgets/widgets/figure/plots/image/image_item.py +14 -0
- bec_widgets/widgets/image/__init__.py +0 -0
- bec_widgets/widgets/image/bec_image_widget.pyproject +1 -0
- bec_widgets/widgets/image/bec_image_widget_plugin.py +59 -0
- bec_widgets/widgets/image/image_widget.py +475 -0
- bec_widgets/widgets/image/register_bec_image_widget.py +15 -0
- {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/METADATA +1 -1
- {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/RECORD +36 -19
- pyproject.toml +1 -1
- tests/unit_tests/client_mocks.py +9 -1
- tests/unit_tests/test_bec_image_widget.py +218 -0
- tests/unit_tests/test_device_input_base.py +1 -1
- tests/unit_tests/test_device_input_widgets.py +2 -0
- tests/unit_tests/test_waveform_widget.py +1 -1
- {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/WHEEL +0 -0
- {bec_widgets-0.89.0.dist-info → bec_widgets-0.90.0.dist-info}/entry_points.txt +0 -0
- {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()
|
@@ -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=
|
5
|
+
CHANGELOG.md,sha256=eO6xwW2pmYK8Q53H99wjv3k8tkwL_YvQvLUDbNfeiAg,7844
|
6
6
|
LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
|
7
|
-
PKG-INFO,sha256=
|
7
|
+
PKG-INFO,sha256=n3d7ArMWgPK6AqsR95K6p5oCT1T4lcatx-ewRBQhEJU,1308
|
8
8
|
README.md,sha256=Od69x-RS85Hph0-WwWACwal4yUd67XkEn4APEfHhHFw,2649
|
9
|
-
pyproject.toml,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
134
|
-
bec_widgets/widgets/figure/plots/image/image_item.py,sha256=
|
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=
|
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=
|
271
|
-
tests/unit_tests/test_device_input_widgets.py,sha256=
|
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=
|
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.
|
301
|
-
bec_widgets-0.
|
302
|
-
bec_widgets-0.
|
303
|
-
bec_widgets-0.
|
304
|
-
bec_widgets-0.
|
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,,
|