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.
Files changed (31) hide show
  1. .gitlab-ci.yml +1 -0
  2. CHANGELOG.md +5727 -0
  3. PKG-INFO +4 -3
  4. bec_widgets/cli/auto_updates.py +45 -61
  5. bec_widgets/cli/client.py +19 -2
  6. bec_widgets/cli/client_utils.py +142 -198
  7. bec_widgets/cli/generate_cli.py +2 -2
  8. bec_widgets/cli/rpc/__init__.py +0 -0
  9. bec_widgets/cli/rpc/rpc_base.py +177 -0
  10. bec_widgets/cli/server.py +66 -29
  11. bec_widgets/qt_utils/error_popups.py +4 -2
  12. bec_widgets/tests/utils.py +8 -0
  13. bec_widgets/utils/bec_connector.py +1 -1
  14. bec_widgets/utils/widget_io.py +85 -5
  15. bec_widgets/widgets/containers/dock/dock.py +1 -1
  16. bec_widgets/widgets/containers/dock/dock_area.py +40 -2
  17. bec_widgets/widgets/containers/layout_manager/layout_manager.py +1 -1
  18. bec_widgets/widgets/containers/main_window/main_window.py +33 -1
  19. bec_widgets/widgets/games/__init__.py +3 -0
  20. bec_widgets/widgets/games/minesweeper.py +413 -0
  21. bec_widgets/widgets/games/minesweeper.pyproject +1 -0
  22. bec_widgets/widgets/games/minesweeper_plugin.py +54 -0
  23. bec_widgets/widgets/games/register_minesweeper.py +15 -0
  24. {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/METADATA +4 -3
  25. {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/RECORD +31 -24
  26. {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/WHEEL +1 -1
  27. pyproject.toml +2 -2
  28. /bec_widgets/cli/{rpc_register.py → rpc/rpc_register.py} +0 -0
  29. /bec_widgets/cli/{rpc_wigdet_handler.py → rpc/rpc_widget_handler.py} +0 -0
  30. {bec_widgets-1.12.0.dist-info → bec_widgets-1.14.0.dist-info}/entry_points.txt +0 -0
  31. {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.3
1
+ Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 1.12.0
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~=2.16; extra == 'dev'
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'
@@ -27,25 +27,17 @@ class AutoUpdates:
27
27
 
28
28
  def __init__(self, gui: BECDockArea):
29
29
  self.gui = gui
30
- self.msg_queue = Queue()
31
- self.auto_update_thread = None
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
- dock = self.gui.panels.get(self.dock_name, [])
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 run(self, msg):
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
- @staticmethod
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
- dev_y = self.get_selected_device(info.monitored_devices, self.gui.selected_device)
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
- plt = fig.plot(x_name=dev_x, y_name=dev_y, label=f"Scan {info.scan_number} - {dev_y}")
145
- plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
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
- dev_z = self.get_selected_device(info.monitored_devices, self.gui.selected_device)
157
- fig.clear_all()
158
- plt = fig.plot(
159
- x_name=dev_x, y_name=dev_y, z_name=dev_z, label=f"Scan {info.scan_number} - {dev_z}"
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
- dev_y = self.get_selected_device(info.monitored_devices, self.gui.selected_device)
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
- plt = fig.plot(x_name=dev_x, y_name=dev_y, label=f"Scan {info.scan_number} - {dev_y}")
176
- plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
177
-
178
- def shutdown(self):
179
- """
180
- Shutdown the auto update thread.
181
- """
182
- self.msg_queue.put(self._shutdown_sentinel)
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.client_utils import BECGuiClientMixin, RPCBase, rpc_call
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, BECGuiClientMixin):
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):