bec-widgets 2.0.3__py3-none-any.whl → 2.1.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 CHANGED
@@ -77,7 +77,7 @@ formatter:
77
77
  stage: Formatter
78
78
  needs: []
79
79
  script:
80
- - pip install bec_lib[dev]
80
+ - pip install -e ./[dev]
81
81
  - isort --check --diff --line-length=100 --profile=black --multi-line=3 --trailing-comma ./
82
82
  - black --check --diff --color --line-length=100 --skip-magic-trailing-comma ./
83
83
  rules:
CHANGELOG.md CHANGED
@@ -1,6 +1,39 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v2.1.0 (2025-05-05)
5
+
6
+ ### Bug Fixes
7
+
8
+ - Ensure rpc object do not collide with protected names
9
+ ([`94463af`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/94463afdba11fe2da5958a371ef49572889b8622))
10
+
11
+ ### Chores
12
+
13
+ - **formatter**: Upgrade to black v25
14
+ ([`452124b`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/452124b528c41db14d1e34ab98db95f6f7230ad6))
15
+
16
+ ### Continuous Integration
17
+
18
+ - Install dev dependencies for formatter
19
+ ([`fff4af2`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/fff4af2489bdea0cf4f6f8db68db59fba411c25e))
20
+
21
+ ### Features
22
+
23
+ - **SafeSlot**: Slot parameters can be overridden with kwarg; add option to raise
24
+ ([`9387275`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/93872758517177503b1f868376a6095670131844))
25
+
26
+ ### Refactoring
27
+
28
+ - **colormap_widget**: Widget is rounded
29
+ ([`02563b1`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/02563b10f3c90bddc069446dfe4137aa5a9727cb))
30
+
31
+ ### Testing
32
+
33
+ - **Dock**: Add validation for new dock creation with invalid name
34
+ ([`c16b9dc`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/c16b9dce9ce629b794d731cd7f3282a59f8b8c59))
35
+
36
+
4
37
  ## v2.0.3 (2025-05-02)
5
38
 
6
39
  ### Bug Fixes
PKG-INFO CHANGED
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 2.0.3
3
+ Version: 2.1.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
@@ -12,7 +12,7 @@ Requires-Python: >=3.10
12
12
  Requires-Dist: bec-ipython-client<=4.0,>=2.21.4
13
13
  Requires-Dist: bec-lib<=4.0,>=3.29
14
14
  Requires-Dist: bec-qthemes>=0.7,~=0.7
15
- Requires-Dist: black~=24.0
15
+ Requires-Dist: black~=25.0
16
16
  Requires-Dist: isort>=5.13.2,~=5.13
17
17
  Requires-Dist: pydantic~=2.0
18
18
  Requires-Dist: pyqtgraph~=0.13
@@ -23,6 +23,7 @@ Requires-Dist: qtpy~=2.4
23
23
  Provides-Extra: dev
24
24
  Requires-Dist: coverage~=7.0; extra == 'dev'
25
25
  Requires-Dist: fakeredis>=2.23.2,~=2.23; extra == 'dev'
26
+ Requires-Dist: isort>=5.13.2,~=5.13; extra == 'dev'
26
27
  Requires-Dist: pytest-bec-e2e<=4.0,>=2.21.4; extra == 'dev'
27
28
  Requires-Dist: pytest-qt~=4.4; extra == 'dev'
28
29
  Requires-Dist: pytest-random-order~=1.1; extra == 'dev'
@@ -235,10 +235,8 @@ class LaunchWindow(BECMainWindow):
235
235
  raise ValueError(
236
236
  f"Name {name} must be unique for dock areas, but already exists: {existing_dock_areas}."
237
237
  )
238
- if not WidgetContainerUtils.has_name_valid_chars(name):
239
- raise ValueError(
240
- f"Name {name} contains invalid characters. Only alphanumeric characters, underscores, and dashes are allowed."
241
- )
238
+ WidgetContainerUtils.raise_for_invalid_name(name)
239
+
242
240
  else:
243
241
  name = "dock_area"
244
242
  name = WidgetContainerUtils.generate_unique_name(name, existing_dock_areas)
@@ -284,6 +282,8 @@ class LaunchWindow(BECMainWindow):
284
282
  raise ValueError("UI file must be provided for custom UI file launch.")
285
283
  filename = os.path.basename(ui_file).split(".")[0]
286
284
 
285
+ WidgetContainerUtils.raise_for_invalid_name(filename)
286
+
287
287
  tree = ET.parse(ui_file)
288
288
  root = tree.getroot()
289
289
  # Check if the top-level widget is a QMainWindow
@@ -21,7 +21,7 @@ def _submodule_specs(module: ModuleType) -> tuple[ModuleSpec | None, ...]:
21
21
 
22
22
 
23
23
  def _loaded_submodules_from_specs(
24
- submodule_specs: tuple[ModuleSpec | None, ...]
24
+ submodule_specs: tuple[ModuleSpec | None, ...],
25
25
  ) -> Generator[ModuleType, None, None]:
26
26
  """Load all submodules from the given specs."""
27
27
  for submodule in (
@@ -1,6 +1,6 @@
1
- """ This custom class is a thin wrapper around the SignalProxy class to allow signal calls to be blocked.
1
+ """This custom class is a thin wrapper around the SignalProxy class to allow signal calls to be blocked.
2
2
  Unblocking the proxy needs to be done through the slot unblock_proxy. The most likely use case for this class is
3
- when the callback function is potentially initiating a slower progress, i.e. requesting a data analysis routine to
3
+ when the callback function is potentially initiating a slower progress, i.e. requesting a data analysis routine to
4
4
  analyse data. Requesting a new fit may lead to request piling up and an overall slow done of performance. This proxy
5
5
  will allow you to decide by yourself when to unblock and execute the callback again."""
6
6
 
@@ -1,11 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
- import itertools
4
- from typing import Literal, Type
3
+ from typing import Any, Type
5
4
 
6
5
  from qtpy.QtWidgets import QWidget
7
6
 
8
- from bec_widgets.cli.rpc.rpc_register import RPCRegister
7
+ from bec_widgets.cli.client_utils import BECGuiClient
9
8
 
10
9
 
11
10
  class WidgetContainerUtils:
@@ -73,3 +72,36 @@ class WidgetContainerUtils:
73
72
  return None
74
73
  else:
75
74
  raise ValueError(f"No widget of class {widget_class} found.")
75
+
76
+ @staticmethod
77
+ def name_is_protected(name: str, container: Any = None) -> bool:
78
+ """
79
+ Check if the name is not protected.
80
+
81
+ Args:
82
+ name(str): The name to be checked.
83
+
84
+ Returns:
85
+ bool: True if the name is not protected, False otherwise.
86
+ """
87
+ if container is None:
88
+ container = BECGuiClient
89
+ gui_client_methods = set(filter(lambda x: not x.startswith("_"), dir(container)))
90
+ return name in gui_client_methods
91
+
92
+ @staticmethod
93
+ def raise_for_invalid_name(name: str, container: Any = None) -> None:
94
+ """
95
+ Check if the name is valid. If not, raise a ValueError.
96
+
97
+ Args:
98
+ name(str): The name to be checked.
99
+ Raises:
100
+ ValueError: If the name is not valid.
101
+ """
102
+ if not WidgetContainerUtils.has_name_valid_chars(name):
103
+ raise ValueError(
104
+ f"Name '{name}' contains invalid characters. Only alphanumeric characters, underscores, and dashes are allowed."
105
+ )
106
+ if WidgetContainerUtils.name_is_protected(name, container):
107
+ raise ValueError(f"Name '{name}' is protected. Please choose another name.")
@@ -99,16 +99,30 @@ def SafeSlot(*slot_args, **slot_kwargs): # pylint: disable=invalid-name
99
99
  'verify_sender' keyword argument can be passed with boolean value if the sender should be verified
100
100
  before executing the slot. If True, the slot will only execute if the sender is a QObject. This is
101
101
  useful to prevent function calls from already deleted objects.
102
+ 'raise_error' keyword argument can be passed with boolean value if the error should be raised
103
+ after the error is displayed. This is useful to propagate the error to the caller but should be used
104
+ with great care to avoid segfaults.
105
+
106
+ The keywords above are stored in a container which can be overridden by passing
107
+ '_override_slot_params' keyword argument with a dictionary containing the keywords to override.
108
+ This is useful to override the default behavior of the decorator for a specific function call.
109
+
102
110
  """
103
- popup_error = bool(slot_kwargs.pop("popup_error", False))
104
- verify_sender = bool(slot_kwargs.pop("verify_sender", False))
111
+ _slot_params = {
112
+ "popup_error": bool(slot_kwargs.pop("popup_error", False)),
113
+ "verify_sender": bool(slot_kwargs.pop("verify_sender", False)),
114
+ "raise_error": bool(slot_kwargs.pop("raise_error", False)),
115
+ }
105
116
 
106
117
  def error_managed(method):
107
118
  @Slot(*slot_args, **slot_kwargs)
108
119
  @functools.wraps(method)
109
120
  def wrapper(*args, **kwargs):
121
+
122
+ _override_slot_params = kwargs.pop("_override_slot_params", {})
123
+ _slot_params.update(_override_slot_params)
110
124
  try:
111
- if not verify_sender or len(args) == 0:
125
+ if not _slot_params["verify_sender"] or len(args) == 0:
112
126
  return method(*args, **kwargs)
113
127
 
114
128
  _instance = args[0]
@@ -126,11 +140,11 @@ def SafeSlot(*slot_args, **slot_kwargs): # pylint: disable=invalid-name
126
140
  except Exception:
127
141
  slot_name = f"{method.__module__}.{method.__qualname__}"
128
142
  error_msg = traceback.format_exc()
129
- if popup_error:
130
- ErrorPopupUtility().custom_exception_hook(
131
- *sys.exc_info(), popup_error=popup_error
132
- )
143
+ if _slot_params["popup_error"]:
144
+ ErrorPopupUtility().custom_exception_hook(*sys.exc_info(), popup_error=True)
133
145
  logger.error(f"SafeSlot error in slot '{slot_name}':\n{error_msg}")
146
+ if _slot_params["raise_error"]:
147
+ raise
134
148
 
135
149
  return wrapper
136
150
 
@@ -1,5 +1,5 @@
1
- """ Module for a thin wrapper (LinearRegionWrapper) around the LinearRegionItem in pyqtgraph.
2
- The class is mainly designed for usage with the BECWaveform and 1D plots. """
1
+ """Module for a thin wrapper (LinearRegionWrapper) around the LinearRegionItem in pyqtgraph.
2
+ The class is mainly designed for usage with the BECWaveform and 1D plots."""
3
3
 
4
4
  from __future__ import annotations
5
5
 
@@ -303,11 +303,7 @@ class BECDock(BECWidget, Dock):
303
303
  shift(Literal["down", "up", "left", "right"]): The direction to shift the widgets if the position is occupied.
304
304
  """
305
305
  if name is not None:
306
- if not WidgetContainerUtils.has_name_valid_chars(name):
307
- raise ValueError(
308
- f"Name {name} contains invalid characters. "
309
- f"Only alphanumeric characters and underscores are allowed."
310
- )
306
+ WidgetContainerUtils.raise_for_invalid_name(name, container=self)
311
307
 
312
308
  if row is None:
313
309
  row = self.layout.rowCount()
@@ -366,11 +366,8 @@ class BECDockArea(BECWidget, QWidget):
366
366
  f"Name {name} must be unique for docks, but already exists in DockArea "
367
367
  f"with name: {self.object_name} and id {self.gui_id}."
368
368
  )
369
- if not WidgetContainerUtils.has_name_valid_chars(name):
370
- raise ValueError(
371
- f"Name {name} contains invalid characters. "
372
- f"Only alphanumeric characters and underscores are allowed."
373
- )
369
+ WidgetContainerUtils.raise_for_invalid_name(name, container=self)
370
+
374
371
  else: # Name is not provided
375
372
  name = WidgetContainerUtils.generate_unique_name(name="dock", list_of_names=dock_names)
376
373
 
@@ -1,4 +1,4 @@
1
- """ Module for a PositionerGroup widget to control a positioner device."""
1
+ """Module for a PositionerGroup widget to control a positioner device."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -1,4 +1,4 @@
1
- """ Module for DapComboBox widget class to select a DAP model from a combobox. """
1
+ """Module for DapComboBox widget class to select a DAP model from a combobox."""
2
2
 
3
3
  from bec_lib.logger import bec_logger
4
4
  from qtpy.QtCore import Property, Signal, Slot
@@ -1,5 +1,5 @@
1
1
  """
2
- BECConsole is a Qt widget that runs a Bash shell.
2
+ BECConsole is a Qt widget that runs a Bash shell.
3
3
 
4
4
  BECConsole VT100 emulation is powered by Pyte,
5
5
  (https://github.com/selectel/pyte).
@@ -56,12 +56,12 @@ control_keys_mapping = {
56
56
  QtCore.Qt.Key_G: b"\x07", # Ctrl-G (Bell)
57
57
  QtCore.Qt.Key_H: b"\x08", # Ctrl-H (Backspace)
58
58
  QtCore.Qt.Key_I: b"\x09", # Ctrl-I (Tab)
59
- QtCore.Qt.Key_J: b"\x0A", # Ctrl-J (Line Feed)
60
- QtCore.Qt.Key_K: b"\x0B", # Ctrl-K (Vertical Tab)
61
- QtCore.Qt.Key_L: b"\x0C", # Ctrl-L (Form Feed)
62
- QtCore.Qt.Key_M: b"\x0D", # Ctrl-M (Carriage Return)
63
- QtCore.Qt.Key_N: b"\x0E", # Ctrl-N
64
- QtCore.Qt.Key_O: b"\x0F", # Ctrl-O
59
+ QtCore.Qt.Key_J: b"\x0a", # Ctrl-J (Line Feed)
60
+ QtCore.Qt.Key_K: b"\x0b", # Ctrl-K (Vertical Tab)
61
+ QtCore.Qt.Key_L: b"\x0c", # Ctrl-L (Form Feed)
62
+ QtCore.Qt.Key_M: b"\x0d", # Ctrl-M (Carriage Return)
63
+ QtCore.Qt.Key_N: b"\x0e", # Ctrl-N
64
+ QtCore.Qt.Key_O: b"\x0f", # Ctrl-O
65
65
  QtCore.Qt.Key_P: b"\x10", # Ctrl-P
66
66
  QtCore.Qt.Key_Q: b"\x11", # Ctrl-Q
67
67
  QtCore.Qt.Key_R: b"\x12", # Ctrl-R
@@ -72,10 +72,10 @@ control_keys_mapping = {
72
72
  QtCore.Qt.Key_W: b"\x17", # Ctrl-W
73
73
  QtCore.Qt.Key_X: b"\x18", # Ctrl-X
74
74
  QtCore.Qt.Key_Y: b"\x19", # Ctrl-Y
75
- QtCore.Qt.Key_Z: b"\x1A", # Ctrl-Z
76
- QtCore.Qt.Key_Escape: b"\x1B", # Ctrl-Escape
77
- QtCore.Qt.Key_Backslash: b"\x1C", # Ctrl-\
78
- QtCore.Qt.Key_Underscore: b"\x1F", # Ctrl-_
75
+ QtCore.Qt.Key_Z: b"\x1a", # Ctrl-Z
76
+ QtCore.Qt.Key_Escape: b"\x1b", # Ctrl-Escape
77
+ QtCore.Qt.Key_Backslash: b"\x1c", # Ctrl-\
78
+ QtCore.Qt.Key_Underscore: b"\x1f", # Ctrl-_
79
79
  }
80
80
 
81
81
  normal_keys_mapping = {
@@ -89,7 +89,7 @@ normal_keys_mapping = {
89
89
  QtCore.Qt.Key_Left: b"\x02",
90
90
  QtCore.Qt.Key_Up: b"\x10",
91
91
  QtCore.Qt.Key_Right: b"\x06",
92
- QtCore.Qt.Key_Down: b"\x0E",
92
+ QtCore.Qt.Key_Down: b"\x0e",
93
93
  QtCore.Qt.Key_PageUp: b"\x49",
94
94
  QtCore.Qt.Key_PageDown: b"\x51",
95
95
  QtCore.Qt.Key_F1: b"\x1b\x31",
@@ -1,4 +1,4 @@
1
- """ Module for a StatusItem widget to display status and metrics for a BEC service.
1
+ """Module for a StatusItem widget to display status and metrics for a BEC service.
2
2
  The widget is bound to be used with the BECStatusBox widget."""
3
3
 
4
4
  import enum
@@ -1,4 +1,4 @@
1
- """ Utilities for filtering and formatting in the LogPanel"""
1
+ """Utilities for filtering and formatting in the LogPanel"""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -1,4 +1,5 @@
1
1
  from pyqtgraph.widgets.ColorMapButton import ColorMapButton
2
+ from qtpy import QtCore, QtGui
2
3
  from qtpy.QtCore import Property, Signal, Slot
3
4
  from qtpy.QtWidgets import QSizePolicy, QVBoxLayout, QWidget
4
5
 
@@ -6,6 +7,23 @@ from bec_widgets.utils import Colors
6
7
  from bec_widgets.utils.bec_widget import BECWidget
7
8
 
8
9
 
10
+ class RoundedColorMapButton(ColorMapButton):
11
+ """Thin wrapper around pyqtgraph ColorMapButton to add rounded clipping."""
12
+
13
+ def __init__(self, *args, **kwargs):
14
+ super().__init__(*args, **kwargs)
15
+ self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
16
+
17
+ def paintEvent(self, evt):
18
+ painter = QtGui.QPainter(self)
19
+ painter.setRenderHint(QtGui.QPainter.Antialiasing)
20
+ path = QtGui.QPainterPath()
21
+ path.addRoundedRect(self.rect(), 8, 8)
22
+ painter.setClipPath(path)
23
+ self.paintColorMap(painter, self.contentsRect())
24
+ painter.end()
25
+
26
+
9
27
  class BECColorMapWidget(BECWidget, QWidget):
10
28
  colormap_changed_signal = Signal(str)
11
29
  ICON_NAME = "palette"
@@ -15,7 +33,7 @@ class BECColorMapWidget(BECWidget, QWidget):
15
33
  def __init__(self, parent=None, cmap: str = "plasma", **kwargs):
16
34
  super().__init__(parent=parent, **kwargs)
17
35
  # Create the ColorMapButton
18
- self.button = ColorMapButton()
36
+ self.button = RoundedColorMapButton()
19
37
 
20
38
  # Set the size policy and minimum width
21
39
  size_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 2.0.3
3
+ Version: 2.1.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
@@ -12,7 +12,7 @@ Requires-Python: >=3.10
12
12
  Requires-Dist: bec-ipython-client<=4.0,>=2.21.4
13
13
  Requires-Dist: bec-lib<=4.0,>=3.29
14
14
  Requires-Dist: bec-qthemes>=0.7,~=0.7
15
- Requires-Dist: black~=24.0
15
+ Requires-Dist: black~=25.0
16
16
  Requires-Dist: isort>=5.13.2,~=5.13
17
17
  Requires-Dist: pydantic~=2.0
18
18
  Requires-Dist: pyqtgraph~=0.13
@@ -23,6 +23,7 @@ Requires-Dist: qtpy~=2.4
23
23
  Provides-Extra: dev
24
24
  Requires-Dist: coverage~=7.0; extra == 'dev'
25
25
  Requires-Dist: fakeredis>=2.23.2,~=2.23; extra == 'dev'
26
+ Requires-Dist: isort>=5.13.2,~=5.13; extra == 'dev'
26
27
  Requires-Dist: pytest-bec-e2e<=4.0,>=2.21.4; extra == 'dev'
27
28
  Requires-Dist: pytest-qt~=4.4; extra == 'dev'
28
29
  Requires-Dist: pytest-random-order~=1.1; extra == 'dev'
@@ -1,12 +1,12 @@
1
1
  .gitignore,sha256=cMQ1MLmnoR88aMCCJwUyfoTnufzl4-ckmHtlFUqHcT4,3253
2
- .gitlab-ci.yml,sha256=AEMwDcgmQNX2jsW5-EZvj5mtTBtIwRu4mNpWyDNUlwM,9516
2
+ .gitlab-ci.yml,sha256=raWZUDLdRkfQT18hNSaxS0C3e0BLaFCtiVISY7UExuE,9514
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
5
- CHANGELOG.md,sha256=2et0gedcDklH8epl7f2glGAAZH32g9UWv66kuTaaF88,269167
5
+ CHANGELOG.md,sha256=dKAUndU9I2TKPEIV_FLGY60yd7xdz7zk51xYnvpNYVc,270252
6
6
  LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
7
- PKG-INFO,sha256=FTn0xb6_Jsc0Jfxr-H7a9A_QkBx2pbfUzAlYTgPX5Ac,1172
7
+ PKG-INFO,sha256=bd1jIFJCtSLFIuk_OZpNQD3JTAva7u-BnkNDU0yY-IY,1224
8
8
  README.md,sha256=KgdKusjlvEvFtdNZCeDMO91y77MWK2iDcYMDziksOr4,2553
9
- pyproject.toml,sha256=G7GylYJKct5QDnu0H2uF4SR5v2jJoSkVk8oNyEMbkB4,2539
9
+ pyproject.toml,sha256=vB5noNu7DZBgkqnwU-rOjqzIIrjppKaoVVCREnjM2y0,2568
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
@@ -15,7 +15,7 @@ pyproject.toml,sha256=G7GylYJKct5QDnu0H2uF4SR5v2jJoSkVk8oNyEMbkB4,2539
15
15
  bec_widgets/__init__.py,sha256=mZhbU6zfFt8-A7q_do74ie89budSevwpKZ6FKtEBdmo,170
16
16
  bec_widgets/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  bec_widgets/applications/bw_launch.py,sha256=4lngXb8Ht_cvQtCwjjbAoqPNuE2V0Ja5WIPHpwgjcRI,687
18
- bec_widgets/applications/launch_window.py,sha256=lRZwfQoMMX0hs5z0v-UQE1trhviFuT_lJ7z2i1WmDnU,15731
18
+ bec_widgets/applications/launch_window.py,sha256=MGkhdLhNODDILuWgBkOhcxe92kWCLUfvemNE3029GDA,15594
19
19
  bec_widgets/assets/app_icons/BEC-General-App.png,sha256=hc2ktly53DZAbl_rE3cb-vdRa5gtdCmBEjfwm2y5P4g,447581
20
20
  bec_widgets/assets/app_icons/alignment_1d.png,sha256=5VouaWieb4lVv3wUBNHaO5ovUW2Fk25aTKYQzOWy0mg,2071069
21
21
  bec_widgets/assets/app_icons/auto_update.png,sha256=YKoAJTWAlWzreYvOm0BttDRFr29tulolZgKirRhAFlA,2197066
@@ -50,23 +50,23 @@ bec_widgets/utils/__init__.py,sha256=1930ji1Jj6dVuY81Wd2kYBhHYNV-2R0bN_L4o9zBj1U
50
50
  bec_widgets/utils/bec_connector.py,sha256=Ao_DN6oiHlpbVDHDK0RLpAgz2zDbhmwYee8yc3y7m2g,18875
51
51
  bec_widgets/utils/bec_designer.py,sha256=rllImDxo7-1diJ7uzesO_qnJv7Euu4lgV7oRYMLDY2U,5319
52
52
  bec_widgets/utils/bec_dispatcher.py,sha256=R0TDylR1ghYzNZj_1DavAEvswbK3iD1bI9IcWWwzhMc,8374
53
- bec_widgets/utils/bec_plugin_helper.py,sha256=bkbuatk7S9u5l6zfF3miAUFHXonN4vJ1YNVB5mw-3qw,3138
54
- bec_widgets/utils/bec_signal_proxy.py,sha256=DFyzlSOJmZ95_uQGC1VJApcJ-_BcU-zfeaeSBsvVxd4,3265
53
+ bec_widgets/utils/bec_plugin_helper.py,sha256=efg97QDAqhZYeqE1wk3vEgkFuhNewg4rvJrtB7mRCAE,3139
54
+ bec_widgets/utils/bec_signal_proxy.py,sha256=Yc08fdBEDABrowwNPSngT9-28R8FD4ml7oTL6BoMyEE,3263
55
55
  bec_widgets/utils/bec_table.py,sha256=nA2b8ukSeUfquFMAxGrUVOqdrzMoDYD6O_4EYbOG2zk,717
56
56
  bec_widgets/utils/bec_widget.py,sha256=jS888GioWKIJafMq5r1YhJ4vgORqiw0qHbxeSbE0Aec,4119
57
57
  bec_widgets/utils/collapsible_panel_manager.py,sha256=tvv77-9YTfYpsU6M_Le3bHR6wtANC83DEOrJ2Hhj6rs,14201
58
58
  bec_widgets/utils/colors.py,sha256=4Oms3kcstf7-WddGMB2TZXPqJwFMGVjFyBO8tHZHnxk,18308
59
59
  bec_widgets/utils/compact_popup.py,sha256=xVK_lQqL5Hy1ZnUzHXB8GU-Ru-mXevKcdM8ync3ssiA,10269
60
- bec_widgets/utils/container_utils.py,sha256=SpDRaDoLMg4HH0qMgMG3lyDxwH9c_h8cVe2HTqYm8MY,2607
60
+ bec_widgets/utils/container_utils.py,sha256=J8YXombOlAPa3M8NGZdhntp2NirBu4raDEQZOgP4elM,3791
61
61
  bec_widgets/utils/crosshair.py,sha256=z2Db0tz-SqDGn3wwyCOuQ5mZn9gQU8wQ7YrCVAAAU_A,18892
62
62
  bec_widgets/utils/entry_validator.py,sha256=8NCsQCYecPz-tn6AW0LtBoxRnjz-KI5oecU7bQNjqMg,1384
63
- bec_widgets/utils/error_popups.py,sha256=l2E8b9DX1UOqv9nirW13YZojffxJu2d4pY_pBZ3MDU0,12434
63
+ bec_widgets/utils/error_popups.py,sha256=UBAmD1YlAgKodpihudyf0VWtI59KGFiLgnjiKmKGjgk,13254
64
64
  bec_widgets/utils/expandable_frame.py,sha256=VV4mgwz4lXbO3r-dNCX2QFUguwWCCXSUkXyjDSTJHbU,2345
65
65
  bec_widgets/utils/filter_io.py,sha256=GKO6GOTiKxTuTp_SHp5Ewou54N7wIZXgWWvlFvhbBmw,5114
66
66
  bec_widgets/utils/fps_counter.py,sha256=seuCWwiNP5q2e2OEztloa66pNb3Sygh-0lEHAcYaDfc,2612
67
67
  bec_widgets/utils/generate_designer_plugin.py,sha256=VbyuSOZ8Bhb08Pv_iu_XWzoLKmt_o8zQzOdWSt7tHi8,6126
68
68
  bec_widgets/utils/layout_manager.py,sha256=H0nKsIMaPxRkof1MEXlSmW6w1dFxA6astaGzf4stI84,4727
69
- bec_widgets/utils/linear_region_selector.py,sha256=p88u6xOFiKOEfefkl7tOOHHJLKV0_us2q9R-ghJR-tY,3322
69
+ bec_widgets/utils/linear_region_selector.py,sha256=3C8Ebozchj1cWj6Dfx0zZzXo_6E-OllVlcPNlUGv1Cg,3320
70
70
  bec_widgets/utils/name_utils.py,sha256=VEHq6lRty1yif3h1EK2nBRNQquGK-l_p-6H9Fmp6BEA,340
71
71
  bec_widgets/utils/ophyd_kind_util.py,sha256=3azqxajYZY4crM04NqDqbEx7zPkWzZGYtWeCzfJu6UE,603
72
72
  bec_widgets/utils/palette_viewer.py,sha256=9FEkDy4sDkVpgazGyk149_Qv1DzJdXX6SpzlIPKoHqc,6304
@@ -97,8 +97,8 @@ bec_widgets/widgets/containers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
97
97
  bec_widgets/widgets/containers/auto_update/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  bec_widgets/widgets/containers/auto_update/auto_updates.py,sha256=tUaYgInedGwDMKOiYzAPDMnAysPQ70AF7ZcqgRXa6vw,12083
99
99
  bec_widgets/widgets/containers/dock/__init__.py,sha256=B7foHt02gnhM7mFksa7GJVwT7n0j_JvYDCt6wc6XR5g,61
100
- bec_widgets/widgets/containers/dock/dock.py,sha256=KCS3eMngI7dpr-Gf5R3WPqC_QkirJWWgNCORKgyhKag,14048
101
- bec_widgets/widgets/containers/dock/dock_area.py,sha256=6i5bsOW7aQ_hyCUAvcs_xZwHSu3nWZZhmq7nK8hfd3E,20641
100
+ bec_widgets/widgets/containers/dock/dock.py,sha256=G-I9zGyZ6gIXA4oyNVKI7Uj487QVAsBab96yFEmI2rE,13860
101
+ bec_widgets/widgets/containers/dock/dock_area.py,sha256=Aa4pDyeYKr-nL2c2ym2mgvgMsGVg8aLu5EPOmpw8-2w,20454
102
102
  bec_widgets/widgets/containers/dock/dock_area.pyproject,sha256=URW0UrDXCnkzk80rbQmUMgF6Uqay2TjHsq8Dq0g1j-c,37
103
103
  bec_widgets/widgets/containers/dock/dock_area_plugin.py,sha256=fDVXKPZuHr85B2fLfAYf_Ic5d9mZQpnZrODTDquzZpM,1331
104
104
  bec_widgets/widgets/containers/dock/register_dock_area.py,sha256=L7BL4qknCjtqsDP-RMQzk2qRPpcYuzXWlb7sJB_0DDM,475
@@ -157,7 +157,7 @@ bec_widgets/widgets/control/device_control/positioner_box/positioner_control_lin
157
157
  bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line_plugin.py,sha256=GAIFfXXxNRWj39gqKKjMFNtYLJ8yvMTGGN5vS5rDSyM,1494
158
158
  bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/register_positioner_control_line.py,sha256=HmHP1P46GqHM1Rh3UCwKqIg0i4TzXsGxTzUJUc4UYGU,572
159
159
  bec_widgets/widgets/control/device_control/positioner_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
- bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py,sha256=-eAVE4DQ1b-XfetmPUHwfYnLhMo3yn1QP410NfC1CNY,5810
160
+ bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py,sha256=KKz4BkcDb1d4UabkeHews4nxd5LMaXV9FlHbSitgs3g,5809
161
161
  bec_widgets/widgets/control/device_control/positioner_group/positioner_group.pyproject,sha256=NV-Hupn3uA4T9KXhxFO3r4MVuUAfdfWaLH4CIm71eqc,35
162
162
  bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plugin.py,sha256=gVzc1yzfs0NyTNM00p8-UDfLqtSF9wgeJOe0E4Ibzmo,1482
163
163
  bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py,sha256=vjoIwn1CQbg3gEwKzgY2MuscfGab2agM5YV0r1_UL0k,531
@@ -193,7 +193,7 @@ bec_widgets/widgets/control/scan_control/scan_control_plugin.py,sha256=_XzNzBv9y
193
193
  bec_widgets/widgets/control/scan_control/scan_group_box.py,sha256=OhqjaYVpGnWBmlVi99DGA_wP48uPRQ2b75H_aaEz8D0,13673
194
194
  bec_widgets/widgets/dap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
195
  bec_widgets/widgets/dap/dap_combo_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
- bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py,sha256=9rKq7srV2wrY1qFRDjjGRO8l9D2JV6gD_ciFQtjhaBA,5844
196
+ bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py,sha256=SPZqpaIz41NwUjuOLb7ZActQ7dBYDAjs6DPveezg9UU,5842
197
197
  bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.pyproject,sha256=3TzD8j0F6UYw8TPwKxVDeXdobnYIRXNrAUrXzqWjk4M,31
198
198
  bec_widgets/widgets/dap/dap_combo_box/dap_combo_box_plugin.py,sha256=UyMQ9n-SbjRU8xQys7UibMTMOArxaZUKT-peLulB3Cs,1270
199
199
  bec_widgets/widgets/dap/dap_combo_box/register_dap_combo_box.py,sha256=IDeZWx4z2Ke-SK8IJOJqJiAtcaxYkGieMAbhEBiBDtQ,481
@@ -207,7 +207,7 @@ bec_widgets/widgets/dap/lmfit_dialog/register_lm_fit_dialog.py,sha256=7tB1gsvv31
207
207
  bec_widgets/widgets/editors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
208
  bec_widgets/widgets/editors/dict_backed_table.py,sha256=QQ-ktAQ4odp7SKFnRbLJ9PEH2pErgy5c8GLyfj5nEK0,6151
209
209
  bec_widgets/widgets/editors/console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
210
- bec_widgets/widgets/editors/console/console.py,sha256=5J4TzpDN1muyVsoAPbCPxmZ3kPzF-OoneaHd6SW4_5E,29324
210
+ bec_widgets/widgets/editors/console/console.py,sha256=OB5vvqpYNhUGWzn5Dx5rR1n0rQulef5Yv-by5RGjr2w,29323
211
211
  bec_widgets/widgets/editors/console/console.pyproject,sha256=JcoDuZG03g1Bxkd3Aipo7jjLexujfbibIZqXHIgLSWc,26
212
212
  bec_widgets/widgets/editors/console/console_plugin.py,sha256=EvFTruYDVHiS4pHIwZnuEvJhS9eQoktuB_k5mcPuEts,1357
213
213
  bec_widgets/widgets/editors/console/register_console.py,sha256=zoF-i3R9sRGzb85sdoxVunebYOfOD53fkCELTPtrFRc,471
@@ -325,7 +325,7 @@ bec_widgets/widgets/services/bec_status_box/bec_status_box.py,sha256=Iw69xY0NvR4
325
325
  bec_widgets/widgets/services/bec_status_box/bec_status_box.pyproject,sha256=JWtx3Csfn2h7ODtk10HtyBNLf6tFIqyU6g04rMWOO1U,32
326
326
  bec_widgets/widgets/services/bec_status_box/bec_status_box_plugin.py,sha256=2tBPwcEIlQa_fH9lNiwgSqzU23g8VSwEvNvTVmHQA_U,1421
327
327
  bec_widgets/widgets/services/bec_status_box/register_bec_status_box.py,sha256=_1gr5nid6D5ZEvvt-GPyXhEGfacSh_QW0oWKxmZrUmY,490
328
- bec_widgets/widgets/services/bec_status_box/status_item.py,sha256=ZV0gqHCZ7mSui02NThSV7fHlIlYpH1kCoVf4LdAVUMY,5610
328
+ bec_widgets/widgets/services/bec_status_box/status_item.py,sha256=CNhGk6J8iNvlldibcuy4PFQULRHvgqHyot-UJ8xfVJw,5609
329
329
  bec_widgets/widgets/services/device_browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
330
330
  bec_widgets/widgets/services/device_browser/device_browser.py,sha256=tvI_T31wxUFP5xFKMNhaEq1omljkuLq44MSfBbHLUbM,3672
331
331
  bec_widgets/widgets/services/device_browser/device_browser.pyproject,sha256=s0vM1xYUwyU6Je68_hSCSBLK8ZPfHB-ftt4flfdpkXY,32
@@ -336,7 +336,7 @@ bec_widgets/widgets/services/device_browser/device_item/__init__.py,sha256=VGY-u
336
336
  bec_widgets/widgets/services/device_browser/device_item/device_item.py,sha256=BoOspOJb5pvtXl07OqXJvU6G2naPAnwnN4gy5q85mks,1921
337
337
  bec_widgets/widgets/utility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
338
338
  bec_widgets/widgets/utility/logpanel/__init__.py,sha256=HldSvPLYgrqBjCgIQj0f7Wa4slkSMksk4bsRJOQi__Y,91
339
- bec_widgets/widgets/utility/logpanel/_util.py,sha256=4vkN2KDJI8CHgwo_R8QjN76Lqg8zKoWAa_pWyFgLP94,1837
339
+ bec_widgets/widgets/utility/logpanel/_util.py,sha256=GqzHbdOTmWBru9OR4weeYdziWj_cWxqSJhS4_6W3Qjg,1836
340
340
  bec_widgets/widgets/utility/logpanel/log_panel.pyproject,sha256=2ncs1bsu-wICstR1gOYwFFdr0UuZmrBQEpwhvNKVFMY,26
341
341
  bec_widgets/widgets/utility/logpanel/log_panel_plugin.py,sha256=KY7eS1uGZzLYtDAdBv6S2mw8UjcDGVt3UklN_D5M06A,1250
342
342
  bec_widgets/widgets/utility/logpanel/logpanel.py,sha256=tnjczAwtfe1biL-u9h9tntoQerWo3iLVD9RTSLOvd5o,20651
@@ -370,15 +370,15 @@ bec_widgets/widgets/utility/visual/colormap_selector/register_colormap_selector.
370
370
  bec_widgets/widgets/utility/visual/colormap_widget/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
371
371
  bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget.pyproject,sha256=mGOToBLJAbXOuDLMXzQgcrAvLs9CuMKAucwlpntd6-M,33
372
372
  bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget_plugin.py,sha256=Q0DSu0Kc_nyEvI9t3RvOvfbwra0mB0HvFV30LD9Ob4U,1346
373
- bec_widgets/widgets/utility/visual/colormap_widget/colormap_widget.py,sha256=uyv5IV6qgqDfX18DBKhzs7N-aSTlbiljqHQ2TbC-yP4,2210
373
+ bec_widgets/widgets/utility/visual/colormap_widget/colormap_widget.py,sha256=LWGo5TtYTURPNqkTWVKKAC4K4eGQe1TmDZudGl_xi0c,2847
374
374
  bec_widgets/widgets/utility/visual/colormap_widget/register_bec_color_map_widget.py,sha256=K8H7hmtwo-W2_Z35nbZsVcrsPpDhsr6LCue7w85i-qA,530
375
375
  bec_widgets/widgets/utility/visual/dark_mode_button/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
376
376
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py,sha256=OotpMs4uk8EBGpbz-I0kEJdhov2fGVPwyai1WWzBnMI,3184
377
377
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject,sha256=Lbi9zb6HNlIq14k6hlzR-oz6PIFShBuF7QxE6d87d64,34
378
378
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py,sha256=CzChz2SSETYsR8-36meqWnsXCT-FIy_J_xeU5coWDY8,1350
379
379
  bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py,sha256=rMpZ1CaoucwobgPj1FuKTnt07W82bV1GaSYdoqcdMb8,521
380
- bec_widgets-2.0.3.dist-info/METADATA,sha256=FTn0xb6_Jsc0Jfxr-H7a9A_QkBx2pbfUzAlYTgPX5Ac,1172
381
- bec_widgets-2.0.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
382
- bec_widgets-2.0.3.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
383
- bec_widgets-2.0.3.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
384
- bec_widgets-2.0.3.dist-info/RECORD,,
380
+ bec_widgets-2.1.0.dist-info/METADATA,sha256=bd1jIFJCtSLFIuk_OZpNQD3JTAva7u-BnkNDU0yY-IY,1224
381
+ bec_widgets-2.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
382
+ bec_widgets-2.1.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
383
+ bec_widgets-2.1.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
384
+ bec_widgets-2.1.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.0.3"
7
+ version = "2.1.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [
@@ -16,7 +16,7 @@ dependencies = [
16
16
  "bec_ipython_client>=2.21.4, <=4.0", # needed for jupyter console
17
17
  "bec_lib>=3.29, <=4.0",
18
18
  "bec_qthemes~=0.7, >=0.7",
19
- "black~=24.0", # needed for bw-generate-cli
19
+ "black~=25.0", # needed for bw-generate-cli
20
20
  "isort~=5.13, >=5.13.2", # needed for bw-generate-cli
21
21
  "pydantic~=2.0",
22
22
  "pyqtgraph~=0.13",
@@ -31,6 +31,7 @@ dependencies = [
31
31
  dev = [
32
32
  "coverage~=7.0",
33
33
  "fakeredis~=2.23, >=2.23.2",
34
+ "isort~=5.13, >=5.13.2",
34
35
  "pytest-bec-e2e>=2.21.4, <=4.0",
35
36
  "pytest-qt~=4.4",
36
37
  "pytest-random-order~=1.1",