bec-widgets 1.12.0__py3-none-any.whl → 1.14.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.
- .gitlab-ci.yml +1 -0
- CHANGELOG.md +5727 -0
- PKG-INFO +4 -3
- bec_widgets/cli/auto_updates.py +45 -61
- bec_widgets/cli/client.py +19 -2
- bec_widgets/cli/client_utils.py +142 -198
- bec_widgets/cli/generate_cli.py +2 -2
- bec_widgets/cli/rpc/__init__.py +0 -0
- bec_widgets/cli/rpc/rpc_base.py +177 -0
- bec_widgets/cli/server.py +66 -29
- bec_widgets/qt_utils/error_popups.py +4 -2
- bec_widgets/tests/utils.py +8 -0
- bec_widgets/utils/bec_connector.py +1 -1
- bec_widgets/utils/widget_io.py +85 -5
- bec_widgets/widgets/containers/dock/dock.py +1 -1
- bec_widgets/widgets/containers/dock/dock_area.py +40 -2
- bec_widgets/widgets/containers/layout_manager/layout_manager.py +1 -1
- bec_widgets/widgets/containers/main_window/main_window.py +33 -1
- bec_widgets/widgets/games/__init__.py +3 -0
- bec_widgets/widgets/games/minesweeper.py +413 -0
- bec_widgets/widgets/games/minesweeper.pyproject +1 -0
- bec_widgets/widgets/games/minesweeper_plugin.py +54 -0
- bec_widgets/widgets/games/register_minesweeper.py +15 -0
- {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/METADATA +4 -3
- {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/RECORD +31 -24
- {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/WHEEL +1 -1
- pyproject.toml +2 -2
- /bec_widgets/cli/{rpc_register.py → rpc/rpc_register.py} +0 -0
- /bec_widgets/cli/{rpc_wigdet_handler.py → rpc/rpc_widget_handler.py} +0 -0
- {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/entry_points.txt +0 -0
- {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/licenses/LICENSE +0 -0
PKG-INFO
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: bec_widgets
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.14.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
|
7
|
+
License-File: LICENSE
|
7
8
|
Classifier: Development Status :: 3 - Alpha
|
8
9
|
Classifier: Programming Language :: Python :: 3
|
9
10
|
Classifier: Topic :: Scientific/Engineering
|
@@ -21,7 +22,7 @@ Requires-Dist: qtpy~=2.4
|
|
21
22
|
Provides-Extra: dev
|
22
23
|
Requires-Dist: coverage~=7.0; extra == 'dev'
|
23
24
|
Requires-Dist: fakeredis>=2.23.2,~=2.23; extra == 'dev'
|
24
|
-
Requires-Dist: pytest-bec-e2e
|
25
|
+
Requires-Dist: pytest-bec-e2e<=4.0,>=2.21.4; extra == 'dev'
|
25
26
|
Requires-Dist: pytest-qt~=4.4; extra == 'dev'
|
26
27
|
Requires-Dist: pytest-random-order~=1.1; extra == 'dev'
|
27
28
|
Requires-Dist: pytest-timeout~=2.2; extra == 'dev'
|
bec_widgets/cli/auto_updates.py
CHANGED
@@ -27,25 +27,17 @@ class AutoUpdates:
|
|
27
27
|
|
28
28
|
def __init__(self, gui: BECDockArea):
|
29
29
|
self.gui = gui
|
30
|
-
self.
|
31
|
-
self.
|
32
|
-
self._shutdown_sentinel = object()
|
33
|
-
self.start()
|
34
|
-
|
35
|
-
def start(self):
|
36
|
-
"""
|
37
|
-
Start the auto update thread.
|
38
|
-
"""
|
39
|
-
self.auto_update_thread = threading.Thread(target=self.process_queue)
|
40
|
-
self.auto_update_thread.start()
|
30
|
+
self._default_dock = None
|
31
|
+
self._default_fig = None
|
41
32
|
|
42
33
|
def start_default_dock(self):
|
43
34
|
"""
|
44
35
|
Create a default dock for the auto updates.
|
45
36
|
"""
|
46
|
-
dock = self.gui.add_dock("default_figure")
|
47
|
-
dock.add_widget("BECFigure")
|
48
37
|
self.dock_name = "default_figure"
|
38
|
+
self._default_dock = self.gui.add_dock(self.dock_name)
|
39
|
+
self._default_dock.add_widget("BECFigure")
|
40
|
+
self._default_fig = self._default_dock.widget_list[0]
|
49
41
|
|
50
42
|
@staticmethod
|
51
43
|
def get_scan_info(msg) -> ScanInfo:
|
@@ -73,15 +65,9 @@ class AutoUpdates:
|
|
73
65
|
"""
|
74
66
|
Get the default figure from the GUI.
|
75
67
|
"""
|
76
|
-
|
77
|
-
if not dock:
|
78
|
-
return None
|
79
|
-
widgets = dock.widget_list
|
80
|
-
if not widgets:
|
81
|
-
return None
|
82
|
-
return widgets[0]
|
68
|
+
return self._default_fig
|
83
69
|
|
84
|
-
def
|
70
|
+
def do_update(self, msg):
|
85
71
|
"""
|
86
72
|
Run the update function if enabled.
|
87
73
|
"""
|
@@ -90,20 +76,9 @@ class AutoUpdates:
|
|
90
76
|
if msg.status != "open":
|
91
77
|
return
|
92
78
|
info = self.get_scan_info(msg)
|
93
|
-
self.handler(info)
|
94
|
-
|
95
|
-
def process_queue(self):
|
96
|
-
"""
|
97
|
-
Process the message queue.
|
98
|
-
"""
|
99
|
-
while True:
|
100
|
-
msg = self.msg_queue.get()
|
101
|
-
if msg is self._shutdown_sentinel:
|
102
|
-
break
|
103
|
-
self.run(msg)
|
79
|
+
return self.handler(info)
|
104
80
|
|
105
|
-
|
106
|
-
def get_selected_device(monitored_devices, selected_device):
|
81
|
+
def get_selected_device(self, monitored_devices, selected_device):
|
107
82
|
"""
|
108
83
|
Get the selected device for the plot. If no device is selected, the first
|
109
84
|
device in the monitored devices list is selected.
|
@@ -120,14 +95,11 @@ class AutoUpdates:
|
|
120
95
|
Default update function.
|
121
96
|
"""
|
122
97
|
if info.scan_name == "line_scan" and info.scan_report_devices:
|
123
|
-
self.simple_line_scan(info)
|
124
|
-
return
|
98
|
+
return self.simple_line_scan(info)
|
125
99
|
if info.scan_name == "grid_scan" and info.scan_report_devices:
|
126
|
-
self.simple_grid_scan(info)
|
127
|
-
return
|
100
|
+
return self.simple_grid_scan(info)
|
128
101
|
if info.scan_report_devices:
|
129
|
-
self.best_effort(info)
|
130
|
-
return
|
102
|
+
return self.best_effort(info)
|
131
103
|
|
132
104
|
def simple_line_scan(self, info: ScanInfo) -> None:
|
133
105
|
"""
|
@@ -137,12 +109,19 @@ class AutoUpdates:
|
|
137
109
|
if not fig:
|
138
110
|
return
|
139
111
|
dev_x = info.scan_report_devices[0]
|
140
|
-
|
112
|
+
selected_device = yield self.gui.selected_device
|
113
|
+
dev_y = self.get_selected_device(info.monitored_devices, selected_device)
|
141
114
|
if not dev_y:
|
142
115
|
return
|
143
|
-
fig.clear_all()
|
144
|
-
|
145
|
-
|
116
|
+
yield fig.clear_all()
|
117
|
+
yield fig.plot(
|
118
|
+
x_name=dev_x,
|
119
|
+
y_name=dev_y,
|
120
|
+
label=f"Scan {info.scan_number} - {dev_y}",
|
121
|
+
title=f"Scan {info.scan_number}",
|
122
|
+
x_label=dev_x,
|
123
|
+
y_label=dev_y,
|
124
|
+
)
|
146
125
|
|
147
126
|
def simple_grid_scan(self, info: ScanInfo) -> None:
|
148
127
|
"""
|
@@ -153,12 +132,18 @@ class AutoUpdates:
|
|
153
132
|
return
|
154
133
|
dev_x = info.scan_report_devices[0]
|
155
134
|
dev_y = info.scan_report_devices[1]
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
135
|
+
selected_device = yield self.gui.selected_device
|
136
|
+
dev_z = self.get_selected_device(info.monitored_devices, selected_device)
|
137
|
+
yield fig.clear_all()
|
138
|
+
yield fig.plot(
|
139
|
+
x_name=dev_x,
|
140
|
+
y_name=dev_y,
|
141
|
+
z_name=dev_z,
|
142
|
+
label=f"Scan {info.scan_number} - {dev_z}",
|
143
|
+
title=f"Scan {info.scan_number}",
|
144
|
+
x_label=dev_x,
|
145
|
+
y_label=dev_y,
|
160
146
|
)
|
161
|
-
plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
|
162
147
|
|
163
148
|
def best_effort(self, info: ScanInfo) -> None:
|
164
149
|
"""
|
@@ -168,17 +153,16 @@ class AutoUpdates:
|
|
168
153
|
if not fig:
|
169
154
|
return
|
170
155
|
dev_x = info.scan_report_devices[0]
|
171
|
-
|
156
|
+
selected_device = yield self.gui.selected_device
|
157
|
+
dev_y = self.get_selected_device(info.monitored_devices, selected_device)
|
172
158
|
if not dev_y:
|
173
159
|
return
|
174
|
-
fig.clear_all()
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
if self.auto_update_thread:
|
184
|
-
self.auto_update_thread.join()
|
160
|
+
yield fig.clear_all()
|
161
|
+
yield fig.plot(
|
162
|
+
x_name=dev_x,
|
163
|
+
y_name=dev_y,
|
164
|
+
label=f"Scan {info.scan_number} - {dev_y}",
|
165
|
+
title=f"Scan {info.scan_number}",
|
166
|
+
x_label=dev_x,
|
167
|
+
y_label=dev_y,
|
168
|
+
)
|
bec_widgets/cli/client.py
CHANGED
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
5
5
|
import enum
|
6
6
|
from typing import Literal, Optional, overload
|
7
7
|
|
8
|
-
from bec_widgets.cli.
|
8
|
+
from bec_widgets.cli.rpc.rpc_base import RPCBase, rpc_call
|
9
9
|
|
10
10
|
# pylint: skip-file
|
11
11
|
|
@@ -31,6 +31,7 @@ class Widgets(str, enum.Enum):
|
|
31
31
|
DeviceComboBox = "DeviceComboBox"
|
32
32
|
DeviceLineEdit = "DeviceLineEdit"
|
33
33
|
LMFitDialog = "LMFitDialog"
|
34
|
+
Minesweeper = "Minesweeper"
|
34
35
|
PositionIndicator = "PositionIndicator"
|
35
36
|
PositionerBox = "PositionerBox"
|
36
37
|
PositionerControlLine = "PositionerControlLine"
|
@@ -342,7 +343,7 @@ class BECDock(RPCBase):
|
|
342
343
|
"""
|
343
344
|
|
344
345
|
|
345
|
-
class BECDockArea(RPCBase
|
346
|
+
class BECDockArea(RPCBase):
|
346
347
|
@property
|
347
348
|
@rpc_call
|
348
349
|
def _config_dict(self) -> "dict":
|
@@ -353,6 +354,13 @@ class BECDockArea(RPCBase, BECGuiClientMixin):
|
|
353
354
|
dict: The configuration of the widget.
|
354
355
|
"""
|
355
356
|
|
357
|
+
@property
|
358
|
+
@rpc_call
|
359
|
+
def selected_device(self) -> "str":
|
360
|
+
"""
|
361
|
+
None
|
362
|
+
"""
|
363
|
+
|
356
364
|
@property
|
357
365
|
@rpc_call
|
358
366
|
def panels(self) -> "dict[str, BECDock]":
|
@@ -480,6 +488,12 @@ class BECDockArea(RPCBase, BECGuiClientMixin):
|
|
480
488
|
Hide all windows including floating docks.
|
481
489
|
"""
|
482
490
|
|
491
|
+
@rpc_call
|
492
|
+
def delete(self):
|
493
|
+
"""
|
494
|
+
None
|
495
|
+
"""
|
496
|
+
|
483
497
|
|
484
498
|
class BECFigure(RPCBase):
|
485
499
|
@property
|
@@ -3168,6 +3182,9 @@ class LMFitDialog(RPCBase):
|
|
3168
3182
|
"""
|
3169
3183
|
|
3170
3184
|
|
3185
|
+
class Minesweeper(RPCBase): ...
|
3186
|
+
|
3187
|
+
|
3171
3188
|
class PositionIndicator(RPCBase):
|
3172
3189
|
@rpc_call
|
3173
3190
|
def set_value(self, position: float):
|