bec-widgets 1.20.0__tar.gz → 1.21.1__tar.gz

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 (357) hide show
  1. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/CHANGELOG.md +16 -0
  2. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/PKG-INFO +2 -2
  3. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_connector.py +54 -19
  4. bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/__init__.py +7 -0
  5. bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/_metadata_widgets.py +275 -0
  6. bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/_util.py +67 -0
  7. bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/additional_metadata_table.py +146 -0
  8. bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +196 -0
  9. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/pyproject.toml +2 -2
  10. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.git_hooks/pre-commit +0 -0
  11. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitignore +0 -0
  12. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab/issue_templates/bug_report_template.md +0 -0
  13. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  14. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab/issue_templates/feature_request_template.md +0 -0
  15. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab/merge_request_templates/default.md +0 -0
  16. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab-ci.yml +0 -0
  17. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.pylintrc +0 -0
  18. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.readthedocs.yaml +0 -0
  19. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/LICENSE +0 -0
  20. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/README.md +0 -0
  21. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/__init__.py +0 -0
  22. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/__init__.py +0 -0
  23. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/alignment/__init__.py +0 -0
  24. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/alignment/alignment_1d/__init__.py +0 -0
  25. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/alignment/alignment_1d/alignment_1d.py +0 -0
  26. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/alignment/alignment_1d/alignment_1d.ui +0 -0
  27. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/bec_app.py +0 -0
  28. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/assets/app_icons/BEC-General-App.png +0 -0
  29. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/assets/app_icons/alignment_1d.png +0 -0
  30. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/assets/app_icons/bec_widgets_icon.png +0 -0
  31. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/__init__.py +0 -0
  32. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/auto_updates.py +0 -0
  33. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/client.py +0 -0
  34. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/client_utils.py +0 -0
  35. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/generate_cli.py +0 -0
  36. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/rpc/__init__.py +0 -0
  37. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/rpc/rpc_base.py +0 -0
  38. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/rpc/rpc_register.py +0 -0
  39. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/rpc/rpc_widget_handler.py +0 -0
  40. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/server.py +0 -0
  41. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/__init__.py +0 -0
  42. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/general_app/__init__.py +0 -0
  43. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/general_app/general_app.py +0 -0
  44. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/general_app/general_app.ui +0 -0
  45. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/general_app/web_links.py +0 -0
  46. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  47. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  48. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
  49. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
  50. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
  51. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
  52. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
  53. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
  54. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
  55. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/__init__.py +0 -0
  56. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/collapsible_panel_manager.py +0 -0
  57. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/compact_popup.py +0 -0
  58. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/error_popups.py +0 -0
  59. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/palette_viewer.py +0 -0
  60. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/redis_message_waiter.py +0 -0
  61. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/round_frame.py +0 -0
  62. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/settings_dialog.py +0 -0
  63. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/side_panel.py +0 -0
  64. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/toolbar.py +0 -0
  65. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/tests/__init__.py +0 -0
  66. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/tests/utils.py +0 -0
  67. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/__init__.py +0 -0
  68. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_designer.py +0 -0
  69. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_dispatcher.py +0 -0
  70. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_signal_proxy.py +0 -0
  71. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_table.py +0 -0
  72. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_widget.py +0 -0
  73. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/colors.py +0 -0
  74. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/container_utils.py +0 -0
  75. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/crosshair.py +0 -0
  76. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/entry_validator.py +0 -0
  77. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/filter_io.py +0 -0
  78. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/fps_counter.py +0 -0
  79. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/generate_designer_plugin.py +0 -0
  80. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/layout_manager.py +0 -0
  81. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/linear_region_selector.py +0 -0
  82. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/ophyd_kind_util.py +0 -0
  83. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/plot_indicator_items.py +0 -0
  84. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/plugin_templates/plugin.template +0 -0
  85. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/plugin_templates/register.template +0 -0
  86. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/plugin_utils.py +0 -0
  87. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/reference_utils.py +0 -0
  88. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/rpc_decorator.py +0 -0
  89. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/thread_checker.py +0 -0
  90. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/ui_loader.py +0 -0
  91. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/validator_delegate.py +0 -0
  92. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/widget_io.py +0 -0
  93. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/widget_state_manager.py +0 -0
  94. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/yaml_dialog.py +0 -0
  95. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/__init__.py +0 -0
  96. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/__init__.py +0 -0
  97. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/__init__.py +0 -0
  98. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/dock.py +0 -0
  99. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/dock_area.py +0 -0
  100. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/dock_area.pyproject +0 -0
  101. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/dock_area_plugin.py +0 -0
  102. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/register_dock_area.py +0 -0
  103. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/__init__.py +0 -0
  104. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/figure.py +0 -0
  105. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/__init__.py +0 -0
  106. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/axis_settings.py +0 -0
  107. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/axis_settings.ui +0 -0
  108. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/image/__init__.py +0 -0
  109. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/image/image.py +0 -0
  110. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/image/image_item.py +0 -0
  111. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/image/image_processor.py +0 -0
  112. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/motor_map/__init__.py +0 -0
  113. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/motor_map/motor_map.py +0 -0
  114. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/multi_waveform/__init__.py +0 -0
  115. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/multi_waveform/multi_waveform.py +0 -0
  116. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/plot_base.py +0 -0
  117. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/waveform/__init__.py +0 -0
  118. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/waveform/waveform.py +0 -0
  119. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/waveform/waveform_curve.py +0 -0
  120. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/layout_manager/__init__.py +0 -0
  121. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/layout_manager/layout_manager.py +0 -0
  122. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/main_window/__init__.py +0 -0
  123. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/main_window/main_window.py +0 -0
  124. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/__init__.py +0 -0
  125. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/__init__.py +0 -0
  126. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/__init__.py +0 -0
  127. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/abort_button.pyproject +0 -0
  128. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/abort_button_plugin.py +0 -0
  129. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/button_abort.py +0 -0
  130. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/register_abort_button.py +0 -0
  131. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/__init__.py +0 -0
  132. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/button_reset.py +0 -0
  133. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/register_reset_button.py +0 -0
  134. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/reset_button.pyproject +0 -0
  135. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/reset_button_plugin.py +0 -0
  136. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/__init__.py +0 -0
  137. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/button_resume.py +0 -0
  138. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/register_resume_button.py +0 -0
  139. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/resume_button.pyproject +0 -0
  140. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/resume_button_plugin.py +0 -0
  141. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/__init__.py +0 -0
  142. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/register_stop_button.py +0 -0
  143. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/stop_button.py +0 -0
  144. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/stop_button.pyproject +0 -0
  145. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/stop_button_plugin.py +0 -0
  146. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/__init__.py +0 -0
  147. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/__init__.py +0 -0
  148. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.py +0 -0
  149. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.pyproject +0 -0
  150. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator_plugin.py +0 -0
  151. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/register_position_indicator.py +0 -0
  152. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/__init__.py +0 -0
  153. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py +0 -0
  154. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py +0 -0
  155. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/__init__.py +0 -0
  156. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +0 -0
  157. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.pyproject +0 -0
  158. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.ui +0 -0
  159. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box_plugin.py +0 -0
  160. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/register_positioner_box.py +0 -0
  161. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/__init__.py +0 -0
  162. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d.pyproject +0 -0
  163. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d_plugin.py +0 -0
  164. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +0 -0
  165. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui +0 -0
  166. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/register_positioner_box2_d.py +0 -0
  167. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.py +0 -0
  168. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.pyproject +0 -0
  169. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.ui +0 -0
  170. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line_plugin.py +0 -0
  171. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/register_positioner_control_line.py +0 -0
  172. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/__init__.py +0 -0
  173. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py +0 -0
  174. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.pyproject +0 -0
  175. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plugin.py +0 -0
  176. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py +0 -0
  177. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/__init__.py +0 -0
  178. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/base_classes/__init__.py +0 -0
  179. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py +0 -0
  180. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py +0 -0
  181. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/__init__.py +0 -0
  182. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box.pyproject +0 -0
  183. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box_plugin.py +0 -0
  184. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py +0 -0
  185. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/register_device_combo_box.py +0 -0
  186. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/__init__.py +0 -0
  187. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py +0 -0
  188. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.pyproject +0 -0
  189. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit_plugin.py +0 -0
  190. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/register_device_line_edit.py +0 -0
  191. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/__init__.py +0 -0
  192. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/register_signal_combo_box.py +0 -0
  193. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject +0 -0
  194. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box_plugin.py +0 -0
  195. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py +0 -0
  196. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/__init__.py +0 -0
  197. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/register_signal_line_edit.py +0 -0
  198. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py +0 -0
  199. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.pyproject +0 -0
  200. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit_plugin.py +0 -0
  201. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/__init__.py +0 -0
  202. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/register_scan_control.py +0 -0
  203. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/scan_control.py +0 -0
  204. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/scan_control.pyproject +0 -0
  205. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/scan_control_plugin.py +0 -0
  206. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/scan_group_box.py +0 -0
  207. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/__init__.py +0 -0
  208. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/__init__.py +0 -0
  209. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py +0 -0
  210. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.pyproject +0 -0
  211. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box_plugin.py +0 -0
  212. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/register_dap_combo_box.py +0 -0
  213. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/__init__.py +0 -0
  214. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog.pyproject +0 -0
  215. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog_plugin.py +0 -0
  216. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog.py +0 -0
  217. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_compact.ui +0 -0
  218. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_vertical.ui +0 -0
  219. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/register_lm_fit_dialog.py +0 -0
  220. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/__init__.py +0 -0
  221. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/__init__.py +0 -0
  222. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/console.py +0 -0
  223. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/console.pyproject +0 -0
  224. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/console_plugin.py +0 -0
  225. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/register_console.py +0 -0
  226. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/jupyter_console/__init__.py +0 -0
  227. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/jupyter_console/jupyter_console.py +0 -0
  228. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/__init__.py +0 -0
  229. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/register_text_box.py +0 -0
  230. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/text_box.py +0 -0
  231. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/text_box.pyproject +0 -0
  232. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/text_box_plugin.py +0 -0
  233. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/__init__.py +0 -0
  234. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/register_vs_code_editor.py +0 -0
  235. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/vs_code_editor.pyproject +0 -0
  236. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/vs_code_editor_plugin.py +0 -0
  237. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/vscode.py +0 -0
  238. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/__init__.py +0 -0
  239. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/register_website_widget.py +0 -0
  240. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/website.py +0 -0
  241. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/website_widget.pyproject +0 -0
  242. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/website_widget_plugin.py +0 -0
  243. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/__init__.py +0 -0
  244. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/minesweeper.py +0 -0
  245. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/minesweeper.pyproject +0 -0
  246. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/minesweeper_plugin.py +0 -0
  247. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/register_minesweeper.py +0 -0
  248. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/__init__.py +0 -0
  249. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/__init__.py +0 -0
  250. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/bec_image_widget.pyproject +0 -0
  251. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/bec_image_widget_plugin.py +0 -0
  252. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/image_widget.py +0 -0
  253. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/register_bec_image_widget.py +0 -0
  254. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/__init__.py +0 -0
  255. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/bec_motor_map_widget.pyproject +0 -0
  256. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/bec_motor_map_widget_plugin.py +0 -0
  257. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/motor_map_dialog/__init__.py +0 -0
  258. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/motor_map_dialog/motor_map_settings.py +0 -0
  259. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/motor_map_dialog/motor_map_settings.ui +0 -0
  260. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/motor_map_widget.py +0 -0
  261. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/register_bec_motor_map_widget.py +0 -0
  262. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/__init__.py +0 -0
  263. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/bec_multi_waveform_widget.pyproject +0 -0
  264. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/bec_multi_waveform_widget_plugin.py +0 -0
  265. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/multi_waveform_controls.ui +0 -0
  266. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/multi_waveform_widget.py +0 -0
  267. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/register_bec_multi_waveform_widget.py +0 -0
  268. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/__init__.py +0 -0
  269. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/bec_waveform_widget.pyproject +0 -0
  270. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/bec_waveform_widget_plugin.py +0 -0
  271. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/register_bec_waveform_widget.py +0 -0
  272. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/__init__.py +0 -0
  273. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/__init__.py +0 -0
  274. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/curve_dialog.py +0 -0
  275. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/curve_dialog.ui +0 -0
  276. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/dap_summary_dialog/__init__.py +0 -0
  277. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/dap_summary_dialog/dap_summary_dialog.py +0 -0
  278. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_widget.py +0 -0
  279. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/plot_base.py +0 -0
  280. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/setting_menus/__init__.py +0 -0
  281. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings.py +0 -0
  282. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings_horizontal.ui +0 -0
  283. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings_vertical.ui +0 -0
  284. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/__init__.py +0 -0
  285. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/mouse_interactions.py +0 -0
  286. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/plot_export.py +0 -0
  287. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/save_state.py +0 -0
  288. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/__init__.py +0 -0
  289. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/__init__.py +0 -0
  290. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar.pyproject +0 -0
  291. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar_plugin.py +0 -0
  292. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/bec_progressbar.py +0 -0
  293. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/register_bec_progress_bar.py +0 -0
  294. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/__init__.py +0 -0
  295. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/register_ring_progress_bar.py +0 -0
  296. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/ring.py +0 -0
  297. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.py +0 -0
  298. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.pyproject +0 -0
  299. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar_plugin.py +0 -0
  300. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/__init__.py +0 -0
  301. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/__init__.py +0 -0
  302. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/bec_queue.py +0 -0
  303. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/bec_queue.pyproject +0 -0
  304. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/bec_queue_plugin.py +0 -0
  305. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/register_bec_queue.py +0 -0
  306. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/__init__.py +0 -0
  307. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/bec_status_box.py +0 -0
  308. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/bec_status_box.pyproject +0 -0
  309. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/bec_status_box_plugin.py +0 -0
  310. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/register_bec_status_box.py +0 -0
  311. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/status_item.py +0 -0
  312. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/__init__.py +0 -0
  313. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_browser.py +0 -0
  314. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_browser.pyproject +0 -0
  315. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_browser.ui +0 -0
  316. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_browser_plugin.py +0 -0
  317. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_item/__init__.py +0 -0
  318. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_item/device_item.py +0 -0
  319. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/register_device_browser.py +0 -0
  320. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/__init__.py +0 -0
  321. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/__init__.py +0 -0
  322. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/_util.py +0 -0
  323. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/log_panel.pyproject +0 -0
  324. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/log_panel_plugin.py +0 -0
  325. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/logpanel.py +0 -0
  326. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/register_log_panel.py +0 -0
  327. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/__init__.py +0 -0
  328. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/register_spinner_widget.py +0 -0
  329. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/spinner.py +0 -0
  330. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/spinner_widget.pyproject +0 -0
  331. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/spinner_widget_plugin.py +0 -0
  332. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/__init__.py +0 -0
  333. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/register_toggle_switch.py +0 -0
  334. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/toggle.py +0 -0
  335. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/toggle_switch.pyproject +0 -0
  336. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/toggle_switch_plugin.py +0 -0
  337. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/__init__.py +0 -0
  338. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/__init__.py +0 -0
  339. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/color_button.py +0 -0
  340. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/color_button.pyproject +0 -0
  341. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/color_button_plugin.py +0 -0
  342. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/register_color_button.py +0 -0
  343. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/__init__.py +0 -0
  344. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.py +0 -0
  345. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.pyproject +0 -0
  346. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector_plugin.py +0 -0
  347. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/register_colormap_selector.py +0 -0
  348. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/__init__.py +0 -0
  349. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget.pyproject +0 -0
  350. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget_plugin.py +0 -0
  351. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/colormap_widget.py +0 -0
  352. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/register_bec_color_map_widget.py +0 -0
  353. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/__init__.py +0 -0
  354. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py +0 -0
  355. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject +0 -0
  356. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py +0 -0
  357. {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py +0 -0
@@ -1,6 +1,22 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v1.21.1 (2025-02-17)
5
+
6
+ ### Bug Fixes
7
+
8
+ - **bec_connector**: Workers stored in reference to not be cleaned up with garbage collector
9
+ ([`383936f`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/383936ffc2bd7d2e088d3367c76b14efa3d1732c))
10
+
11
+
12
+ ## v1.21.0 (2025-02-17)
13
+
14
+ ### Features
15
+
16
+ - Generated form for scan metadata
17
+ ([`1708bd4`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/1708bd405f86b1353828b01fbf5f98383a19ec2a))
18
+
19
+
4
20
  ## v1.20.0 (2025-02-06)
5
21
 
6
22
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 1.20.0
3
+ Version: 1.21.1
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
@@ -16,7 +16,7 @@ Requires-Dist: black~=24.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
19
- Requires-Dist: pyside6==6.7.2
19
+ Requires-Dist: pyside6>=6.8
20
20
  Requires-Dist: pyte
21
21
  Requires-Dist: qtconsole>=5.5.1,~=5.5
22
22
  Requires-Dist: qtpy~=2.4
@@ -111,7 +111,7 @@ class BECConnector:
111
111
 
112
112
  # register widget to rpc register
113
113
  # be careful: when registering, and the object is not a BECWidget,
114
- # cleanup has to called manually since there is no 'closeEvent'
114
+ # cleanup has to be called manually since there is no 'closeEvent'
115
115
  self.rpc_register = RPCRegister()
116
116
  self.rpc_register.add_rpc(self)
117
117
 
@@ -119,6 +119,8 @@ class BECConnector:
119
119
  self.error_utility = ErrorPopupUtility()
120
120
 
121
121
  self._thread_pool = QThreadPool.globalInstance()
122
+ # Store references to running workers so they're not garbage collected prematurely.
123
+ self._workers = []
122
124
 
123
125
  def submit_task(self, fn, *args, on_complete: pyqtSlot = None, **kwargs) -> Worker:
124
126
  """
@@ -147,11 +149,14 @@ class BECConnector:
147
149
  >>> def on_complete():
148
150
  >>> print("Task complete")
149
151
  >>> self.submit_task(my_function, 1, 2, on_complete=on_complete)
150
-
151
152
  """
152
153
  worker = Worker(fn, *args, **kwargs)
153
154
  if on_complete:
154
155
  worker.signals.completed.connect(on_complete)
156
+ # Keep a reference to the worker so it is not garbage collected.
157
+ self._workers.append(worker)
158
+ # When the worker is done, remove it from our list.
159
+ worker.signals.completed.connect(lambda: self._workers.remove(worker))
155
160
  self._thread_pool.start(worker)
156
161
  return worker
157
162
 
@@ -183,10 +188,10 @@ class BECConnector:
183
188
  @_config_dict.setter
184
189
  def _config_dict(self, config: BaseModel) -> None:
185
190
  """
186
- Get the configuration of the widget.
191
+ Set the configuration of the widget.
187
192
 
188
- Returns:
189
- dict: The configuration of the widget.
193
+ Args:
194
+ config (BaseModel): The new configuration model.
190
195
  """
191
196
  self.config = config
192
197
 
@@ -195,8 +200,8 @@ class BECConnector:
195
200
  Apply the configuration to the widget.
196
201
 
197
202
  Args:
198
- config(dict): Configuration settings.
199
- generate_new_id(bool): If True, generate a new GUI ID for the widget.
203
+ config (dict): Configuration settings.
204
+ generate_new_id (bool): If True, generate a new GUI ID for the widget.
200
205
  """
201
206
  self.config = ConnectionConfig(**config)
202
207
  if generate_new_id is True:
@@ -212,8 +217,8 @@ class BECConnector:
212
217
  Load the configuration of the widget from YAML.
213
218
 
214
219
  Args:
215
- path(str): Path to the configuration file for non-GUI dialog mode.
216
- gui(bool): If True, use the GUI dialog to load the configuration file.
220
+ path (str | None): Path to the configuration file for non-GUI dialog mode.
221
+ gui (bool): If True, use the GUI dialog to load the configuration file.
217
222
  """
218
223
  if gui is True:
219
224
  config = load_yaml_gui(self)
@@ -232,8 +237,8 @@ class BECConnector:
232
237
  Save the configuration of the widget to YAML.
233
238
 
234
239
  Args:
235
- path(str): Path to save the configuration file for non-GUI dialog mode.
236
- gui(bool): If True, use the GUI dialog to save the configuration file.
240
+ path (str | None): Path to save the configuration file for non-GUI dialog mode.
241
+ gui (bool): If True, use the GUI dialog to save the configuration file.
237
242
  """
238
243
  if gui is True:
239
244
  save_yaml_gui(self, self._config_dict)
@@ -241,7 +246,6 @@ class BECConnector:
241
246
  if path is None:
242
247
  path = os.getcwd()
243
248
  file_path = os.path.join(path, f"{self.__class__.__name__}_config.yaml")
244
-
245
249
  save_yaml(file_path, self._config_dict)
246
250
 
247
251
  @pyqtSlot(str)
@@ -250,7 +254,7 @@ class BECConnector:
250
254
  Set the GUI ID for the widget.
251
255
 
252
256
  Args:
253
- gui_id(str): GUI ID
257
+ gui_id (str): GUI ID.
254
258
  """
255
259
  self.config.gui_id = gui_id
256
260
  self.gui_id = gui_id
@@ -271,7 +275,7 @@ class BECConnector:
271
275
  """Update the client and device manager from BEC and create object for BEC shortcuts.
272
276
 
273
277
  Args:
274
- client: BEC client
278
+ client: BEC client.
275
279
  """
276
280
  self.client = client
277
281
  self.get_bec_shortcuts()
@@ -282,12 +286,10 @@ class BECConnector:
282
286
  Update the configuration for the widget.
283
287
 
284
288
  Args:
285
- config(ConnectionConfig): Configuration settings.
289
+ config (ConnectionConfig | dict): Configuration settings.
286
290
  """
287
291
  if isinstance(config, dict):
288
292
  config = ConnectionConfig(**config)
289
- # TODO add error handler
290
-
291
293
  self.config = config
292
294
 
293
295
  def get_config(self, dict_output: bool = True) -> dict | BaseModel:
@@ -295,12 +297,45 @@ class BECConnector:
295
297
  Get the configuration of the widget.
296
298
 
297
299
  Args:
298
- dict_output(bool): If True, return the configuration as a dictionary. If False, return the configuration as a pydantic model.
300
+ dict_output (bool): If True, return the configuration as a dictionary.
301
+ If False, return the configuration as a pydantic model.
299
302
 
300
303
  Returns:
301
- dict: The configuration of the plot widget.
304
+ dict | BaseModel: The configuration of the widget.
302
305
  """
303
306
  if dict_output:
304
307
  return self.config.model_dump()
305
308
  else:
306
309
  return self.config
310
+
311
+
312
+ # --- Example usage of BECConnector: running a simple task ---
313
+ if __name__ == "__main__": # pragma: no cover
314
+ import sys
315
+
316
+ # Create a QApplication instance (required for QThreadPool)
317
+ app = QApplication(sys.argv)
318
+
319
+ connector = BECConnector()
320
+
321
+ def print_numbers():
322
+ """
323
+ Task function that prints numbers 1 to 10 with a 0.5 second delay between each.
324
+ """
325
+ for i in range(1, 11):
326
+ print(i)
327
+ time.sleep(0.5)
328
+
329
+ def task_complete():
330
+ """
331
+ Called when the task is complete.
332
+ """
333
+ print("Task complete")
334
+ # Exit the application after the task completes.
335
+ app.quit()
336
+
337
+ # Submit the task using the connector's submit_task method.
338
+ connector.submit_task(print_numbers, on_complete=task_complete)
339
+
340
+ # Start the Qt event loop.
341
+ sys.exit(app.exec_())
@@ -0,0 +1,7 @@
1
+ from bec_widgets.widgets.editors.scan_metadata.additional_metadata_table import (
2
+ AdditionalMetadataTable,
3
+ AdditionalMetadataTableModel,
4
+ )
5
+ from bec_widgets.widgets.editors.scan_metadata.scan_metadata import ScanMetadata
6
+
7
+ __all__ = ["ScanMetadata", "AdditionalMetadataTable", "AdditionalMetadataTableModel"]
@@ -0,0 +1,275 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import abstractmethod
4
+ from decimal import Decimal
5
+ from typing import TYPE_CHECKING, Callable, get_args
6
+
7
+ from bec_lib.logger import bec_logger
8
+ from bec_qthemes import material_icon
9
+ from pydantic import BaseModel, Field
10
+ from qtpy.QtCore import Signal # type: ignore
11
+ from qtpy.QtWidgets import (
12
+ QApplication,
13
+ QButtonGroup,
14
+ QCheckBox,
15
+ QDoubleSpinBox,
16
+ QGridLayout,
17
+ QHBoxLayout,
18
+ QLabel,
19
+ QLayout,
20
+ QLineEdit,
21
+ QRadioButton,
22
+ QSpinBox,
23
+ QToolButton,
24
+ QWidget,
25
+ )
26
+
27
+ from bec_widgets.widgets.editors.scan_metadata._util import (
28
+ clearable_required,
29
+ field_default,
30
+ field_limits,
31
+ field_maxlen,
32
+ field_minlen,
33
+ field_precision,
34
+ )
35
+
36
+ if TYPE_CHECKING:
37
+ from pydantic.fields import FieldInfo
38
+
39
+ logger = bec_logger.logger
40
+
41
+
42
+ class ClearableBoolEntry(QWidget):
43
+ stateChanged = Signal()
44
+
45
+ def __init__(self, parent: QWidget | None = None) -> None:
46
+ super().__init__(parent)
47
+ self._layout = QHBoxLayout()
48
+ self._layout.setContentsMargins(0, 0, 0, 0)
49
+ self.setLayout(self._layout)
50
+ self._layout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)
51
+ self._entry = QButtonGroup()
52
+ self._true = QRadioButton("true", parent=self)
53
+ self._false = QRadioButton("false", parent=self)
54
+ for button in [self._true, self._false]:
55
+ self._layout.addWidget(button)
56
+ self._entry.addButton(button)
57
+ button.toggled.connect(self.stateChanged)
58
+
59
+ def clear(self):
60
+ self._entry.setExclusive(False)
61
+ self._true.setChecked(False)
62
+ self._false.setChecked(False)
63
+ self._entry.setExclusive(True)
64
+
65
+ def isChecked(self) -> bool | None:
66
+ if not self._true.isChecked() and not self._false.isChecked():
67
+ return None
68
+ return self._true.isChecked()
69
+
70
+ def setChecked(self, value: bool | None):
71
+ if value is None:
72
+ self.clear()
73
+ elif value:
74
+ self._true.setChecked(True)
75
+ self._false.setChecked(False)
76
+ else:
77
+ self._true.setChecked(False)
78
+ self._false.setChecked(True)
79
+
80
+ def setToolTip(self, tooltip: str):
81
+ self._true.setToolTip(tooltip)
82
+ self._false.setToolTip(tooltip)
83
+
84
+
85
+ class MetadataWidget(QWidget):
86
+
87
+ valueChanged = Signal()
88
+
89
+ def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
90
+ super().__init__(parent)
91
+ self._info = info
92
+ self._layout = QHBoxLayout()
93
+ self._layout.setContentsMargins(0, 0, 0, 0)
94
+ self._layout.setSizeConstraint(QLayout.SizeConstraint.SetMaximumSize)
95
+ self._default = field_default(self._info)
96
+ self._desc = self._info.description
97
+ self.setLayout(self._layout)
98
+ self._add_main_widget()
99
+ if clearable_required(info):
100
+ self._add_clear_button()
101
+
102
+ @abstractmethod
103
+ def getValue(self): ...
104
+
105
+ @abstractmethod
106
+ def setValue(self, value): ...
107
+
108
+ @abstractmethod
109
+ def _add_main_widget(self) -> None:
110
+ """Add the main data entry widget to self._main_widget and appply any
111
+ constraints from the field info"""
112
+
113
+ def _describe(self, pad=" "):
114
+ return pad + (self._desc if self._desc else "")
115
+
116
+ def _add_clear_button(self):
117
+ self._clear_button = QToolButton()
118
+ self._clear_button.setIcon(
119
+ material_icon(icon_name="close", size=(10, 10), convert_to_pixmap=False)
120
+ )
121
+ self._layout.addWidget(self._clear_button)
122
+ # the widget added in _add_main_widget must implement .clear() if value is not required
123
+ self._clear_button.setToolTip("Clear value or reset to default.")
124
+ self._clear_button.clicked.connect(self._main_widget.clear) # type: ignore
125
+
126
+ def _value_changed(self, *_, **__):
127
+ self.valueChanged.emit()
128
+
129
+
130
+ class StrMetadataField(MetadataWidget):
131
+ def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
132
+ super().__init__(info, parent)
133
+ self._main_widget.textChanged.connect(self._value_changed)
134
+
135
+ def _add_main_widget(self) -> None:
136
+ self._main_widget = QLineEdit()
137
+ self._layout.addWidget(self._main_widget)
138
+ min_length, max_length = field_minlen(self._info), field_maxlen(self._info)
139
+ if max_length:
140
+ self._main_widget.setMaxLength(max_length)
141
+ self._main_widget.setToolTip(
142
+ f"(length min: {min_length} max: {max_length}){self._describe()}"
143
+ )
144
+ if self._default:
145
+ self._main_widget.setText(self._default)
146
+ self._add_clear_button()
147
+
148
+ def getValue(self):
149
+ if self._main_widget.text() == "":
150
+ return self._default
151
+ return self._main_widget.text()
152
+
153
+ def setValue(self, value: str):
154
+ if value is None:
155
+ self._main_widget.setText("")
156
+ self._main_widget.setText(value)
157
+
158
+
159
+ class IntMetadataField(MetadataWidget):
160
+ def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
161
+ super().__init__(info, parent)
162
+ self._main_widget.textChanged.connect(self._value_changed)
163
+
164
+ def _add_main_widget(self) -> None:
165
+ self._main_widget = QSpinBox()
166
+ self._layout.addWidget(self._main_widget)
167
+ min_, max_ = field_limits(self._info, int)
168
+ self._main_widget.setMinimum(min_)
169
+ self._main_widget.setMaximum(max_)
170
+ self._main_widget.setToolTip(f"(range {min_} to {max_}){self._describe()}")
171
+ if self._default is not None:
172
+ self._main_widget.setValue(self._default)
173
+ self._add_clear_button()
174
+ else:
175
+ self._main_widget.clear()
176
+
177
+ def getValue(self):
178
+ if self._main_widget.text() == "":
179
+ return self._default
180
+ return self._main_widget.value()
181
+
182
+ def setValue(self, value: int):
183
+ if value is None:
184
+ self._main_widget.clear()
185
+ self._main_widget.setValue(value)
186
+
187
+
188
+ class FloatDecimalMetadataField(MetadataWidget):
189
+ def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
190
+ super().__init__(info, parent)
191
+ self._main_widget.textChanged.connect(self._value_changed)
192
+
193
+ def _add_main_widget(self) -> None:
194
+ self._main_widget = QDoubleSpinBox()
195
+ self._layout.addWidget(self._main_widget)
196
+ min_, max_ = field_limits(self._info, int)
197
+ self._main_widget.setMinimum(min_)
198
+ self._main_widget.setMaximum(max_)
199
+ precision = field_precision(self._info)
200
+ if precision:
201
+ self._main_widget.setDecimals(precision)
202
+ minstr = f"{float(min_):.3f}" if abs(min_) <= 1000 else f"{float(min_):.3e}"
203
+ maxstr = f"{float(max_):.3f}" if abs(max_) <= 1000 else f"{float(max_):.3e}"
204
+ self._main_widget.setToolTip(f"(range {minstr} to {maxstr}){self._describe()}")
205
+ if self._default is not None:
206
+ self._main_widget.setValue(self._default)
207
+ self._add_clear_button()
208
+ else:
209
+ self._main_widget.clear()
210
+
211
+ def getValue(self):
212
+ if self._main_widget.text() == "":
213
+ return self._default
214
+ return self._main_widget.value()
215
+
216
+ def setValue(self, value: float):
217
+ if value is None:
218
+ self._main_widget.clear()
219
+ self._main_widget.setValue(value)
220
+
221
+
222
+ class BoolMetadataField(MetadataWidget):
223
+ def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
224
+ super().__init__(info, parent)
225
+ self._main_widget.stateChanged.connect(self._value_changed)
226
+
227
+ def _add_main_widget(self) -> None:
228
+ if clearable_required(self._info):
229
+ self._main_widget = ClearableBoolEntry()
230
+ else:
231
+ self._main_widget = QCheckBox()
232
+ self._layout.addWidget(self._main_widget)
233
+ self._main_widget.setToolTip(self._describe(""))
234
+ self._main_widget.setChecked(self._default) # type: ignore # if there is no default then it will be ClearableBoolEntry and can be set with None
235
+
236
+ def getValue(self):
237
+ return self._main_widget.isChecked()
238
+
239
+ def setValue(self, value):
240
+ self._main_widget.setChecked(value)
241
+
242
+
243
+ def widget_from_type(annotation: type | None) -> Callable[[FieldInfo], MetadataWidget]:
244
+ if annotation in [str, str | None]:
245
+ return StrMetadataField
246
+ if annotation in [int, int | None]:
247
+ return IntMetadataField
248
+ if annotation in [float, float | None, Decimal, Decimal | None]:
249
+ return FloatDecimalMetadataField
250
+ if annotation in [bool, bool | None]:
251
+ return BoolMetadataField
252
+ else:
253
+ logger.warning(f"Type {annotation} is not (yet) supported in metadata form creation.")
254
+ return StrMetadataField
255
+
256
+
257
+ if __name__ == "__main__": # pragma: no cover
258
+
259
+ class TestModel(BaseModel):
260
+ value1: str | None = Field(None)
261
+ value2: bool | None = Field(None)
262
+ value3: bool = Field(True)
263
+ value4: int = Field(123)
264
+ value5: int | None = Field()
265
+
266
+ app = QApplication([])
267
+ w = QWidget()
268
+ layout = QGridLayout()
269
+ w.setLayout(layout)
270
+ for i, (field_name, info) in enumerate(TestModel.model_fields.items()):
271
+ layout.addWidget(QLabel(field_name), i, 0)
272
+ layout.addWidget(widget_from_type(info.annotation)(info), i, 1)
273
+
274
+ w.show()
275
+ app.exec()
@@ -0,0 +1,67 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ from decimal import Decimal
5
+ from math import inf, nextafter
6
+ from typing import TYPE_CHECKING, TypeVar, get_args
7
+
8
+ from annotated_types import Ge, Gt, Le, Lt
9
+ from bec_lib.logger import bec_logger
10
+ from pydantic_core import PydanticUndefined
11
+
12
+ if TYPE_CHECKING:
13
+ from pydantic.fields import FieldInfo
14
+
15
+ logger = bec_logger.logger
16
+
17
+
18
+ _MININT = -2147483648
19
+ _MAXINT = 2147483647
20
+ _MINFLOAT = -sys.float_info.max
21
+ _MAXFLOAT = sys.float_info.max
22
+
23
+ T = TypeVar("T", int, float, Decimal)
24
+
25
+
26
+ def field_limits(info: FieldInfo, type_: type[T]) -> tuple[T, T]:
27
+ _min = _MININT if type_ is int else _MINFLOAT
28
+ _max = _MAXINT if type_ is int else _MAXFLOAT
29
+ for md in info.metadata:
30
+ if isinstance(md, Ge):
31
+ _min = type_(md.ge) # type: ignore
32
+ if isinstance(md, Gt):
33
+ _min = type_(md.gt) + 1 if type_ is int else nextafter(type_(md.gt), inf) # type: ignore
34
+ if isinstance(md, Lt):
35
+ _max = type_(md.lt) - 1 if type_ is int else nextafter(type_(md.lt), -inf) # type: ignore
36
+ if isinstance(md, Le):
37
+ _max = type_(md.le) # type: ignore
38
+ return _min, _max # type: ignore
39
+
40
+
41
+ def _get_anno(info: FieldInfo, annotation: str, default):
42
+ for md in info.metadata:
43
+ if hasattr(md, annotation):
44
+ return getattr(md, annotation)
45
+ return default
46
+
47
+
48
+ def field_precision(info: FieldInfo):
49
+ return _get_anno(info, "decimal_places", 307)
50
+
51
+
52
+ def field_maxlen(info: FieldInfo):
53
+ return _get_anno(info, "max_length", None)
54
+
55
+
56
+ def field_minlen(info: FieldInfo):
57
+ return _get_anno(info, "min_length", None)
58
+
59
+
60
+ def field_default(info: FieldInfo):
61
+ if info.default is PydanticUndefined:
62
+ return
63
+ return info.default
64
+
65
+
66
+ def clearable_required(info: FieldInfo):
67
+ return type(None) in get_args(info.annotation) or info.is_required()