bec-widgets 1.19.2__tar.gz → 1.21.0__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 (358) hide show
  1. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/CHANGELOG.md +20 -0
  2. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/PKG-INFO +2 -3
  3. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/client.py +21 -0
  4. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/dock/dock_area.py +7 -0
  5. bec_widgets-1.21.0/bec_widgets/widgets/editors/scan_metadata/__init__.py +7 -0
  6. bec_widgets-1.21.0/bec_widgets/widgets/editors/scan_metadata/_metadata_widgets.py +275 -0
  7. bec_widgets-1.21.0/bec_widgets/widgets/editors/scan_metadata/_util.py +67 -0
  8. bec_widgets-1.21.0/bec_widgets/widgets/editors/scan_metadata/additional_metadata_table.py +146 -0
  9. bec_widgets-1.21.0/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +196 -0
  10. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/text_box/text_box.py +5 -5
  11. bec_widgets-1.21.0/bec_widgets/widgets/utility/logpanel/__init__.py +3 -0
  12. bec_widgets-1.21.0/bec_widgets/widgets/utility/logpanel/_util.py +58 -0
  13. bec_widgets-1.21.0/bec_widgets/widgets/utility/logpanel/log_panel.pyproject +1 -0
  14. bec_widgets-1.21.0/bec_widgets/widgets/utility/logpanel/log_panel_plugin.py +54 -0
  15. bec_widgets-1.21.0/bec_widgets/widgets/utility/logpanel/logpanel.py +529 -0
  16. bec_widgets-1.21.0/bec_widgets/widgets/utility/logpanel/register_log_panel.py +15 -0
  17. bec_widgets-1.21.0/bec_widgets/widgets/utility/visual/dark_mode_button/__init__.py +0 -0
  18. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/pyproject.toml +4 -4
  19. bec_widgets-1.19.2/bec_widgets/widgets/__init__.py +0 -1
  20. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.git_hooks/pre-commit +0 -0
  21. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.gitignore +0 -0
  22. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.gitlab/issue_templates/bug_report_template.md +0 -0
  23. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  24. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.gitlab/issue_templates/feature_request_template.md +0 -0
  25. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.gitlab/merge_request_templates/default.md +0 -0
  26. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.gitlab-ci.yml +0 -0
  27. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.pylintrc +0 -0
  28. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/.readthedocs.yaml +0 -0
  29. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/LICENSE +0 -0
  30. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/README.md +0 -0
  31. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/__init__.py +0 -0
  32. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/applications/__init__.py +0 -0
  33. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/applications/alignment/__init__.py +0 -0
  34. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/applications/alignment/alignment_1d/__init__.py +0 -0
  35. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/applications/alignment/alignment_1d/alignment_1d.py +0 -0
  36. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/applications/alignment/alignment_1d/alignment_1d.ui +0 -0
  37. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/applications/bec_app.py +0 -0
  38. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/assets/app_icons/BEC-General-App.png +0 -0
  39. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/assets/app_icons/alignment_1d.png +0 -0
  40. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/assets/app_icons/bec_widgets_icon.png +0 -0
  41. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/__init__.py +0 -0
  42. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/auto_updates.py +0 -0
  43. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/client_utils.py +0 -0
  44. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/generate_cli.py +0 -0
  45. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/rpc/__init__.py +0 -0
  46. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/rpc/rpc_base.py +0 -0
  47. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/rpc/rpc_register.py +0 -0
  48. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/rpc/rpc_widget_handler.py +0 -0
  49. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/cli/server.py +0 -0
  50. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/__init__.py +0 -0
  51. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/general_app/__init__.py +0 -0
  52. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/general_app/general_app.py +0 -0
  53. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/general_app/general_app.ui +0 -0
  54. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/general_app/web_links.py +0 -0
  55. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  56. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  57. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
  58. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
  59. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
  60. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
  61. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
  62. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
  63. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
  64. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/__init__.py +0 -0
  65. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/collapsible_panel_manager.py +0 -0
  66. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/compact_popup.py +0 -0
  67. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/error_popups.py +0 -0
  68. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/palette_viewer.py +0 -0
  69. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/redis_message_waiter.py +0 -0
  70. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/round_frame.py +0 -0
  71. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/settings_dialog.py +0 -0
  72. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/side_panel.py +0 -0
  73. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/qt_utils/toolbar.py +0 -0
  74. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/tests/__init__.py +0 -0
  75. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/tests/utils.py +0 -0
  76. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/__init__.py +0 -0
  77. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/bec_connector.py +0 -0
  78. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/bec_designer.py +0 -0
  79. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/bec_dispatcher.py +0 -0
  80. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/bec_signal_proxy.py +0 -0
  81. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/bec_table.py +0 -0
  82. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/bec_widget.py +0 -0
  83. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/colors.py +0 -0
  84. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/container_utils.py +0 -0
  85. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/crosshair.py +0 -0
  86. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/entry_validator.py +0 -0
  87. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/filter_io.py +0 -0
  88. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/fps_counter.py +0 -0
  89. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/generate_designer_plugin.py +0 -0
  90. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/layout_manager.py +0 -0
  91. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/linear_region_selector.py +0 -0
  92. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/ophyd_kind_util.py +0 -0
  93. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/plot_indicator_items.py +0 -0
  94. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/plugin_templates/plugin.template +0 -0
  95. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/plugin_templates/register.template +0 -0
  96. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/plugin_utils.py +0 -0
  97. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/reference_utils.py +0 -0
  98. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/rpc_decorator.py +0 -0
  99. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/thread_checker.py +0 -0
  100. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/ui_loader.py +0 -0
  101. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/validator_delegate.py +0 -0
  102. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/widget_io.py +0 -0
  103. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/widget_state_manager.py +0 -0
  104. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/utils/yaml_dialog.py +0 -0
  105. {bec_widgets-1.19.2/bec_widgets/widgets/containers → bec_widgets-1.21.0/bec_widgets/widgets}/__init__.py +0 -0
  106. {bec_widgets-1.19.2/bec_widgets/widgets/containers/figure/plots → bec_widgets-1.21.0/bec_widgets/widgets/containers}/__init__.py +0 -0
  107. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/dock/__init__.py +0 -0
  108. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/dock/dock.py +0 -0
  109. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/dock/dock_area.pyproject +0 -0
  110. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/dock/dock_area_plugin.py +0 -0
  111. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/dock/register_dock_area.py +0 -0
  112. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/__init__.py +0 -0
  113. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/figure.py +0 -0
  114. {bec_widgets-1.19.2/bec_widgets/widgets/containers/figure/plots/image → bec_widgets-1.21.0/bec_widgets/widgets/containers/figure/plots}/__init__.py +0 -0
  115. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/axis_settings.py +0 -0
  116. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/axis_settings.ui +0 -0
  117. {bec_widgets-1.19.2/bec_widgets/widgets/containers/figure/plots/motor_map → bec_widgets-1.21.0/bec_widgets/widgets/containers/figure/plots/image}/__init__.py +0 -0
  118. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/image/image.py +0 -0
  119. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/image/image_item.py +0 -0
  120. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/image/image_processor.py +0 -0
  121. {bec_widgets-1.19.2/bec_widgets/widgets/containers/figure/plots/multi_waveform → bec_widgets-1.21.0/bec_widgets/widgets/containers/figure/plots/motor_map}/__init__.py +0 -0
  122. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/motor_map/motor_map.py +0 -0
  123. {bec_widgets-1.19.2/bec_widgets/widgets/containers/figure/plots/waveform → bec_widgets-1.21.0/bec_widgets/widgets/containers/figure/plots/multi_waveform}/__init__.py +0 -0
  124. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/multi_waveform/multi_waveform.py +0 -0
  125. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/plot_base.py +0 -0
  126. {bec_widgets-1.19.2/bec_widgets/widgets/containers/layout_manager → bec_widgets-1.21.0/bec_widgets/widgets/containers/figure/plots/waveform}/__init__.py +0 -0
  127. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/waveform/waveform.py +0 -0
  128. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/figure/plots/waveform/waveform_curve.py +0 -0
  129. {bec_widgets-1.19.2/bec_widgets/widgets/containers/main_window → bec_widgets-1.21.0/bec_widgets/widgets/containers/layout_manager}/__init__.py +0 -0
  130. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/layout_manager/layout_manager.py +0 -0
  131. {bec_widgets-1.19.2/bec_widgets/widgets/control → bec_widgets-1.21.0/bec_widgets/widgets/containers/main_window}/__init__.py +0 -0
  132. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/containers/main_window/main_window.py +0 -0
  133. {bec_widgets-1.19.2/bec_widgets/widgets/control/buttons → bec_widgets-1.21.0/bec_widgets/widgets/control}/__init__.py +0 -0
  134. {bec_widgets-1.19.2/bec_widgets/widgets/control/buttons/button_abort → bec_widgets-1.21.0/bec_widgets/widgets/control/buttons}/__init__.py +0 -0
  135. {bec_widgets-1.19.2/bec_widgets/widgets/control/buttons/button_reset → bec_widgets-1.21.0/bec_widgets/widgets/control/buttons/button_abort}/__init__.py +0 -0
  136. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_abort/abort_button.pyproject +0 -0
  137. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_abort/abort_button_plugin.py +0 -0
  138. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_abort/button_abort.py +0 -0
  139. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_abort/register_abort_button.py +0 -0
  140. {bec_widgets-1.19.2/bec_widgets/widgets/control/buttons/button_resume → bec_widgets-1.21.0/bec_widgets/widgets/control/buttons/button_reset}/__init__.py +0 -0
  141. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_reset/button_reset.py +0 -0
  142. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_reset/register_reset_button.py +0 -0
  143. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_reset/reset_button.pyproject +0 -0
  144. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_reset/reset_button_plugin.py +0 -0
  145. {bec_widgets-1.19.2/bec_widgets/widgets/control/buttons/stop_button → bec_widgets-1.21.0/bec_widgets/widgets/control/buttons/button_resume}/__init__.py +0 -0
  146. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_resume/button_resume.py +0 -0
  147. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_resume/register_resume_button.py +0 -0
  148. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_resume/resume_button.pyproject +0 -0
  149. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/button_resume/resume_button_plugin.py +0 -0
  150. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_control → bec_widgets-1.21.0/bec_widgets/widgets/control/buttons/stop_button}/__init__.py +0 -0
  151. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/stop_button/register_stop_button.py +0 -0
  152. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button.py +0 -0
  153. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button.pyproject +0 -0
  154. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button_plugin.py +0 -0
  155. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_control/position_indicator → bec_widgets-1.21.0/bec_widgets/widgets/control/device_control}/__init__.py +0 -0
  156. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_control/positioner_box/positioner_box → bec_widgets-1.21.0/bec_widgets/widgets/control/device_control/position_indicator}/__init__.py +0 -0
  157. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.py +0 -0
  158. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.pyproject +0 -0
  159. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator_plugin.py +0 -0
  160. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/position_indicator/register_position_indicator.py +0 -0
  161. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/__init__.py +0 -0
  162. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py +0 -0
  163. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py +0 -0
  164. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d → bec_widgets-1.21.0/bec_widgets/widgets/control/device_control/positioner_box/positioner_box}/__init__.py +0 -0
  165. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +0 -0
  166. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.pyproject +0 -0
  167. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.ui +0 -0
  168. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box_plugin.py +0 -0
  169. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/register_positioner_box.py +0 -0
  170. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_control/positioner_group → bec_widgets-1.21.0/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d}/__init__.py +0 -0
  171. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d.pyproject +0 -0
  172. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d_plugin.py +0 -0
  173. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +0 -0
  174. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui +0 -0
  175. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/register_positioner_box2_d.py +0 -0
  176. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.py +0 -0
  177. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.pyproject +0 -0
  178. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.ui +0 -0
  179. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line_plugin.py +0 -0
  180. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/register_positioner_control_line.py +0 -0
  181. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_input → bec_widgets-1.21.0/bec_widgets/widgets/control/device_control/positioner_group}/__init__.py +0 -0
  182. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py +0 -0
  183. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.pyproject +0 -0
  184. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plugin.py +0 -0
  185. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py +0 -0
  186. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_input/base_classes → bec_widgets-1.21.0/bec_widgets/widgets/control/device_input}/__init__.py +0 -0
  187. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_input/device_combobox → bec_widgets-1.21.0/bec_widgets/widgets/control/device_input/base_classes}/__init__.py +0 -0
  188. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py +0 -0
  189. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py +0 -0
  190. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_input/device_line_edit → bec_widgets-1.21.0/bec_widgets/widgets/control/device_input/device_combobox}/__init__.py +0 -0
  191. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box.pyproject +0 -0
  192. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box_plugin.py +0 -0
  193. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py +0 -0
  194. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/device_combobox/register_device_combo_box.py +0 -0
  195. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_input/signal_combobox → bec_widgets-1.21.0/bec_widgets/widgets/control/device_input/device_line_edit}/__init__.py +0 -0
  196. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py +0 -0
  197. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.pyproject +0 -0
  198. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit_plugin.py +0 -0
  199. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/device_line_edit/register_device_line_edit.py +0 -0
  200. {bec_widgets-1.19.2/bec_widgets/widgets/control/device_input/signal_line_edit → bec_widgets-1.21.0/bec_widgets/widgets/control/device_input/signal_combobox}/__init__.py +0 -0
  201. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/signal_combobox/register_signal_combo_box.py +0 -0
  202. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject +0 -0
  203. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box_plugin.py +0 -0
  204. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py +0 -0
  205. {bec_widgets-1.19.2/bec_widgets/widgets/dap → bec_widgets-1.21.0/bec_widgets/widgets/control/device_input/signal_line_edit}/__init__.py +0 -0
  206. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/signal_line_edit/register_signal_line_edit.py +0 -0
  207. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py +0 -0
  208. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.pyproject +0 -0
  209. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit_plugin.py +0 -0
  210. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/scan_control/__init__.py +0 -0
  211. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/scan_control/register_scan_control.py +0 -0
  212. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/scan_control/scan_control.py +0 -0
  213. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/scan_control/scan_control.pyproject +0 -0
  214. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/scan_control/scan_control_plugin.py +0 -0
  215. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/control/scan_control/scan_group_box.py +0 -0
  216. {bec_widgets-1.19.2/bec_widgets/widgets/dap/dap_combo_box → bec_widgets-1.21.0/bec_widgets/widgets/dap}/__init__.py +0 -0
  217. {bec_widgets-1.19.2/bec_widgets/widgets/dap/lmfit_dialog → bec_widgets-1.21.0/bec_widgets/widgets/dap/dap_combo_box}/__init__.py +0 -0
  218. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py +0 -0
  219. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.pyproject +0 -0
  220. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box_plugin.py +0 -0
  221. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/dap_combo_box/register_dap_combo_box.py +0 -0
  222. {bec_widgets-1.19.2/bec_widgets/widgets/editors → bec_widgets-1.21.0/bec_widgets/widgets/dap/lmfit_dialog}/__init__.py +0 -0
  223. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog.pyproject +0 -0
  224. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog_plugin.py +0 -0
  225. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog.py +0 -0
  226. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_compact.ui +0 -0
  227. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_vertical.ui +0 -0
  228. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/dap/lmfit_dialog/register_lm_fit_dialog.py +0 -0
  229. {bec_widgets-1.19.2/bec_widgets/widgets/editors/console → bec_widgets-1.21.0/bec_widgets/widgets/editors}/__init__.py +0 -0
  230. {bec_widgets-1.19.2/bec_widgets/widgets/editors/jupyter_console → bec_widgets-1.21.0/bec_widgets/widgets/editors/console}/__init__.py +0 -0
  231. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/console/console.py +0 -0
  232. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/console/console.pyproject +0 -0
  233. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/console/console_plugin.py +0 -0
  234. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/console/register_console.py +0 -0
  235. {bec_widgets-1.19.2/bec_widgets/widgets/editors/text_box → bec_widgets-1.21.0/bec_widgets/widgets/editors/jupyter_console}/__init__.py +0 -0
  236. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/jupyter_console/jupyter_console.py +0 -0
  237. {bec_widgets-1.19.2/bec_widgets/widgets/editors/vscode → bec_widgets-1.21.0/bec_widgets/widgets/editors/text_box}/__init__.py +0 -0
  238. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/text_box/register_text_box.py +0 -0
  239. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/text_box/text_box.pyproject +0 -0
  240. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/text_box/text_box_plugin.py +0 -0
  241. {bec_widgets-1.19.2/bec_widgets/widgets/editors/website → bec_widgets-1.21.0/bec_widgets/widgets/editors/vscode}/__init__.py +0 -0
  242. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/vscode/register_vs_code_editor.py +0 -0
  243. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/vscode/vs_code_editor.pyproject +0 -0
  244. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/vscode/vs_code_editor_plugin.py +0 -0
  245. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/vscode/vscode.py +0 -0
  246. {bec_widgets-1.19.2/bec_widgets/widgets/plots → bec_widgets-1.21.0/bec_widgets/widgets/editors/website}/__init__.py +0 -0
  247. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/website/register_website_widget.py +0 -0
  248. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/website/website.py +0 -0
  249. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/website/website_widget.pyproject +0 -0
  250. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/editors/website/website_widget_plugin.py +0 -0
  251. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/games/__init__.py +0 -0
  252. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/games/minesweeper.py +0 -0
  253. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/games/minesweeper.pyproject +0 -0
  254. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/games/minesweeper_plugin.py +0 -0
  255. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/games/register_minesweeper.py +0 -0
  256. {bec_widgets-1.19.2/bec_widgets/widgets/plots/image → bec_widgets-1.21.0/bec_widgets/widgets/plots}/__init__.py +0 -0
  257. {bec_widgets-1.19.2/bec_widgets/widgets/plots/motor_map → bec_widgets-1.21.0/bec_widgets/widgets/plots/image}/__init__.py +0 -0
  258. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/image/bec_image_widget.pyproject +0 -0
  259. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/image/bec_image_widget_plugin.py +0 -0
  260. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/image/image_widget.py +0 -0
  261. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/image/register_bec_image_widget.py +0 -0
  262. {bec_widgets-1.19.2/bec_widgets/widgets/plots/motor_map/motor_map_dialog → bec_widgets-1.21.0/bec_widgets/widgets/plots/motor_map}/__init__.py +0 -0
  263. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/motor_map/bec_motor_map_widget.pyproject +0 -0
  264. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/motor_map/bec_motor_map_widget_plugin.py +0 -0
  265. {bec_widgets-1.19.2/bec_widgets/widgets/plots/multi_waveform → bec_widgets-1.21.0/bec_widgets/widgets/plots/motor_map/motor_map_dialog}/__init__.py +0 -0
  266. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/motor_map/motor_map_dialog/motor_map_settings.py +0 -0
  267. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/motor_map/motor_map_dialog/motor_map_settings.ui +0 -0
  268. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/motor_map/motor_map_widget.py +0 -0
  269. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/motor_map/register_bec_motor_map_widget.py +0 -0
  270. {bec_widgets-1.19.2/bec_widgets/widgets/plots/waveform → bec_widgets-1.21.0/bec_widgets/widgets/plots/multi_waveform}/__init__.py +0 -0
  271. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/multi_waveform/bec_multi_waveform_widget.pyproject +0 -0
  272. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/multi_waveform/bec_multi_waveform_widget_plugin.py +0 -0
  273. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/multi_waveform/multi_waveform_controls.ui +0 -0
  274. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/multi_waveform/multi_waveform_widget.py +0 -0
  275. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/multi_waveform/register_bec_multi_waveform_widget.py +0 -0
  276. {bec_widgets-1.19.2/bec_widgets/widgets/plots/waveform/waveform_popups → bec_widgets-1.21.0/bec_widgets/widgets/plots/waveform}/__init__.py +0 -0
  277. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/waveform/bec_waveform_widget.pyproject +0 -0
  278. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/waveform/bec_waveform_widget_plugin.py +0 -0
  279. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/waveform/register_bec_waveform_widget.py +0 -0
  280. {bec_widgets-1.19.2/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog → bec_widgets-1.21.0/bec_widgets/widgets/plots/waveform/waveform_popups}/__init__.py +0 -0
  281. {bec_widgets-1.19.2/bec_widgets/widgets/plots/waveform/waveform_popups/dap_summary_dialog → bec_widgets-1.21.0/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog}/__init__.py +0 -0
  282. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/curve_dialog.py +0 -0
  283. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/curve_dialog.ui +0 -0
  284. {bec_widgets-1.19.2/bec_widgets/widgets/plots_next_gen/setting_menus → bec_widgets-1.21.0/bec_widgets/widgets/plots/waveform/waveform_popups/dap_summary_dialog}/__init__.py +0 -0
  285. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/waveform/waveform_popups/dap_summary_dialog/dap_summary_dialog.py +0 -0
  286. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots/waveform/waveform_widget.py +0 -0
  287. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots_next_gen/plot_base.py +0 -0
  288. {bec_widgets-1.19.2/bec_widgets/widgets/plots_next_gen/toolbar_bundles → bec_widgets-1.21.0/bec_widgets/widgets/plots_next_gen/setting_menus}/__init__.py +0 -0
  289. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings.py +0 -0
  290. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings_horizontal.ui +0 -0
  291. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings_vertical.ui +0 -0
  292. {bec_widgets-1.19.2/bec_widgets/widgets/progress → bec_widgets-1.21.0/bec_widgets/widgets/plots_next_gen/toolbar_bundles}/__init__.py +0 -0
  293. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/mouse_interactions.py +0 -0
  294. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/plot_export.py +0 -0
  295. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/save_state.py +0 -0
  296. {bec_widgets-1.19.2/bec_widgets/widgets/progress/bec_progressbar → bec_widgets-1.21.0/bec_widgets/widgets/progress}/__init__.py +0 -0
  297. {bec_widgets-1.19.2/bec_widgets/widgets/services → bec_widgets-1.21.0/bec_widgets/widgets/progress/bec_progressbar}/__init__.py +0 -0
  298. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar.pyproject +0 -0
  299. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar_plugin.py +0 -0
  300. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progressbar.py +0 -0
  301. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/bec_progressbar/register_bec_progress_bar.py +0 -0
  302. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/ring_progress_bar/__init__.py +0 -0
  303. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/ring_progress_bar/register_ring_progress_bar.py +0 -0
  304. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/ring_progress_bar/ring.py +0 -0
  305. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.py +0 -0
  306. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.pyproject +0 -0
  307. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar_plugin.py +0 -0
  308. {bec_widgets-1.19.2/bec_widgets/widgets/services/bec_queue → bec_widgets-1.21.0/bec_widgets/widgets/services}/__init__.py +0 -0
  309. {bec_widgets-1.19.2/bec_widgets/widgets/services/bec_status_box → bec_widgets-1.21.0/bec_widgets/widgets/services/bec_queue}/__init__.py +0 -0
  310. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_queue/bec_queue.py +0 -0
  311. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_queue/bec_queue.pyproject +0 -0
  312. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_queue/bec_queue_plugin.py +0 -0
  313. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_queue/register_bec_queue.py +0 -0
  314. {bec_widgets-1.19.2/bec_widgets/widgets/services/device_browser → bec_widgets-1.21.0/bec_widgets/widgets/services/bec_status_box}/__init__.py +0 -0
  315. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box.py +0 -0
  316. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box.pyproject +0 -0
  317. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box_plugin.py +0 -0
  318. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_status_box/register_bec_status_box.py +0 -0
  319. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/bec_status_box/status_item.py +0 -0
  320. {bec_widgets-1.19.2/bec_widgets/widgets/utility → bec_widgets-1.21.0/bec_widgets/widgets/services/device_browser}/__init__.py +0 -0
  321. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/device_browser/device_browser.py +0 -0
  322. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/device_browser/device_browser.pyproject +0 -0
  323. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/device_browser/device_browser.ui +0 -0
  324. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/device_browser/device_browser_plugin.py +0 -0
  325. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/device_browser/device_item/__init__.py +0 -0
  326. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/device_browser/device_item/device_item.py +0 -0
  327. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/services/device_browser/register_device_browser.py +0 -0
  328. {bec_widgets-1.19.2/bec_widgets/widgets/utility/spinner → bec_widgets-1.21.0/bec_widgets/widgets/utility}/__init__.py +0 -0
  329. {bec_widgets-1.19.2/bec_widgets/widgets/utility/toggle → bec_widgets-1.21.0/bec_widgets/widgets/utility/spinner}/__init__.py +0 -0
  330. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/spinner/register_spinner_widget.py +0 -0
  331. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/spinner/spinner.py +0 -0
  332. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/spinner/spinner_widget.pyproject +0 -0
  333. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/spinner/spinner_widget_plugin.py +0 -0
  334. {bec_widgets-1.19.2/bec_widgets/widgets/utility/visual → bec_widgets-1.21.0/bec_widgets/widgets/utility/toggle}/__init__.py +0 -0
  335. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/toggle/register_toggle_switch.py +0 -0
  336. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/toggle/toggle.py +0 -0
  337. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/toggle/toggle_switch.pyproject +0 -0
  338. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/toggle/toggle_switch_plugin.py +0 -0
  339. {bec_widgets-1.19.2/bec_widgets/widgets/utility/visual/color_button → bec_widgets-1.21.0/bec_widgets/widgets/utility/visual}/__init__.py +0 -0
  340. {bec_widgets-1.19.2/bec_widgets/widgets/utility/visual/colormap_selector → bec_widgets-1.21.0/bec_widgets/widgets/utility/visual/color_button}/__init__.py +0 -0
  341. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/color_button/color_button.py +0 -0
  342. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/color_button/color_button.pyproject +0 -0
  343. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/color_button/color_button_plugin.py +0 -0
  344. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/color_button/register_color_button.py +0 -0
  345. {bec_widgets-1.19.2/bec_widgets/widgets/utility/visual/colormap_widget → bec_widgets-1.21.0/bec_widgets/widgets/utility/visual/colormap_selector}/__init__.py +0 -0
  346. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.py +0 -0
  347. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.pyproject +0 -0
  348. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector_plugin.py +0 -0
  349. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/colormap_selector/register_colormap_selector.py +0 -0
  350. {bec_widgets-1.19.2/bec_widgets/widgets/utility/visual/dark_mode_button → bec_widgets-1.21.0/bec_widgets/widgets/utility/visual/colormap_widget}/__init__.py +0 -0
  351. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget.pyproject +0 -0
  352. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget_plugin.py +0 -0
  353. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/colormap_widget/colormap_widget.py +0 -0
  354. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/colormap_widget/register_bec_color_map_widget.py +0 -0
  355. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py +0 -0
  356. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject +0 -0
  357. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py +0 -0
  358. {bec_widgets-1.19.2 → bec_widgets-1.21.0}/bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py +0 -0
@@ -1,6 +1,26 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v1.21.0 (2025-02-17)
5
+
6
+ ### Features
7
+
8
+ - Generated form for scan metadata
9
+ ([`1708bd4`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/1708bd405f86b1353828b01fbf5f98383a19ec2a))
10
+
11
+
12
+ ## v1.20.0 (2025-02-06)
13
+
14
+ ### Features
15
+
16
+ - **widget**: Add LogPanel widget
17
+ ([`b3217b7`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/b3217b7ca5cabe8798f06787de4ae3f3ec1af3b6))
18
+
19
+ hopefully without segfaults - compared to first implementation: - explicitly set parent of all
20
+ dialog components - try/except and log for redis new message callback - pass in ServiceStatusMixin
21
+ and explicitly clean it up
22
+
23
+
4
24
  ## v1.19.2 (2025-02-06)
5
25
 
6
26
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 1.19.2
3
+ Version: 1.21.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
@@ -16,6 +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
20
  Requires-Dist: pyte
20
21
  Requires-Dist: qtconsole>=5.5.1,~=5.5
21
22
  Requires-Dist: qtpy~=2.4
@@ -28,5 +29,3 @@ Requires-Dist: pytest-random-order~=1.1; extra == 'dev'
28
29
  Requires-Dist: pytest-timeout~=2.2; extra == 'dev'
29
30
  Requires-Dist: pytest-xvfb~=3.0; extra == 'dev'
30
31
  Requires-Dist: pytest~=8.0; extra == 'dev'
31
- Provides-Extra: pyside6
32
- Requires-Dist: pyside6==6.7.2; extra == 'pyside6'
@@ -31,6 +31,7 @@ class Widgets(str, enum.Enum):
31
31
  DeviceComboBox = "DeviceComboBox"
32
32
  DeviceLineEdit = "DeviceLineEdit"
33
33
  LMFitDialog = "LMFitDialog"
34
+ LogPanel = "LogPanel"
34
35
  Minesweeper = "Minesweeper"
35
36
  PositionIndicator = "PositionIndicator"
36
37
  PositionerBox = "PositionerBox"
@@ -3183,6 +3184,26 @@ class LMFitDialog(RPCBase):
3183
3184
  """
3184
3185
 
3185
3186
 
3187
+ class LogPanel(RPCBase):
3188
+ @rpc_call
3189
+ def set_plain_text(self, text: str) -> None:
3190
+ """
3191
+ Set the plain text of the widget.
3192
+
3193
+ Args:
3194
+ text (str): The text to set.
3195
+ """
3196
+
3197
+ @rpc_call
3198
+ def set_html_text(self, text: str) -> None:
3199
+ """
3200
+ Set the HTML text of the widget.
3201
+
3202
+ Args:
3203
+ text (str): The text to set.
3204
+ """
3205
+
3206
+
3186
3207
  class Minesweeper(RPCBase): ...
3187
3208
 
3188
3209
 
@@ -30,6 +30,7 @@ from bec_widgets.widgets.plots.waveform.waveform_widget import BECWaveformWidget
30
30
  from bec_widgets.widgets.progress.ring_progress_bar.ring_progress_bar import RingProgressBar
31
31
  from bec_widgets.widgets.services.bec_queue.bec_queue import BECQueue
32
32
  from bec_widgets.widgets.services.bec_status_box.bec_status_box import BECStatusBox
33
+ from bec_widgets.widgets.utility.logpanel.logpanel import LogPanel
33
34
  from bec_widgets.widgets.utility.visual.dark_mode_button.dark_mode_button import DarkModeButton
34
35
 
35
36
 
@@ -139,6 +140,9 @@ class BECDockArea(BECWidget, QWidget):
139
140
  tooltip="Add Circular ProgressBar",
140
141
  filled=True,
141
142
  ),
143
+ "log_panel": MaterialIconAction(
144
+ icon_name=LogPanel.ICON_NAME, tooltip="Add LogPanel", filled=True
145
+ ),
142
146
  },
143
147
  ),
144
148
  "separator_2": SeparatorAction(),
@@ -200,6 +204,9 @@ class BECDockArea(BECWidget, QWidget):
200
204
  self.toolbar.widgets["menu_utils"].widgets["progress_bar"].triggered.connect(
201
205
  lambda: self.add_dock(widget="RingProgressBar", prefix="progress_bar")
202
206
  )
207
+ self.toolbar.widgets["menu_utils"].widgets["log_panel"].triggered.connect(
208
+ lambda: self.add_dock(widget="LogPanel", prefix="log_panel")
209
+ )
203
210
 
204
211
  # Icons
205
212
  self.toolbar.widgets["attach_all"].action.triggered.connect(self.attach_all)
@@ -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()
@@ -0,0 +1,146 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from qtpy.QtCore import QAbstractTableModel, QModelIndex, Qt, Signal # type: ignore
6
+ from qtpy.QtWidgets import (
7
+ QApplication,
8
+ QHBoxLayout,
9
+ QLabel,
10
+ QPushButton,
11
+ QTableView,
12
+ QVBoxLayout,
13
+ QWidget,
14
+ )
15
+
16
+ from bec_widgets.qt_utils.error_popups import SafeSlot
17
+
18
+
19
+ class AdditionalMetadataTableModel(QAbstractTableModel):
20
+ def __init__(self, data):
21
+ super().__init__()
22
+ self._data: list[list[str]] = data
23
+ self._disallowed_keys: list[str] = []
24
+
25
+ def headerData(
26
+ self, section: int, orientation: Qt.Orientation, role: int = Qt.ItemDataRole()
27
+ ) -> Any:
28
+ if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole:
29
+ return "Key" if section == 0 else "Value"
30
+ return super().headerData(section, orientation, role)
31
+
32
+ def rowCount(self, index: QModelIndex = QModelIndex()):
33
+ return 0 if index.isValid() else len(self._data)
34
+
35
+ def columnCount(self, index: QModelIndex = QModelIndex()):
36
+ return 0 if index.isValid() else 2
37
+
38
+ def data(self, index, role=Qt.ItemDataRole):
39
+ if index.isValid():
40
+ if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
41
+ return str(self._data[index.row()][index.column()])
42
+
43
+ def setData(self, index, value, role):
44
+ if role == Qt.ItemDataRole.EditRole:
45
+ if value in self._disallowed_keys or value in self._other_keys(index.row()):
46
+ return False
47
+ self._data[index.row()][index.column()] = str(value)
48
+ return True
49
+ return False
50
+
51
+ def update_disallowed_keys(self, keys: list[str]):
52
+ self._disallowed_keys = keys
53
+ for i, item in enumerate(self._data):
54
+ if item[0] in self._disallowed_keys:
55
+ self._data[i][0] = ""
56
+ self.dataChanged.emit(self.index(i, 0), self.index(i, 0))
57
+
58
+ def _other_keys(self, row: int):
59
+ return [r[0] for r in self._data[:row] + self._data[row + 1 :]]
60
+
61
+ def flags(self, _):
62
+ return Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsEditable
63
+
64
+ def insertRows(self, row, number, index):
65
+ """We only support adding one at a time for now"""
66
+ if row != self.rowCount() or number != 1:
67
+ return False
68
+ self.beginInsertRows(QModelIndex(), 0, 0)
69
+ self._data.append(["", ""])
70
+ self.endInsertRows()
71
+ return True
72
+
73
+ def removeRows(self, row, number, index):
74
+ """This can only be consecutive, so instead of trying to be clever, only support removing one at a time"""
75
+ if number != 1:
76
+ return False
77
+ self.beginRemoveRows(QModelIndex(), row, row)
78
+ del self._data[row]
79
+ self.endRemoveRows()
80
+ return True
81
+
82
+ @SafeSlot()
83
+ def add_row(self):
84
+ self.insertRow(self.rowCount())
85
+
86
+ @SafeSlot(list)
87
+ def delete_rows(self, rows: list[int]):
88
+ # delete from the end so indices stay correct
89
+ for row in sorted(rows, reverse=True):
90
+ self.removeRows(row, 1, QModelIndex())
91
+
92
+ def dump_dict(self):
93
+ if self._data == [[]]:
94
+ return {}
95
+ return dict(self._data)
96
+
97
+
98
+ class AdditionalMetadataTable(QWidget):
99
+
100
+ delete_rows = Signal(list)
101
+
102
+ def __init__(self, initial_data: list[list[str]]):
103
+ super().__init__()
104
+
105
+ self._layout = QHBoxLayout()
106
+ self.setLayout(self._layout)
107
+ self._table_model = AdditionalMetadataTableModel(initial_data)
108
+ self._table_view = QTableView()
109
+ self._table_view.setModel(self._table_model)
110
+ self._table_view.horizontalHeader().setStretchLastSection(True)
111
+ self._layout.addWidget(self._table_view)
112
+
113
+ self._buttons = QVBoxLayout()
114
+ self._layout.addLayout(self._buttons)
115
+ self._add_button = QPushButton("+")
116
+ self._add_button.setToolTip("add a new row")
117
+ self._remove_button = QPushButton("-")
118
+ self._remove_button.setToolTip("delete rows containing any selected cells")
119
+ self._buttons.addWidget(self._add_button)
120
+ self._buttons.addWidget(self._remove_button)
121
+ self._add_button.clicked.connect(self._table_model.add_row)
122
+ self._remove_button.clicked.connect(self.delete_selected_rows)
123
+ self.delete_rows.connect(self._table_model.delete_rows)
124
+
125
+ def delete_selected_rows(self):
126
+ cells: list[QModelIndex] = self._table_view.selectionModel().selectedIndexes()
127
+ row_indices = list({r.row() for r in cells})
128
+ if row_indices:
129
+ self.delete_rows.emit(row_indices)
130
+
131
+ def dump_dict(self):
132
+ return self._table_model.dump_dict()
133
+
134
+ def update_disallowed_keys(self, keys: list[str]):
135
+ self._table_model.update_disallowed_keys(keys)
136
+
137
+
138
+ if __name__ == "__main__": # pragma: no cover
139
+ from bec_widgets.utils.colors import set_theme
140
+
141
+ app = QApplication([])
142
+ set_theme("dark")
143
+
144
+ window = AdditionalMetadataTable([["key1", "value1"], ["key2", "value2"], ["key3", "value3"]])
145
+ window.show()
146
+ app.exec()