bec-widgets 1.23.1__py3-none-any.whl → 1.24.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 CHANGED
@@ -1,6 +1,30 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v1.24.0 (2025-02-26)
5
+
6
+ ### Bug Fixes
7
+
8
+ - Make scan metadata use collapsible frame
9
+ ([`1c0021f`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/1c0021f98b8e0419dba883b891a6035653c0ba0d))
10
+
11
+ - Replace add'l md table w/ tree view
12
+ ([`42665b6`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/42665b69c5cca60a9e5f2d7bd43dbfe5da5a7eb3))
13
+
14
+ ### Code Style
15
+
16
+ - Isort
17
+ ([`d32952a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/d32952a0d590b03007271427bd85f00b88ef0851))
18
+
19
+ ### Features
20
+
21
+ - Add expandable/collapsible frame
22
+ ([`5206528`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/5206528feccaf192f3d5872ac785470562b493f9))
23
+
24
+ - Add metadata widget to scan control
25
+ ([`7309c1d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/7309c1dede2ec93bf08f84f13596ce18dfdb1476))
26
+
27
+
4
28
  ## v1.23.1 (2025-02-24)
5
29
 
6
30
  ### Bug Fixes
PKG-INFO CHANGED
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 1.23.1
3
+ Version: 1.24.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
@@ -0,0 +1,72 @@
1
+ from __future__ import annotations
2
+
3
+ from bec_qthemes import material_icon
4
+ from qtpy.QtWidgets import (
5
+ QFrame,
6
+ QHBoxLayout,
7
+ QLabel,
8
+ QLayout,
9
+ QSizePolicy,
10
+ QToolButton,
11
+ QVBoxLayout,
12
+ QWidget,
13
+ )
14
+
15
+ from bec_widgets.qt_utils.error_popups import SafeProperty, SafeSlot
16
+
17
+
18
+ class ExpandableGroupFrame(QFrame):
19
+
20
+ EXPANDED_ICON_NAME: str = "collapse_all"
21
+ COLLAPSED_ICON_NAME: str = "expand_all"
22
+
23
+ def __init__(self, title: str, parent: QWidget | None = None, expanded: bool = True) -> None:
24
+ super().__init__(parent=parent)
25
+ self._expanded = expanded
26
+
27
+ self.setFrameStyle(QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
28
+ self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum)
29
+ self._layout = QVBoxLayout()
30
+ self._layout.setContentsMargins(0, 0, 0, 0)
31
+ self.setLayout(self._layout)
32
+ self._title_layout = QHBoxLayout()
33
+ self._layout.addLayout(self._title_layout)
34
+ self._expansion_button = QToolButton()
35
+ self._update_icon()
36
+ self._title = QLabel(f"<b>{title}</b>")
37
+ self._title_layout.addWidget(self._expansion_button)
38
+ self._title_layout.addWidget(self._title)
39
+
40
+ self._contents = QWidget()
41
+ self._layout.addWidget(self._contents)
42
+
43
+ self._expansion_button.clicked.connect(self.switch_expanded_state)
44
+ self.expanded = self._expanded # type: ignore
45
+
46
+ def set_layout(self, layout: QLayout) -> None:
47
+ self._contents.setLayout(layout)
48
+ self._contents.layout().setContentsMargins(0, 0, 0, 0) # type: ignore
49
+
50
+ @SafeSlot()
51
+ def switch_expanded_state(self):
52
+ self.expanded = not self.expanded # type: ignore
53
+ self._update_icon()
54
+
55
+ @SafeProperty(bool)
56
+ def expanded(self): # type: ignore
57
+ return self._expanded
58
+
59
+ @expanded.setter
60
+ def expanded(self, expanded: bool):
61
+ self._expanded = expanded
62
+ self._contents.setVisible(expanded)
63
+ self.updateGeometry()
64
+
65
+ def _update_icon(self):
66
+ self._expansion_button.setIcon(
67
+ material_icon(icon_name=self.EXPANDED_ICON_NAME, size=(10, 10), convert_to_pixmap=False)
68
+ if self.expanded
69
+ else material_icon(
70
+ icon_name=self.COLLAPSED_ICON_NAME, size=(10, 10), convert_to_pixmap=False
71
+ )
72
+ )
@@ -1,10 +1,10 @@
1
1
  from collections import defaultdict
2
- from types import SimpleNamespace
2
+ from types import NoneType, SimpleNamespace
3
3
  from typing import Optional
4
4
 
5
5
  from bec_lib.endpoints import MessageEndpoints
6
6
  from pydantic import BaseModel, Field
7
- from qtpy.QtCore import Property, Signal, Slot
7
+ from qtpy.QtCore import Signal
8
8
  from qtpy.QtGui import QColor
9
9
  from qtpy.QtWidgets import (
10
10
  QApplication,
@@ -18,12 +18,13 @@ from qtpy.QtWidgets import (
18
18
  QWidget,
19
19
  )
20
20
 
21
- from bec_widgets.qt_utils.error_popups import SafeSlot
21
+ from bec_widgets.qt_utils.error_popups import SafeProperty, SafeSlot
22
22
  from bec_widgets.utils import ConnectionConfig
23
23
  from bec_widgets.utils.bec_widget import BECWidget
24
24
  from bec_widgets.utils.colors import get_accent_colors
25
25
  from bec_widgets.widgets.control.buttons.stop_button.stop_button import StopButton
26
26
  from bec_widgets.widgets.control.scan_control.scan_group_box import ScanGroupBox
27
+ from bec_widgets.widgets.editors.scan_metadata.scan_metadata import ScanMetadata
27
28
  from bec_widgets.widgets.utility.toggle.toggle import ToggleSwitch
28
29
 
29
30
 
@@ -42,6 +43,7 @@ class ScanControlConfig(ConnectionConfig):
42
43
  class ScanControl(BECWidget, QWidget):
43
44
  PLUGIN = True
44
45
  ICON_NAME = "tune"
46
+ ARG_BOX_POSITION: int = 2
45
47
 
46
48
  scan_started = Signal()
47
49
  scan_selected = Signal(str)
@@ -83,6 +85,8 @@ class ScanControl(BECWidget, QWidget):
83
85
  self.config.default_scan = default_scan
84
86
  self.config.allowed_scans = allowed_scans
85
87
 
88
+ self._scan_metadata: dict | None = None
89
+
86
90
  # Create and set main layout
87
91
  self._init_UI()
88
92
 
@@ -152,6 +156,20 @@ class ScanControl(BECWidget, QWidget):
152
156
  # Initialize scan selection
153
157
  self.populate_scans()
154
158
 
159
+ # Append metadata form
160
+ self._add_metadata_form()
161
+
162
+ self.layout.addStretch()
163
+
164
+ def _add_metadata_form(self):
165
+ self._metadata_form = ScanMetadata()
166
+ self.layout.addWidget(self._metadata_form)
167
+ self._metadata_form.update_with_new_scan(self.comboBox_scan_selection.currentText())
168
+ self.scan_selected.connect(self._metadata_form.update_with_new_scan)
169
+ self._metadata_form.metadata_updated.connect(self.update_scan_metadata)
170
+ self._metadata_form.metadata_cleared.connect(self.update_scan_metadata)
171
+ self._metadata_form.validate_form()
172
+
155
173
  def populate_scans(self):
156
174
  """Populates the scan selection combo box with available scans from BEC session."""
157
175
  self.available_scans = self.client.connector.get(
@@ -176,8 +194,9 @@ class ScanControl(BECWidget, QWidget):
176
194
  self.request_last_executed_scan_parameters()
177
195
  self.restore_scan_parameters(selected_scan_name)
178
196
 
179
- @Slot()
180
- def request_last_executed_scan_parameters(self):
197
+ @SafeSlot()
198
+ @SafeSlot(bool)
199
+ def request_last_executed_scan_parameters(self, *_):
181
200
  """
182
201
  Requests the last executed scan parameters from BEC and restores them to the scan control widget.
183
202
  """
@@ -211,7 +230,7 @@ class ScanControl(BECWidget, QWidget):
211
230
  else:
212
231
  self.last_scan_found = False
213
232
 
214
- @Property(str)
233
+ @SafeProperty(str)
215
234
  def current_scan(self):
216
235
  """Returns the scan name for the currently selected scan."""
217
236
  return self.comboBox_scan_selection.currentText()
@@ -227,7 +246,7 @@ class ScanControl(BECWidget, QWidget):
227
246
  return
228
247
  self.comboBox_scan_selection.setCurrentText(scan_name)
229
248
 
230
- @Slot(str)
249
+ @SafeSlot(str)
231
250
  def set_current_scan(self, scan_name: str):
232
251
  """Slot for setting the current scan to the given scan name.
233
252
 
@@ -236,7 +255,7 @@ class ScanControl(BECWidget, QWidget):
236
255
  """
237
256
  self.current_scan = scan_name
238
257
 
239
- @Property(bool)
258
+ @SafeProperty(bool)
240
259
  def hide_arg_box(self):
241
260
  """Property to hide the argument box."""
242
261
  if self.arg_box is None:
@@ -253,7 +272,7 @@ class ScanControl(BECWidget, QWidget):
253
272
  if self.arg_box is not None:
254
273
  self.arg_box.setVisible(not hide)
255
274
 
256
- @Property(bool)
275
+ @SafeProperty(bool)
257
276
  def hide_kwarg_boxes(self):
258
277
  """Property to hide the keyword argument boxes."""
259
278
  if len(self.kwarg_boxes) == 0:
@@ -274,7 +293,7 @@ class ScanControl(BECWidget, QWidget):
274
293
  for box in self.kwarg_boxes:
275
294
  box.setVisible(not hide)
276
295
 
277
- @Property(bool)
296
+ @SafeProperty(bool)
278
297
  def hide_scan_control_buttons(self):
279
298
  """Property to hide the scan control buttons."""
280
299
  return not self.button_run_scan.isVisible()
@@ -288,12 +307,40 @@ class ScanControl(BECWidget, QWidget):
288
307
  """
289
308
  self.show_scan_control_buttons(not hide)
290
309
 
291
- @Slot(bool)
310
+ @SafeProperty(bool)
311
+ def hide_metadata(self):
312
+ """Property to hide the metadata form."""
313
+ return not self._metadata_form.isVisible()
314
+
315
+ @hide_metadata.setter
316
+ def hide_metadata(self, hide: bool):
317
+ """Setter for the hide_metadata property.
318
+
319
+ Args:
320
+ hide(bool): Hide or show the metadata form.
321
+ """
322
+ self._metadata_form.setVisible(not hide)
323
+
324
+ @SafeProperty(bool)
325
+ def hide_optional_metadata(self):
326
+ """Property to hide the optional metadata form."""
327
+ return self._metadata_form.hide_optional_metadata
328
+
329
+ @hide_optional_metadata.setter
330
+ def hide_optional_metadata(self, hide: bool):
331
+ """Setter for the hide_optional_metadata property.
332
+
333
+ Args:
334
+ hide(bool): Hide or show the optional metadata form.
335
+ """
336
+ self._metadata_form.hide_optional_metadata = hide
337
+
338
+ @SafeSlot(bool)
292
339
  def show_scan_control_buttons(self, show: bool):
293
340
  """Shows or hides the scan control buttons."""
294
341
  self.scan_control_group.setVisible(show)
295
342
 
296
- @Property(bool)
343
+ @SafeProperty(bool)
297
344
  def hide_scan_selection_combobox(self):
298
345
  """Property to hide the scan selection combobox."""
299
346
  return not self.comboBox_scan_selection.isVisible()
@@ -307,12 +354,12 @@ class ScanControl(BECWidget, QWidget):
307
354
  """
308
355
  self.show_scan_selection_combobox(not hide)
309
356
 
310
- @Slot(bool)
357
+ @SafeSlot(bool)
311
358
  def show_scan_selection_combobox(self, show: bool):
312
359
  """Shows or hides the scan selection combobox."""
313
360
  self.scan_selection_group.setVisible(show)
314
361
 
315
- @Slot(str)
362
+ @SafeSlot(str)
316
363
  def scan_select(self, scan_name: str):
317
364
  """
318
365
  Slot for scan selection. Updates the scan control layout based on the selected scan.
@@ -335,7 +382,7 @@ class ScanControl(BECWidget, QWidget):
335
382
  self.update()
336
383
  self.adjustSize()
337
384
 
338
- @Property(bool)
385
+ @SafeProperty(bool)
339
386
  def hide_add_remove_buttons(self):
340
387
  """Property to hide the add_remove buttons."""
341
388
  return self._hide_add_remove_buttons
@@ -358,10 +405,11 @@ class ScanControl(BECWidget, QWidget):
358
405
  Args:
359
406
  groups(list): List of dictionaries containing the gui_group information.
360
407
  """
408
+ position = self.ARG_BOX_POSITION + (1 if self.arg_box is not None else 0)
361
409
  for group in groups:
362
410
  box = ScanGroupBox(box_type="kwargs", config=group)
363
411
  box.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
364
- self.layout.addWidget(box)
412
+ self.layout.insertWidget(position + len(self.kwarg_boxes), box)
365
413
  self.kwarg_boxes.append(box)
366
414
 
367
415
  def add_arg_group(self, group: dict):
@@ -374,9 +422,9 @@ class ScanControl(BECWidget, QWidget):
374
422
  self.arg_box.device_selected.connect(self.emit_device_selected)
375
423
  self.arg_box.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
376
424
  self.arg_box.hide_add_remove_buttons = self._hide_add_remove_buttons
377
- self.layout.addWidget(self.arg_box)
425
+ self.layout.insertWidget(self.ARG_BOX_POSITION, self.arg_box)
378
426
 
379
- @Slot(str)
427
+ @SafeSlot(str)
380
428
  def emit_device_selected(self, dev_names):
381
429
  """
382
430
  Emit the signal to inform about selected device(s)
@@ -454,10 +502,20 @@ class ScanControl(BECWidget, QWidget):
454
502
  scan_params = ScanParameterConfig(name=scan_name, args=args, kwargs=kwargs)
455
503
  self.config.scans[scan_name] = scan_params
456
504
 
505
+ @SafeSlot(dict)
506
+ @SafeSlot(NoneType)
507
+ def update_scan_metadata(self, md: dict | None):
508
+ self._scan_metadata = md
509
+ if md is None:
510
+ self.button_run_scan.setEnabled(False)
511
+ else:
512
+ self.button_run_scan.setEnabled(True)
513
+
457
514
  @SafeSlot(popup_error=True)
458
515
  def run_scan(self):
459
516
  """Starts the selected scan with the given parameters."""
460
517
  args, kwargs = self.get_scan_parameters()
518
+ kwargs["metadata"] = self._scan_metadata
461
519
  self.scan_args.emit(args)
462
520
  scan_function = getattr(self.scans, self.comboBox_scan_selection.currentText())
463
521
  if callable(scan_function):
@@ -6,9 +6,9 @@ from qtpy.QtCore import QAbstractTableModel, QModelIndex, Qt, Signal # type: ig
6
6
  from qtpy.QtWidgets import (
7
7
  QApplication,
8
8
  QHBoxLayout,
9
- QLabel,
10
9
  QPushButton,
11
- QTableView,
10
+ QSizePolicy,
11
+ QTreeView,
12
12
  QVBoxLayout,
13
13
  QWidget,
14
14
  )
@@ -105,9 +105,12 @@ class AdditionalMetadataTable(QWidget):
105
105
  self._layout = QHBoxLayout()
106
106
  self.setLayout(self._layout)
107
107
  self._table_model = AdditionalMetadataTableModel(initial_data)
108
- self._table_view = QTableView()
108
+ self._table_view = QTreeView()
109
109
  self._table_view.setModel(self._table_model)
110
- self._table_view.horizontalHeader().setStretchLastSection(True)
110
+ self._table_view.setSizePolicy(
111
+ QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum)
112
+ )
113
+ self._table_view.setAlternatingRowColors(True)
111
114
  self._layout.addWidget(self._table_view)
112
115
 
113
116
  self._buttons = QVBoxLayout()
@@ -1,16 +1,19 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from decimal import Decimal
4
+ from types import NoneType
4
5
  from typing import TYPE_CHECKING
5
6
 
6
7
  from bec_lib.logger import bec_logger
7
8
  from bec_lib.metadata_schema import get_metadata_schema_for_scan
8
9
  from bec_qthemes import material_icon
9
10
  from pydantic import Field, ValidationError
11
+ from qtpy.QtCore import Signal # type: ignore
10
12
  from qtpy.QtWidgets import (
11
13
  QApplication,
12
14
  QComboBox,
13
15
  QGridLayout,
16
+ QHBoxLayout,
14
17
  QLabel,
15
18
  QLayout,
16
19
  QVBoxLayout,
@@ -18,7 +21,8 @@ from qtpy.QtWidgets import (
18
21
  )
19
22
 
20
23
  from bec_widgets.qt_utils.compact_popup import CompactPopupWidget
21
- from bec_widgets.qt_utils.error_popups import SafeSlot
24
+ from bec_widgets.qt_utils.error_popups import SafeProperty, SafeSlot
25
+ from bec_widgets.qt_utils.expandable_frame import ExpandableGroupFrame
22
26
  from bec_widgets.utils.bec_widget import BECWidget
23
27
  from bec_widgets.widgets.editors.scan_metadata._metadata_widgets import widget_from_type
24
28
  from bec_widgets.widgets.editors.scan_metadata.additional_metadata_table import (
@@ -36,6 +40,9 @@ class ScanMetadata(BECWidget, QWidget):
36
40
  metadata schema registry supplied in the plugin repo to find pydantic models
37
41
  associated with the scan type. Sets limits for numerical values if specified."""
38
42
 
43
+ metadata_updated = Signal(dict)
44
+ metadata_cleared = Signal(NoneType)
45
+
39
46
  def __init__(
40
47
  self,
41
48
  parent=None,
@@ -49,22 +56,32 @@ class ScanMetadata(BECWidget, QWidget):
49
56
  self.set_schema(scan_name)
50
57
 
51
58
  self._layout = QVBoxLayout()
52
- self._layout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)
59
+ self._layout.setContentsMargins(0, 0, 0, 0)
53
60
  self.setLayout(self._layout)
54
- self._layout.addWidget(QLabel("<b>Required scan metadata:</b>"))
61
+
62
+ self._required_md_box = ExpandableGroupFrame("Scan schema metadata")
63
+ self._layout.addWidget(self._required_md_box)
64
+ self._required_md_box_layout = QHBoxLayout()
65
+ self._required_md_box.set_layout(self._required_md_box_layout)
66
+
55
67
  self._md_grid = QWidget()
56
- self._layout.addWidget(self._md_grid)
68
+ self._required_md_box_layout.addWidget(self._md_grid)
57
69
  self._grid_container = QVBoxLayout()
58
70
  self._md_grid.setLayout(self._grid_container)
59
71
  self._new_grid_layout()
60
72
  self._grid_container.addLayout(self._md_grid_layout)
61
- self._layout.addWidget(QLabel("<b>Additional metadata:</b>"))
73
+
74
+ self._additional_md_box = ExpandableGroupFrame("Additional metadata", expanded=False)
75
+ self._layout.addWidget(self._additional_md_box)
76
+ self._additional_md_box_layout = QHBoxLayout()
77
+ self._additional_md_box.set_layout(self._additional_md_box_layout)
78
+
62
79
  self._additional_metadata = AdditionalMetadataTable(initial_extras or [])
63
- self._layout.addWidget(self._additional_metadata)
80
+ self._additional_md_box_layout.addWidget(self._additional_metadata)
64
81
 
65
82
  self._validity = CompactPopupWidget()
66
83
  self._validity.compact_view = True # type: ignore
67
- self._validity.label = "Validity" # type: ignore
84
+ self._validity.label = "Metadata validity" # type: ignore
68
85
  self._validity.compact_show_popup.setIcon(
69
86
  material_icon(icon_name="info", size=(10, 10), convert_to_pixmap=False)
70
87
  )
@@ -80,14 +97,20 @@ class ScanMetadata(BECWidget, QWidget):
80
97
  self.populate()
81
98
  self.validate_form()
82
99
 
83
- def validate_form(self, *_):
100
+ def validate_form(self, *_) -> bool:
101
+ """validate the currently entered metadata against the pydantic schema.
102
+ If successful, returns on metadata_emitted and returns true.
103
+ Otherwise, emits on metadata_cleared and returns false."""
84
104
  try:
85
- self._md_schema.model_validate(self.get_full_model_dict())
105
+ metadata_dict = self.get_full_model_dict()
106
+ self._md_schema.model_validate(metadata_dict)
86
107
  self._validity.set_global_state("success")
87
108
  self._validity_message.setText("No errors!")
109
+ self.metadata_updated.emit(metadata_dict)
88
110
  except ValidationError as e:
89
111
  self._validity.set_global_state("emergency")
90
112
  self._validity_message.setText(str(e))
113
+ self.metadata_cleared.emit(None)
91
114
 
92
115
  def get_full_model_dict(self):
93
116
  """Get the entered metadata as a dict"""
@@ -140,6 +163,20 @@ class ScanMetadata(BECWidget, QWidget):
140
163
  self._md_grid_layout.setContentsMargins(0, 0, 0, 0)
141
164
  self._md_grid_layout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)
142
165
 
166
+ @SafeProperty(bool)
167
+ def hide_optional_metadata(self): # type: ignore
168
+ """Property to hide the optional metadata table."""
169
+ return not self._additional_md_box.isVisible()
170
+
171
+ @hide_optional_metadata.setter
172
+ def hide_optional_metadata(self, hide: bool):
173
+ """Setter for the hide_optional_metadata property.
174
+
175
+ Args:
176
+ hide(bool): Hide or show the optional metadata table.
177
+ """
178
+ self._additional_md_box.setVisible(not hide)
179
+
143
180
 
144
181
  if __name__ == "__main__": # pragma: no cover
145
182
  from unittest.mock import patch
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 1.23.1
3
+ Version: 1.24.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=PuL-FmkTHm7qs467Mh9D8quWcEj4tgEA-UUGDieMuWk,8774
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
5
- CHANGELOG.md,sha256=QnqjQF8f-P2uM86la1l-6AqqSFhZSRWO9w4ySfvv4CY,230770
5
+ CHANGELOG.md,sha256=yQGe-Ikb02Hnc7G1nSgx3R-BvKJutwRjJDRsWusNUgM,231533
6
6
  LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
7
- PKG-INFO,sha256=meXQxhVHfRve92RxVBdv3-D7qCFwAGoKa-yUK2_o3AI,1173
7
+ PKG-INFO,sha256=eJjorty6zibIuBNkGdz185Wq0sOjPcTeFBK5pGA4AkI,1173
8
8
  README.md,sha256=KgdKusjlvEvFtdNZCeDMO91y77MWK2iDcYMDziksOr4,2553
9
- pyproject.toml,sha256=FwPybInvz9CcwelC59TZLWREXuaBM-Xkh0d0LlS56Ok,2540
9
+ pyproject.toml,sha256=J6oTcgYqcqc0-5PPstNYV5nnA0_X06KaXy7l8irLVm4,2540
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
@@ -50,6 +50,7 @@ bec_widgets/qt_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
50
50
  bec_widgets/qt_utils/collapsible_panel_manager.py,sha256=tvv77-9YTfYpsU6M_Le3bHR6wtANC83DEOrJ2Hhj6rs,14201
51
51
  bec_widgets/qt_utils/compact_popup.py,sha256=3yeb-GJ1PUla5Q_hT0XDKqvyIEH9yV_eGidf1t8Dbbw,10234
52
52
  bec_widgets/qt_utils/error_popups.py,sha256=7bL-Lil1G8reQPaRZo8NfG_7Cq2Y0HkF3KREJUE0ZlQ,11545
53
+ bec_widgets/qt_utils/expandable_frame.py,sha256=ys2peAfVAK3V2ZZekmp5JlpVovJwLMJGc3NdGXZZfUY,2344
53
54
  bec_widgets/qt_utils/palette_viewer.py,sha256=--B0x7aE7bniHIeuuLY_pH8yBDrTTXaE0IDrC_AM1mo,6326
54
55
  bec_widgets/qt_utils/redis_message_waiter.py,sha256=fvL_QgC0cTDv_FPJdRyp5AKjf401EJU4z3r38p47ydY,1745
55
56
  bec_widgets/qt_utils/round_frame.py,sha256=ldLQ4BaWygFRrRv1s0w--5qZ4sj8MAqhdXuzho50xMg,4860
@@ -195,7 +196,7 @@ bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.pypro
195
196
  bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit_plugin.py,sha256=t2VBGsbysCL6154Z5Ny5Nk2UWcURMGS-ibVKiRvYs6Y,1384
196
197
  bec_widgets/widgets/control/scan_control/__init__.py,sha256=IOfHl15vxb_uC6KN62-PeUzbBha_vQyqkkXbJ2HU674,38
197
198
  bec_widgets/widgets/control/scan_control/register_scan_control.py,sha256=j7KrYSn9O6wp6ay2Yb7BWDjdbWzpkSLcCI0neeZi048,483
198
- bec_widgets/widgets/control/scan_control/scan_control.py,sha256=Nixsb7NrEn0eQzeax8jd2o2_omlpKN5s6IcWRsL_JhQ,18109
199
+ bec_widgets/widgets/control/scan_control/scan_control.py,sha256=zUU1NkPpyFYsWb3WnJPg2kxKsWoZmamCdWWQVn2jfk0,20297
199
200
  bec_widgets/widgets/control/scan_control/scan_control.pyproject,sha256=eTgVDFKToIH8_BbJjM2RvbOLr7HnYoidX0SAHx640DM,30
200
201
  bec_widgets/widgets/control/scan_control/scan_control_plugin.py,sha256=_XzNzBv9y3ut7Z_94hvB16Ewat76hq7xe0_762aEPA4,1278
201
202
  bec_widgets/widgets/control/scan_control/scan_group_box.py,sha256=mapJBn-hKup1rdL4zAX2qGJOt6WYgpBx2Jmzqgr2WRI,12929
@@ -223,8 +224,8 @@ bec_widgets/widgets/editors/jupyter_console/jupyter_console.py,sha256=-e7HQOECeH
223
224
  bec_widgets/widgets/editors/scan_metadata/__init__.py,sha256=IhDv6xQ7tpSbdaAQDOenrb0IU3wfSoElV9k6ajIM1IY,315
224
225
  bec_widgets/widgets/editors/scan_metadata/_metadata_widgets.py,sha256=2WZf0Ej_R3ZQJ9QLvxCrVAoOgNPT5unh9OuhyYiUVyY,9294
225
226
  bec_widgets/widgets/editors/scan_metadata/_util.py,sha256=8qn2clcJqi9nvPSvZzO9ornHxn_PGw4Z_O_1XpSmq8E,1861
226
- bec_widgets/widgets/editors/scan_metadata/additional_metadata_table.py,sha256=XysmHU8B6WqLOLjQQBRG3sbN6_KaralvrIlrylkJ56E,5105
227
- bec_widgets/widgets/editors/scan_metadata/scan_metadata.py,sha256=fo9CvYFUWbuypYUcdzTXlUJ1rIIIVCIFPX1ejbJGL8Q,7263
227
+ bec_widgets/widgets/editors/scan_metadata/additional_metadata_table.py,sha256=s5no1gnxFlgR_UUQXSN7cWczdqpNinWmSaVwfcVRQtQ,5221
228
+ bec_widgets/widgets/editors/scan_metadata/scan_metadata.py,sha256=lx4LcY1yDY-i9akTHFg1iENc0rOhgYP9U_m4M65KPCE,8781
228
229
  bec_widgets/widgets/editors/text_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
229
230
  bec_widgets/widgets/editors/text_box/register_text_box.py,sha256=xRgVugvjLhX3iKb-vaAxflE6pWpal7pVFWDaUSUZLyE,467
230
231
  bec_widgets/widgets/editors/text_box/text_box.py,sha256=F_BdWKPwEjltgfAsPmGHipOs5sPtI4o0Y0EO68s3Og0,4311
@@ -361,8 +362,8 @@ bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py,sha256=Z
361
362
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject,sha256=Lbi9zb6HNlIq14k6hlzR-oz6PIFShBuF7QxE6d87d64,34
362
363
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py,sha256=CzChz2SSETYsR8-36meqWnsXCT-FIy_J_xeU5coWDY8,1350
363
364
  bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py,sha256=rMpZ1CaoucwobgPj1FuKTnt07W82bV1GaSYdoqcdMb8,521
364
- bec_widgets-1.23.1.dist-info/METADATA,sha256=meXQxhVHfRve92RxVBdv3-D7qCFwAGoKa-yUK2_o3AI,1173
365
- bec_widgets-1.23.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
366
- bec_widgets-1.23.1.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
367
- bec_widgets-1.23.1.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
368
- bec_widgets-1.23.1.dist-info/RECORD,,
365
+ bec_widgets-1.24.0.dist-info/METADATA,sha256=eJjorty6zibIuBNkGdz185Wq0sOjPcTeFBK5pGA4AkI,1173
366
+ bec_widgets-1.24.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
367
+ bec_widgets-1.24.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
368
+ bec_widgets-1.24.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
369
+ bec_widgets-1.24.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 = "1.23.1"
7
+ version = "1.24.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [