bec-widgets 2.10.3__py3-none-any.whl → 2.12.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 (27) hide show
  1. CHANGELOG.md +84 -0
  2. PKG-INFO +1 -1
  3. bec_widgets/cli/client.py +5 -5
  4. bec_widgets/tests/utils.py +2 -2
  5. bec_widgets/utils/clickable_label.py +13 -0
  6. bec_widgets/utils/colors.py +7 -4
  7. bec_widgets/utils/expandable_frame.py +58 -7
  8. bec_widgets/utils/forms_from_types/forms.py +107 -28
  9. bec_widgets/utils/forms_from_types/items.py +88 -12
  10. bec_widgets/utils/forms_from_types/styles.py +21 -0
  11. bec_widgets/utils/generate_designer_plugin.py +10 -21
  12. bec_widgets/widgets/control/scan_control/scan_control.py +1 -1
  13. bec_widgets/widgets/editors/dict_backed_table.py +31 -11
  14. bec_widgets/widgets/editors/scan_metadata/_util.py +7 -4
  15. bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +10 -4
  16. bec_widgets/widgets/plots/image/image.py +128 -856
  17. bec_widgets/widgets/plots/image/image_base.py +1062 -0
  18. bec_widgets/widgets/plots/image/image_item.py +7 -6
  19. bec_widgets/widgets/services/device_browser/device_browser.py +61 -29
  20. bec_widgets/widgets/services/device_browser/device_item/device_item.py +97 -19
  21. bec_widgets/widgets/services/device_browser/util.py +11 -0
  22. {bec_widgets-2.10.3.dist-info → bec_widgets-2.12.0.dist-info}/METADATA +1 -1
  23. {bec_widgets-2.10.3.dist-info → bec_widgets-2.12.0.dist-info}/RECORD +27 -23
  24. pyproject.toml +1 -1
  25. {bec_widgets-2.10.3.dist-info → bec_widgets-2.12.0.dist-info}/WHEEL +0 -0
  26. {bec_widgets-2.10.3.dist-info → bec_widgets-2.12.0.dist-info}/entry_points.txt +0 -0
  27. {bec_widgets-2.10.3.dist-info → bec_widgets-2.12.0.dist-info}/licenses/LICENSE +0 -0
@@ -21,9 +21,6 @@ logger = bec_logger.logger
21
21
  # noinspection PyDataclass
22
22
  class ImageItemConfig(ConnectionConfig): # TODO review config
23
23
  parent_id: str | None = Field(None, description="The parent plot of the image.")
24
- monitor: str | None = Field(None, description="The name of the monitor.")
25
- monitor_type: Literal["1d", "2d", "auto"] = Field("auto", description="The type of monitor.")
26
- source: str | None = Field(None, description="The source of the curve.")
27
24
  color_map: str | None = Field("plasma", description="The color map of the image.")
28
25
  downsample: bool | None = Field(True, description="Whether to downsample the image.")
29
26
  opacity: float | None = Field(1.0, description="The opacity of the image.")
@@ -43,6 +40,7 @@ class ImageItemConfig(ConnectionConfig): # TODO review config
43
40
 
44
41
 
45
42
  class ImageItem(BECConnector, pg.ImageItem):
43
+
46
44
  RPC = True
47
45
  USER_ACCESS = [
48
46
  "color_map",
@@ -69,12 +67,13 @@ class ImageItem(BECConnector, pg.ImageItem):
69
67
  ]
70
68
 
71
69
  vRangeChangedManually = Signal(tuple)
70
+ removed = Signal(str)
72
71
 
73
72
  def __init__(
74
73
  self,
75
74
  config: Optional[ImageItemConfig] = None,
76
75
  gui_id: Optional[str] = None,
77
- parent_image=None,
76
+ parent_image=None, # FIXME: rename to parent
78
77
  **kwargs,
79
78
  ):
80
79
  if config is None:
@@ -274,6 +273,8 @@ class ImageItem(BECConnector, pg.ImageItem):
274
273
  self.buffer = []
275
274
  self.max_len = 0
276
275
 
277
- def remove(self):
278
- self.parent().disconnect_monitor(self.config.monitor)
276
+ def remove(self, emit: bool = True):
279
277
  self.clear()
278
+ super().remove()
279
+ if emit:
280
+ self.removed.emit(self.objectName())
@@ -1,15 +1,22 @@
1
1
  import os
2
2
  import re
3
- from typing import Optional
3
+ from functools import partial
4
4
 
5
5
  from bec_lib.callback_handler import EventType
6
+ from bec_lib.logger import bec_logger
7
+ from bec_lib.messages import ConfigAction
6
8
  from pyqtgraph import SignalProxy
7
- from qtpy.QtCore import Signal, Slot
8
- from qtpy.QtWidgets import QListWidgetItem, QVBoxLayout, QWidget
9
+ from qtpy.QtCore import QSize, Signal
10
+ from qtpy.QtWidgets import QListWidget, QListWidgetItem, QVBoxLayout, QWidget
9
11
 
12
+ from bec_widgets.cli.rpc.rpc_register import RPCRegister
10
13
  from bec_widgets.utils.bec_widget import BECWidget
14
+ from bec_widgets.utils.error_popups import SafeSlot
11
15
  from bec_widgets.utils.ui_loader import UILoader
12
16
  from bec_widgets.widgets.services.device_browser.device_item import DeviceItem
17
+ from bec_widgets.widgets.services.device_browser.util import map_device_type_to_icon
18
+
19
+ logger = bec_logger.logger
13
20
 
14
21
 
15
22
  class DeviceBrowser(BECWidget, QWidget):
@@ -23,18 +30,18 @@ class DeviceBrowser(BECWidget, QWidget):
23
30
 
24
31
  def __init__(
25
32
  self,
26
- parent: Optional[QWidget] = None,
33
+ parent: QWidget | None = None,
27
34
  config=None,
28
35
  client=None,
29
- gui_id: Optional[str] = None,
36
+ gui_id: str | None = None,
30
37
  **kwargs,
31
38
  ) -> None:
32
39
  super().__init__(parent=parent, client=client, gui_id=gui_id, config=config, **kwargs)
33
-
34
40
  self.get_bec_shortcuts()
35
41
  self.ui = None
36
42
  self.ini_ui()
37
-
43
+ self.dev_list: QListWidget = self.ui.device_list
44
+ self.dev_list.setVerticalScrollMode(QListWidget.ScrollMode.ScrollPerPixel)
38
45
  self.proxy_device_update = SignalProxy(
39
46
  self.ui.filter_input.textChanged, rateLimit=500, slot=self.update_device_list
40
47
  )
@@ -43,6 +50,7 @@ class DeviceBrowser(BECWidget, QWidget):
43
50
  )
44
51
  self.device_update.connect(self.update_device_list)
45
52
 
53
+ self.init_device_list()
46
54
  self.update_device_list()
47
55
 
48
56
  def ini_ui(self) -> None:
@@ -50,14 +58,12 @@ class DeviceBrowser(BECWidget, QWidget):
50
58
  Initialize the UI by loading the UI file and setting the layout.
51
59
  """
52
60
  layout = QVBoxLayout()
53
- layout.setContentsMargins(0, 0, 0, 0)
54
-
55
61
  ui_file_path = os.path.join(os.path.dirname(__file__), "device_browser.ui")
56
62
  self.ui = UILoader(self).loader(ui_file_path)
57
63
  layout.addWidget(self.ui)
58
64
  self.setLayout(layout)
59
65
 
60
- def on_device_update(self, action: str, content: dict) -> None:
66
+ def on_device_update(self, action: ConfigAction, content: dict) -> None:
61
67
  """
62
68
  Callback for device update events. Triggers the device_update signal.
63
69
 
@@ -68,8 +74,43 @@ class DeviceBrowser(BECWidget, QWidget):
68
74
  if action in ["add", "remove", "reload"]:
69
75
  self.device_update.emit()
70
76
 
71
- @Slot()
72
- def update_device_list(self) -> None:
77
+ def init_device_list(self):
78
+ self.dev_list.clear()
79
+ self._device_items: dict[str, QListWidgetItem] = {}
80
+
81
+ def _updatesize(item: QListWidgetItem, device_item: DeviceItem):
82
+ device_item.adjustSize()
83
+ item.setSizeHint(QSize(device_item.width(), device_item.height()))
84
+ logger.debug(f"Adjusting {item} size to {device_item.width(), device_item.height()}")
85
+
86
+ with RPCRegister.delayed_broadcast():
87
+ for device, device_obj in self.dev.items():
88
+ item = QListWidgetItem(self.dev_list)
89
+ device_item = DeviceItem(
90
+ parent=self, device=device, icon=map_device_type_to_icon(device_obj)
91
+ )
92
+
93
+ device_item.expansion_state_changed.connect(partial(_updatesize, item, device_item))
94
+
95
+ device_config = self.dev[device]._config # pylint: disable=protected-access
96
+ device_item.set_display_config(device_config)
97
+ tooltip = device_config.get("description", "")
98
+ device_item.setToolTip(tooltip)
99
+ device_item.broadcast_size_hint.connect(item.setSizeHint)
100
+ item.setSizeHint(device_item.sizeHint())
101
+
102
+ self.dev_list.setItemWidget(item, device_item)
103
+ self.dev_list.addItem(item)
104
+ self._device_items[device] = item
105
+
106
+ @SafeSlot()
107
+ def reset_device_list(self) -> None:
108
+ self.init_device_list()
109
+ self.update_device_list()
110
+
111
+ @SafeSlot()
112
+ @SafeSlot(str)
113
+ def update_device_list(self, *_) -> None:
73
114
  """
74
115
  Update the device list based on the filter input.
75
116
  There are two ways to trigger this function:
@@ -80,23 +121,14 @@ class DeviceBrowser(BECWidget, QWidget):
80
121
  """
81
122
  filter_text = self.ui.filter_input.text()
82
123
  try:
83
- regex = re.compile(filter_text, re.IGNORECASE)
124
+ self.regex = re.compile(filter_text, re.IGNORECASE)
84
125
  except re.error:
85
- regex = None # Invalid regex, disable filtering
86
-
87
- dev_list = self.ui.device_list
88
- dev_list.clear()
126
+ self.regex = None # Invalid regex, disable filtering
127
+ for device in self.dev:
128
+ self._device_items[device].setHidden(False)
129
+ return
89
130
  for device in self.dev:
90
- if regex is None or regex.search(device):
91
- item = QListWidgetItem(dev_list)
92
- device_item = DeviceItem(device)
93
-
94
- # pylint: disable=protected-access
95
- tooltip = self.dev[device]._config.get("description", "")
96
- device_item.setToolTip(tooltip)
97
- item.setSizeHint(device_item.sizeHint())
98
- dev_list.setItemWidget(item, device_item)
99
- dev_list.addItem(item)
131
+ self._device_items[device].setHidden(not self.regex.search(device))
100
132
 
101
133
 
102
134
  if __name__ == "__main__": # pragma: no cover
@@ -104,10 +136,10 @@ if __name__ == "__main__": # pragma: no cover
104
136
 
105
137
  from qtpy.QtWidgets import QApplication
106
138
 
107
- from bec_widgets.utils.colors import apply_theme
139
+ from bec_widgets.utils.colors import set_theme
108
140
 
109
141
  app = QApplication(sys.argv)
110
- apply_theme("light")
142
+ set_theme("light")
111
143
  widget = DeviceBrowser()
112
144
  widget.show()
113
145
  sys.exit(app.exec_())
@@ -2,10 +2,18 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from bec_lib.atlas_models import Device as DeviceConfigModel
5
6
  from bec_lib.logger import bec_logger
6
- from qtpy.QtCore import QMimeData, Qt
7
+ from qtpy.QtCore import QMimeData, QSize, Qt, Signal
7
8
  from qtpy.QtGui import QDrag
8
- from qtpy.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget
9
+ from qtpy.QtWidgets import QApplication, QHBoxLayout, QWidget
10
+
11
+ from bec_widgets.utils.colors import get_theme_name
12
+ from bec_widgets.utils.error_popups import SafeSlot
13
+ from bec_widgets.utils.expandable_frame import ExpandableGroupFrame
14
+ from bec_widgets.utils.forms_from_types import styles
15
+ from bec_widgets.utils.forms_from_types.forms import PydanticModelForm
16
+ from bec_widgets.widgets.utility.visual.dark_mode_button.dark_mode_button import DarkModeButton
9
17
 
10
18
  if TYPE_CHECKING: # pragma: no cover
11
19
  from qtpy.QtGui import QMouseEvent
@@ -13,26 +21,77 @@ if TYPE_CHECKING: # pragma: no cover
13
21
  logger = bec_logger.logger
14
22
 
15
23
 
16
- class DeviceItem(QWidget):
17
- def __init__(self, device: str) -> None:
18
- super().__init__()
24
+ class DeviceItemForm(PydanticModelForm):
25
+ RPC = False
26
+ PLUGIN = False
27
+
28
+ def __init__(self, parent=None, client=None, pretty_display=False, **kwargs):
29
+ super().__init__(
30
+ parent=parent,
31
+ data_model=DeviceConfigModel,
32
+ pretty_display=pretty_display,
33
+ client=client,
34
+ **kwargs,
35
+ )
36
+ self._validity.setVisible(False)
37
+ self._connect_to_theme_change()
38
+
39
+ def set_pretty_display_theme(self, theme: str | None = None):
40
+ if theme is None:
41
+ theme = get_theme_name()
42
+ self.setStyleSheet(styles.pretty_display_theme(theme))
43
+
44
+ def _connect_to_theme_change(self):
45
+ """Connect to the theme change signal."""
46
+ qapp = QApplication.instance()
47
+ if hasattr(qapp, "theme_signal"):
48
+ qapp.theme_signal.theme_updated.connect(self.set_pretty_display_theme) # type: ignore
19
49
 
20
- self._drag_pos = None
21
50
 
51
+ class DeviceItem(ExpandableGroupFrame):
52
+ broadcast_size_hint = Signal(QSize)
53
+
54
+ RPC = False
55
+
56
+ def __init__(self, parent, device: str, icon: str = "") -> None:
57
+ super().__init__(parent, title=device, expanded=False, icon=icon)
58
+
59
+ self._drag_pos = None
60
+ self._expanded_first_time = False
61
+ self._data = None
22
62
  self.device = device
23
63
  layout = QHBoxLayout()
24
- layout.setContentsMargins(10, 2, 10, 2)
25
- self.label = QLabel(device)
26
- layout.addWidget(self.label)
27
- self.setLayout(layout)
28
-
29
- self.setStyleSheet(
30
- """
31
- border: 1px solid #ddd;
32
- border-radius: 5px;
33
- padding: 10px;
34
- """
35
- )
64
+ layout.setContentsMargins(0, 0, 0, 0)
65
+ self.set_layout(layout)
66
+
67
+ self.adjustSize()
68
+ self._title.clicked.connect(self.switch_expanded_state)
69
+ self._title_icon.clicked.connect(self.switch_expanded_state)
70
+
71
+ @SafeSlot()
72
+ def switch_expanded_state(self):
73
+ if not self.expanded and not self._expanded_first_time:
74
+ self._expanded_first_time = True
75
+ self.form = DeviceItemForm(parent=self, pretty_display=True)
76
+ self._contents.layout().addWidget(self.form)
77
+ if self._data:
78
+ self.form.set_data(self._data)
79
+ self.broadcast_size_hint.emit(self.sizeHint())
80
+ super().switch_expanded_state()
81
+ if self._expanded_first_time:
82
+ self.form.adjustSize()
83
+ self.updateGeometry()
84
+ if self._expanded:
85
+ self.form.set_pretty_display_theme()
86
+ self.adjustSize()
87
+ self.broadcast_size_hint.emit(self.sizeHint())
88
+
89
+ def set_display_config(self, config_dict: dict):
90
+ """Set the displayed information from a device config dict, which must conform to the
91
+ bec_lib.atlas_models.Device config model."""
92
+ self._data = DeviceConfigModel.model_validate(config_dict)
93
+ if self._expanded_first_time:
94
+ self.form.set_data(self._data)
36
95
 
37
96
  def mousePressEvent(self, event: QMouseEvent) -> None:
38
97
  super().mousePressEvent(event)
@@ -63,6 +122,25 @@ if __name__ == "__main__": # pragma: no cover
63
122
  from qtpy.QtWidgets import QApplication
64
123
 
65
124
  app = QApplication(sys.argv)
66
- widget = DeviceItem("Device")
125
+ widget = QWidget()
126
+ layout = QHBoxLayout()
127
+ widget.setLayout(layout)
128
+ item = DeviceItem("Device")
129
+ layout.addWidget(DarkModeButton())
130
+ layout.addWidget(item)
131
+ item.set_display_config(
132
+ {
133
+ "name": "Test Device",
134
+ "enabled": True,
135
+ "deviceClass": "FakeDeviceClass",
136
+ "deviceConfig": {"kwarg1": "value1"},
137
+ "readoutPriority": "baseline",
138
+ "description": "A device for testing out a widget",
139
+ "readOnly": True,
140
+ "softwareTrigger": False,
141
+ "deviceTags": ["tag1", "tag2", "tag3"],
142
+ "userParameter": {"some_setting": "some_ value"},
143
+ }
144
+ )
67
145
  widget.show()
68
146
  sys.exit(app.exec_())
@@ -0,0 +1,11 @@
1
+ from bec_lib.device import Device
2
+
3
+
4
+ def map_device_type_to_icon(device_obj: Device) -> str:
5
+ """Associate device types with material icon names"""
6
+ match device_obj._info.get("device_base_class", "").lower():
7
+ case "positioner":
8
+ return "precision_manufacturing"
9
+ case "signal":
10
+ return "vital_signs"
11
+ return "deployed_code"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 2.10.3
3
+ Version: 2.12.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=1nMYldzVk0tFkBWYTcUjumOrdSADASheWOAc0kOFDYs,9509
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=ivqg3HTaOxNbEW3bzWh9MXAkrekuGoNdj0Mj3SdRYuw,639
5
- CHANGELOG.md,sha256=cWrA4_qflE6UwtdjVRKaazD6sHWKNKRysZZ4ks6dWNI,293110
5
+ CHANGELOG.md,sha256=lORmYObpSzbFUz1z0Rj8e6vhhHC8X0jvtgLSTEJ0BIQ,296713
6
6
  LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
7
- PKG-INFO,sha256=Srgpj3zqyK5vthPGAPDziOYXfH_LYjLNYDT97SgjTuY,1254
7
+ PKG-INFO,sha256=FoTDKomAsElhYvoeeE2QbYCCrzmXhrMuWzI-vV3-1L8,1254
8
8
  README.md,sha256=oY5Jc1uXehRASuwUJ0umin2vfkFh7tHF-LLruHTaQx0,3560
9
- pyproject.toml,sha256=bHRGb77fRv3z8fPACmRZ1tuwrHgEzFbebpQJO1tbpjc,2835
9
+ pyproject.toml,sha256=VhTvWlzqOMI_FNIsQF2dCc-hSlNpNH26uMqDSWjI_-0,2835
10
10
  .git_hooks/pre-commit,sha256=n3RofIZHJl8zfJJIUomcMyYGFi_rwq4CC19z0snz3FI,286
11
11
  .github/pull_request_template.md,sha256=F_cJXzooWMFgMGtLK-7KeGcQt0B4AYFse5oN0zQ9p6g,801
12
12
  .github/ISSUE_TEMPLATE/bug_report.yml,sha256=WdRnt7HGxvsIBLzhkaOWNfg8IJQYa_oV9_F08Ym6znQ,1081
@@ -35,7 +35,7 @@ bec_widgets/assets/app_icons/bec_widgets_icon.png,sha256=K8dgGwIjalDh9PRHUsSQBqg
35
35
  bec_widgets/assets/app_icons/ui_loader_tile.png,sha256=qSK3XHqvnAVGV9Q0ulORcGFbXJ9LDq2uz8l9uTtMsNk,1812476
36
36
  bec_widgets/assets/app_icons/widget_launch_tile.png,sha256=bWsICHFfSe9-ESUj3AwlE95dDOea-f6M-s9fBapsxB4,2252911
37
37
  bec_widgets/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- bec_widgets/cli/client.py,sha256=6fDvgkNBt2Veli4pLARYP-vUT6_FiKKjeqgQLQyK9ik,97919
38
+ bec_widgets/cli/client.py,sha256=YcHF_WYmCy4DcgLhYsjVuzESxvjOlG5Ip6E3v2GmBCk,97938
39
39
  bec_widgets/cli/client_utils.py,sha256=F2hyt--jL53bN8NoWifNUMqwwx5FbpS6I1apERdTRzM,18114
40
40
  bec_widgets/cli/generate_cli.py,sha256=K_wMxo2XBUn92SnY3dSrlyUn8ax6Y20QBGCuP284DsQ,10986
41
41
  bec_widgets/cli/server.py,sha256=h7QyBOOGjyrP_fxJIIOSEMc4E06cLG0JyaofjNV6oCA,5671
@@ -58,7 +58,7 @@ bec_widgets/examples/plugin_example_pyside/tictactoe.py,sha256=s3rCurXloVcmMdzZi
58
58
  bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py,sha256=MFMwONn4EZ3V8DboEG4I3BXpURE9JDbKB7XTzzfZl5w,1978
59
59
  bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py,sha256=SiJaoX3OYA8YMkSwU1d7KEfSUjQQUsQgpRAxSSlr8oQ,2376
60
60
  bec_widgets/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- bec_widgets/tests/utils.py,sha256=DSzi6Z70fospjfyx0Uz5bWIDwaAzKbzcHfWPW0YyxzQ,7102
61
+ bec_widgets/tests/utils.py,sha256=PVVhVrAVGqOI_BWZQRwCrJViIcwVHLZyeqWu8b7nN8k,7151
62
62
  bec_widgets/utils/__init__.py,sha256=1930ji1Jj6dVuY81Wd2kYBhHYNV-2R0bN_L4o9zBj1U,533
63
63
  bec_widgets/utils/bec_connector.py,sha256=ATOSyZqryn1QHPc7aotiDnUtzFhlj_gmcukMT_pqjHQ,19272
64
64
  bec_widgets/utils/bec_designer.py,sha256=ehNl_i743rijmhPiIGNd1bihE7-l4oJzTVoa4yjPjls,5426
@@ -67,17 +67,18 @@ bec_widgets/utils/bec_plugin_helper.py,sha256=tLXEyzh0LWuRp-1XhJg32m-hUSLfRStC0Y
67
67
  bec_widgets/utils/bec_signal_proxy.py,sha256=Yc08fdBEDABrowwNPSngT9-28R8FD4ml7oTL6BoMyEE,3263
68
68
  bec_widgets/utils/bec_table.py,sha256=nA2b8ukSeUfquFMAxGrUVOqdrzMoDYD6O_4EYbOG2zk,717
69
69
  bec_widgets/utils/bec_widget.py,sha256=jS888GioWKIJafMq5r1YhJ4vgORqiw0qHbxeSbE0Aec,4119
70
+ bec_widgets/utils/clickable_label.py,sha256=sCmfLdBjDguLfwYH_Qlv6oKHIoY3BcTjnfFqKPBUsik,323
70
71
  bec_widgets/utils/collapsible_panel_manager.py,sha256=tvv77-9YTfYpsU6M_Le3bHR6wtANC83DEOrJ2Hhj6rs,14201
71
- bec_widgets/utils/colors.py,sha256=4Oms3kcstf7-WddGMB2TZXPqJwFMGVjFyBO8tHZHnxk,18308
72
+ bec_widgets/utils/colors.py,sha256=i1DuwwdXzRs7HVq9m5wXSaZOJwLX5mJPvV6GAqylZhM,18341
72
73
  bec_widgets/utils/compact_popup.py,sha256=xVK_lQqL5Hy1ZnUzHXB8GU-Ru-mXevKcdM8ync3ssiA,10269
73
74
  bec_widgets/utils/container_utils.py,sha256=J8YXombOlAPa3M8NGZdhntp2NirBu4raDEQZOgP4elM,3791
74
75
  bec_widgets/utils/crosshair.py,sha256=UZNM4GQnpYD6arN6CAgM9CTQ4LX6t24NoHozPU244Fc,22310
75
76
  bec_widgets/utils/entry_validator.py,sha256=lwT8HP0RDG1FXENIeZ3IDEF2DQmD8KXGkRxPoMXbryk,1817
76
77
  bec_widgets/utils/error_popups.py,sha256=UBAmD1YlAgKodpihudyf0VWtI59KGFiLgnjiKmKGjgk,13254
77
- bec_widgets/utils/expandable_frame.py,sha256=VV4mgwz4lXbO3r-dNCX2QFUguwWCCXSUkXyjDSTJHbU,2345
78
+ bec_widgets/utils/expandable_frame.py,sha256=ynqRFwXsd6jWT5C6qjNwmmHY9Rm9UCALeL32OPQkYgw,3785
78
79
  bec_widgets/utils/filter_io.py,sha256=GKO6GOTiKxTuTp_SHp5Ewou54N7wIZXgWWvlFvhbBmw,5114
79
80
  bec_widgets/utils/fps_counter.py,sha256=seuCWwiNP5q2e2OEztloa66pNb3Sygh-0lEHAcYaDfc,2612
80
- bec_widgets/utils/generate_designer_plugin.py,sha256=VbyuSOZ8Bhb08Pv_iu_XWzoLKmt_o8zQzOdWSt7tHi8,6126
81
+ bec_widgets/utils/generate_designer_plugin.py,sha256=d_-cWQJ2s8Ff-XD_YQUgnVsRCMHBPcszXOAuJSeIWHM,5676
81
82
  bec_widgets/utils/layout_manager.py,sha256=H0nKsIMaPxRkof1MEXlSmW6w1dFxA6astaGzf4stI84,4727
82
83
  bec_widgets/utils/linear_region_selector.py,sha256=3C8Ebozchj1cWj6Dfx0zZzXo_6E-OllVlcPNlUGv1Cg,3320
83
84
  bec_widgets/utils/name_utils.py,sha256=VEHq6lRty1yif3h1EK2nBRNQquGK-l_p-6H9Fmp6BEA,340
@@ -101,8 +102,9 @@ bec_widgets/utils/widget_io.py,sha256=afR7i59fw2WrEQCmkH5dwhz1uNjfMPnJTIhE8NWVBs
101
102
  bec_widgets/utils/widget_state_manager.py,sha256=tzrxVmnGa6IHSEdeh-R68aQ934BsuS9nLQbwYQ78J90,7651
102
103
  bec_widgets/utils/yaml_dialog.py,sha256=T6UyGNGdmpXW74fa_7Nk6b99T5pp2Wvyw3AOauRc8T8,2407
103
104
  bec_widgets/utils/forms_from_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
- bec_widgets/utils/forms_from_types/forms.py,sha256=L_1FcDuLyZoKw4USw4G2eQ4lEvcvwf-CaWRAS2kmD_E,6826
105
- bec_widgets/utils/forms_from_types/items.py,sha256=94EjZHM-QFHBpsJWsDoC4Vw3PtUxTbWdCg90pU2DQ-M,9888
105
+ bec_widgets/utils/forms_from_types/forms.py,sha256=o2BPhegPDI5b6zzLIrFrWja2FkKWcz97iwSrl0j0JSM,10097
106
+ bec_widgets/utils/forms_from_types/items.py,sha256=Jkou4xvx9ZJmTATnPntGaFXW5MUa_ChXedPT3HzsdM8,13002
107
+ bec_widgets/utils/forms_from_types/styles.py,sha256=PeMx8bLI2PX0--U1QOS-3yuGQiyAX4W3EpL_IA5iIrI,702
106
108
  bec_widgets/utils/plugin_templates/plugin.template,sha256=DWtJdHpdsVtbiTTOniH3zBe5a40ztQ20o_-Hclyu38s,1266
107
109
  bec_widgets/utils/plugin_templates/register.template,sha256=XyL3OZPT_FTArLAM8tHd5qMqv2ZuAbJAZLsNNnHcagU,417
108
110
  bec_widgets/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -200,7 +202,7 @@ bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.pypro
200
202
  bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit_plugin.py,sha256=t2VBGsbysCL6154Z5Ny5Nk2UWcURMGS-ibVKiRvYs6Y,1384
201
203
  bec_widgets/widgets/control/scan_control/__init__.py,sha256=IOfHl15vxb_uC6KN62-PeUzbBha_vQyqkkXbJ2HU674,38
202
204
  bec_widgets/widgets/control/scan_control/register_scan_control.py,sha256=j7KrYSn9O6wp6ay2Yb7BWDjdbWzpkSLcCI0neeZi048,483
203
- bec_widgets/widgets/control/scan_control/scan_control.py,sha256=lbjyieruR5xwllxjS6CSZ5698qbnaqvGi-TRZV-9uXY,20363
205
+ bec_widgets/widgets/control/scan_control/scan_control.py,sha256=F02Z3sQdggnMI3jmGi35IxePLRbNxTBRa1ZTv0NH4Zo,20363
204
206
  bec_widgets/widgets/control/scan_control/scan_control.pyproject,sha256=eTgVDFKToIH8_BbJjM2RvbOLr7HnYoidX0SAHx640DM,30
205
207
  bec_widgets/widgets/control/scan_control/scan_control_plugin.py,sha256=_XzNzBv9y3ut7Z_94hvB16Ewat76hq7xe0_762aEPA4,1278
206
208
  bec_widgets/widgets/control/scan_control/scan_group_box.py,sha256=OhqjaYVpGnWBmlVi99DGA_wP48uPRQ2b75H_aaEz8D0,13673
@@ -218,13 +220,13 @@ bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_compact.ui,sha256=JbdMEPzbA3p2
218
220
  bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_vertical.ui,sha256=BVm0XydqbgmIYOs3YPQzQsL4v4gZzourR10dH_2NrVg,5078
219
221
  bec_widgets/widgets/dap/lmfit_dialog/register_lm_fit_dialog.py,sha256=7tB1gsvv310_kVuKf2u4EdSR4F1posm7QCrWH5Kih-Q,480
220
222
  bec_widgets/widgets/editors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
- bec_widgets/widgets/editors/dict_backed_table.py,sha256=u8n5diNaKY-UBb5vkpDSRtSI7w7g1096g37co8nxA8A,6422
223
+ bec_widgets/widgets/editors/dict_backed_table.py,sha256=fKQ-50QzwqJs4JaFlGDx8OB4HEV1dMn5sVPEb_aDFxI,7244
222
224
  bec_widgets/widgets/editors/jupyter_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
223
225
  bec_widgets/widgets/editors/jupyter_console/jupyter_console.py,sha256=-e7HQOECeH5eDrJYh4BFIzRL78LDkooU4otabyN0aX4,2343
224
226
  bec_widgets/widgets/editors/scan_metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
- bec_widgets/widgets/editors/scan_metadata/_util.py,sha256=3mm8ziir0UPnf25ONEfQ277SFC8132HeQVgdXWik5tI,1881
227
+ bec_widgets/widgets/editors/scan_metadata/_util.py,sha256=7bny4A1ZDNAt4ZzkdZclJS3r0jlQvEU2Kyj-G5Synms,2036
226
228
  bec_widgets/widgets/editors/scan_metadata/register_scan_metadata.py,sha256=dGcd8AXM1E9i-N45_CIRdCIyKtHJlq_7neyKHrDx6C0,487
227
- bec_widgets/widgets/editors/scan_metadata/scan_metadata.py,sha256=DPTwBSp9wkjL0FC5vMXr0Eby0Xo1T-9ak5YeALdY-jw,5371
229
+ bec_widgets/widgets/editors/scan_metadata/scan_metadata.py,sha256=t5sv6AgxxM4-Metgqh5OzOE5g7DNNvNZfBOjBvI8oh8,5445
228
230
  bec_widgets/widgets/editors/scan_metadata/scan_metadata.pyproject,sha256=_4guiQAGxiQ4gSN5i5S160UnFXvPFC1W1nG77PubNYQ,31
229
231
  bec_widgets/widgets/editors/scan_metadata/scan_metadata_plugin.py,sha256=ldp4O8JYh9WPwI0mybH1-4FOF-b6EOF6A0tRQCmbyxo,1329
230
232
  bec_widgets/widgets/editors/text_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -254,9 +256,10 @@ bec_widgets/widgets/games/register_minesweeper.py,sha256=8fgMBD3yB-5_eGqhG_qxpj3
254
256
  bec_widgets/widgets/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
255
257
  bec_widgets/widgets/plots/plot_base.py,sha256=GETUsx51BE_Tuop8bC-KiFVrkR82TJ5S0cr7siouSWM,35848
256
258
  bec_widgets/widgets/plots/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
257
- bec_widgets/widgets/plots/image/image.py,sha256=4PamL6EqwpmLMpSagYsBS7ZpU0fXVlzMg7518Tqo5EI,42127
259
+ bec_widgets/widgets/plots/image/image.py,sha256=8s9DShQVAz458aPKfJTCWEmg8HoagCX3MkjFJZXSmek,17278
258
260
  bec_widgets/widgets/plots/image/image.pyproject,sha256=_sRCIu4MNgToaB4D7tUMWq3xKX6T2VoRS3UzGNIseHQ,23
259
- bec_widgets/widgets/plots/image/image_item.py,sha256=2bn9H5YLmo7ohQnnf1mLlL24TASnlZNzMvF7buMutmI,8728
261
+ bec_widgets/widgets/plots/image/image_base.py,sha256=_c4rYRX2AwGyy0WWUhaAJl3gNfXSq1ts99MG8rsa-6w,36104
262
+ bec_widgets/widgets/plots/image/image_item.py,sha256=rkL1o35Pgs1zhvv2wpSG1gt_bjP5kO4Z1oy6d2q-Yls,8577
260
263
  bec_widgets/widgets/plots/image/image_plugin.py,sha256=R0Hzh2GgYlfZLPZwOMgqLKKIA5DxEnTcSrbI7zTe-tI,1204
261
264
  bec_widgets/widgets/plots/image/image_processor.py,sha256=0qsQIyB__xxBwNIoXhFbB0wSiB8n7n_oX4cvfFsUzOs,4304
262
265
  bec_widgets/widgets/plots/image/image_roi_plot.py,sha256=5CWy_eC-GS2ZLJTj2ItrVCoKhPN2g3fx6L4ktf5yVFQ,1191
@@ -344,13 +347,14 @@ bec_widgets/widgets/services/bec_status_box/bec_status_box_plugin.py,sha256=2tBP
344
347
  bec_widgets/widgets/services/bec_status_box/register_bec_status_box.py,sha256=_1gr5nid6D5ZEvvt-GPyXhEGfacSh_QW0oWKxmZrUmY,490
345
348
  bec_widgets/widgets/services/bec_status_box/status_item.py,sha256=CNhGk6J8iNvlldibcuy4PFQULRHvgqHyot-UJ8xfVJw,5609
346
349
  bec_widgets/widgets/services/device_browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
347
- bec_widgets/widgets/services/device_browser/device_browser.py,sha256=tvI_T31wxUFP5xFKMNhaEq1omljkuLq44MSfBbHLUbM,3672
350
+ bec_widgets/widgets/services/device_browser/device_browser.py,sha256=ivr6BSjS_MRJujmsE_dvOns3iBXf76LAlnIg_ueJXNs,5298
348
351
  bec_widgets/widgets/services/device_browser/device_browser.pyproject,sha256=s0vM1xYUwyU6Je68_hSCSBLK8ZPfHB-ftt4flfdpkXY,32
349
352
  bec_widgets/widgets/services/device_browser/device_browser.ui,sha256=Dy_3oXArScP-_7hRI6nQ7SKKnihuyYAzJfXiRxxJQBE,1077
350
353
  bec_widgets/widgets/services/device_browser/device_browser_plugin.py,sha256=JS4uYQclT-h0jMTPZ_wZgi5MCert--gjmmBks_EmEoo,1299
351
354
  bec_widgets/widgets/services/device_browser/register_device_browser.py,sha256=OrL6NwN47TMu-ib6vqtnQ3ogePMWVipG3IfEXyq2OqY,509
355
+ bec_widgets/widgets/services/device_browser/util.py,sha256=aDtRa53L4-CGn4rM9IKqUP80pBYBxh4pssE1Tc46tAo,370
352
356
  bec_widgets/widgets/services/device_browser/device_item/__init__.py,sha256=VGY-uNVCnpcY-q-gijteB2N8KxFNgYR-qQ209MVu1QI,36
353
- bec_widgets/widgets/services/device_browser/device_item/device_item.py,sha256=BoOspOJb5pvtXl07OqXJvU6G2naPAnwnN4gy5q85mks,1921
357
+ bec_widgets/widgets/services/device_browser/device_item/device_item.py,sha256=g8kjFxErwAD_QpxtM-HLYh7DauTuilW-pYoGNshw-vk,5153
354
358
  bec_widgets/widgets/utility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
355
359
  bec_widgets/widgets/utility/logpanel/__init__.py,sha256=HldSvPLYgrqBjCgIQj0f7Wa4slkSMksk4bsRJOQi__Y,91
356
360
  bec_widgets/widgets/utility/logpanel/_util.py,sha256=GqzHbdOTmWBru9OR4weeYdziWj_cWxqSJhS4_6W3Qjg,1836
@@ -403,8 +407,8 @@ bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py,sha256=O
403
407
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject,sha256=Lbi9zb6HNlIq14k6hlzR-oz6PIFShBuF7QxE6d87d64,34
404
408
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py,sha256=CzChz2SSETYsR8-36meqWnsXCT-FIy_J_xeU5coWDY8,1350
405
409
  bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py,sha256=rMpZ1CaoucwobgPj1FuKTnt07W82bV1GaSYdoqcdMb8,521
406
- bec_widgets-2.10.3.dist-info/METADATA,sha256=Srgpj3zqyK5vthPGAPDziOYXfH_LYjLNYDT97SgjTuY,1254
407
- bec_widgets-2.10.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
408
- bec_widgets-2.10.3.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
409
- bec_widgets-2.10.3.dist-info/licenses/LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
410
- bec_widgets-2.10.3.dist-info/RECORD,,
410
+ bec_widgets-2.12.0.dist-info/METADATA,sha256=FoTDKomAsElhYvoeeE2QbYCCrzmXhrMuWzI-vV3-1L8,1254
411
+ bec_widgets-2.12.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
412
+ bec_widgets-2.12.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
413
+ bec_widgets-2.12.0.dist-info/licenses/LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
414
+ bec_widgets-2.12.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 = "2.10.3"
7
+ version = "2.12.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [