bec-widgets 0.70.0__tar.gz → 0.71.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 (214) hide show
  1. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/CHANGELOG.md +48 -62
  2. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/PKG-INFO +1 -1
  3. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/cli/client.py +19 -0
  4. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/cli/client_utils.py +4 -0
  5. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/widget_io.py +18 -2
  6. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_combobox/device_combobox.py +12 -4
  7. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_input_base.py +5 -2
  8. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit.py +18 -5
  9. bec_widgets-0.71.1/bec_widgets/widgets/scan_control/scan_control.py +212 -0
  10. bec_widgets-0.71.1/bec_widgets/widgets/scan_control/scan_group_box.py +223 -0
  11. bec_widgets-0.71.1/docs/user/widgets/scan_control.gif +0 -0
  12. bec_widgets-0.71.1/docs/user/widgets/scan_control.md +35 -0
  13. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/pyproject.toml +1 -1
  14. bec_widgets-0.71.1/tests/end-2-end/test_scan_control_e2e.py +71 -0
  15. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_device_input_base.py +4 -4
  16. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_device_input_widgets.py +10 -10
  17. bec_widgets-0.71.1/tests/unit_tests/test_scan_control.py +324 -0
  18. bec_widgets-0.71.1/tests/unit_tests/test_scan_control_group_box.py +160 -0
  19. bec_widgets-0.70.0/bec_widgets/widgets/scan_control/scan_control.py +0 -444
  20. bec_widgets-0.70.0/tests/unit_tests/test_scan_control.py +0 -184
  21. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.git_hooks/pre-commit +0 -0
  22. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.gitignore +0 -0
  23. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.gitlab/issue_templates/bug_report_template.md +0 -0
  24. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  25. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.gitlab/issue_templates/feature_request_template.md +0 -0
  26. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.gitlab/merge_request_templates/default.md +0 -0
  27. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.gitlab-ci.yml +0 -0
  28. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.pylintrc +0 -0
  29. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/.readthedocs.yaml +0 -0
  30. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/LICENSE +0 -0
  31. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/README.md +0 -0
  32. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/__init__.py +0 -0
  33. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/assets/bec_widgets_icon.png +0 -0
  34. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/assets/terminal_icon.png +0 -0
  35. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/cli/__init__.py +0 -0
  36. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/cli/auto_updates.py +0 -0
  37. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/cli/generate_cli.py +0 -0
  38. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/cli/rpc_register.py +0 -0
  39. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/cli/rpc_wigdet_handler.py +0 -0
  40. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/cli/server.py +0 -0
  41. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/__init__.py +0 -0
  42. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  43. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  44. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/jupyter_console/jupyter_console_window.ui +0 -0
  45. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/motor_movement/__init__.py +0 -0
  46. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/motor_movement/motor_control_compilations.py +0 -0
  47. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/motor_movement/motor_controller.ui +0 -0
  48. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
  49. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
  50. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
  51. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
  52. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
  53. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
  54. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
  55. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/__init__.py +0 -0
  56. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/bec_connector.py +0 -0
  57. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/bec_designer.py +0 -0
  58. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/bec_dispatcher.py +0 -0
  59. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/bec_table.py +0 -0
  60. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/colors.py +0 -0
  61. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/container_utils.py +0 -0
  62. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/crosshair.py +0 -0
  63. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/entry_validator.py +0 -0
  64. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/layout_manager.py +0 -0
  65. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/plugin_utils.py +0 -0
  66. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/rpc_decorator.py +0 -0
  67. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/thread_checker.py +0 -0
  68. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/ui_loader.py +0 -0
  69. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/validator_delegate.py +0 -0
  70. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/utils/yaml_dialog.py +0 -0
  71. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/__init__.py +0 -0
  72. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/bec_status_box/__init__.py +0 -0
  73. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/bec_status_box/bec_status_box.py +0 -0
  74. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/bec_status_box/status_item.py +0 -0
  75. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/buttons/__init__.py +0 -0
  76. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/buttons/stop_button/__init__.py +0 -0
  77. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/buttons/stop_button/stop_button.py +0 -0
  78. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/__init__.py +0 -0
  79. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_combobox/__init__.py +0 -0
  80. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_combobox/device_combobox.pyproject +0 -0
  81. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_combobox/device_combobox_plugin.py +0 -0
  82. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_combobox/launch_device_combobox.py +0 -0
  83. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_combobox/register_device_combobox.py +0 -0
  84. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_line_edit/__init__.py +0 -0
  85. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit.pyproject +0 -0
  86. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit_plugin.py +0 -0
  87. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_line_edit/launch_device_line_edit.py +0 -0
  88. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/device_inputs/device_line_edit/register_device_line_edit.py +0 -0
  89. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/dock/__init__.py +0 -0
  90. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/dock/dock.py +0 -0
  91. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/dock/dock_area.py +0 -0
  92. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/__init__.py +0 -0
  93. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/figure.py +0 -0
  94. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/__init__.py +0 -0
  95. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/image/__init__.py +0 -0
  96. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/image/image.py +0 -0
  97. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/image/image_item.py +0 -0
  98. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/image/image_processor.py +0 -0
  99. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/motor_map/__init__.py +0 -0
  100. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py +0 -0
  101. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/plot_base.py +0 -0
  102. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/waveform/__init__.py +0 -0
  103. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/waveform/waveform.py +0 -0
  104. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +0 -0
  105. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/jupyter_console/__init__.py +0 -0
  106. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/jupyter_console/jupyter_console.py +0 -0
  107. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/__init__.py +0 -0
  108. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/motor_control.py +0 -0
  109. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/motor_table/__init__.py +0 -0
  110. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/motor_table/motor_table.py +0 -0
  111. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/motor_table/motor_table.ui +0 -0
  112. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/movement_absolute/__init__.py +0 -0
  113. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.py +0 -0
  114. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.ui +0 -0
  115. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/movement_relative/__init__.py +0 -0
  116. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.py +0 -0
  117. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.ui +0 -0
  118. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/selection/__init__.py +0 -0
  119. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/selection/selection.py +0 -0
  120. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/motor_control/selection/selection.ui +0 -0
  121. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/scan_control/__init__.py +0 -0
  122. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/spiral_progress_bar/__init__.py +0 -0
  123. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/spiral_progress_bar/ring.py +0 -0
  124. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/spiral_progress_bar/spiral_progress_bar.py +0 -0
  125. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/text_box/__init__.py +0 -0
  126. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/text_box/text_box.py +0 -0
  127. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/toolbar/__init__.py +0 -0
  128. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/toolbar/toolbar.py +0 -0
  129. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/vscode/__init__.py +0 -0
  130. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/vscode/vscode.py +0 -0
  131. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/website/__init__.py +0 -0
  132. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/bec_widgets/widgets/website/website.py +0 -0
  133. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/Makefile +0 -0
  134. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/_static/custom.css +0 -0
  135. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/_templates/custom-class-template.rst +0 -0
  136. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/_templates/custom-module-template.rst +0 -0
  137. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/api_reference/api_reference.md +0 -0
  138. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/assets/apps_48dp.svg +0 -0
  139. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/assets/display_settings_48dp.svg +0 -0
  140. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/assets/index_api.svg +0 -0
  141. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/assets/index_contribute.svg +0 -0
  142. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/assets/index_getting_started.svg +0 -0
  143. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/assets/index_user_guide.svg +0 -0
  144. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/assets/rocket_launch_48dp.svg +0 -0
  145. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/conf.py +0 -0
  146. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/developer/developer.md +0 -0
  147. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/developer/getting_started/development.md +0 -0
  148. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/developer/getting_started/getting_started.md +0 -0
  149. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/developer/widgets/widgets.md +0 -0
  150. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/index.md +0 -0
  151. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/introduction/introduction.md +0 -0
  152. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/make.bat +0 -0
  153. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/requirements.txt +0 -0
  154. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/api_reference/api_reference.md +0 -0
  155. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/applications/applications.md +0 -0
  156. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/customisation.md +0 -0
  157. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/getting_started/BECDockArea.png +0 -0
  158. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/getting_started/auto_updates.md +0 -0
  159. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/getting_started/getting_started.md +0 -0
  160. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/getting_started/gui_complex_gui.gif +0 -0
  161. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/getting_started/installation.md +0 -0
  162. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/getting_started/quick_start.md +0 -0
  163. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/user.md +0 -0
  164. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/BECFigure.png +0 -0
  165. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/bec_figure.md +0 -0
  166. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/bec_status_box.gif +0 -0
  167. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/bec_status_box.md +0 -0
  168. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/buttons.md +0 -0
  169. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/image_plot.gif +0 -0
  170. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/motor.gif +0 -0
  171. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/progress_bar.gif +0 -0
  172. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/scatter_2D.gif +0 -0
  173. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/spiral_progress_bar.md +0 -0
  174. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/text_box.md +0 -0
  175. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/w1D.gif +0 -0
  176. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/website.md +0 -0
  177. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/docs/user/widgets/widgets.md +0 -0
  178. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/__init__.py +0 -0
  179. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/end-2-end/__init__.py +0 -0
  180. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/end-2-end/conftest.py +0 -0
  181. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/end-2-end/test_bec_dock_rpc_e2e.py +0 -0
  182. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/end-2-end/test_bec_figure_rpc_e2e.py +0 -0
  183. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/end-2-end/test_rpc_register_e2e.py +0 -0
  184. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/__init__.py +0 -0
  185. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/client_mocks.py +0 -0
  186. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/conftest.py +0 -0
  187. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_bec_connector.py +0 -0
  188. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_bec_dispatcher.py +0 -0
  189. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_bec_dock.py +0 -0
  190. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_bec_figure.py +0 -0
  191. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_bec_motor_map.py +0 -0
  192. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_bec_status_box.py +0 -0
  193. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_client_utils.py +0 -0
  194. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_color_validation.py +0 -0
  195. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_configs/config_device.yaml +0 -0
  196. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_configs/config_device_no_entry.yaml +0 -0
  197. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_configs/config_scan.yaml +0 -0
  198. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_crosshair.py +0 -0
  199. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_generate_cli_client.py +0 -0
  200. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_motor_control.py +0 -0
  201. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_msgs/__init__.py +0 -0
  202. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_msgs/available_scans_message.py +0 -0
  203. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_plot_base.py +0 -0
  204. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_plugin_utils.py +0 -0
  205. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_rpc_register.py +0 -0
  206. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_rpc_widget_handler.py +0 -0
  207. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_spiral_progress_bar.py +0 -0
  208. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_stop_button.py +0 -0
  209. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_text_box_widget.py +0 -0
  210. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_vscode_widget.py +0 -0
  211. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_waveform1d.py +0 -0
  212. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_website_widget.py +0 -0
  213. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_widget_io.py +0 -0
  214. {bec_widgets-0.70.0 → bec_widgets-0.71.1}/tests/unit_tests/test_yaml_dialog.py +0 -0
@@ -1,5 +1,53 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.71.1 (2024-06-23)
4
+
5
+ ### Fix
6
+
7
+ * fix: don't print exception if the auto-update module cannot be found in plugins ([`860517a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/860517a3211075d1f6e2af7fa6a567b9e0cd77f3))
8
+
9
+ ## v0.71.0 (2024-06-23)
10
+
11
+ ### Feature
12
+
13
+ * feat(scan_group_box): scan box for args and kwargs separated from ScanControlGUI code ([`d8cf441`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/d8cf44134c30063e586771f9068947fef7a306d1))
14
+
15
+ ### Fix
16
+
17
+ * fix(cleanup): cleanup added to device_input widgets and scan_control ([`8badb6a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/8badb6adc1d003dbf0b2b1a800c34821f3fc9aa3))
18
+
19
+ * fix(scan_group_box): added row counter based on widgets ([`37682e7`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/37682e7b8a6ede38308880d285e41a948d6fe831))
20
+
21
+ * fix(scan_control): added default min limit for args bundle if specified ([`ec4574e`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/ec4574ed5c2c85ea6fbbe2b98f162a8e1220653b))
22
+
23
+ * fix(scan_control): argbox delete later added to prevent overlapping gui if scan changed ([`7ce3a83`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/7ce3a83c58cb69c2bf7cb7f4eaba7e6a2ca6c546))
24
+
25
+ * fix(scan_control): only scans with defined gui_config are allowed ([`6dff187`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6dff1879c4178df0f8ebfd35101acdebb028d572))
26
+
27
+ * fix(WidgetIO): find handlers within base classes ([`ca85638`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/ca856384f380dabf28d43f1cd48511af784c035b))
28
+
29
+ * fix(scan_control): adapted widget to scan BEC gui config ([`8b822e0`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/8b822e0fa8e28f080b9a4bf81948a7280a4c07bf))
30
+
31
+ * fix(scan_control): scan_control.py combatible with the newest BEC versions, test disabled ([`67d398c`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/67d398caf74e08ab25a70cc5d85a5f0c2de8212d))
32
+
33
+ ### Refactor
34
+
35
+ * refactor(device_line_edit): renamed default_device to default ([`4e2c9df`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/4e2c9df6a4979d935285fd7eba17fd7fd455a35c))
36
+
37
+ ### Test
38
+
39
+ * test(scan_control): tests added ([`56e74a0`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/56e74a0e7da72d18e89bc30d1896dbf9ef97cd6b))
40
+
41
+ ### Unknown
42
+
43
+ * test(scan_control):e2e tests added ([`83001a0`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/83001a0d8267e1320549b07032857dcf46ecd293))
44
+
45
+ * doc(scan_control): docs added ([`1b7921a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/1b7921a7f2e3bcc846219a2a7aa0de0fd27bb8fe))
46
+
47
+ * fix(device_line_edit):SizePolicy fixed for 100 horizontal ([`21d20e0`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/21d20e0fc78e9a3853abe802733388cce119ce20))
48
+
49
+ * tests WIP ([`c09644b`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/c09644b29ddb291c91dc58bcd6ebf02ff45cab36))
50
+
3
51
  ## v0.70.0 (2024-06-21)
4
52
 
5
53
  ### Documentation
@@ -100,68 +148,6 @@ in their parent process ([`ce37416`](https://gitlab.psi.ch/bec/bec_widgets/-/com
100
148
 
101
149
  ## v0.65.0 (2024-06-20)
102
150
 
103
- ### Feature
104
-
105
- * feat(device_input): DeviceLineEdit with QCompleter added ([`50e41ff`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/50e41ff26160ec26d77feb6d519e4dad902a9b9b))
106
-
107
- * feat(device_combobox): DeviceInputBase and DeviceComboBox added ([`430b282`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/430b282039806e3fbc6cf98e958861a065760620))
108
-
109
- ### Fix
110
-
111
- * fix(device_input_base): bug with setting config and overwriting default device and filter ([`d79f7e9`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/d79f7e9ccde03dc77819ca556c79736d30f7821a))
112
-
113
151
  ### Test
114
152
 
115
153
  * test(device_input): tests added ([`1a0a98a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/1a0a98a45367db414bed813bbd346b3e1ae8d550))
116
-
117
- ## v0.64.2 (2024-06-19)
118
-
119
- ### Fix
120
-
121
- * fix(client_utils): added close rpc command to shutdown of gui from bec_ipython_client ([`e5a7d47`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/e5a7d47b21cbf066f740f1d11d7c9ea7c70f3080))
122
-
123
- ## v0.64.1 (2024-06-19)
124
-
125
- ### Fix
126
-
127
- * fix(widgets): removed widget module import of sub widgets ([`216511b`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/216511b951ff0e15b6d7c70133095f3ac45c23f4))
128
-
129
- ### Refactor
130
-
131
- * refactor(utils): moved get_rpc_widgets to plugin_utils ([`6dabbf8`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6dabbf874fbbdde89c34a7885bf95aa9c895a28b))
132
-
133
- ### Test
134
-
135
- * test: moved rpc_classes test ([`b3575eb`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/b3575eb06852b456cde915dfda281a3e778e3aeb))
136
-
137
- ## v0.64.0 (2024-06-19)
138
-
139
- ### Ci
140
-
141
- * ci: add job optional dependency check ([`27426ce`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/27426ce7a52b4cbad7f3bef114d6efe6ad73bd7f))
142
-
143
- ### Documentation
144
-
145
- * docs: fix links in developer section ([`9e16f2f`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/9e16f2faf9c59a5d36ae878512c5a910cca31e69))
146
-
147
- * docs: refactor developer section, add widget tutorial ([`2a36d93`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/2a36d9364f242bf42e4cda4b50e6f46aa3833bbd))
148
-
149
- ### Feature
150
-
151
- * feat: add option to change size of the fonts ([`ea805d1`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/ea805d1362fc084d3b703b6f81b0180072f0825d))
152
-
153
- ### Fix
154
-
155
- * fix(plot_base): font size is set with setScale which is scaling the whole legend window ([`5d66720`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/5d6672069ea1cbceb62104f66c127e4e3c23e4a4))
156
-
157
- ### Test
158
-
159
- * test: add tests ([`140ad83`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/140ad83380808928edf7953e23c762ab72a0a1e9))
160
-
161
- ## v0.63.2 (2024-06-14)
162
-
163
- ### Fix
164
-
165
- * fix: do not import "server" in client, prevents from having trouble with QApplication creation order
166
-
167
- Like with QtWebEngine ([`6f96498`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6f96498de66358b89f3a2035627eed2e02dde5a1))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.70.0
3
+ Version: 0.71.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
@@ -17,6 +17,7 @@ class Widgets(str, enum.Enum):
17
17
  BECDock = "BECDock"
18
18
  BECDockArea = "BECDockArea"
19
19
  BECFigure = "BECFigure"
20
+ ScanControl = "ScanControl"
20
21
  SpiralProgressBar = "SpiralProgressBar"
21
22
  TextBox = "TextBox"
22
23
  VSCodeEditor = "VSCodeEditor"
@@ -1823,6 +1824,24 @@ class Ring(RPCBase):
1823
1824
  """
1824
1825
 
1825
1826
 
1827
+ class ScanControl(RPCBase):
1828
+ @property
1829
+ @rpc_call
1830
+ def config_dict(self) -> "dict":
1831
+ """
1832
+ Get the configuration of the widget.
1833
+
1834
+ Returns:
1835
+ dict: The configuration of the widget.
1836
+ """
1837
+
1838
+ @rpc_call
1839
+ def get_all_rpc(self) -> "dict":
1840
+ """
1841
+ Get all registered RPC objects.
1842
+ """
1843
+
1844
+
1826
1845
  class SpiralProgressBar(RPCBase):
1827
1846
  @rpc_call
1828
1847
  def get_all_rpc(self) -> "dict":
@@ -141,6 +141,10 @@ class BECGuiClientMixin:
141
141
  for ep in eps:
142
142
  if ep.name == "plugin_widgets_update":
143
143
  try:
144
+ spec = importlib.util.find_spec(ep.module)
145
+ # if the module is not found, we skip it
146
+ if spec is None:
147
+ continue
144
148
  return ep.load()(gui=self)
145
149
  except Exception as e:
146
150
  print(f"Error loading auto update script from plugin: {str(e)}")
@@ -119,7 +119,7 @@ class WidgetIO:
119
119
  widget: Widget instance.
120
120
  ignore_errors(bool, optional): Whether to ignore if no handler is found.
121
121
  """
122
- handler_class = WidgetIO._handlers.get(type(widget))
122
+ handler_class = WidgetIO._find_handler(widget)
123
123
  if handler_class:
124
124
  return handler_class().get_value(widget) # Instantiate the handler
125
125
  if not ignore_errors:
@@ -136,12 +136,28 @@ class WidgetIO:
136
136
  value: Value to set.
137
137
  ignore_errors(bool, optional): Whether to ignore if no handler is found.
138
138
  """
139
- handler_class = WidgetIO._handlers.get(type(widget))
139
+ handler_class = WidgetIO._find_handler(widget)
140
140
  if handler_class:
141
141
  handler_class().set_value(widget, value) # Instantiate the handler
142
142
  elif not ignore_errors:
143
143
  raise ValueError(f"No handler for widget type: {type(widget)}")
144
144
 
145
+ @staticmethod
146
+ def _find_handler(widget):
147
+ """
148
+ Find the appropriate handler for the widget by checking its base classes.
149
+
150
+ Args:
151
+ widget: Widget instance.
152
+
153
+ Returns:
154
+ handler_class: The handler class if found, otherwise None.
155
+ """
156
+ for base in type(widget).__mro__:
157
+ if base in WidgetIO._handlers:
158
+ return WidgetIO._handlers[base]
159
+ return None
160
+
145
161
 
146
162
  ################## for exporting and importing widget hierarchies ##################
147
163
 
@@ -18,7 +18,7 @@ class DeviceComboBox(DeviceInputBase, QComboBox):
18
18
  config: Device input configuration.
19
19
  gui_id: GUI ID.
20
20
  device_filter: Device filter, name of the device class.
21
- default_device: Default device name.
21
+ default: Default device name.
22
22
  arg_name: Argument name, can be used for the other widgets which has to call some other function in bec using correct argument names.
23
23
  """
24
24
 
@@ -29,7 +29,7 @@ class DeviceComboBox(DeviceInputBase, QComboBox):
29
29
  config: DeviceInputConfig = None,
30
30
  gui_id: str | None = None,
31
31
  device_filter: str | None = None,
32
- default_device: str | None = None,
32
+ default: str | None = None,
33
33
  arg_name: str | None = None,
34
34
  ):
35
35
  super().__init__(client=client, config=config, gui_id=gui_id)
@@ -41,8 +41,8 @@ class DeviceComboBox(DeviceInputBase, QComboBox):
41
41
  self.config.arg_name = arg_name
42
42
  if device_filter is not None:
43
43
  self.set_device_filter(device_filter)
44
- if default_device is not None:
45
- self.set_default_device(default_device)
44
+ if default is not None:
45
+ self.set_default_device(default)
46
46
 
47
47
  def set_device_filter(self, device_filter: str):
48
48
  """
@@ -82,3 +82,11 @@ class DeviceComboBox(DeviceInputBase, QComboBox):
82
82
  if device_obj is None:
83
83
  raise ValueError(f"Device {device_name} is not found.")
84
84
  return device_obj
85
+
86
+ def cleanup(self):
87
+ """Cleanup the widget."""
88
+ super().cleanup()
89
+
90
+ def closeEvent(self, event):
91
+ super().cleanup()
92
+ QComboBox().closeEvent(event)
@@ -5,7 +5,7 @@ from bec_widgets.utils import BECConnector, ConnectionConfig
5
5
 
6
6
  class DeviceInputConfig(ConnectionConfig):
7
7
  device_filter: str | list[str] | None = None
8
- default_device: str | None = None
8
+ default: str | None = None
9
9
  arg_name: str | None = None
10
10
 
11
11
 
@@ -65,7 +65,7 @@ class DeviceInputBase(BECConnector):
65
65
  default_device(str): Default device name.
66
66
  """
67
67
  self.validate_device(default_device)
68
- self.config.default_device = default_device
68
+ self.config.default = default_device
69
69
 
70
70
  def get_device_list(self, filter: str | list[str] | None = None) -> list[str]:
71
71
  """
@@ -118,3 +118,6 @@ class DeviceInputBase(BECConnector):
118
118
  """
119
119
  if device not in self.get_device_list(self.config.device_filter):
120
120
  raise ValueError(f"Device {device} is not valid.")
121
+
122
+ def cleanup(self):
123
+ super().cleanup()
@@ -1,6 +1,7 @@
1
1
  from typing import TYPE_CHECKING
2
2
 
3
- from qtpy.QtWidgets import QCompleter, QLineEdit
3
+ from qtpy.QtCore import QSize
4
+ from qtpy.QtWidgets import QCompleter, QLineEdit, QSizePolicy
4
5
 
5
6
  from bec_widgets.widgets.device_inputs.device_input_base import DeviceInputBase, DeviceInputConfig
6
7
 
@@ -18,7 +19,7 @@ class DeviceLineEdit(DeviceInputBase, QLineEdit):
18
19
  config: Device input configuration.
19
20
  gui_id: GUI ID.
20
21
  device_filter: Device filter, name of the device class.
21
- default_device: Default device name.
22
+ default: Default device name.
22
23
  arg_name: Argument name, can be used for the other widgets which has to call some other function in bec using correct argument names.
23
24
  """
24
25
 
@@ -29,7 +30,7 @@ class DeviceLineEdit(DeviceInputBase, QLineEdit):
29
30
  config: DeviceInputConfig = None,
30
31
  gui_id: str | None = None,
31
32
  device_filter: str | list[str] | None = None,
32
- default_device: str | None = None,
33
+ default: str | None = None,
33
34
  arg_name: str | None = None,
34
35
  ):
35
36
  QLineEdit.__init__(self, parent=parent)
@@ -41,10 +42,14 @@ class DeviceLineEdit(DeviceInputBase, QLineEdit):
41
42
 
42
43
  if arg_name is not None:
43
44
  self.config.arg_name = arg_name
45
+ self.arg_name = arg_name
44
46
  if device_filter is not None:
45
47
  self.set_device_filter(device_filter)
46
- if default_device is not None:
47
- self.set_default_device(default_device)
48
+ if default is not None:
49
+ self.set_default_device(default)
50
+
51
+ self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
52
+ self.setMinimumSize(QSize(100, 0))
48
53
 
49
54
  def set_device_filter(self, device_filter: str | list[str]):
50
55
  """
@@ -89,3 +94,11 @@ class DeviceLineEdit(DeviceInputBase, QLineEdit):
89
94
  if device_obj is None:
90
95
  raise ValueError(f"Device {device_name} is not found.")
91
96
  return device_obj
97
+
98
+ def cleanup(self):
99
+ """Cleanup the widget."""
100
+ super().cleanup()
101
+
102
+ def closeEvent(self, event):
103
+ super().cleanup()
104
+ QLineEdit().closeEvent(event)
@@ -0,0 +1,212 @@
1
+ import qdarktheme
2
+ from bec_lib.endpoints import MessageEndpoints
3
+ from qtpy.QtWidgets import (
4
+ QApplication,
5
+ QComboBox,
6
+ QGridLayout,
7
+ QGroupBox,
8
+ QPushButton,
9
+ QSizePolicy,
10
+ QVBoxLayout,
11
+ QWidget,
12
+ )
13
+
14
+ from bec_widgets.utils import BECConnector
15
+ from bec_widgets.widgets.buttons.stop_button.stop_button import StopButton
16
+ from bec_widgets.widgets.scan_control.scan_group_box import ScanGroupBox
17
+
18
+
19
+ class ScanControl(BECConnector, QWidget):
20
+
21
+ def __init__(
22
+ self, parent=None, client=None, gui_id: str | None = None, allowed_scans: list | None = None
23
+ ):
24
+ super().__init__(client=client, gui_id=gui_id)
25
+ QWidget.__init__(self, parent=parent)
26
+
27
+ # Client from BEC + shortcuts to device manager and scans
28
+ self.get_bec_shortcuts()
29
+
30
+ # Main layout
31
+ self.layout = QVBoxLayout(self)
32
+ self.arg_box = None
33
+ self.kwarg_boxes = []
34
+ self.expert_mode = False # TODO implement in the future versions
35
+
36
+ # Scan list - allowed scans for the GUI
37
+ self.allowed_scans = allowed_scans
38
+
39
+ # Create and set main layout
40
+ self._init_UI()
41
+
42
+ def _init_UI(self):
43
+ """
44
+ Initializes the UI of the scan control widget. Create the top box for scan selection and populate scans to main combobox.
45
+ """
46
+
47
+ # Scan selection group box
48
+ self.scan_selection_group = self.create_scan_selection_group()
49
+ self.scan_selection_group.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
50
+ self.layout.addWidget(self.scan_selection_group)
51
+
52
+ # Connect signals
53
+ self.comboBox_scan_selection.currentIndexChanged.connect(self.on_scan_selected)
54
+ self.button_run_scan.clicked.connect(self.run_scan)
55
+ self.button_add_bundle.clicked.connect(self.add_arg_bundle)
56
+ self.button_remove_bundle.clicked.connect(self.remove_arg_bundle)
57
+
58
+ # Initialize scan selection
59
+ self.populate_scans()
60
+
61
+ def create_scan_selection_group(self) -> QGroupBox:
62
+ """
63
+ Creates the scan selection group box with combobox to select the scan and start/stop button.
64
+
65
+ Returns:
66
+ QGroupBox: Group box containing the scan selection widgets.
67
+ """
68
+
69
+ scan_selection_group = QGroupBox("Scan Selection", self)
70
+ self.scan_selection_layout = QGridLayout(scan_selection_group)
71
+ self.comboBox_scan_selection = QComboBox(scan_selection_group)
72
+ # Run button
73
+ self.button_run_scan = QPushButton("Start", scan_selection_group)
74
+ self.button_run_scan.setStyleSheet("background-color: #559900; color: white")
75
+ # Stop button
76
+ self.button_stop_scan = StopButton(parent=scan_selection_group)
77
+ # Add bundle button
78
+ self.button_add_bundle = QPushButton("Add Bundle", scan_selection_group)
79
+ # Remove bundle button
80
+ self.button_remove_bundle = QPushButton("Remove Bundle", scan_selection_group)
81
+
82
+ self.scan_selection_layout.addWidget(self.comboBox_scan_selection, 0, 0, 1, 2)
83
+ self.scan_selection_layout.addWidget(self.button_run_scan, 1, 0)
84
+ self.scan_selection_layout.addWidget(self.button_stop_scan, 1, 1)
85
+ self.scan_selection_layout.addWidget(self.button_add_bundle, 2, 0)
86
+ self.scan_selection_layout.addWidget(self.button_remove_bundle, 2, 1)
87
+
88
+ return scan_selection_group
89
+
90
+ def populate_scans(self):
91
+ """Populates the scan selection combo box with available scans from BEC session."""
92
+ self.available_scans = self.client.connector.get(
93
+ MessageEndpoints.available_scans()
94
+ ).resource
95
+ if self.allowed_scans is None:
96
+ supported_scans = ["ScanBase", "SyncFlyScanBase", "AsyncFlyScanBase"]
97
+ allowed_scans = [
98
+ scan_name
99
+ for scan_name, scan_info in self.available_scans.items()
100
+ if scan_info["base_class"] in supported_scans and len(scan_info["gui_config"]) > 0
101
+ ]
102
+
103
+ else:
104
+ allowed_scans = self.allowed_scans
105
+ self.comboBox_scan_selection.addItems(allowed_scans)
106
+
107
+ def on_scan_selected(self):
108
+ """Callback for scan selection combo box"""
109
+ self.reset_layout()
110
+ selected_scan_name = self.comboBox_scan_selection.currentText()
111
+ selected_scan_info = self.available_scans.get(selected_scan_name, {})
112
+
113
+ gui_config = selected_scan_info.get("gui_config", {})
114
+ self.arg_group = gui_config.get("arg_group", None)
115
+ self.kwarg_groups = gui_config.get("kwarg_groups", None)
116
+
117
+ if self.arg_box is None:
118
+ self.button_add_bundle.setEnabled(False)
119
+ self.button_remove_bundle.setEnabled(False)
120
+
121
+ if len(self.arg_group["arg_inputs"]) > 0:
122
+ self.button_add_bundle.setEnabled(True)
123
+ self.button_remove_bundle.setEnabled(True)
124
+ self.add_arg_group(self.arg_group)
125
+ if len(self.kwarg_groups) > 0:
126
+ self.add_kwargs_boxes(self.kwarg_groups)
127
+
128
+ self.update()
129
+ self.adjustSize()
130
+
131
+ def add_kwargs_boxes(self, groups: list):
132
+ """
133
+ Adds the given gui_groups to the scan control layout.
134
+
135
+ Args:
136
+ groups(list): List of dictionaries containing the gui_group information.
137
+ """
138
+ for group in groups:
139
+ box = ScanGroupBox(box_type="kwargs", config=group)
140
+ box.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
141
+ self.layout.addWidget(box)
142
+ self.kwarg_boxes.append(box)
143
+
144
+ def add_arg_group(self, group: dict):
145
+ """
146
+ Adds the given gui_groups to the scan control layout.
147
+
148
+ Args:
149
+ """
150
+ self.arg_box = ScanGroupBox(box_type="args", config=group)
151
+ self.arg_box.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
152
+ self.layout.addWidget(self.arg_box)
153
+
154
+ def add_arg_bundle(self):
155
+ self.arg_box.add_widget_bundle()
156
+
157
+ def remove_arg_bundle(self):
158
+ self.arg_box.remove_widget_bundle()
159
+
160
+ def reset_layout(self):
161
+ """Clears the scan control layout from GuiGroups and ArgGroups boxes."""
162
+ if self.arg_box is not None:
163
+ self.layout.removeWidget(self.arg_box)
164
+ self.arg_box.deleteLater()
165
+ self.arg_box = None
166
+ if self.kwarg_boxes != []:
167
+ self.remove_kwarg_boxes()
168
+
169
+ def remove_kwarg_boxes(self):
170
+ for box in self.kwarg_boxes:
171
+ self.layout.removeWidget(box)
172
+ box.deleteLater()
173
+ self.kwarg_boxes = []
174
+
175
+ def run_scan(self):
176
+ args = []
177
+ kwargs = {}
178
+ if self.arg_box is not None:
179
+ args = self.arg_box.get_parameters()
180
+ for box in self.kwarg_boxes:
181
+ box_kwargs = box.get_parameters()
182
+ kwargs.update(box_kwargs)
183
+ scan_function = getattr(self.scans, self.comboBox_scan_selection.currentText())
184
+ if callable(scan_function):
185
+ scan_function(*args, **kwargs)
186
+
187
+ def cleanup(self):
188
+ self.button_stop_scan.cleanup()
189
+ if self.arg_box:
190
+ for widget in self.arg_box.widgets:
191
+ if hasattr(widget, "cleanup"):
192
+ widget.cleanup()
193
+ for kwarg_box in self.kwarg_boxes:
194
+ for widget in kwarg_box.widgets:
195
+ if hasattr(widget, "cleanup"):
196
+ widget.cleanup()
197
+ super().cleanup()
198
+
199
+ def closeEvent(self, event):
200
+ self.cleanup()
201
+ QWidget().closeEvent(event)
202
+
203
+
204
+ # Application example
205
+ if __name__ == "__main__": # pragma: no cover
206
+ app = QApplication([])
207
+ scan_control = ScanControl()
208
+
209
+ qdarktheme.setup_theme("auto")
210
+ window = scan_control
211
+ window.show()
212
+ app.exec()