bec-widgets 0.105.0__tar.gz → 0.107.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 (252) hide show
  1. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/CHANGELOG.md +32 -26
  2. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/PKG-INFO +1 -1
  3. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/cli/client.py +53 -7
  4. bec_widgets-0.107.0/bec_widgets/utils/linear_region_selector.py +72 -0
  5. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/axis_settings.py +3 -0
  6. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/axis_settings.ui +38 -17
  7. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/plot_base.py +14 -0
  8. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/waveform/waveform.py +126 -8
  9. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/waveform_popups/curve_dialog/curve_dialog.py +6 -14
  10. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/waveform_widget.py +78 -7
  11. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/pyproject.toml +1 -1
  12. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.git_hooks/pre-commit +0 -0
  13. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.gitignore +0 -0
  14. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.gitlab/issue_templates/bug_report_template.md +0 -0
  15. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  16. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.gitlab/issue_templates/feature_request_template.md +0 -0
  17. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.gitlab/merge_request_templates/default.md +0 -0
  18. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.gitlab-ci.yml +0 -0
  19. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.pylintrc +0 -0
  20. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/.readthedocs.yaml +0 -0
  21. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/LICENSE +0 -0
  22. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/README.md +0 -0
  23. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/__init__.py +0 -0
  24. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/assets/app_icons/BEC-General-App.png +0 -0
  25. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/assets/app_icons/bec_widgets_icon.png +0 -0
  26. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/assets/status_icons/error.svg +0 -0
  27. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/assets/status_icons/not_connected.svg +0 -0
  28. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/assets/status_icons/refresh.svg +0 -0
  29. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/assets/status_icons/running.svg +0 -0
  30. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/assets/status_icons/warning.svg +0 -0
  31. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/cli/__init__.py +0 -0
  32. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/cli/auto_updates.py +0 -0
  33. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/cli/client_utils.py +0 -0
  34. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/cli/generate_cli.py +0 -0
  35. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/cli/rpc_register.py +0 -0
  36. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/cli/rpc_wigdet_handler.py +0 -0
  37. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/cli/server.py +0 -0
  38. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/__init__.py +0 -0
  39. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/general_app/__init__.py +0 -0
  40. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/general_app/general_app.py +0 -0
  41. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/general_app/general_app.ui +0 -0
  42. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/general_app/web_links.py +0 -0
  43. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  44. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  45. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
  46. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
  47. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
  48. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
  49. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
  50. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
  51. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
  52. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/qt_utils/__init__.py +0 -0
  53. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/qt_utils/error_popups.py +0 -0
  54. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/qt_utils/redis_message_waiter.py +0 -0
  55. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/qt_utils/settings_dialog.py +0 -0
  56. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/qt_utils/toolbar.py +0 -0
  57. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/__init__.py +0 -0
  58. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/bec_connector.py +0 -0
  59. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/bec_designer.py +0 -0
  60. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/bec_dispatcher.py +0 -0
  61. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/bec_table.py +0 -0
  62. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/bec_widget.py +0 -0
  63. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/colors.py +0 -0
  64. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/container_utils.py +0 -0
  65. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/crosshair.py +0 -0
  66. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/entry_validator.py +0 -0
  67. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/generate_designer_plugin.py +0 -0
  68. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/layout_manager.py +0 -0
  69. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/plugin_templates/plugin.template +0 -0
  70. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/plugin_templates/register.template +0 -0
  71. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/plugin_utils.py +0 -0
  72. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/reference_utils.py +0 -0
  73. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/rpc_decorator.py +0 -0
  74. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/thread_checker.py +0 -0
  75. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/ui_loader.py +0 -0
  76. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/validator_delegate.py +0 -0
  77. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/widget_io.py +0 -0
  78. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/utils/yaml_dialog.py +0 -0
  79. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/__init__.py +0 -0
  80. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/base_classes/__init__.py +0 -0
  81. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/base_classes/device_input_base.py +0 -0
  82. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_queue/__init__.py +0 -0
  83. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_queue/bec_queue.py +0 -0
  84. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_queue/bec_queue.pyproject +0 -0
  85. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_queue/bec_queue_plugin.py +0 -0
  86. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_queue/register_bec_queue.py +0 -0
  87. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_status_box/__init__.py +0 -0
  88. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_status_box/bec_status_box.py +0 -0
  89. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_status_box/bec_status_box.pyproject +0 -0
  90. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_status_box/bec_status_box_plugin.py +0 -0
  91. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_status_box/register_bec_status_box.py +0 -0
  92. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/bec_status_box/status_item.py +0 -0
  93. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_abort/__init__.py +0 -0
  94. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_abort/abort_button.pyproject +0 -0
  95. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_abort/abort_button_plugin.py +0 -0
  96. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_abort/button_abort.py +0 -0
  97. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_abort/register_abort_button.py +0 -0
  98. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_reset/__init__.py +0 -0
  99. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_reset/button_reset.py +0 -0
  100. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_reset/register_reset_button.py +0 -0
  101. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_reset/reset_button.pyproject +0 -0
  102. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_reset/reset_button_plugin.py +0 -0
  103. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_resume/__init__.py +0 -0
  104. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_resume/button_resume.py +0 -0
  105. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_resume/register_resume_button.py +0 -0
  106. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_resume/resume_button.pyproject +0 -0
  107. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/button_resume/resume_button_plugin.py +0 -0
  108. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/color_button/__init__.py +0 -0
  109. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/color_button/color_button.py +0 -0
  110. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/color_button/color_button.pyproject +0 -0
  111. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/color_button/color_button_plugin.py +0 -0
  112. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/color_button/register_color_button.py +0 -0
  113. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/colormap_selector/__init__.py +0 -0
  114. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/colormap_selector/colormap_selector.py +0 -0
  115. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/colormap_selector/colormap_selector.pyproject +0 -0
  116. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/colormap_selector/colormap_selector_plugin.py +0 -0
  117. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/colormap_selector/register_colormap_selector.py +0 -0
  118. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/console/console.py +0 -0
  119. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dap_combo_box/__init__.py +0 -0
  120. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dap_combo_box/dap_combo_box.py +0 -0
  121. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dap_combo_box/dap_combo_box.pyproject +0 -0
  122. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dap_combo_box/dap_combo_box_plugin.py +0 -0
  123. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dap_combo_box/register_dap_combo_box.py +0 -0
  124. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dark_mode_button/__init__.py +0 -0
  125. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dark_mode_button/dark_mode_button.py +0 -0
  126. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dark_mode_button/dark_mode_button.pyproject +0 -0
  127. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dark_mode_button/dark_mode_button_plugin.py +0 -0
  128. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dark_mode_button/register_dark_mode_button.py +0 -0
  129. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_browser/__init__.py +0 -0
  130. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_browser/device_browser.py +0 -0
  131. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_browser/device_browser.pyproject +0 -0
  132. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_browser/device_browser.ui +0 -0
  133. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_browser/device_browser_plugin.py +0 -0
  134. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_browser/device_item/__init__.py +0 -0
  135. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_browser/device_item/device_item.py +0 -0
  136. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_browser/register_device_browser.py +0 -0
  137. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_combobox/__init__.py +0 -0
  138. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_combobox/device_combo_box.pyproject +0 -0
  139. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_combobox/device_combo_box_plugin.py +0 -0
  140. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_combobox/device_combobox.py +0 -0
  141. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_combobox/register_device_combo_box.py +0 -0
  142. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_line_edit/__init__.py +0 -0
  143. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_line_edit/device_line_edit.py +0 -0
  144. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_line_edit/device_line_edit.pyproject +0 -0
  145. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_line_edit/device_line_edit_plugin.py +0 -0
  146. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/device_line_edit/register_device_line_edit.py +0 -0
  147. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dock/__init__.py +0 -0
  148. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dock/dock.py +0 -0
  149. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dock/dock_area.py +0 -0
  150. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dock/dock_area.pyproject +0 -0
  151. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dock/dock_area_plugin.py +0 -0
  152. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/dock/register_dock_area.py +0 -0
  153. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/__init__.py +0 -0
  154. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/figure.py +0 -0
  155. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/__init__.py +0 -0
  156. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/image/__init__.py +0 -0
  157. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/image/image.py +0 -0
  158. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/image/image_item.py +0 -0
  159. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/image/image_processor.py +0 -0
  160. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/motor_map/__init__.py +0 -0
  161. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py +0 -0
  162. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/waveform/__init__.py +0 -0
  163. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +0 -0
  164. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/image/__init__.py +0 -0
  165. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/image/bec_image_widget.pyproject +0 -0
  166. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/image/bec_image_widget_plugin.py +0 -0
  167. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/image/image_widget.py +0 -0
  168. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/image/register_bec_image_widget.py +0 -0
  169. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/jupyter_console/__init__.py +0 -0
  170. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/jupyter_console/jupyter_console.py +0 -0
  171. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/lmfit_dialog/__init__.py +0 -0
  172. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/lmfit_dialog/lm_fit_dialog.pyproject +0 -0
  173. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/lmfit_dialog/lm_fit_dialog_plugin.py +0 -0
  174. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/lmfit_dialog/lmfit_dialog.py +0 -0
  175. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/lmfit_dialog/lmfit_dialog_compact.ui +0 -0
  176. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/lmfit_dialog/lmfit_dialog_vertical.ui +0 -0
  177. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/lmfit_dialog/register_lm_fit_dialog.py +0 -0
  178. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/motor_map/__init__.py +0 -0
  179. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/motor_map/bec_motor_map_widget.pyproject +0 -0
  180. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/motor_map/bec_motor_map_widget_plugin.py +0 -0
  181. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/motor_map/motor_map_dialog/__init__.py +0 -0
  182. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/motor_map/motor_map_dialog/motor_map_settings.py +0 -0
  183. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/motor_map/motor_map_dialog/motor_map_settings.ui +0 -0
  184. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/motor_map/motor_map_widget.py +0 -0
  185. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/motor_map/register_bec_motor_map_widget.py +0 -0
  186. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/position_indicator/__init__.py +0 -0
  187. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/position_indicator/position_indicator.py +0 -0
  188. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/position_indicator/position_indicator.pyproject +0 -0
  189. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/position_indicator/position_indicator_plugin.py +0 -0
  190. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/position_indicator/register_position_indicator.py +0 -0
  191. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/__init__.py +0 -0
  192. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/positioner_box.py +0 -0
  193. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/positioner_box.pyproject +0 -0
  194. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/positioner_box.ui +0 -0
  195. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/positioner_box_plugin.py +0 -0
  196. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/positioner_control_line.py +0 -0
  197. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/positioner_control_line.pyproject +0 -0
  198. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/positioner_control_line.ui +0 -0
  199. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/positioner_control_line_plugin.py +0 -0
  200. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/register_positioner_box.py +0 -0
  201. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/positioner_box/register_positioner_control_line.py +0 -0
  202. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/ring_progress_bar/__init__.py +0 -0
  203. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/ring_progress_bar/register_ring_progress_bar.py +0 -0
  204. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/ring_progress_bar/ring.py +0 -0
  205. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/ring_progress_bar/ring_progress_bar.py +0 -0
  206. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/ring_progress_bar/ring_progress_bar.pyproject +0 -0
  207. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/ring_progress_bar/ring_progress_bar_plugin.py +0 -0
  208. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/scan_control/__init__.py +0 -0
  209. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/scan_control/register_scan_control.py +0 -0
  210. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/scan_control/scan_control.py +0 -0
  211. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/scan_control/scan_control.pyproject +0 -0
  212. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/scan_control/scan_control_plugin.py +0 -0
  213. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/scan_control/scan_group_box.py +0 -0
  214. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/spinner/__init__.py +0 -0
  215. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/spinner/register_spinner_widget.py +0 -0
  216. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/spinner/spinner.py +0 -0
  217. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/spinner/spinner_widget.pyproject +0 -0
  218. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/spinner/spinner_widget_plugin.py +0 -0
  219. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/stop_button/__init__.py +0 -0
  220. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/stop_button/register_stop_button.py +0 -0
  221. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/stop_button/stop_button.py +0 -0
  222. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/stop_button/stop_button.pyproject +0 -0
  223. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/stop_button/stop_button_plugin.py +0 -0
  224. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/text_box/__init__.py +0 -0
  225. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/text_box/register_text_box.py +0 -0
  226. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/text_box/text_box.py +0 -0
  227. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/text_box/text_box.pyproject +0 -0
  228. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/text_box/text_box_plugin.py +0 -0
  229. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/toggle/__init__.py +0 -0
  230. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/toggle/register_toggle_switch.py +0 -0
  231. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/toggle/toggle.py +0 -0
  232. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/toggle/toggle_switch.pyproject +0 -0
  233. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/toggle/toggle_switch_plugin.py +0 -0
  234. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/vscode/__init__.py +0 -0
  235. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/vscode/register_vs_code_editor.py +0 -0
  236. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/vscode/vs_code_editor.pyproject +0 -0
  237. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/vscode/vs_code_editor_plugin.py +0 -0
  238. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/vscode/vscode.py +0 -0
  239. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/__init__.py +0 -0
  240. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/bec_waveform_widget.pyproject +0 -0
  241. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/bec_waveform_widget_plugin.py +0 -0
  242. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/register_bec_waveform_widget.py +0 -0
  243. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/waveform_popups/__init__.py +0 -0
  244. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/waveform_popups/curve_dialog/__init__.py +0 -0
  245. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/waveform_popups/curve_dialog/curve_dialog.ui +0 -0
  246. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/waveform_popups/dap_summary_dialog/__init__.py +0 -0
  247. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/waveform/waveform_popups/dap_summary_dialog/dap_summary_dialog.py +0 -0
  248. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/website/__init__.py +0 -0
  249. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/website/register_website_widget.py +0 -0
  250. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/website/website.py +0 -0
  251. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/website/website_widget.pyproject +0 -0
  252. {bec_widgets-0.105.0 → bec_widgets-0.107.0}/bec_widgets/widgets/website/website_widget_plugin.py +0 -0
@@ -1,5 +1,37 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.107.0 (2024-09-06)
4
+
5
+ ### Documentation
6
+
7
+ * docs: extend waveform docs ([`e6976dc`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/e6976dc15105209852090a00a97b7cda723142e9))
8
+
9
+ ### Feature
10
+
11
+ * feat: add roi select for dap, allow automatic clear curves on plot request ([`7bdca84`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/7bdca8431496fe6562d2c28f5a6af869d1a2e654))
12
+
13
+ ### Refactor
14
+
15
+ * refactor: change style to bec_accent_colors ([`bd126dd`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/bd126dddbbec3e6c448cce263433d328d577c5c0))
16
+
17
+ ### Test
18
+
19
+ * test: add tests, including extension to end-2-end test ([`b1aff6d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/b1aff6d791ff847eb2f628e66ccaa4672fdeea08))
20
+
21
+ ## v0.106.0 (2024-09-05)
22
+
23
+ ### Feature
24
+
25
+ * feat(plot_base): toggle to switch outer axes for plotting widgets ([`06d7741`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/06d7741622aea8556208cd17cae521c37333f8b6))
26
+
27
+ ### Refactor
28
+
29
+ * refactor: use DAPComboBox in curve_dialog selection ([`998a745`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/998a7451335b1b35c3e18691d3bab8d882e2d30b))
30
+
31
+ ### Test
32
+
33
+ * test: fix tests ([`6b15abc`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6b15abcc73170cb49292741a619a08ee615e6250))
34
+
3
35
  ## v0.105.0 (2024-09-04)
4
36
 
5
37
  ### Feature
@@ -126,32 +158,6 @@
126
158
 
127
159
  ## v0.99.13 (2024-08-30)
128
160
 
129
- ### Documentation
130
-
131
- * docs: minor updates to the widget tutorial ([`ec9c8f2`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/ec9c8f29633364c45ebd998a5411d428c1ce488d))
132
-
133
- * docs(widget tutorial): step by step guide added ([`b32ced8`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/b32ced85fff628a9e1303a781630cdae3865238e))
134
-
135
161
  ### Fix
136
162
 
137
163
  * fix(dark mode button): fixed dark mode button state for external updates, including auto ([`a3110d9`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/a3110d98147295dcb1f9353f9aaf5461cba9232a))
138
-
139
- ## v0.99.12 (2024-08-29)
140
-
141
- ### Fix
142
-
143
- * fix(toolbar): widget action added ([`2efd487`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/2efd48736cbe04e84533f7933c552ea8274e2162))
144
-
145
- * fix(reset_button): reset button added ([`6ed1efc`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6ed1efc6af193908f70aa37fb73157d2ca6a62f4))
146
-
147
- * fix(abort_button): abort button added; some minor fixes ([`a568633`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/a568633c3206a8c26069d140f2d9a548bf4124b0))
148
-
149
- ## v0.99.11 (2024-08-29)
150
-
151
- ### Fix
152
-
153
- * fix(resume_button): resume button added ([`8be8295`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/8be8295b2b38f36da210ab36c5da6d0a00e330cc))
154
-
155
- ### Refactor
156
-
157
- * refactor(icons): general app icon changed; jupyter app icon changed to material icon ([`5d73fe4`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/5d73fe455a568ad40a9fadc5ce6e249d782ad20d))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.105.0
3
+ Version: 0.107.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
@@ -1653,6 +1653,15 @@ class BECPlotBase(RPCBase):
1653
1653
  y(bool): Show grid on the y-axis.
1654
1654
  """
1655
1655
 
1656
+ @rpc_call
1657
+ def set_outer_axes(self, show: "bool" = True):
1658
+ """
1659
+ Set the outer axes of the plot widget.
1660
+
1661
+ Args:
1662
+ show(bool): Show the outer axes.
1663
+ """
1664
+
1656
1665
  @rpc_call
1657
1666
  def lock_aspect_ratio(self, lock):
1658
1667
  """
@@ -1878,7 +1887,7 @@ class BECWaveform(RPCBase):
1878
1887
  """
1879
1888
 
1880
1889
  @rpc_call
1881
- def get_all_data(self, output: "Literal['dict', 'pandas']" = "dict") -> "dict | pd.DataFrame":
1890
+ def get_all_data(self, output: "Literal['dict', 'pandas']" = "dict") -> "dict":
1882
1891
  """
1883
1892
  Extract all curve data into a dictionary or a pandas DataFrame.
1884
1893
 
@@ -2041,6 +2050,25 @@ class BECWaveform(RPCBase):
2041
2050
  size(int): Font size of the legend.
2042
2051
  """
2043
2052
 
2053
+ @rpc_call
2054
+ def toggle_roi(self, toggled: "bool") -> "None":
2055
+ """
2056
+ Toggle the linear region selector on the plot.
2057
+
2058
+ Args:
2059
+ toggled(bool): If True, enable the linear region selector.
2060
+ """
2061
+
2062
+ @rpc_call
2063
+ def select_roi(self, region: "tuple[float, float]"):
2064
+ """
2065
+ Set the fit region of the plot widget. At the moment only a single region is supported.
2066
+ To remove the roi region again, use toggle_roi_region
2067
+
2068
+ Args:
2069
+ region(tuple[float, float]): The fit region.
2070
+ """
2071
+
2044
2072
 
2045
2073
  class BECWaveformWidget(RPCBase):
2046
2074
  @property
@@ -2312,12 +2340,30 @@ class BECWaveformWidget(RPCBase):
2312
2340
  Export the plot widget to Matplotlib.
2313
2341
  """
2314
2342
 
2343
+ @rpc_call
2344
+ def toggle_roi(self, checked: "bool"):
2345
+ """
2346
+ Toggle the linear region selector.
2347
+
2348
+ Args:
2349
+ checked(bool): If True, enable the linear region selector.
2350
+ """
2351
+
2352
+ @rpc_call
2353
+ def select_roi(self, region: "tuple"):
2354
+ """
2355
+ Set the region of interest of the plot widget.
2356
+
2357
+ Args:
2358
+ region(tuple): Region of interest.
2359
+ """
2360
+
2315
2361
 
2316
2362
  class DapComboBox(RPCBase):
2317
2363
  @rpc_call
2318
2364
  def select_y_axis(self, y_axis: str):
2319
2365
  """
2320
- Receive update signal for the y axis.
2366
+ Slot to update the y axis.
2321
2367
 
2322
2368
  Args:
2323
2369
  y_axis(str): Y axis.
@@ -2326,19 +2372,19 @@ class DapComboBox(RPCBase):
2326
2372
  @rpc_call
2327
2373
  def select_x_axis(self, x_axis: str):
2328
2374
  """
2329
- Receive update signal for the x axis.
2375
+ Slot to update the x axis.
2330
2376
 
2331
2377
  Args:
2332
2378
  x_axis(str): X axis.
2333
2379
  """
2334
2380
 
2335
2381
  @rpc_call
2336
- def select_fit(self, fit_name: str | None):
2382
+ def select_fit_model(self, fit_name: str | None):
2337
2383
  """
2338
- Select current fit.
2384
+ Slot to update the fit model.
2339
2385
 
2340
- Args:
2341
- default_device(str): Default device name.
2386
+ Args:
2387
+ default_device(str): Default device name.
2342
2388
  """
2343
2389
 
2344
2390
 
@@ -0,0 +1,72 @@
1
+ """ Module for a thin wrapper (LinearRegionWrapper) around the LinearRegionItem in pyqtgraph.
2
+ The class is mainly designed for usage with the BECWaveform and 1D plots. """
3
+
4
+ import pyqtgraph as pg
5
+ from qtpy.QtCore import QObject, Signal, Slot
6
+ from qtpy.QtGui import QColor
7
+
8
+
9
+ class LinearRegionWrapper(QObject):
10
+ """Wrapper class for the LinearRegionItem in pyqtgraph for 1D plots (BECWaveform)
11
+
12
+ Args:
13
+ plot_item (pg.PlotItem): The plot item to add the region selector to.
14
+ parent (QObject): The parent object.
15
+ color (QColor): The color of the region selector.
16
+ hover_color (QColor): The color of the region selector when the mouse is over it.
17
+ """
18
+
19
+ # Signal with the region tuble (start, end)
20
+ region_changed = Signal(tuple)
21
+
22
+ def __init__(
23
+ self, plot_item: pg.PlotItem, color: QColor = None, hover_color: QColor = None, parent=None
24
+ ):
25
+ super().__init__(parent)
26
+ self._edge_width = 2
27
+ self.plot_item = plot_item
28
+ self.linear_region_selector = pg.LinearRegionItem()
29
+ self.proxy = None
30
+ self.change_roi_color((color, hover_color))
31
+
32
+ # Slot for changing the color of the region selector (edge and fill)
33
+ @Slot(tuple)
34
+ def change_roi_color(self, colors: tuple[QColor | str | tuple, QColor | str | tuple]):
35
+ """Change the color and hover color of the region selector.
36
+ Hover color means the color when the mouse is over the region.
37
+
38
+ Args:
39
+ colors (tuple): Tuple with the color and hover color
40
+ """
41
+ color, hover_color = colors
42
+ if color is not None:
43
+ self.linear_region_selector.setBrush(pg.mkBrush(color))
44
+ if hover_color is not None:
45
+ self.linear_region_selector.setHoverBrush(pg.mkBrush(hover_color))
46
+
47
+ @Slot()
48
+ def add_region_selector(self):
49
+ """Add the region selector to the plot item"""
50
+ self.plot_item.addItem(self.linear_region_selector)
51
+ # Use proxy to limit the update rate of the region change signal to 10Hz
52
+ self.proxy = pg.SignalProxy(
53
+ self.linear_region_selector.sigRegionChanged,
54
+ rateLimit=10,
55
+ slot=self._region_change_proxy,
56
+ )
57
+
58
+ @Slot()
59
+ def remove_region_selector(self):
60
+ """Remove the region selector from the plot item"""
61
+ self.proxy.disconnect()
62
+ self.proxy = None
63
+ self.plot_item.removeItem(self.linear_region_selector)
64
+
65
+ def _region_change_proxy(self):
66
+ """Emit the region change signal"""
67
+ region = self.linear_region_selector.getRegion()
68
+ self.region_changed.emit(region)
69
+
70
+ def cleanup(self):
71
+ """Cleanup the widget."""
72
+ self.remove_region_selector()
@@ -31,6 +31,7 @@ class AxisSettings(SettingWidget):
31
31
 
32
32
  # Top Box
33
33
  WidgetIO.set_value(self.ui.plot_title, axis_config["title"])
34
+ self.ui.switch_outer_axes.checked = axis_config["outer_axes"]
34
35
 
35
36
  # X Axis Box
36
37
  WidgetIO.set_value(self.ui.x_label, axis_config["x_label"])
@@ -63,6 +64,7 @@ class AxisSettings(SettingWidget):
63
64
  @Slot()
64
65
  def accept_changes(self):
65
66
  title = WidgetIO.get_value(self.ui.plot_title)
67
+ outer_axes = self.ui.switch_outer_axes.checked
66
68
 
67
69
  # X Axis
68
70
  x_label = WidgetIO.get_value(self.ui.x_label)
@@ -86,3 +88,4 @@ class AxisSettings(SettingWidget):
86
88
  y_lim=y_lim,
87
89
  )
88
90
  self.target_widget.set_grid(x_grid, y_grid)
91
+ self.target_widget.set_outer_axes(outer_axes)
@@ -6,8 +6,8 @@
6
6
  <rect>
7
7
  <x>0</x>
8
8
  <y>0</y>
9
- <width>417</width>
10
- <height>250</height>
9
+ <width>427</width>
10
+ <height>270</height>
11
11
  </rect>
12
12
  </property>
13
13
  <property name="minimumSize">
@@ -26,7 +26,28 @@
26
26
  <string>Form</string>
27
27
  </property>
28
28
  <layout class="QGridLayout" name="gridLayout">
29
- <item row="1" column="1">
29
+ <item row="0" column="0" colspan="2">
30
+ <layout class="QHBoxLayout" name="horizontalLayout">
31
+ <item>
32
+ <widget class="QLabel" name="plot_title_label">
33
+ <property name="text">
34
+ <string>Plot Title</string>
35
+ </property>
36
+ </widget>
37
+ </item>
38
+ <item>
39
+ <widget class="QLineEdit" name="plot_title"/>
40
+ </item>
41
+ </layout>
42
+ </item>
43
+ <item row="1" column="0">
44
+ <widget class="QLabel" name="label_outer_axes">
45
+ <property name="text">
46
+ <string>Outer Axes</string>
47
+ </property>
48
+ </widget>
49
+ </item>
50
+ <item row="2" column="1">
30
51
  <widget class="QGroupBox" name="y_axis_box">
31
52
  <property name="title">
32
53
  <string>Y Axis</string>
@@ -120,7 +141,7 @@
120
141
  </layout>
121
142
  </widget>
122
143
  </item>
123
- <item row="1" column="0">
144
+ <item row="2" column="0">
124
145
  <widget class="QGroupBox" name="x_axis_box">
125
146
  <property name="title">
126
147
  <string>X Axis</string>
@@ -214,22 +235,22 @@
214
235
  </layout>
215
236
  </widget>
216
237
  </item>
217
- <item row="0" column="0" colspan="2">
218
- <layout class="QHBoxLayout" name="horizontalLayout">
219
- <item>
220
- <widget class="QLabel" name="plot_title_label">
221
- <property name="text">
222
- <string>Plot Title</string>
223
- </property>
224
- </widget>
225
- </item>
226
- <item>
227
- <widget class="QLineEdit" name="plot_title"/>
228
- </item>
229
- </layout>
238
+ <item row="1" column="1">
239
+ <widget class="ToggleSwitch" name="switch_outer_axes">
240
+ <property name="checked" stdset="0">
241
+ <bool>false</bool>
242
+ </property>
243
+ </widget>
230
244
  </item>
231
245
  </layout>
232
246
  </widget>
247
+ <customwidgets>
248
+ <customwidget>
249
+ <class>ToggleSwitch</class>
250
+ <extends>QWidget</extends>
251
+ <header>toggle_switch</header>
252
+ </customwidget>
253
+ </customwidgets>
233
254
  <resources/>
234
255
  <connections/>
235
256
  </ui>
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections import defaultdict
3
4
  from typing import Literal, Optional
4
5
 
5
6
  import bec_qthemes
@@ -31,6 +32,7 @@ class AxisConfig(BaseModel):
31
32
  y_lim: Optional[tuple] = Field(None, description="The limits of the y-axis.")
32
33
  x_grid: bool = Field(False, description="Show grid on the x-axis.")
33
34
  y_grid: bool = Field(False, description="Show grid on the y-axis.")
35
+ outer_axes: bool = Field(False, description="Show the outer axes of the plot widget.")
34
36
  model_config: dict = {"validate_assignment": True}
35
37
 
36
38
 
@@ -75,6 +77,7 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout):
75
77
  "set_x_lim",
76
78
  "set_y_lim",
77
79
  "set_grid",
80
+ "set_outer_axes",
78
81
  "lock_aspect_ratio",
79
82
  "export",
80
83
  "remove",
@@ -336,6 +339,17 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout):
336
339
  self.config.axis.x_grid = x
337
340
  self.config.axis.y_grid = y
338
341
 
342
+ def set_outer_axes(self, show: bool = True):
343
+ """
344
+ Set the outer axes of the plot widget.
345
+
346
+ Args:
347
+ show(bool): Show the outer axes.
348
+ """
349
+ self.plot_item.showAxis("top", show)
350
+ self.plot_item.showAxis("right", show)
351
+ self.config.axis.outer_axes = show
352
+
339
353
  def add_legend(self):
340
354
  """Add legend to the plot"""
341
355
  self.plot_item.addLegend()
@@ -12,10 +12,11 @@ from bec_lib.logger import bec_logger
12
12
  from pydantic import Field, ValidationError, field_validator
13
13
  from pyqtgraph.exporters import MatplotlibExporter
14
14
  from qtpy.QtCore import Signal as pyqtSignal
15
- from qtpy.QtWidgets import QWidget
15
+ from qtpy.QtWidgets import QApplication, QWidget
16
16
 
17
17
  from bec_widgets.qt_utils.error_popups import SafeSlot as Slot
18
18
  from bec_widgets.utils import Colors, EntryValidator
19
+ from bec_widgets.utils.linear_region_selector import LinearRegionWrapper
19
20
  from bec_widgets.widgets.figure.plots.plot_base import BECPlotBase, SubplotConfig
20
21
  from bec_widgets.widgets.figure.plots.waveform.waveform_curve import (
21
22
  BECCurve,
@@ -74,6 +75,8 @@ class BECWaveform(BECPlotBase):
74
75
  "remove",
75
76
  "clear_all",
76
77
  "set_legend_label_size",
78
+ "toggle_roi",
79
+ "select_roi",
77
80
  ]
78
81
  scan_signal_update = pyqtSignal()
79
82
  async_signal_update = pyqtSignal()
@@ -81,6 +84,9 @@ class BECWaveform(BECPlotBase):
81
84
  dap_summary_update = pyqtSignal(dict, dict)
82
85
  autorange_signal = pyqtSignal()
83
86
  new_scan = pyqtSignal()
87
+ roi_changed = pyqtSignal(tuple)
88
+ roi_active = pyqtSignal(bool)
89
+ request_dap_refresh = pyqtSignal()
84
90
 
85
91
  def __init__(
86
92
  self,
@@ -100,6 +106,9 @@ class BECWaveform(BECPlotBase):
100
106
  self.old_scan_id = None
101
107
  self.scan_id = None
102
108
  self.scan_item = None
109
+ self._roi_region = None
110
+ self.roi_select = None
111
+ self._accent_colors = QApplication.instance().theme.accent_colors
103
112
  self._x_axis_mode = {
104
113
  "name": None,
105
114
  "entry": None,
@@ -130,6 +139,63 @@ class BECWaveform(BECPlotBase):
130
139
  self.add_legend()
131
140
  self.apply_config(self.config)
132
141
 
142
+ @Slot(bool)
143
+ def toggle_roi(self, toggled: bool) -> None:
144
+ """Toggle the linear region selector on the plot.
145
+
146
+ Args:
147
+ toggled(bool): If True, enable the linear region selector.
148
+ """
149
+ if toggled:
150
+ return self._hook_roi()
151
+ return self._unhook_roi()
152
+
153
+ @Slot(tuple)
154
+ def select_roi(self, region: tuple[float, float]):
155
+ """Set the fit region of the plot widget. At the moment only a single region is supported.
156
+ To remove the roi region again, use toggle_roi_region
157
+
158
+ Args:
159
+ region(tuple[float, float]): The fit region.
160
+ """
161
+ if self.roi_region == (None, None):
162
+ self.toggle_roi(True)
163
+ try:
164
+ self.roi_select.linear_region_selector.setRegion(region)
165
+ except Exception as e:
166
+ logger.error(f"Error setting region {tuple}; Exception raised: {e}")
167
+ raise ValueError(f"Error setting region {tuple}; Exception raised: {e}")
168
+
169
+ def _hook_roi(self):
170
+ """Hook the linear region selector to the plot."""
171
+ color = self._accent_colors.default
172
+ color.setAlpha(int(0.2 * 255))
173
+ hover_color = self._accent_colors.default
174
+ hover_color.setAlpha(int(0.35 * 255))
175
+ if self.roi_select is None:
176
+ self.roi_select = LinearRegionWrapper(
177
+ self.plot_item, color=color, hover_color=hover_color, parent=self
178
+ )
179
+ self.roi_select.add_region_selector()
180
+ self.roi_select.region_changed.connect(self.roi_changed)
181
+ self.roi_select.region_changed.connect(self.set_roi_region)
182
+ self.request_dap_refresh.connect(self.refresh_dap)
183
+ self._emit_roi_region()
184
+ self.roi_active.emit(True)
185
+
186
+ def _unhook_roi(self):
187
+ """Unhook the linear region selector from the plot."""
188
+ if self.roi_select is not None:
189
+ self.roi_select.region_changed.disconnect(self.roi_changed)
190
+ self.roi_select.region_changed.disconnect(self.set_roi_region)
191
+ self.request_dap_refresh.disconnect(self.refresh_dap)
192
+ self.roi_active.emit(False)
193
+ self.roi_region = None
194
+ self.refresh_dap()
195
+ self.roi_select.cleanup()
196
+ self.roi_select.deleteLater()
197
+ self.roi_select = None
198
+
133
199
  def apply_config(self, config: dict | SubplotConfig, replot_last_scan: bool = False):
134
200
  """
135
201
  Apply the configuration to the 1D waveform widget.
@@ -171,6 +237,48 @@ class BECWaveform(BECPlotBase):
171
237
  for curve in self.curves:
172
238
  curve.config.parent_id = new_gui_id
173
239
 
240
+ ###################################
241
+ # Fit Range Properties
242
+ ###################################
243
+
244
+ @property
245
+ def roi_region(self) -> tuple[float, float] | None:
246
+ """
247
+ Get the fit region of the plot widget.
248
+
249
+ Returns:
250
+ tuple: The fit region.
251
+ """
252
+ if self._roi_region is not None:
253
+ return self._roi_region
254
+ return None, None
255
+
256
+ @roi_region.setter
257
+ def roi_region(self, value: tuple[float, float] | None):
258
+ """Set the fit region of the plot widget.
259
+
260
+ Args:
261
+ value(tuple[float, float]|None): The fit region.
262
+ """
263
+ self._roi_region = value
264
+ if value is not None:
265
+ self.request_dap_refresh.emit()
266
+
267
+ @Slot(tuple)
268
+ def set_roi_region(self, region: tuple[float, float]):
269
+ """
270
+ Set the fit region of the plot widget.
271
+
272
+ Args:
273
+ region(tuple[float, float]): The fit region.
274
+ """
275
+ self.roi_region = region
276
+
277
+ def _emit_roi_region(self):
278
+ """Emit the current ROI from selector the plot widget."""
279
+ if self.roi_select is not None:
280
+ self.set_roi_region(self.roi_select.linear_region_selector.getRegion())
281
+
174
282
  ###################################
175
283
  # Waveform Properties
176
284
  ###################################
@@ -1058,13 +1166,14 @@ class BECWaveform(BECPlotBase):
1058
1166
  y_entry = curve.config.signals.y.entry
1059
1167
  model_name = curve.config.signals.dap
1060
1168
  model = getattr(self.dap, model_name)
1169
+ x_min, x_max = self.roi_region
1061
1170
 
1062
1171
  msg = messages.DAPRequestMessage(
1063
1172
  dap_cls="LmfitService1D",
1064
1173
  dap_type="on_demand",
1065
1174
  config={
1066
1175
  "args": [self.scan_id, x_name, x_entry, y_name, y_entry],
1067
- "kwargs": {},
1176
+ "kwargs": {"x_min": x_min, "x_max": x_max},
1068
1177
  "class_args": model._plugin_info["class_args"],
1069
1178
  "class_kwargs": model._plugin_info["class_kwargs"],
1070
1179
  },
@@ -1304,7 +1413,8 @@ class BECWaveform(BECPlotBase):
1304
1413
  self.scan_signal_update.emit()
1305
1414
  self.async_signal_update.emit()
1306
1415
 
1307
- def get_all_data(self, output: Literal["dict", "pandas"] = "dict") -> dict | pd.DataFrame:
1416
+ # pylint: ignore: undefined-variable
1417
+ def get_all_data(self, output: Literal["dict", "pandas"] = "dict") -> dict: # | pd.DataFrame:
1308
1418
  """
1309
1419
  Extract all curve data into a dictionary or a pandas DataFrame.
1310
1420
 
@@ -1351,13 +1461,21 @@ class BECWaveform(BECPlotBase):
1351
1461
  """
1352
1462
  MatplotlibExporter(self.plot_item).export()
1353
1463
 
1354
- def clear_all(self):
1464
+ def clear_source(self, source: Literal["DAP", "async", "scan_segment", "custom"]):
1465
+ """Clear speicific source from self._curves_data.
1466
+
1467
+ Args:
1468
+ source (Literal["DAP", "async", "scan_segment", "custom"]): Source to be cleared.
1469
+ """
1355
1470
  curves_data = self._curves_data
1356
- sources = list(curves_data.keys())
1471
+ curve_ids_to_remove = list(curves_data[source].keys())
1472
+ for curve_id in curve_ids_to_remove:
1473
+ self.remove_curve(curve_id)
1474
+
1475
+ def clear_all(self):
1476
+ sources = list(self._curves_data.keys())
1357
1477
  for source in sources:
1358
- curve_ids_to_remove = list(curves_data[source].keys())
1359
- for curve_id in curve_ids_to_remove:
1360
- self.remove_curve(curve_id)
1478
+ self.clear_source(source)
1361
1479
 
1362
1480
  def cleanup(self):
1363
1481
  """Cleanup the widget connection from BECDispatcher."""
@@ -13,6 +13,7 @@ from bec_widgets.qt_utils.error_popups import WarningPopupUtility
13
13
  from bec_widgets.qt_utils.settings_dialog import SettingWidget
14
14
  from bec_widgets.utils import Colors, UILoader
15
15
  from bec_widgets.widgets.color_button.color_button import ColorButton
16
+ from bec_widgets.widgets.dap_combo_box.dap_combo_box import DapComboBox
16
17
  from bec_widgets.widgets.device_line_edit.device_line_edit import DeviceLineEdit
17
18
 
18
19
  MODULE_PATH = os.path.dirname(bec_widgets.__file__)
@@ -241,8 +242,9 @@ class DialogRow(QObject):
241
242
  self.device_line_edit = DeviceLineEdit()
242
243
  self.entry_line_edit = QLineEdit()
243
244
 
244
- self.dap_combo = QComboBox()
245
- self.populate_dap_combobox()
245
+ self.dap_combo = DapComboBox()
246
+ self.dap_combo.populate_fit_model_combobox()
247
+ self.dap_combo.select_fit_model("GaussianModel")
246
248
 
247
249
  # Styling
248
250
  self.color_button = ColorButton()
@@ -261,16 +263,6 @@ class DialogRow(QObject):
261
263
  lambda: self.remove_row()
262
264
  ) # From some reason do not work without lambda
263
265
 
264
- def populate_dap_combobox(self):
265
- available_models = [
266
- attr
267
- for attr in dir(self.client.dap)
268
- if not attr.startswith("__")
269
- and not callable(getattr(self.client.dap, attr))
270
- and not attr.startswith("_")
271
- ]
272
- self.dap_combo.addItems(available_models)
273
-
274
266
  def add_scan_row(self):
275
267
  if self.config is not None:
276
268
  self.device_line_edit.setText(self.config.signals.y.name)
@@ -298,7 +290,7 @@ class DialogRow(QObject):
298
290
  if self.config is not None:
299
291
  self.device_line_edit.setText(self.config.signals.y.name)
300
292
  self.entry_line_edit.setText(self.config.signals.y.entry)
301
- self.dap_combo.setCurrentText(self.config.signals.dap)
293
+ self.dap_combo.fit_model_combobox.setCurrentText(self.config.signals.dap)
302
294
  self.color_button.set_color(self.config.color)
303
295
  self.style_combo.setCurrentText(self.config.pen_style)
304
296
  self.width.setValue(self.config.pen_width)
@@ -312,7 +304,7 @@ class DialogRow(QObject):
312
304
 
313
305
  self.table_widget.setCellWidget(self.row, 0, self.device_line_edit)
314
306
  self.table_widget.setCellWidget(self.row, 1, self.entry_line_edit)
315
- self.table_widget.setCellWidget(self.row, 2, self.dap_combo)
307
+ self.table_widget.setCellWidget(self.row, 2, self.dap_combo.fit_model_combobox)
316
308
  self.table_widget.setCellWidget(self.row, 3, self.color_button)
317
309
  self.table_widget.setCellWidget(self.row, 4, self.style_combo)
318
310
  self.table_widget.setCellWidget(self.row, 5, self.width)