bec-widgets 1.10.0__py3-none-any.whl → 1.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.
CHANGELOG.md CHANGED
@@ -1,6 +1,29 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v1.12.0 (2024-12-12)
5
+
6
+ ### Features
7
+
8
+ - **safe_property**: Added decorator to handle errors in Property decorator from qt to not crash
9
+ designer
10
+ ([`e380489`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/e38048964f942f9f4edba225835ad0a937503dd4))
11
+
12
+
13
+ ## v1.11.0 (2024-12-11)
14
+
15
+ ### Features
16
+
17
+ - **collapsible_panel_manager**: Panel manager to handle collapsing and expanding widgets from the
18
+ main widget added
19
+ ([`a434d3e`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/a434d3ee574081356c32c096d2fd61f641e04542))
20
+
21
+ ### Testing
22
+
23
+ - **collapsible_panel_manager**: Fixture changed to not use .show()
24
+ ([`ff654b5`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/ff654b56ae98388a2b707c040d51220be6cbce13))
25
+
26
+
4
27
  ## v1.10.0 (2024-12-10)
5
28
 
6
29
  ### Features
@@ -189,24 +212,3 @@ Depending on the test, auto-updates are enabled or not.
189
212
 
190
213
  - **positioner_box**: Adjusted default signals
191
214
  ([`8e5c0ad`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/8e5c0ad8c8eff5a9308169bc663d2b7230f0ebb1))
192
-
193
-
194
- ## v1.4.0 (2024-11-11)
195
-
196
- ### Bug Fixes
197
-
198
- - **crosshair**: Label of coordinates of TextItem displays numbers in general format
199
- ([`11e5937`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/11e5937ae0f3c1413acd4e66878a692ebe4ef7d0))
200
-
201
- - **crosshair**: Label of coordinates of TextItem is updated according to the current theme of qapp
202
- ([`4f31ea6`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/4f31ea655cf6190e141e6a2720a2d6da517a2b5b))
203
-
204
- ### Features
205
-
206
- - **crosshair**: Textitem to display crosshair coordinates
207
- ([`035136d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/035136d5171ec5f4311d15a9aa5bad2bdbc1f6cb))
208
-
209
- ### Testing
210
-
211
- - **crosshair**: Tests extended
212
- ([`64df805`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/64df805a9ed92bb97e580ac3bc0a1bbd2b1cb81e))
PKG-INFO CHANGED
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 1.10.0
3
+ Version: 1.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
@@ -0,0 +1,380 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ from typing import Literal
5
+
6
+ import pyqtgraph as pg
7
+ from qtpy.QtCore import Property, QEasingCurve, QObject, QPropertyAnimation
8
+ from qtpy.QtWidgets import (
9
+ QApplication,
10
+ QHBoxLayout,
11
+ QMainWindow,
12
+ QPushButton,
13
+ QSizePolicy,
14
+ QVBoxLayout,
15
+ QWidget,
16
+ )
17
+ from typeguard import typechecked
18
+
19
+ from bec_widgets.widgets.containers.layout_manager.layout_manager import LayoutManagerWidget
20
+
21
+
22
+ class DimensionAnimator(QObject):
23
+ """
24
+ Helper class to animate the size of a panel widget.
25
+ """
26
+
27
+ def __init__(self, panel_widget: QWidget, direction: str):
28
+ super().__init__()
29
+ self.panel_widget = panel_widget
30
+ self.direction = direction
31
+ self._size = 0
32
+
33
+ @Property(int)
34
+ def panel_width(self):
35
+ """
36
+ Returns the current width of the panel widget.
37
+ """
38
+ return self._size
39
+
40
+ @panel_width.setter
41
+ def panel_width(self, val: int):
42
+ """
43
+ Set the width of the panel widget.
44
+
45
+ Args:
46
+ val(int): The width to set.
47
+ """
48
+ self._size = val
49
+ self.panel_widget.setFixedWidth(val)
50
+
51
+ @Property(int)
52
+ def panel_height(self):
53
+ """
54
+ Returns the current height of the panel widget.
55
+ """
56
+ return self._size
57
+
58
+ @panel_height.setter
59
+ def panel_height(self, val: int):
60
+ """
61
+ Set the height of the panel widget.
62
+
63
+ Args:
64
+ val(int): The height to set.
65
+ """
66
+ self._size = val
67
+ self.panel_widget.setFixedHeight(val)
68
+
69
+
70
+ class CollapsiblePanelManager(QObject):
71
+ """
72
+ Manager class to handle collapsible panels from a main widget using LayoutManagerWidget.
73
+ """
74
+
75
+ def __init__(self, layout_manager: LayoutManagerWidget, reference_widget: QWidget, parent=None):
76
+ super().__init__(parent)
77
+ self.layout_manager = layout_manager
78
+ self.reference_widget = reference_widget
79
+ self.animations = {}
80
+ self.panels = {}
81
+ self.direction_settings = {
82
+ "left": {"property": b"maximumWidth", "default_size": 200},
83
+ "right": {"property": b"maximumWidth", "default_size": 200},
84
+ "top": {"property": b"maximumHeight", "default_size": 150},
85
+ "bottom": {"property": b"maximumHeight", "default_size": 150},
86
+ }
87
+
88
+ def add_panel(
89
+ self,
90
+ direction: Literal["left", "right", "top", "bottom"],
91
+ panel_widget: QWidget,
92
+ target_size: int | None = None,
93
+ duration: int = 300,
94
+ ):
95
+ """
96
+ Add a panel widget to the layout manager.
97
+
98
+ Args:
99
+ direction(Literal["left", "right", "top", "bottom"]): Direction of the panel.
100
+ panel_widget(QWidget): The panel widget to add.
101
+ target_size(int, optional): The target size of the panel. Defaults to None.
102
+ duration(int): The duration of the animation in milliseconds. Defaults to 300.
103
+ """
104
+ if direction not in self.direction_settings:
105
+ raise ValueError("Direction must be one of 'left', 'right', 'top', 'bottom'.")
106
+
107
+ if target_size is None:
108
+ target_size = self.direction_settings[direction]["default_size"]
109
+
110
+ self.layout_manager.add_widget_relative(
111
+ widget=panel_widget, reference_widget=self.reference_widget, position=direction
112
+ )
113
+ panel_widget.setVisible(False)
114
+
115
+ # Set initial constraints as flexible
116
+ if direction in ["left", "right"]:
117
+ panel_widget.setMaximumWidth(0)
118
+ panel_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
119
+ else:
120
+ panel_widget.setMaximumHeight(0)
121
+ panel_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
122
+
123
+ self.panels[direction] = {
124
+ "widget": panel_widget,
125
+ "direction": direction,
126
+ "target_size": target_size,
127
+ "duration": duration,
128
+ "animator": None,
129
+ }
130
+
131
+ def toggle_panel(
132
+ self,
133
+ direction: Literal["left", "right", "top", "bottom"],
134
+ target_size: int | None = None,
135
+ duration: int | None = None,
136
+ easing_curve: QEasingCurve = QEasingCurve.InOutQuad,
137
+ ensure_max: bool = False,
138
+ scale: float | None = None,
139
+ animation: bool = True,
140
+ ):
141
+ """
142
+ Toggle the specified panel.
143
+
144
+ Parameters:
145
+ direction (Literal["left", "right", "top", "bottom"]): Direction of the panel to toggle.
146
+ target_size (int, optional): Override target size for this toggle.
147
+ duration (int, optional): Override the animation duration.
148
+ easing_curve (QEasingCurve): Animation easing curve.
149
+ ensure_max (bool): If True, animate as a fixed-size panel.
150
+ scale (float, optional): If provided, calculate target_size from main widget size.
151
+ animation (bool): If False, no animation is performed; panel instantly toggles.
152
+ """
153
+ if direction not in self.panels:
154
+ raise ValueError(f"No panel found in direction '{direction}'.")
155
+
156
+ panel_info = self.panels[direction]
157
+ panel_widget = panel_info["widget"]
158
+ dir_settings = self.direction_settings[direction]
159
+
160
+ # Determine final target size
161
+ if scale is not None:
162
+ main_rect = self.reference_widget.geometry()
163
+ if direction in ["left", "right"]:
164
+ computed_target = int(main_rect.width() * scale)
165
+ else:
166
+ computed_target = int(main_rect.height() * scale)
167
+ final_target_size = computed_target
168
+ else:
169
+ if target_size is None:
170
+ final_target_size = panel_info["target_size"]
171
+ else:
172
+ final_target_size = target_size
173
+
174
+ if duration is None:
175
+ duration = panel_info["duration"]
176
+
177
+ expanding_property = dir_settings["property"]
178
+ currently_visible = panel_widget.isVisible()
179
+
180
+ if ensure_max:
181
+ if panel_info["animator"] is None:
182
+ panel_info["animator"] = DimensionAnimator(panel_widget, direction)
183
+ animator = panel_info["animator"]
184
+
185
+ if direction in ["left", "right"]:
186
+ prop_name = b"panel_width"
187
+ else:
188
+ prop_name = b"panel_height"
189
+ else:
190
+ animator = None
191
+ prop_name = expanding_property
192
+
193
+ if currently_visible:
194
+ # Hide the panel
195
+ if ensure_max:
196
+ start_value = final_target_size
197
+ end_value = 0
198
+ finish_callback = lambda w=panel_widget, d=direction: self._after_hide_reset(w, d)
199
+ else:
200
+ start_value = (
201
+ panel_widget.width()
202
+ if direction in ["left", "right"]
203
+ else panel_widget.height()
204
+ )
205
+ end_value = 0
206
+ finish_callback = lambda w=panel_widget: w.setVisible(False)
207
+ else:
208
+ # Show the panel
209
+ start_value = 0
210
+ end_value = final_target_size
211
+ finish_callback = None
212
+ if ensure_max:
213
+ # Fix panel exactly
214
+ if direction in ["left", "right"]:
215
+ panel_widget.setMinimumWidth(0)
216
+ panel_widget.setMaximumWidth(final_target_size)
217
+ panel_widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
218
+ else:
219
+ panel_widget.setMinimumHeight(0)
220
+ panel_widget.setMaximumHeight(final_target_size)
221
+ panel_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
222
+ else:
223
+ # Flexible mode
224
+ if direction in ["left", "right"]:
225
+ panel_widget.setMinimumWidth(0)
226
+ panel_widget.setMaximumWidth(final_target_size)
227
+ panel_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
228
+ else:
229
+ panel_widget.setMinimumHeight(0)
230
+ panel_widget.setMaximumHeight(final_target_size)
231
+ panel_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
232
+
233
+ panel_widget.setVisible(True)
234
+
235
+ if not animation:
236
+ # No animation: instantly set final state
237
+ if end_value == 0:
238
+ # Hiding
239
+ if ensure_max:
240
+ # Reset after hide
241
+ self._after_hide_reset(panel_widget, direction)
242
+ else:
243
+ panel_widget.setVisible(False)
244
+ else:
245
+ # Showing
246
+ if ensure_max:
247
+ # Already set fixed size
248
+ if direction in ["left", "right"]:
249
+ panel_widget.setFixedWidth(end_value)
250
+ else:
251
+ panel_widget.setFixedHeight(end_value)
252
+ else:
253
+ # Just set maximum dimension
254
+ if direction in ["left", "right"]:
255
+ panel_widget.setMaximumWidth(end_value)
256
+ else:
257
+ panel_widget.setMaximumHeight(end_value)
258
+ return
259
+
260
+ # With animation
261
+ animation = QPropertyAnimation(animator if ensure_max else panel_widget, prop_name)
262
+ animation.setDuration(duration)
263
+ animation.setStartValue(start_value)
264
+ animation.setEndValue(end_value)
265
+ animation.setEasingCurve(easing_curve)
266
+
267
+ if end_value == 0 and finish_callback:
268
+ animation.finished.connect(finish_callback)
269
+ elif end_value == 0 and not finish_callback:
270
+ animation.finished.connect(lambda w=panel_widget: w.setVisible(False))
271
+
272
+ animation.start()
273
+ self.animations[panel_widget] = animation
274
+
275
+ @typechecked
276
+ def _after_hide_reset(
277
+ self, panel_widget: QWidget, direction: Literal["left", "right", "top", "bottom"]
278
+ ):
279
+ """
280
+ Reset the panel widget after hiding it in ensure_max mode.
281
+
282
+ Args:
283
+ panel_widget(QWidget): The panel widget to reset.
284
+ direction(Literal["left", "right", "top", "bottom"]): The direction of the panel.
285
+ """
286
+ # Called after hiding a panel in ensure_max mode
287
+ panel_widget.setVisible(False)
288
+ if direction in ["left", "right"]:
289
+ panel_widget.setMinimumWidth(0)
290
+ panel_widget.setMaximumWidth(0)
291
+ panel_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
292
+ else:
293
+ panel_widget.setMinimumHeight(0)
294
+ panel_widget.setMaximumHeight(16777215)
295
+ panel_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
296
+
297
+
298
+ ####################################################################################################
299
+ # The following code is for the GUI control panel to interact with the CollapsiblePanelManager.
300
+ # It is not covered by any tests as it serves only as an example for the CollapsiblePanelManager class.
301
+ ####################################################################################################
302
+
303
+
304
+ class MainWindow(QMainWindow): # pragma: no cover
305
+ def __init__(self):
306
+ super().__init__()
307
+ self.setWindowTitle("Panels with ensure_max, scale, and animation toggle")
308
+ self.resize(800, 600)
309
+
310
+ central_widget = QWidget()
311
+ self.setCentralWidget(central_widget)
312
+ main_layout = QVBoxLayout(central_widget)
313
+ main_layout.setContentsMargins(10, 10, 10, 10)
314
+ main_layout.setSpacing(10)
315
+
316
+ # Buttons
317
+ buttons_layout = QHBoxLayout()
318
+ self.btn_left = QPushButton("Toggle Left (ensure_max=True)")
319
+ self.btn_top = QPushButton("Toggle Top (scale=0.5, no animation)")
320
+ self.btn_right = QPushButton("Toggle Right (ensure_max=True, scale=0.3)")
321
+ self.btn_bottom = QPushButton("Toggle Bottom (no animation)")
322
+
323
+ buttons_layout.addWidget(self.btn_left)
324
+ buttons_layout.addWidget(self.btn_top)
325
+ buttons_layout.addWidget(self.btn_right)
326
+ buttons_layout.addWidget(self.btn_bottom)
327
+
328
+ main_layout.addLayout(buttons_layout)
329
+
330
+ self.layout_manager = LayoutManagerWidget()
331
+ main_layout.addWidget(self.layout_manager)
332
+
333
+ # Main widget
334
+ self.main_plot = pg.PlotWidget()
335
+ self.main_plot.plot([1, 2, 3, 4], [4, 3, 2, 1])
336
+ self.layout_manager.add_widget(self.main_plot, 0, 0)
337
+
338
+ self.panel_manager = CollapsiblePanelManager(self.layout_manager, self.main_plot)
339
+
340
+ # Panels
341
+ self.left_panel = pg.PlotWidget()
342
+ self.left_panel.plot([1, 2, 3], [3, 2, 1])
343
+ self.panel_manager.add_panel("left", self.left_panel, target_size=200)
344
+
345
+ self.right_panel = pg.PlotWidget()
346
+ self.right_panel.plot([10, 20, 30], [1, 10, 1])
347
+ self.panel_manager.add_panel("right", self.right_panel, target_size=200)
348
+
349
+ self.top_panel = pg.PlotWidget()
350
+ self.top_panel.plot([1, 2, 3], [1, 2, 3])
351
+ self.panel_manager.add_panel("top", self.top_panel, target_size=150)
352
+
353
+ self.bottom_panel = pg.PlotWidget()
354
+ self.bottom_panel.plot([2, 4, 6], [10, 5, 10])
355
+ self.panel_manager.add_panel("bottom", self.bottom_panel, target_size=150)
356
+
357
+ # Connect buttons
358
+ # Left with ensure_max
359
+ self.btn_left.clicked.connect(
360
+ lambda: self.panel_manager.toggle_panel("left", ensure_max=True)
361
+ )
362
+ # Top with scale=0.5 and no animation
363
+ self.btn_top.clicked.connect(
364
+ lambda: self.panel_manager.toggle_panel("top", scale=0.5, animation=False)
365
+ )
366
+ # Right with ensure_max, scale=0.3
367
+ self.btn_right.clicked.connect(
368
+ lambda: self.panel_manager.toggle_panel("right", ensure_max=True, scale=0.3)
369
+ )
370
+ # Bottom no animation
371
+ self.btn_bottom.clicked.connect(
372
+ lambda: self.panel_manager.toggle_panel("bottom", target_size=100, animation=False)
373
+ )
374
+
375
+
376
+ if __name__ == "__main__": # pragma: no cover
377
+ app = QApplication(sys.argv)
378
+ w = MainWindow()
379
+ w.show()
380
+ sys.exit(app.exec())
@@ -2,10 +2,46 @@ import functools
2
2
  import sys
3
3
  import traceback
4
4
 
5
- from qtpy.QtCore import QObject, Qt, Signal, Slot
5
+ from qtpy.QtCore import Property, QObject, Qt, Signal, Slot
6
6
  from qtpy.QtWidgets import QApplication, QMessageBox, QPushButton, QVBoxLayout, QWidget
7
7
 
8
8
 
9
+ def SafeProperty(prop_type, *prop_args, popup_error: bool = False, **prop_kwargs):
10
+ """
11
+ Decorator to create a Qt Property with a safe setter that won't crash Designer on errors.
12
+ Behaves similarly to SafeSlot, but for properties.
13
+
14
+ Args:
15
+ prop_type: The property type (e.g., str, bool, "QStringList", etc.)
16
+ popup_error (bool): If True, show popup on error, otherwise just handle it silently.
17
+ *prop_args, **prop_kwargs: Additional arguments and keyword arguments accepted by Property.
18
+ """
19
+
20
+ def decorator(getter):
21
+ class PropertyWrapper:
22
+ def __init__(self, getter_func):
23
+ self.getter_func = getter_func
24
+
25
+ def setter(self, setter_func):
26
+ @functools.wraps(setter_func)
27
+ def safe_setter(self_, value):
28
+ try:
29
+ return setter_func(self_, value)
30
+ except Exception:
31
+ if popup_error:
32
+ ErrorPopupUtility().custom_exception_hook(
33
+ *sys.exc_info(), popup_error=True
34
+ )
35
+ else:
36
+ return
37
+
38
+ return Property(prop_type, self.getter_func, safe_setter, *prop_args, **prop_kwargs)
39
+
40
+ return PropertyWrapper(getter)
41
+
42
+ return decorator
43
+
44
+
9
45
  def SafeSlot(*slot_args, **slot_kwargs): # pylint: disable=invalid-name
10
46
  """Function with args, acting like a decorator, applying "error_managed" decorator + Qt Slot
11
47
  to the passed function, to display errors instead of potentially raising an exception
@@ -91,6 +127,12 @@ class _ErrorPopupUtility(QObject):
91
127
  msg.setMinimumHeight(400)
92
128
  msg.exec_()
93
129
 
130
+ def show_property_error(self, title, message, widget):
131
+ """
132
+ Show a property-specific error message.
133
+ """
134
+ self.error_occurred.emit(title, message, widget)
135
+
94
136
  def format_traceback(self, traceback_message: str) -> str:
95
137
  """
96
138
  Format the traceback message to be displayed in the error popup by adding indentation to each line.
@@ -408,9 +408,9 @@ class LayoutManagerWidget(QWidget):
408
408
 
409
409
  def remove(
410
410
  self,
411
- row: Optional[int] = None,
412
- col: Optional[int] = None,
413
- coordinates: Optional[Tuple[int, int]] = None,
411
+ row: int | None = None,
412
+ col: int | None = None,
413
+ coordinates: Tuple[int, int] | None = None,
414
414
  ) -> None:
415
415
  """
416
416
  Remove a widget from the layout. Can be removed by widget ID or by coordinates.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 1.10.0
3
+ Version: 1.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=bAWGX_NR9rQZmv_bmyLXkEMRreWp0JzVNpsNTxk0NwE,8637
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
5
- CHANGELOG.md,sha256=IKF4CsJODVEwtIjKM2zTTS9m_JRHCY3XRYlUdJ4DZLs,7686
5
+ CHANGELOG.md,sha256=YUN7cYN4D404UHmCrAwMrlL-4mVl5OViGPzlLVCnYn0,7625
6
6
  LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
7
- PKG-INFO,sha256=hICH58v6kexJp6j2db_OOpSQQlaMAO57Af9ScSPDgSg,1309
7
+ PKG-INFO,sha256=1-7w2AujTo1NIogqL1USRHIzs8GGvH5d49N-1KP90kk,1309
8
8
  README.md,sha256=Od69x-RS85Hph0-WwWACwal4yUd67XkEn4APEfHhHFw,2649
9
- pyproject.toml,sha256=D6UU8tgbCO_3ovaiysqzl6EAp0qc_nHHOBav0gKDFvY,2587
9
+ pyproject.toml,sha256=flzI-4819-LvKYP0njUAltnkKXfJisdhtnUNtCryTXI,2587
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
@@ -45,8 +45,9 @@ bec_widgets/examples/plugin_example_pyside/tictactoe.py,sha256=s3rCurXloVcmMdzZi
45
45
  bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py,sha256=MFMwONn4EZ3V8DboEG4I3BXpURE9JDbKB7XTzzfZl5w,1978
46
46
  bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py,sha256=V6OVnBTS-60zjQ2FAs88Ldjm1MfoMROfiQZZu6Guav8,2379
47
47
  bec_widgets/qt_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ bec_widgets/qt_utils/collapsible_panel_manager.py,sha256=tvv77-9YTfYpsU6M_Le3bHR6wtANC83DEOrJ2Hhj6rs,14201
48
49
  bec_widgets/qt_utils/compact_popup.py,sha256=3yeb-GJ1PUla5Q_hT0XDKqvyIEH9yV_eGidf1t8Dbbw,10234
49
- bec_widgets/qt_utils/error_popups.py,sha256=y9gKKWaafp468ioHr96nBhf02ZpEgjDc-BAVOTWh-e8,7680
50
+ bec_widgets/qt_utils/error_popups.py,sha256=gd63kggSOHRmh9HzSPH2jjQznUecRBhhCtvoGIlh7xA,9253
50
51
  bec_widgets/qt_utils/palette_viewer.py,sha256=--B0x7aE7bniHIeuuLY_pH8yBDrTTXaE0IDrC_AM1mo,6326
51
52
  bec_widgets/qt_utils/redis_message_waiter.py,sha256=fvL_QgC0cTDv_FPJdRyp5AKjf401EJU4z3r38p47ydY,1745
52
53
  bec_widgets/qt_utils/round_frame.py,sha256=Ba_sTzYB_vYDepBBMPPqU8XDwKOAiU6ClZ3xUqiveK0,5734
@@ -109,7 +110,7 @@ bec_widgets/widgets/containers/figure/plots/waveform/__init__.py,sha256=47DEQpj8
109
110
  bec_widgets/widgets/containers/figure/plots/waveform/waveform.py,sha256=6j-3hg0tVtpCnDgbYObTYwiNI7ciuWgQ5L1TlAN0Kg8,57543
110
111
  bec_widgets/widgets/containers/figure/plots/waveform/waveform_curve.py,sha256=9rOFHIxRjz0-G6f-mpw0FNmX846ZPwGn8yrJ3FpxlVc,8725
111
112
  bec_widgets/widgets/containers/layout_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
- bec_widgets/widgets/containers/layout_manager/layout_manager.py,sha256=98G91ffPynoZTTi2IjklS9TwZh_JZbJX1_MeXAB2eC4,33766
113
+ bec_widgets/widgets/containers/layout_manager/layout_manager.py,sha256=LJFEjzi10mzo0wxD84Iud1A-jKahqAf8nJ5qIBx1MfE,33757
113
114
  bec_widgets/widgets/containers/main_window/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
115
  bec_widgets/widgets/containers/main_window/main_window.py,sha256=A2IAux-lqupMCVZOQu7AUt1AEaeIG3Eza85eN0bknlI,272
115
116
  bec_widgets/widgets/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -317,8 +318,8 @@ bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py,sha256=Z
317
318
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject,sha256=Lbi9zb6HNlIq14k6hlzR-oz6PIFShBuF7QxE6d87d64,34
318
319
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py,sha256=CzChz2SSETYsR8-36meqWnsXCT-FIy_J_xeU5coWDY8,1350
319
320
  bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py,sha256=rMpZ1CaoucwobgPj1FuKTnt07W82bV1GaSYdoqcdMb8,521
320
- bec_widgets-1.10.0.dist-info/METADATA,sha256=hICH58v6kexJp6j2db_OOpSQQlaMAO57Af9ScSPDgSg,1309
321
- bec_widgets-1.10.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
322
- bec_widgets-1.10.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
323
- bec_widgets-1.10.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
324
- bec_widgets-1.10.0.dist-info/RECORD,,
321
+ bec_widgets-1.12.0.dist-info/METADATA,sha256=1-7w2AujTo1NIogqL1USRHIzs8GGvH5d49N-1KP90kk,1309
322
+ bec_widgets-1.12.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
323
+ bec_widgets-1.12.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
324
+ bec_widgets-1.12.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
325
+ bec_widgets-1.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 = "1.10.0"
7
+ version = "1.12.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [