bec-widgets 0.96.0__tar.gz → 0.96.2__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 (401) hide show
  1. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.gitlab-ci.yml +2 -2
  2. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/CHANGELOG.md +24 -28
  3. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/PKG-INFO +1 -1
  4. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/qt_utils/toolbar.py +29 -1
  5. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/crosshair.py +115 -74
  6. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/plot_base.py +56 -1
  7. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/waveform/waveform.py +13 -20
  8. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/waveform_widget.py +32 -3
  9. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/pyproject.toml +1 -1
  10. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_crosshair.py +40 -47
  11. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.git_hooks/pre-commit +0 -0
  12. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.gitignore +0 -0
  13. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.gitlab/issue_templates/bug_report_template.md +0 -0
  14. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  15. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.gitlab/issue_templates/feature_request_template.md +0 -0
  16. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.gitlab/merge_request_templates/default.md +0 -0
  17. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.pylintrc +0 -0
  18. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/.readthedocs.yaml +0 -0
  19. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/LICENSE +0 -0
  20. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/README.md +0 -0
  21. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/__init__.py +0 -0
  22. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/app_icons/BEC-Dark.png +0 -0
  23. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/app_icons/bec_widgets_icon.png +0 -0
  24. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/app_icons/terminal_icon.png +0 -0
  25. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/status_icons/error.svg +0 -0
  26. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/status_icons/not_connected.svg +0 -0
  27. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/status_icons/refresh.svg +0 -0
  28. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/status_icons/running.svg +0 -0
  29. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/status_icons/warning.svg +0 -0
  30. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/add.svg +0 -0
  31. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/attach_all.svg +0 -0
  32. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/auto_range.svg +0 -0
  33. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/compare.svg +0 -0
  34. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/connection.svg +0 -0
  35. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/device_line_edit.svg +0 -0
  36. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/drag_pan_mode.svg +0 -0
  37. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/export.svg +0 -0
  38. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/fft.svg +0 -0
  39. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/fitting_parameters.svg +0 -0
  40. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/history.svg +0 -0
  41. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/image.svg +0 -0
  42. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/image_autorange.svg +0 -0
  43. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/import.svg +0 -0
  44. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/line_axis.svg +0 -0
  45. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/line_curve.svg +0 -0
  46. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/lock_aspect_ratio.svg +0 -0
  47. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/log_scale.png +0 -0
  48. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/motor_map.svg +0 -0
  49. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/photo_library.svg +0 -0
  50. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/positioner_box.svg +0 -0
  51. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/progress.svg +0 -0
  52. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/queue.svg +0 -0
  53. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/rectangle_mode.svg +0 -0
  54. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/remove.svg +0 -0
  55. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/reset_settings.svg +0 -0
  56. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/restore_state.svg +0 -0
  57. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/ring_progress.svg +0 -0
  58. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/rotate_left.svg +0 -0
  59. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/rotate_right.svg +0 -0
  60. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/save.svg +0 -0
  61. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/save_state.svg +0 -0
  62. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/scan_control.svg +0 -0
  63. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/settings.svg +0 -0
  64. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/status.svg +0 -0
  65. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/terminal.svg +0 -0
  66. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/transform.svg +0 -0
  67. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/assets/toolbar_icons/waveform.svg +0 -0
  68. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/cli/__init__.py +0 -0
  69. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/cli/auto_updates.py +0 -0
  70. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/cli/client.py +0 -0
  71. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/cli/client_utils.py +0 -0
  72. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/cli/generate_cli.py +0 -0
  73. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/cli/rpc_register.py +0 -0
  74. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/cli/rpc_wigdet_handler.py +0 -0
  75. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/cli/server.py +0 -0
  76. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/__init__.py +0 -0
  77. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/general_app/__init__.py +0 -0
  78. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/general_app/general_app.py +0 -0
  79. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/general_app/general_app.ui +0 -0
  80. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/general_app/web_links.py +0 -0
  81. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  82. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  83. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
  84. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
  85. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
  86. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
  87. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
  88. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
  89. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
  90. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/qt_utils/__init__.py +0 -0
  91. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/qt_utils/error_popups.py +0 -0
  92. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/qt_utils/redis_message_waiter.py +0 -0
  93. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/qt_utils/settings_dialog.py +0 -0
  94. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/__init__.py +0 -0
  95. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/bec_connector.py +0 -0
  96. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/bec_designer.py +0 -0
  97. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/bec_dispatcher.py +0 -0
  98. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/bec_table.py +0 -0
  99. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/bec_widget.py +0 -0
  100. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/colors.py +0 -0
  101. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/container_utils.py +0 -0
  102. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/entry_validator.py +0 -0
  103. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/generate_designer_plugin.py +0 -0
  104. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/layout_manager.py +0 -0
  105. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/plugin_templates/plugin.template +0 -0
  106. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/plugin_templates/register.template +0 -0
  107. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/plugin_utils.py +0 -0
  108. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/reference_utils.py +0 -0
  109. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/rpc_decorator.py +0 -0
  110. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/thread_checker.py +0 -0
  111. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/ui_loader.py +0 -0
  112. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/validator_delegate.py +0 -0
  113. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/widget_io.py +0 -0
  114. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/utils/yaml_dialog.py +0 -0
  115. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/__init__.py +0 -0
  116. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/base_classes/__init__.py +0 -0
  117. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/base_classes/device_input_base.py +0 -0
  118. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_queue/__init__.py +0 -0
  119. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_queue/bec_queue.py +0 -0
  120. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_queue/bec_queue.pyproject +0 -0
  121. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_queue/bec_queue_plugin.py +0 -0
  122. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_queue/register_bec_queue.py +0 -0
  123. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_status_box/__init__.py +0 -0
  124. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_status_box/bec_status_box.py +0 -0
  125. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_status_box/bec_status_box.pyproject +0 -0
  126. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_status_box/bec_status_box_plugin.py +0 -0
  127. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_status_box/register_bec_status_box.py +0 -0
  128. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/bec_status_box/status_item.py +0 -0
  129. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/color_button/__init__.py +0 -0
  130. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/color_button/color_button.py +0 -0
  131. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/color_button/color_button.pyproject +0 -0
  132. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/color_button/color_button_plugin.py +0 -0
  133. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/color_button/register_color_button.py +0 -0
  134. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/colormap_selector/__init__.py +0 -0
  135. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/colormap_selector/colormap_selector.py +0 -0
  136. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/colormap_selector/colormap_selector.pyproject +0 -0
  137. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/colormap_selector/colormap_selector_plugin.py +0 -0
  138. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/colormap_selector/register_colormap_selector.py +0 -0
  139. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/console/console.py +0 -0
  140. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_browser/__init__.py +0 -0
  141. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_browser/device_browser.py +0 -0
  142. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_browser/device_browser.pyproject +0 -0
  143. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_browser/device_browser.ui +0 -0
  144. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_browser/device_browser_plugin.py +0 -0
  145. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_browser/device_item/__init__.py +0 -0
  146. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_browser/device_item/device_item.py +0 -0
  147. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_browser/register_device_browser.py +0 -0
  148. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_combobox/__init__.py +0 -0
  149. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_combobox/device_combo_box.pyproject +0 -0
  150. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_combobox/device_combo_box_plugin.py +0 -0
  151. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_combobox/device_combobox.py +0 -0
  152. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_combobox/register_device_combo_box.py +0 -0
  153. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_line_edit/__init__.py +0 -0
  154. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_line_edit/device_line_edit.py +0 -0
  155. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_line_edit/device_line_edit.pyproject +0 -0
  156. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_line_edit/device_line_edit_plugin.py +0 -0
  157. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/device_line_edit/register_device_line_edit.py +0 -0
  158. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/dock/__init__.py +0 -0
  159. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/dock/dock.py +0 -0
  160. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/dock/dock_area.py +0 -0
  161. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/dock/dock_area.pyproject +0 -0
  162. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/dock/dock_area_plugin.py +0 -0
  163. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/dock/register_dock_area.py +0 -0
  164. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/__init__.py +0 -0
  165. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/figure.py +0 -0
  166. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/__init__.py +0 -0
  167. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/axis_settings.py +0 -0
  168. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/axis_settings.ui +0 -0
  169. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/image/__init__.py +0 -0
  170. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/image/image.py +0 -0
  171. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/image/image_item.py +0 -0
  172. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/image/image_processor.py +0 -0
  173. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/motor_map/__init__.py +0 -0
  174. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py +0 -0
  175. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/waveform/__init__.py +0 -0
  176. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +0 -0
  177. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/image/__init__.py +0 -0
  178. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/image/bec_image_widget.pyproject +0 -0
  179. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/image/bec_image_widget_plugin.py +0 -0
  180. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/image/image_widget.py +0 -0
  181. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/image/register_bec_image_widget.py +0 -0
  182. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/jupyter_console/__init__.py +0 -0
  183. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/jupyter_console/jupyter_console.py +0 -0
  184. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/motor_map/__init__.py +0 -0
  185. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/motor_map/bec_motor_map_widget.pyproject +0 -0
  186. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/motor_map/bec_motor_map_widget_plugin.py +0 -0
  187. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/motor_map/motor_map_dialog/__init__.py +0 -0
  188. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/motor_map/motor_map_dialog/motor_map_settings.py +0 -0
  189. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/motor_map/motor_map_dialog/motor_map_settings.ui +0 -0
  190. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/motor_map/motor_map_widget.py +0 -0
  191. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/motor_map/register_bec_motor_map_widget.py +0 -0
  192. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/position_indicator/__init__.py +0 -0
  193. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/position_indicator/position_indicator.py +0 -0
  194. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/position_indicator/position_indicator.pyproject +0 -0
  195. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/position_indicator/position_indicator_plugin.py +0 -0
  196. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/position_indicator/register_position_indicator.py +0 -0
  197. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/__init__.py +0 -0
  198. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/positioner_box.py +0 -0
  199. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/positioner_box.pyproject +0 -0
  200. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/positioner_box.ui +0 -0
  201. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/positioner_box_plugin.py +0 -0
  202. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/positioner_control_line.py +0 -0
  203. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/positioner_control_line.pyproject +0 -0
  204. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/positioner_control_line.ui +0 -0
  205. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/positioner_control_line_plugin.py +0 -0
  206. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/register_positioner_box.py +0 -0
  207. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/positioner_box/register_positioner_control_line.py +0 -0
  208. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/ring_progress_bar/__init__.py +0 -0
  209. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/ring_progress_bar/register_ring_progress_bar.py +0 -0
  210. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/ring_progress_bar/ring.py +0 -0
  211. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/ring_progress_bar/ring_progress_bar.py +0 -0
  212. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/ring_progress_bar/ring_progress_bar.pyproject +0 -0
  213. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/ring_progress_bar/ring_progress_bar_plugin.py +0 -0
  214. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/scan_control/__init__.py +0 -0
  215. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/scan_control/register_scan_control.py +0 -0
  216. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/scan_control/scan_control.py +0 -0
  217. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/scan_control/scan_control.pyproject +0 -0
  218. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/scan_control/scan_control_plugin.py +0 -0
  219. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/scan_control/scan_group_box.py +0 -0
  220. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/spinner/__init__.py +0 -0
  221. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/spinner/register_spinner_widget.py +0 -0
  222. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/spinner/spinner.py +0 -0
  223. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/spinner/spinner_widget.pyproject +0 -0
  224. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/spinner/spinner_widget_plugin.py +0 -0
  225. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/stop_button/__init__.py +0 -0
  226. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/stop_button/register_stop_button.py +0 -0
  227. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/stop_button/stop_button.py +0 -0
  228. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/stop_button/stop_button.pyproject +0 -0
  229. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/stop_button/stop_button_plugin.py +0 -0
  230. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/text_box/__init__.py +0 -0
  231. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/text_box/register_text_box.py +0 -0
  232. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/text_box/text_box.py +0 -0
  233. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/text_box/text_box.pyproject +0 -0
  234. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/text_box/text_box_plugin.py +0 -0
  235. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/toggle/__init__.py +0 -0
  236. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/toggle/register_toggle_switch.py +0 -0
  237. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/toggle/toggle.py +0 -0
  238. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/toggle/toggle_switch.pyproject +0 -0
  239. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/toggle/toggle_switch_plugin.py +0 -0
  240. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/vscode/__init__.py +0 -0
  241. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/vscode/register_vs_code_editor.py +0 -0
  242. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/vscode/vs_code_editor.pyproject +0 -0
  243. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/vscode/vs_code_editor_plugin.py +0 -0
  244. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/vscode/vscode.py +0 -0
  245. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/__init__.py +0 -0
  246. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/bec_waveform_widget.pyproject +0 -0
  247. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/bec_waveform_widget_plugin.py +0 -0
  248. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/register_bec_waveform_widget.py +0 -0
  249. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/waveform_popups/__init__.py +0 -0
  250. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/waveform_popups/curve_dialog/__init__.py +0 -0
  251. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/waveform_popups/curve_dialog/curve_dialog.py +0 -0
  252. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/waveform_popups/curve_dialog/curve_dialog.ui +0 -0
  253. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/waveform_popups/dap_summary_dialog/__init__.py +0 -0
  254. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/waveform_popups/dap_summary_dialog/dap_summary.ui +0 -0
  255. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/waveform/waveform_popups/dap_summary_dialog/dap_summary_dialog.py +0 -0
  256. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/website/__init__.py +0 -0
  257. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/website/register_website_widget.py +0 -0
  258. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/website/website.py +0 -0
  259. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/website/website_widget.pyproject +0 -0
  260. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/bec_widgets/widgets/website/website_widget_plugin.py +0 -0
  261. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/Makefile +0 -0
  262. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/_static/custom.css +0 -0
  263. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/_templates/custom-class-template.rst +0 -0
  264. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/_templates/custom-module-template.rst +0 -0
  265. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/api_reference/api_reference.md +0 -0
  266. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/apps_48dp.svg +0 -0
  267. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/display_settings_48dp.svg +0 -0
  268. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/index_api.svg +0 -0
  269. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/index_contribute.svg +0 -0
  270. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/index_getting_started.svg +0 -0
  271. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/index_user_guide.svg +0 -0
  272. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/rocket_launch_48dp.svg +0 -0
  273. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/buttons.png +0 -0
  274. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/device_box.png +0 -0
  275. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/device_browser.png +0 -0
  276. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/device_inputs.png +0 -0
  277. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/dock_area.png +0 -0
  278. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/figure.png +0 -0
  279. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/image_widget.png +0 -0
  280. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/motor_map_widget.png +0 -0
  281. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/position_indicator.png +0 -0
  282. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/queue.png +0 -0
  283. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/ring_progress_bar.png +0 -0
  284. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/scan_controller.png +0 -0
  285. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/spinner.gif +0 -0
  286. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/status_box.png +0 -0
  287. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/text_box.png +0 -0
  288. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/toggle.png +0 -0
  289. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/waveform_widget.png +0 -0
  290. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/assets/widget_screenshots/website.png +0 -0
  291. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/conf.py +0 -0
  292. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/developer/developer.md +0 -0
  293. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/developer/introduction/concepts.md +0 -0
  294. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/developer/introduction/contributing.md +0 -0
  295. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/developer/introduction/introduction.md +0 -0
  296. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/developer/introduction/useful_links.md +0 -0
  297. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/developer/widget_development/widget_development.md +0 -0
  298. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/index.md +0 -0
  299. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/introduction/introduction.md +0 -0
  300. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/make.bat +0 -0
  301. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/requirements.txt +0 -0
  302. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/api_reference/api_reference.md +0 -0
  303. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/applications/applications.md +0 -0
  304. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/customisation.md +0 -0
  305. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/getting_started/BECDockArea.png +0 -0
  306. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/getting_started/auto_updates.md +0 -0
  307. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/getting_started/getting_started.md +0 -0
  308. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/getting_started/gui_complex_gui.gif +0 -0
  309. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/getting_started/installation.md +0 -0
  310. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/getting_started/quick_start.md +0 -0
  311. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/getting_started/video_tutorials.md +0 -0
  312. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/user.md +0 -0
  313. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/bec_figure/BECFigure.png +0 -0
  314. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/bec_figure/bec_figure.md +0 -0
  315. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/bec_status_box/bec_status_box.gif +0 -0
  316. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/bec_status_box/bec_status_box.md +0 -0
  317. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/buttons/buttons.md +0 -0
  318. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/device_browser/device_browser.md +0 -0
  319. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/device_browser/device_browser.png +0 -0
  320. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/device_input/device_input.md +0 -0
  321. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/dock_area/BECDockArea.png +0 -0
  322. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/dock_area/bec_dock_area.md +0 -0
  323. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/image/image_plot.gif +0 -0
  324. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/image/image_widget.md +0 -0
  325. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/motor_map/motor.gif +0 -0
  326. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/motor_map/motor_map.md +0 -0
  327. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/position_indicator/position_indicator.md +0 -0
  328. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/positioner_box/positioner_box.md +0 -0
  329. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/progress_bar/progress_bar.gif +0 -0
  330. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/progress_bar/ring_progress_bar.md +0 -0
  331. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/queue/queue.md +0 -0
  332. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/scan_control/hide_scan_control.png +0 -0
  333. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/scan_control/scan_control.gif +0 -0
  334. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/scan_control/scan_control.md +0 -0
  335. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/spinner/spinner.md +0 -0
  336. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/text_box/text_box.md +0 -0
  337. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/toggle/toggle.md +0 -0
  338. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/waveform/bec_figure_dap.gif +0 -0
  339. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/waveform/scatter_2D.gif +0 -0
  340. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/waveform/w1D.gif +0 -0
  341. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/waveform/waveform_widget.md +0 -0
  342. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/website/website.md +0 -0
  343. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/docs/user/widgets/widgets.md +0 -0
  344. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/__init__.py +0 -0
  345. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/end-2-end/__init__.py +0 -0
  346. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/end-2-end/conftest.py +0 -0
  347. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/end-2-end/test_bec_dock_rpc_e2e.py +0 -0
  348. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/end-2-end/test_bec_figure_rpc_e2e.py +0 -0
  349. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/end-2-end/test_rpc_register_e2e.py +0 -0
  350. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/end-2-end/test_scan_control_e2e.py +0 -0
  351. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/references/SpinnerWidget/SpinnerWidget_darwin.png +0 -0
  352. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/references/SpinnerWidget/SpinnerWidget_linux.png +0 -0
  353. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png +0 -0
  354. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/references/SpinnerWidget/SpinnerWidget_started_linux.png +0 -0
  355. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/__init__.py +0 -0
  356. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/client_mocks.py +0 -0
  357. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/conftest.py +0 -0
  358. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_connector.py +0 -0
  359. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_dispatcher.py +0 -0
  360. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_dock.py +0 -0
  361. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_figure.py +0 -0
  362. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_image.py +0 -0
  363. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_image_widget.py +0 -0
  364. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_motor_map.py +0 -0
  365. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_queue.py +0 -0
  366. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_bec_status_box.py +0 -0
  367. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_client_utils.py +0 -0
  368. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_color_map_selector.py +0 -0
  369. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_color_validation.py +0 -0
  370. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_configs/config_device.yaml +0 -0
  371. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_configs/config_device_no_entry.yaml +0 -0
  372. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_configs/config_scan.yaml +0 -0
  373. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_device_browser.py +0 -0
  374. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_device_input_base.py +0 -0
  375. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_device_input_widgets.py +0 -0
  376. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_error_utils.py +0 -0
  377. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_generate_cli_client.py +0 -0
  378. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_generate_plugin.py +0 -0
  379. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_motor_map_widget.py +0 -0
  380. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_msgs/__init__.py +0 -0
  381. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_msgs/available_scans_message.py +0 -0
  382. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_plot_base.py +0 -0
  383. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_plugin_utils.py +0 -0
  384. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_positioner_box.py +0 -0
  385. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_ring_progress_bar.py +0 -0
  386. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_rpc_register.py +0 -0
  387. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_rpc_server.py +0 -0
  388. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_rpc_widget_handler.py +0 -0
  389. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_scan_control.py +0 -0
  390. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_scan_control_group_box.py +0 -0
  391. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_setting_dialog.py +0 -0
  392. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_spinner.py +0 -0
  393. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_stop_button.py +0 -0
  394. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_text_box_widget.py +0 -0
  395. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_toggle.py +0 -0
  396. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_vscode_widget.py +0 -0
  397. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_waveform1d.py +0 -0
  398. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_waveform_widget.py +0 -0
  399. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_website_widget.py +0 -0
  400. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_widget_io.py +0 -0
  401. {bec_widgets-0.96.0 → bec_widgets-0.96.2}/tests/unit_tests/test_yaml_dialog.py +0 -0
@@ -140,7 +140,7 @@ tests:
140
140
  - *install-os-packages
141
141
  - *install-repos
142
142
  - pip install -e .[dev,pyqt6]
143
- - coverage run --source=./bec_widgets -m pytest -v --junitxml=report.xml --random-order --full-trace ./tests/unit_tests
143
+ - coverage run --source=./bec_widgets -m pytest -v --junitxml=report.xml --maxfail=2 --random-order --full-trace ./tests/unit_tests
144
144
  - coverage report
145
145
  - coverage xml
146
146
  coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
@@ -177,7 +177,7 @@ test-matrix:
177
177
  - *install-os-packages
178
178
  - *install-repos
179
179
  - pip install -e .[dev,$QT_PCKG]
180
- - pytest -v --junitxml=report.xml --random-order ./tests/unit_tests
180
+ - pytest -v --maxfail=2 --junitxml=report.xml --random-order ./tests/unit_tests
181
181
  allow_failure: true
182
182
 
183
183
  end-2-end-conda:
@@ -1,5 +1,29 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.96.2 (2024-08-22)
4
+
5
+ ### Fix
6
+
7
+ * fix(waveform): validation of custom curves removed ([`af28574`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/af28574bd58457a05f1269f121db01ad627b5769))
8
+
9
+ * fix(waveform): skip validation for curves that are not BECCurve instances ([`617db36`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/617db36ed4932c8a0633724079b695bc67d5c77b))
10
+
11
+ ## v0.96.1 (2024-08-22)
12
+
13
+ ### Ci
14
+
15
+ * ci: fail pytest after 2 failed tests ([`f0203d9`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/f0203d9bf60c4975ba5ab93a057d9091762454d5))
16
+
17
+ ### Fix
18
+
19
+ * fix(crosshair): update markers if necessary ([`4473805`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/44738057a36f5de2bbb55affdd309f92286d4a0f))
20
+
21
+ * fix(waveform_widget): fixed icon appearance ([`f98a9f9`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/f98a9f9771b93226d47830aa52f45739624f51b4))
22
+
23
+ * fix: bubble-up signals ([`2fe72c9`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/2fe72c9ccb71bcb196a1b78197b73acf9aa3f506))
24
+
25
+ * fix(crosshair): fixed crosshair for image and waveforms ([`37835cb`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/37835cbf76ca3ba1081f514ee7793244ac500e7f))
26
+
3
27
  ## v0.96.0 (2024-08-22)
4
28
 
5
29
  ### Documentation
@@ -133,31 +157,3 @@ Terminating client connections has to be done at the application level ([`198c1d
133
157
  ### Fix
134
158
 
135
159
  * fix(positioner_box): icons fixed ([`281633d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/281633deff15b6879dac3a4f0770fa6949aaecdc))
136
-
137
- ### Refactor
138
-
139
- * refactor: add button for positioner selection ([`0d190c5`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/0d190c5c5996e59fec4bdd44d2003e10e200b009))
140
-
141
- ### Test
142
-
143
- * test(dap): wait for fit ([`6269009`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6269009e5451f830cdee58a514c7858483488a8d))
144
-
145
- * test(auto-update): wait for rendering ([`6d2442d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6d2442d23c683fe92af13df982ce681c07e99cde))
146
-
147
- ## v0.93.4 (2024-08-07)
148
-
149
- ### Fix
150
-
151
- * fix: rename DeviceBox to PositionerBox, fix test for validation ([`37aa371`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/37aa371e7c4c62d70abf37abc125db0c088790fe))
152
-
153
- * fix: add validation for bec_lib.device.Positioner; closes #268 ([`eb54e9f`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/eb54e9f788e97af23db8fe0c78f8facb8688bb99))
154
-
155
- ## v0.93.3 (2024-08-07)
156
-
157
- ### Fix
158
-
159
- * fix(dock): properly shut down docks and temp areas ([`99ee545`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/99ee545e41c6078654958b668b5b329f85553d16))
160
-
161
- ### Test
162
-
163
- * test: removed quit from teardown ([`cf94599`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/cf94599c2544d6831c8afbe7b340082077557ed1))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.96.0
3
+ Version: 0.96.2
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
@@ -3,8 +3,9 @@ import os
3
3
  from abc import ABC, abstractmethod
4
4
  from collections import defaultdict
5
5
 
6
+ from bec_qthemes import material_icon
6
7
  from qtpy.QtCore import QSize
7
- from qtpy.QtGui import QAction, QIcon
8
+ from qtpy.QtGui import QAction, QGuiApplication, QIcon
8
9
  from qtpy.QtWidgets import QHBoxLayout, QLabel, QMenu, QToolBar, QToolButton, QWidget
9
10
 
10
11
  import bec_widgets
@@ -70,6 +71,33 @@ class IconAction(ToolBarAction):
70
71
  toolbar.addAction(self.action)
71
72
 
72
73
 
74
+ class MaterialIconAction:
75
+ """
76
+ Abstract base class for toolbar actions.
77
+
78
+ Args:
79
+ icon_path (str, optional): The name of the icon file from `assets/toolbar_icons`. Defaults to None.
80
+ tooltip (bool, optional): The tooltip for the action. Defaults to None.
81
+ checkable (bool, optional): Whether the action is checkable. Defaults to False.
82
+ """
83
+
84
+ def __init__(self, icon_name: str = None, tooltip: str = None, checkable: bool = False):
85
+ self.icon_name = icon_name
86
+ self.tooltip = tooltip
87
+ self.checkable = checkable
88
+ self.action = None
89
+
90
+ def add_to_toolbar(self, toolbar: QToolBar, target: QWidget):
91
+ palette = QGuiApplication.palette()
92
+ color = "#FFFFFF" # FIXME: This should be a theme color but the toolbar doesn't respect the theme atm
93
+ # one fixed, change it to palette.toolTipBase().color()
94
+
95
+ icon = material_icon(self.icon_name, size=(20, 20), color=color)
96
+ self.action = QAction(QIcon(icon), self.tooltip, target)
97
+ self.action.setCheckable(self.checkable)
98
+ toolbar.addAction(self.action)
99
+
100
+
73
101
  class DeviceSelectionAction(ToolBarAction):
74
102
  """
75
103
  Action for selecting a device in a combobox.
@@ -1,8 +1,10 @@
1
+ from collections import defaultdict
2
+
1
3
  import numpy as np
2
4
  import pyqtgraph as pg
3
5
 
4
6
  # from qtpy.QtCore import QObject, pyqtSignal
5
- from qtpy.QtCore import QObject
7
+ from qtpy.QtCore import QObject, Qt
6
8
  from qtpy.QtCore import Signal as pyqtSignal
7
9
 
8
10
 
@@ -26,10 +28,13 @@ class Crosshair(QObject):
26
28
  super().__init__(parent)
27
29
  self.is_log_y = None
28
30
  self.is_log_x = None
31
+ self.is_derivative = None
29
32
  self.plot_item = plot_item
30
33
  self.precision = precision
31
34
  self.v_line = pg.InfiniteLine(angle=90, movable=False)
35
+ self.v_line.skip_auto_range = True
32
36
  self.h_line = pg.InfiniteLine(angle=0, movable=False)
37
+ self.h_line.skip_auto_range = True
33
38
  self.plot_item.addItem(self.v_line, ignoreBounds=True)
34
39
  self.plot_item.addItem(self.h_line, ignoreBounds=True)
35
40
  self.proxy = pg.SignalProxy(
@@ -37,74 +42,75 @@ class Crosshair(QObject):
37
42
  )
38
43
  self.plot_item.scene().sigMouseClicked.connect(self.mouse_clicked)
39
44
 
45
+ self.plot_item.ctrl.derivativeCheck.checkStateChanged.connect(self.check_derivatives)
46
+ self.plot_item.ctrl.logXCheck.checkStateChanged.connect(self.check_log)
47
+ self.plot_item.ctrl.logYCheck.checkStateChanged.connect(self.check_log)
48
+
40
49
  # Initialize markers
41
- self.marker_moved_1d = []
42
- self.marker_clicked_1d = []
50
+ self.marker_moved_1d = {}
51
+ self.marker_clicked_1d = {}
43
52
  self.marker_2d = None
44
53
  self.update_markers()
45
54
 
46
55
  def update_markers(self):
47
56
  """Update the markers for the crosshair, creating new ones if necessary."""
48
57
 
49
- # Clear existing markers
50
- for marker in self.marker_moved_1d + self.marker_clicked_1d:
51
- self.plot_item.removeItem(marker)
52
- if self.marker_2d:
53
- self.plot_item.removeItem(self.marker_2d)
54
-
55
58
  # Create new markers
56
- self.marker_moved_1d = []
57
- self.marker_clicked_1d = []
58
- self.marker_2d = None
59
59
  for item in self.plot_item.items:
60
60
  if isinstance(item, pg.PlotDataItem): # 1D plot
61
+ if item.name() in self.marker_moved_1d:
62
+ continue
61
63
  pen = item.opts["pen"]
62
64
  color = pen.color() if hasattr(pen, "color") else pg.mkColor(pen)
63
65
  marker_moved = pg.ScatterPlotItem(
64
66
  size=10, pen=pg.mkPen(color), brush=pg.mkBrush(None)
65
67
  )
66
- marker_clicked = pg.ScatterPlotItem(
67
- size=10, pen=pg.mkPen(None), brush=pg.mkBrush(color)
68
- )
69
- self.marker_moved_1d.append(marker_moved)
68
+ marker_moved.skip_auto_range = True
69
+ self.marker_moved_1d[item.name()] = marker_moved
70
70
  self.plot_item.addItem(marker_moved)
71
+
71
72
  # Create glowing effect markers for clicked events
72
- marker_clicked_list = []
73
73
  for size, alpha in [(18, 64), (14, 128), (10, 255)]:
74
74
  marker_clicked = pg.ScatterPlotItem(
75
75
  size=size,
76
76
  pen=pg.mkPen(None),
77
77
  brush=pg.mkBrush(color.red(), color.green(), color.blue(), alpha),
78
78
  )
79
- marker_clicked_list.append(marker_clicked)
79
+ marker_clicked.skip_auto_range = True
80
+ self.marker_clicked_1d[item.name()] = marker_clicked
80
81
  self.plot_item.addItem(marker_clicked)
81
82
 
82
- self.marker_clicked_1d.append(marker_clicked_list)
83
83
  elif isinstance(item, pg.ImageItem): # 2D plot
84
+ if self.marker_2d is not None:
85
+ continue
84
86
  self.marker_2d = pg.ROI(
85
87
  [0, 0], size=[1, 1], pen=pg.mkPen("r", width=2), movable=False
86
88
  )
87
89
  self.plot_item.addItem(self.marker_2d)
88
90
 
89
- def snap_to_data(self, x, y) -> tuple:
91
+ def snap_to_data(self, x, y) -> tuple[defaultdict[list], defaultdict[list]]:
90
92
  """
91
93
  Finds the nearest data points to the given x and y coordinates.
92
94
 
93
95
  Args:
94
- x: The x-coordinate
95
- y: The y-coordinate
96
+ x: The x-coordinate of the mouse cursor
97
+ y: The y-coordinate of the mouse cursor
96
98
 
97
99
  Returns:
98
- tuple: The nearest x and y values
100
+ tuple: x and y values snapped to the nearest data
99
101
  """
100
- y_values_1d = []
101
- x_values_1d = []
102
+ y_values = defaultdict(list)
103
+ x_values = defaultdict(list)
102
104
  image_2d = None
103
105
 
104
106
  # Iterate through items in the plot
105
107
  for item in self.plot_item.items:
106
108
  if isinstance(item, pg.PlotDataItem): # 1D plot
107
- x_data, y_data = item.xData, item.yData
109
+ name = item.name()
110
+ plot_data = item._getDisplayDataset()
111
+ if plot_data is None:
112
+ continue
113
+ x_data, y_data = plot_data.x, plot_data.y
108
114
  if x_data is not None and y_data is not None:
109
115
  if self.is_log_x:
110
116
  min_x_data = np.min(x_data[x_data > 0])
@@ -112,25 +118,25 @@ class Crosshair(QObject):
112
118
  min_x_data = np.min(x_data)
113
119
  max_x_data = np.max(x_data)
114
120
  if x < min_x_data or x > max_x_data:
115
- return None, None
121
+ y_values[name] = None
122
+ x_values[name] = None
123
+ continue
116
124
  closest_x, closest_y = self.closest_x_y_value(x, x_data, y_data)
117
- y_values_1d.append(closest_y)
118
- x_values_1d.append(closest_x)
125
+ y_values[name] = closest_y
126
+ x_values[name] = closest_x
119
127
  elif isinstance(item, pg.ImageItem): # 2D plot
128
+ name = item.config.monitor
120
129
  image_2d = item.image
130
+ # clip the x and y values to the image dimensions to avoid out of bounds errors
131
+ y_values[name] = int(np.clip(y, 0, image_2d.shape[1] - 1))
132
+ x_values[name] = int(np.clip(x, 0, image_2d.shape[0] - 1))
121
133
 
122
- # Handle 1D plot
123
- if y_values_1d:
124
- if all(v is None for v in x_values_1d) or all(v is None for v in y_values_1d):
134
+ if x_values and y_values:
135
+ if all(v is None for v in x_values.values()) or all(
136
+ v is None for v in y_values.values()
137
+ ):
125
138
  return None, None
126
- closest_x = min(x_values_1d, key=lambda xi: abs(xi - x)) # Snap x to closest data point
127
- return closest_x, y_values_1d
128
-
129
- # Handle 2D plot
130
- if image_2d is not None:
131
- x_idx = int(np.clip(x, 0, image_2d.shape[0] - 1))
132
- y_idx = int(np.clip(y, 0, image_2d.shape[1] - 1))
133
- return x_idx, y_idx
139
+ return x_values, y_values
134
140
 
135
141
  return None, None
136
142
 
@@ -156,8 +162,8 @@ class Crosshair(QObject):
156
162
  Args:
157
163
  event: The mouse moved event
158
164
  """
159
- self.check_log()
160
165
  pos = event[0]
166
+ self.update_markers()
161
167
  if self.plot_item.vb.sceneBoundingRect().contains(pos):
162
168
  mouse_point = self.plot_item.vb.mapSceneToView(pos)
163
169
  self.v_line.setPos(mouse_point.x())
@@ -168,27 +174,34 @@ class Crosshair(QObject):
168
174
  x = 10**x
169
175
  if self.is_log_y:
170
176
  y = 10**y
171
- x, y_values = self.snap_to_data(x, y)
177
+ x_snap_values, y_snap_values = self.snap_to_data(x, y)
178
+ if x_snap_values is None or y_snap_values is None:
179
+ return
180
+ if all(v is None for v in x_snap_values.values()) or all(
181
+ v is None for v in y_snap_values.values()
182
+ ):
183
+ # not sure how we got here, but just to be safe...
184
+ return
172
185
 
173
186
  for item in self.plot_item.items:
174
187
  if isinstance(item, pg.PlotDataItem):
175
- if x is None or all(v is None for v in y_values):
176
- return
177
- coordinate_to_emit = (
178
- round(x, self.precision),
179
- [round(y_val, self.precision) for y_val in y_values],
180
- )
188
+ name = item.name()
189
+ x, y = x_snap_values[name], y_snap_values[name]
190
+ if x is None or y is None:
191
+ continue
192
+ self.marker_moved_1d[name].setData([x], [y])
193
+ coordinate_to_emit = (name, round(x, self.precision), round(y, self.precision))
181
194
  self.coordinatesChanged1D.emit(coordinate_to_emit)
182
- for i, y_val in enumerate(y_values):
183
- self.marker_moved_1d[i].setData(
184
- [x if not self.is_log_x else np.log10(x)],
185
- [y_val if not self.is_log_y else np.log10(y_val)],
186
- )
187
195
  elif isinstance(item, pg.ImageItem):
188
- if x is None or y_values is None:
189
- return
190
- coordinate_to_emit = (x, y_values)
196
+ name = item.config.monitor
197
+ x, y = x_snap_values[name], y_snap_values[name]
198
+ if x is None or y is None:
199
+ continue
200
+ self.marker_2d.setPos([x, y])
201
+ coordinate_to_emit = (name, x, y)
191
202
  self.coordinatesChanged2D.emit(coordinate_to_emit)
203
+ else:
204
+ continue
192
205
 
193
206
  def mouse_clicked(self, event):
194
207
  """Handles the mouse clicked event, updating the crosshair position and emitting signals.
@@ -196,7 +209,11 @@ class Crosshair(QObject):
196
209
  Args:
197
210
  event: The mouse clicked event
198
211
  """
199
- self.check_log()
212
+
213
+ # we only accept left mouse clicks
214
+ if event.button() != Qt.MouseButton.LeftButton:
215
+ return
216
+ self.update_markers()
200
217
  if self.plot_item.vb.sceneBoundingRect().contains(event._scenePos):
201
218
  mouse_point = self.plot_item.vb.mapSceneToView(event._scenePos)
202
219
  x, y = mouse_point.x(), mouse_point.y()
@@ -205,31 +222,55 @@ class Crosshair(QObject):
205
222
  x = 10**x
206
223
  if self.is_log_y:
207
224
  y = 10**y
208
- x, y_values = self.snap_to_data(x, y)
225
+ x_snap_values, y_snap_values = self.snap_to_data(x, y)
226
+
227
+ if x_snap_values is None or y_snap_values is None:
228
+ return
229
+ if all(v is None for v in x_snap_values.values()) or all(
230
+ v is None for v in y_snap_values.values()
231
+ ):
232
+ # not sure how we got here, but just to be safe...
233
+ return
209
234
 
210
235
  for item in self.plot_item.items:
211
236
  if isinstance(item, pg.PlotDataItem):
212
- if x is None or all(v is None for v in y_values):
213
- return
214
- coordinate_to_emit = (
215
- round(x, self.precision),
216
- [round(y_val, self.precision) for y_val in y_values],
217
- )
237
+ name = item.name()
238
+ x, y = x_snap_values[name], y_snap_values[name]
239
+ if x is None or y is None:
240
+ continue
241
+ self.marker_clicked_1d[name].setData([x], [y])
242
+ coordinate_to_emit = (name, round(x, self.precision), round(y, self.precision))
218
243
  self.coordinatesClicked1D.emit(coordinate_to_emit)
219
- for i, y_val in enumerate(y_values):
220
- for marker in self.marker_clicked_1d[i]:
221
- marker.setData(
222
- [x if not self.is_log_x else np.log10(x)],
223
- [y_val if not self.is_log_y else np.log10(y_val)],
224
- )
225
244
  elif isinstance(item, pg.ImageItem):
226
- if x is None or y_values is None:
227
- return
228
- coordinate_to_emit = (x, y_values)
245
+ name = item.config.monitor
246
+ x, y = x_snap_values[name], y_snap_values[name]
247
+ if x is None or y is None:
248
+ continue
249
+ self.marker_2d.setPos([x, y])
250
+ coordinate_to_emit = (name, x, y)
229
251
  self.coordinatesClicked2D.emit(coordinate_to_emit)
230
- self.marker_2d.setPos([x, y_values])
252
+ else:
253
+ continue
254
+
255
+ def clear_markers(self):
256
+ """Clears the markers from the plot."""
257
+ for marker in self.marker_moved_1d.values():
258
+ marker.clear()
259
+ for marker in self.marker_clicked_1d.values():
260
+ marker.clear()
231
261
 
232
262
  def check_log(self):
233
263
  """Checks if the x or y axis is in log scale and updates the internal state accordingly."""
234
264
  self.is_log_x = self.plot_item.ctrl.logXCheck.isChecked()
235
265
  self.is_log_y = self.plot_item.ctrl.logYCheck.isChecked()
266
+ self.clear_markers()
267
+
268
+ def check_derivatives(self):
269
+ """Checks if the derivatives are enabled and updates the internal state accordingly."""
270
+ self.is_derivative = self.plot_item.ctrl.derivativeCheck.isChecked()
271
+ self.clear_markers()
272
+
273
+ def cleanup(self):
274
+ self.v_line.deleteLater()
275
+ self.h_line.deleteLater()
276
+ self.clear_markers()
@@ -4,9 +4,11 @@ from typing import Literal, Optional
4
4
 
5
5
  import pyqtgraph as pg
6
6
  from pydantic import BaseModel, Field
7
+ from qtpy.QtCore import Signal, Slot
7
8
  from qtpy.QtWidgets import QWidget
8
9
 
9
10
  from bec_widgets.utils import BECConnector, ConnectionConfig
11
+ from bec_widgets.utils.crosshair import Crosshair
10
12
 
11
13
 
12
14
  class AxisConfig(BaseModel):
@@ -41,7 +43,21 @@ class SubplotConfig(ConnectionConfig):
41
43
  )
42
44
 
43
45
 
46
+ class BECViewBox(pg.ViewBox):
47
+
48
+ def itemBoundsChanged(self, item):
49
+ self._itemBoundsCache.pop(item, None)
50
+ if (self.state["autoRange"][0] is not False) or (self.state["autoRange"][1] is not False):
51
+ # check if the call is coming from a mouse-move event
52
+ if hasattr(item, "skip_auto_range") and item.skip_auto_range:
53
+ return
54
+ self._autoRangeNeedsUpdate = True
55
+ self.update()
56
+
57
+
44
58
  class BECPlotBase(BECConnector, pg.GraphicsLayout):
59
+ crosshair_coordinates_changed = Signal(tuple)
60
+ crosshair_coordinates_clicked = Signal(tuple)
45
61
  USER_ACCESS = [
46
62
  "_config_dict",
47
63
  "set",
@@ -73,9 +89,13 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout):
73
89
  pg.GraphicsLayout.__init__(self, parent)
74
90
 
75
91
  self.figure = parent_figure
76
- self.plot_item = self.addPlot(row=0, col=0)
92
+
93
+ # self.plot_item = self.addPlot(row=0, col=0)
94
+ self.plot_item = pg.PlotItem(viewBox=BECViewBox(parent=self, enableMenu=True), parent=self)
95
+ self.addItem(self.plot_item, row=0, col=0)
77
96
 
78
97
  self.add_legend()
98
+ self.crosshair = None
79
99
 
80
100
  def set(self, **kwargs) -> None:
81
101
  """
@@ -304,6 +324,40 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout):
304
324
  """
305
325
  self.plot_item.enableAutoRange(axis, enabled)
306
326
 
327
+ def hook_crosshair(self) -> None:
328
+ """Hook the crosshair to all plots."""
329
+ if self.crosshair is None:
330
+ self.crosshair = Crosshair(self.plot_item, precision=3)
331
+ self.crosshair.coordinatesChanged1D.connect(self.crosshair_coordinates_changed)
332
+ self.crosshair.coordinatesClicked1D.connect(self.crosshair_coordinates_clicked)
333
+ self.crosshair.coordinatesChanged2D.connect(self.crosshair_coordinates_changed)
334
+ self.crosshair.coordinatesClicked2D.connect(self.crosshair_coordinates_clicked)
335
+
336
+ def unhook_crosshair(self) -> None:
337
+ """Unhook the crosshair from all plots."""
338
+ if self.crosshair is not None:
339
+ self.crosshair.coordinatesChanged1D.disconnect(self.crosshair_coordinates_changed)
340
+ self.crosshair.coordinatesClicked1D.disconnect(self.crosshair_coordinates_clicked)
341
+ self.crosshair.coordinatesChanged2D.disconnect(self.crosshair_coordinates_changed)
342
+ self.crosshair.coordinatesClicked2D.disconnect(self.crosshair_coordinates_clicked)
343
+ self.crosshair.cleanup()
344
+ self.crosshair.deleteLater()
345
+ self.crosshair = None
346
+
347
+ def toggle_crosshair(self) -> None:
348
+ """Toggle the crosshair on all plots."""
349
+ if self.crosshair is None:
350
+ return self.hook_crosshair()
351
+
352
+ self.unhook_crosshair()
353
+
354
+ @Slot()
355
+ def reset(self) -> None:
356
+ """Reset the plot widget."""
357
+ if self.crosshair is not None:
358
+ self.crosshair.clear_markers()
359
+ self.crosshair.update_markers()
360
+
307
361
  def export(self):
308
362
  """Show the Export Dialog of the plot widget."""
309
363
  scene = self.plot_item.scene()
@@ -317,6 +371,7 @@ class BECPlotBase(BECConnector, pg.GraphicsLayout):
317
371
 
318
372
  def cleanup_pyqtgraph(self):
319
373
  """Cleanup pyqtgraph items."""
374
+ self.unhook_crosshair()
320
375
  item = self.plot_item
321
376
  item.vb.menu.close()
322
377
  item.vb.menu.deleteLater()
@@ -77,6 +77,7 @@ class BECWaveform(BECPlotBase):
77
77
  dap_params_update = pyqtSignal(dict)
78
78
  dap_summary_update = pyqtSignal(dict)
79
79
  autorange_signal = pyqtSignal()
80
+ new_scan = pyqtSignal()
80
81
 
81
82
  def __init__(
82
83
  self,
@@ -375,6 +376,10 @@ class BECWaveform(BECPlotBase):
375
376
  if len(self.curves) > 0:
376
377
  # validate all curves
377
378
  for curve in self.curves:
379
+ if not isinstance(curve, BECCurve):
380
+ continue
381
+ if curve.config.source == "custom":
382
+ continue
378
383
  self._validate_x_axis_behaviour(curve.config.signals.y.name, x_name, x_entry, False)
379
384
  self._switch_x_axis_item(
380
385
  f"{x_name}-{x_entry}"
@@ -382,9 +387,12 @@ class BECWaveform(BECPlotBase):
382
387
  else x_name
383
388
  )
384
389
  for curve_id, curve_config in zip(curve_ids, curve_configs):
385
- if curve_config.signals.x:
386
- curve_config.signals.x.name = x_name
387
- curve_config.signals.x.entry = x_entry
390
+ if curve_config.signals is None:
391
+ continue
392
+ if curve_config.signals.x is None:
393
+ continue
394
+ curve_config.signals.x.name = x_name
395
+ curve_config.signals.x.entry = x_entry
388
396
  self.remove_curve(curve_id)
389
397
  self.add_curve_by_config(curve_config)
390
398
 
@@ -408,23 +416,6 @@ class BECWaveform(BECPlotBase):
408
416
  """
409
417
  self.plot_item.enableAutoRange(axis, enabled)
410
418
 
411
- @Slot()
412
- def auto_range(self):
413
- self.plot_item.autoRange()
414
-
415
- def set_auto_range(self, enabled: bool, axis: str = "xy"):
416
- """
417
- Set the auto range of the plot widget.
418
-
419
- Args:
420
- enabled(bool): If True, enable the auto range.
421
- axis(str, optional): The axis to enable the auto range.
422
- - "xy": Enable auto range for both x and y axis.
423
- - "x": Enable auto range for x axis.
424
- - "y": Enable auto range for y axis.
425
- """
426
- self.plot_item.enableAutoRange(axis, enabled)
427
-
428
419
  def add_curve_custom(
429
420
  self,
430
421
  x: list | np.ndarray,
@@ -935,6 +926,8 @@ class BECWaveform(BECPlotBase):
935
926
  return
936
927
 
937
928
  if current_scan_id != self.scan_id:
929
+ self.reset()
930
+ self.new_scan.emit()
938
931
  self.set_auto_range(True, "xy")
939
932
  self.old_scan_id = self.scan_id
940
933
  self.scan_id = current_scan_id