bec-widgets 2.13.2__tar.gz → 2.15.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 (411) hide show
  1. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/CHANGELOG.md +37 -0
  2. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/PKG-INFO +1 -1
  3. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/client.py +123 -1
  4. bec_widgets-2.15.0/bec_widgets/widgets/containers/main_window/addons/scroll_label.py +89 -0
  5. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/main_window.py +94 -20
  6. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_base.py +12 -1
  7. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/setting_widgets/image_roi_tree.py +42 -22
  8. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/roi/image_roi.py +86 -0
  9. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/pyproject.toml +1 -1
  10. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.git_hooks/pre-commit +0 -0
  11. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  12. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/ISSUE_TEMPLATE/documentation_update.md +0 -0
  13. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  14. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/actions/bw_install/action.yml +0 -0
  15. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/pull_request_template.md +0 -0
  16. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/scripts/pr_issue_sync/pr_issue_sync.py +0 -0
  17. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/scripts/pr_issue_sync/requirements.txt +0 -0
  18. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/check_pr.yml +0 -0
  19. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/ci.yml +0 -0
  20. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/end2end-conda.yml +0 -0
  21. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/formatter.yml +0 -0
  22. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/generate-cli-check.yml +0 -0
  23. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/pytest-matrix.yml +0 -0
  24. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/pytest.yml +0 -0
  25. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/semantic_release.yml +0 -0
  26. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/stale-issues.yml +0 -0
  27. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/sync-issues-pr.yml +0 -0
  28. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.gitignore +0 -0
  29. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.gitlab-ci.yml +0 -0
  30. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.pylintrc +0 -0
  31. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.readthedocs.yaml +0 -0
  32. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/LICENSE +0 -0
  33. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/README.md +0 -0
  34. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/__init__.py +0 -0
  35. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/applications/__init__.py +0 -0
  36. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/applications/bw_launch.py +0 -0
  37. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/applications/launch_window.py +0 -0
  38. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/BEC-General-App.png +0 -0
  39. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/alignment_1d.png +0 -0
  40. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/auto_update.png +0 -0
  41. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/bec_widgets_icon.png +0 -0
  42. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/ui_loader_tile.png +0 -0
  43. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/widget_launch_tile.png +0 -0
  44. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/__init__.py +0 -0
  45. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/client_utils.py +0 -0
  46. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/generate_cli.py +0 -0
  47. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/rpc/__init__.py +0 -0
  48. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/rpc/rpc_base.py +0 -0
  49. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/rpc/rpc_register.py +0 -0
  50. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/rpc/rpc_widget_handler.py +0 -0
  51. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/server.py +0 -0
  52. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/__init__.py +0 -0
  53. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/general_app/__init__.py +0 -0
  54. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/general_app/general_app.py +0 -0
  55. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/general_app/general_app.ui +0 -0
  56. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/general_app/web_links.py +0 -0
  57. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  58. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  59. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
  60. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
  61. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
  62. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
  63. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
  64. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
  65. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
  66. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/tests/__init__.py +0 -0
  67. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/tests/utils.py +0 -0
  68. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/__init__.py +0 -0
  69. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_connector.py +0 -0
  70. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_designer.py +0 -0
  71. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_dispatcher.py +0 -0
  72. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_plugin_helper.py +0 -0
  73. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_signal_proxy.py +0 -0
  74. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_table.py +0 -0
  75. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_widget.py +0 -0
  76. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/clickable_label.py +0 -0
  77. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/collapsible_panel_manager.py +0 -0
  78. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/colors.py +0 -0
  79. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/compact_popup.py +0 -0
  80. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/container_utils.py +0 -0
  81. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/crosshair.py +0 -0
  82. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/entry_validator.py +0 -0
  83. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/error_popups.py +0 -0
  84. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/expandable_frame.py +0 -0
  85. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/filter_io.py +0 -0
  86. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/forms_from_types/__init__.py +0 -0
  87. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/forms_from_types/forms.py +0 -0
  88. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/forms_from_types/items.py +0 -0
  89. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/forms_from_types/styles.py +0 -0
  90. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/fps_counter.py +0 -0
  91. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/generate_designer_plugin.py +0 -0
  92. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/layout_manager.py +0 -0
  93. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/linear_region_selector.py +0 -0
  94. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/name_utils.py +0 -0
  95. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/ophyd_kind_util.py +0 -0
  96. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/palette_viewer.py +0 -0
  97. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/plot_indicator_items.py +0 -0
  98. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/plugin_templates/plugin.template +0 -0
  99. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/plugin_templates/register.template +0 -0
  100. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/plugin_utils.py +0 -0
  101. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/redis_message_waiter.py +0 -0
  102. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/reference_utils.py +0 -0
  103. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/round_frame.py +0 -0
  104. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/rpc_decorator.py +0 -0
  105. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/rpc_server.py +0 -0
  106. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/serialization.py +0 -0
  107. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/settings_dialog.py +0 -0
  108. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/side_panel.py +0 -0
  109. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/thread_checker.py +0 -0
  110. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/toolbar.py +0 -0
  111. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/ui_loader.py +0 -0
  112. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/validator_delegate.py +0 -0
  113. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/widget_io.py +0 -0
  114. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/widget_state_manager.py +0 -0
  115. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/yaml_dialog.py +0 -0
  116. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/__init__.py +0 -0
  117. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/__init__.py +0 -0
  118. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/auto_update/__init__.py +0 -0
  119. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/auto_update/auto_updates.py +0 -0
  120. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/__init__.py +0 -0
  121. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/dock.py +0 -0
  122. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/dock_area.py +0 -0
  123. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/dock_area.pyproject +0 -0
  124. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/dock_area_plugin.py +0 -0
  125. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/register_dock_area.py +0 -0
  126. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/layout_manager/__init__.py +0 -0
  127. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/layout_manager/layout_manager.py +0 -0
  128. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/__init__.py +0 -0
  129. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/addons/__init__.py +0 -0
  130. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/addons/web_links.py +0 -0
  131. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/__init__.py +0 -0
  132. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/__init__.py +0 -0
  133. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/__init__.py +0 -0
  134. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/abort_button.pyproject +0 -0
  135. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/abort_button_plugin.py +0 -0
  136. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/button_abort.py +0 -0
  137. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/register_abort_button.py +0 -0
  138. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/__init__.py +0 -0
  139. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/button_reset.py +0 -0
  140. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/register_reset_button.py +0 -0
  141. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/reset_button.pyproject +0 -0
  142. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/reset_button_plugin.py +0 -0
  143. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/__init__.py +0 -0
  144. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/button_resume.py +0 -0
  145. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/register_resume_button.py +0 -0
  146. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/resume_button.pyproject +0 -0
  147. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/resume_button_plugin.py +0 -0
  148. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/__init__.py +0 -0
  149. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/register_stop_button.py +0 -0
  150. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button.py +0 -0
  151. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button.pyproject +0 -0
  152. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button_plugin.py +0 -0
  153. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/__init__.py +0 -0
  154. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/__init__.py +0 -0
  155. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.py +0 -0
  156. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.pyproject +0 -0
  157. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator_plugin.py +0 -0
  158. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/register_position_indicator.py +0 -0
  159. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/__init__.py +0 -0
  160. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py +0 -0
  161. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py +0 -0
  162. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/__init__.py +0 -0
  163. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +0 -0
  164. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.pyproject +0 -0
  165. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.ui +0 -0
  166. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box_plugin.py +0 -0
  167. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/register_positioner_box.py +0 -0
  168. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/__init__.py +0 -0
  169. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d.pyproject +0 -0
  170. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d_plugin.py +0 -0
  171. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +0 -0
  172. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui +0 -0
  173. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/register_positioner_box2_d.py +0 -0
  174. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.py +0 -0
  175. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.pyproject +0 -0
  176. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.ui +0 -0
  177. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line_plugin.py +0 -0
  178. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/register_positioner_control_line.py +0 -0
  179. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/__init__.py +0 -0
  180. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py +0 -0
  181. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.pyproject +0 -0
  182. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plugin.py +0 -0
  183. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py +0 -0
  184. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/__init__.py +0 -0
  185. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/base_classes/__init__.py +0 -0
  186. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py +0 -0
  187. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py +0 -0
  188. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_combobox/__init__.py +0 -0
  189. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box.pyproject +0 -0
  190. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box_plugin.py +0 -0
  191. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py +0 -0
  192. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_combobox/register_device_combo_box.py +0 -0
  193. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_line_edit/__init__.py +0 -0
  194. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py +0 -0
  195. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.pyproject +0 -0
  196. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit_plugin.py +0 -0
  197. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_line_edit/register_device_line_edit.py +0 -0
  198. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_combobox/__init__.py +0 -0
  199. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_combobox/register_signal_combo_box.py +0 -0
  200. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject +0 -0
  201. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box_plugin.py +0 -0
  202. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py +0 -0
  203. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_line_edit/__init__.py +0 -0
  204. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_line_edit/register_signal_line_edit.py +0 -0
  205. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py +0 -0
  206. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.pyproject +0 -0
  207. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit_plugin.py +0 -0
  208. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/__init__.py +0 -0
  209. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/register_scan_control.py +0 -0
  210. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/scan_control.py +0 -0
  211. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/scan_control.pyproject +0 -0
  212. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/scan_control_plugin.py +0 -0
  213. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/scan_group_box.py +0 -0
  214. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/__init__.py +0 -0
  215. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/__init__.py +0 -0
  216. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py +0 -0
  217. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.pyproject +0 -0
  218. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box_plugin.py +0 -0
  219. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/register_dap_combo_box.py +0 -0
  220. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/__init__.py +0 -0
  221. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog.pyproject +0 -0
  222. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog_plugin.py +0 -0
  223. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog.py +0 -0
  224. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_compact.ui +0 -0
  225. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_vertical.ui +0 -0
  226. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/register_lm_fit_dialog.py +0 -0
  227. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/__init__.py +0 -0
  228. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/dict_backed_table.py +0 -0
  229. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/jupyter_console/__init__.py +0 -0
  230. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/jupyter_console/jupyter_console.py +0 -0
  231. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/__init__.py +0 -0
  232. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/_util.py +0 -0
  233. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/register_scan_metadata.py +0 -0
  234. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +0 -0
  235. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/scan_metadata.pyproject +0 -0
  236. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/scan_metadata_plugin.py +0 -0
  237. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/__init__.py +0 -0
  238. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/register_text_box.py +0 -0
  239. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/text_box.py +0 -0
  240. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/text_box.pyproject +0 -0
  241. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/text_box_plugin.py +0 -0
  242. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/__init__.py +0 -0
  243. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/register_vs_code_editor.py +0 -0
  244. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/vs_code_editor.pyproject +0 -0
  245. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/vs_code_editor_plugin.py +0 -0
  246. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/vscode.py +0 -0
  247. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/web_console/register_web_console.py +0 -0
  248. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/web_console/web_console.py +0 -0
  249. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/web_console/web_console.pyproject +0 -0
  250. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/web_console/web_console_plugin.py +0 -0
  251. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/__init__.py +0 -0
  252. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/register_website_widget.py +0 -0
  253. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/website.py +0 -0
  254. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/website_widget.pyproject +0 -0
  255. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/website_widget_plugin.py +0 -0
  256. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/__init__.py +0 -0
  257. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/minesweeper.py +0 -0
  258. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/minesweeper.pyproject +0 -0
  259. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/minesweeper_plugin.py +0 -0
  260. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/register_minesweeper.py +0 -0
  261. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/__init__.py +0 -0
  262. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/__init__.py +0 -0
  263. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image.py +0 -0
  264. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image.pyproject +0 -0
  265. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_item.py +0 -0
  266. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_plugin.py +0 -0
  267. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_processor.py +0 -0
  268. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_roi_plot.py +0 -0
  269. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/register_image.py +0 -0
  270. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/setting_widgets/__init__.py +0 -0
  271. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/toolbar_bundles/__init__.py +0 -0
  272. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/toolbar_bundles/image_selection.py +0 -0
  273. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/toolbar_bundles/processing.py +0 -0
  274. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/__init__.py +0 -0
  275. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/motor_map.py +0 -0
  276. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/motor_map.pyproject +0 -0
  277. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/motor_map_plugin.py +0 -0
  278. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/register_motor_map.py +0 -0
  279. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/settings/__init__.py +0 -0
  280. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/settings/motor_map_settings.py +0 -0
  281. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/settings/motor_map_settings.ui +0 -0
  282. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/toolbar_bundles/__init__.py +0 -0
  283. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/toolbar_bundles/motor_selection.py +0 -0
  284. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/__init__.py +0 -0
  285. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/multi_waveform.py +0 -0
  286. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/multi_waveform.pyproject +0 -0
  287. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/multi_waveform_plugin.py +0 -0
  288. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/register_multi_waveform.py +0 -0
  289. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/settings/__init__.py +0 -0
  290. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/settings/control_panel.py +0 -0
  291. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/settings/multi_waveform_controls.ui +0 -0
  292. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/__init__.py +0 -0
  293. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/monitor_selection.py +0 -0
  294. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/plot_base.py +0 -0
  295. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/roi/__init__.py +0 -0
  296. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/__init__.py +0 -0
  297. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/register_scatter_waveform.py +0 -0
  298. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/scatter_curve.py +0 -0
  299. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.py +0 -0
  300. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.pyproject +0 -0
  301. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform_plugin.py +0 -0
  302. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/settings/__init__.py +0 -0
  303. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_setting.py +0 -0
  304. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_settings_horizontal.ui +0 -0
  305. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_settings_vertical.ui +0 -0
  306. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/setting_menus/__init__.py +0 -0
  307. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/setting_menus/axis_settings.py +0 -0
  308. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/setting_menus/axis_settings_horizontal.ui +0 -0
  309. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/setting_menus/axis_settings_vertical.ui +0 -0
  310. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/__init__.py +0 -0
  311. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/mouse_interactions.py +0 -0
  312. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/plot_export.py +0 -0
  313. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/roi_bundle.py +0 -0
  314. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/save_state.py +0 -0
  315. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/__init__.py +0 -0
  316. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/curve.py +0 -0
  317. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/register_waveform.py +0 -0
  318. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/settings/__init__.py +0 -0
  319. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/settings/curve_settings/__init__.py +0 -0
  320. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_setting.py +0 -0
  321. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py +0 -0
  322. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/utils/__init__.py +0 -0
  323. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/utils/roi_manager.py +0 -0
  324. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/waveform.py +0 -0
  325. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/waveform.pyproject +0 -0
  326. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/waveform_plugin.py +0 -0
  327. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/__init__.py +0 -0
  328. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/__init__.py +0 -0
  329. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar.pyproject +0 -0
  330. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar_plugin.py +0 -0
  331. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progressbar.py +0 -0
  332. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/register_bec_progress_bar.py +0 -0
  333. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/__init__.py +0 -0
  334. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/register_ring_progress_bar.py +0 -0
  335. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/ring.py +0 -0
  336. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.py +0 -0
  337. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.pyproject +0 -0
  338. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar_plugin.py +0 -0
  339. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/__init__.py +0 -0
  340. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/__init__.py +0 -0
  341. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/bec_queue.py +0 -0
  342. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/bec_queue.pyproject +0 -0
  343. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/bec_queue_plugin.py +0 -0
  344. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/register_bec_queue.py +0 -0
  345. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/__init__.py +0 -0
  346. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box.py +0 -0
  347. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box.pyproject +0 -0
  348. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box_plugin.py +0 -0
  349. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/register_bec_status_box.py +0 -0
  350. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/status_item.py +0 -0
  351. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/__init__.py +0 -0
  352. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_browser.py +0 -0
  353. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_browser.pyproject +0 -0
  354. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_browser.ui +0 -0
  355. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_browser_plugin.py +0 -0
  356. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_item/__init__.py +0 -0
  357. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_item/device_item.py +0 -0
  358. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/register_device_browser.py +0 -0
  359. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/util.py +0 -0
  360. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/__init__.py +0 -0
  361. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/__init__.py +0 -0
  362. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/_util.py +0 -0
  363. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/log_panel.pyproject +0 -0
  364. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/log_panel_plugin.py +0 -0
  365. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/logpanel.py +0 -0
  366. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/register_log_panel.py +0 -0
  367. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/signal_label/register_signal_label.py +0 -0
  368. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/signal_label/signal_label.py +0 -0
  369. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/signal_label/signal_label.pyproject +0 -0
  370. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/signal_label/signal_label_plugin.py +0 -0
  371. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/__init__.py +0 -0
  372. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/bec_spin_box.pyproject +0 -0
  373. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/bec_spin_box_plugin.py +0 -0
  374. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/decimal_spinbox.py +0 -0
  375. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/register_bec_spin_box.py +0 -0
  376. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/__init__.py +0 -0
  377. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/register_spinner_widget.py +0 -0
  378. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/spinner.py +0 -0
  379. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/spinner_widget.pyproject +0 -0
  380. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/spinner_widget_plugin.py +0 -0
  381. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/__init__.py +0 -0
  382. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/register_toggle_switch.py +0 -0
  383. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/toggle.py +0 -0
  384. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/toggle_switch.pyproject +0 -0
  385. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/toggle_switch_plugin.py +0 -0
  386. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/__init__.py +0 -0
  387. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/__init__.py +0 -0
  388. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/color_button.py +0 -0
  389. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/color_button.pyproject +0 -0
  390. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/color_button_plugin.py +0 -0
  391. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/register_color_button.py +0 -0
  392. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button_native/__init__.py +0 -0
  393. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button_native/color_button_native.py +0 -0
  394. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button_native/color_button_native.pyproject +0 -0
  395. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button_native/color_button_native_plugin.py +0 -0
  396. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button_native/register_color_button_native.py +0 -0
  397. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/__init__.py +0 -0
  398. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.py +0 -0
  399. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.pyproject +0 -0
  400. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector_plugin.py +0 -0
  401. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/register_colormap_selector.py +0 -0
  402. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_widget/__init__.py +0 -0
  403. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget.pyproject +0 -0
  404. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget_plugin.py +0 -0
  405. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_widget/colormap_widget.py +0 -0
  406. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_widget/register_bec_color_map_widget.py +0 -0
  407. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/dark_mode_button/__init__.py +0 -0
  408. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py +0 -0
  409. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject +0 -0
  410. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py +0 -0
  411. {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py +0 -0
@@ -1,6 +1,43 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v2.15.0 (2025-06-15)
5
+
6
+ ### Bug Fixes
7
+
8
+ - **main_window**: Central widget cleanup check to not remove None
9
+ ([`644be62`](https://github.com/bec-project/bec_widgets/commit/644be621f20cf09037da763f6217df9d1e4642bc))
10
+
11
+ ### Features
12
+
13
+ - **main_window**: Main window can display the messages from the send_client_info as a scrolling
14
+ horizontal text; closes #700
15
+ ([`0dec78a`](https://github.com/bec-project/bec_widgets/commit/0dec78afbaddbef98d20949d3a0ba4e0dc8529df))
16
+
17
+ ### Refactoring
18
+
19
+ - **main_window**: App id is displayed as QLabel instead of message
20
+ ([`57b9a57`](https://github.com/bec-project/bec_widgets/commit/57b9a57a631f267a8cb3622bf73035ffb15510e6))
21
+
22
+ ### Testing
23
+
24
+ - **main_window**: Becmainwindow tests extended
25
+ ([`30acc4c`](https://github.com/bec-project/bec_widgets/commit/30acc4c236bfbfed19f56512b264a52b4359e6c1))
26
+
27
+
28
+ ## v2.14.0 (2025-06-13)
29
+
30
+ ### Features
31
+
32
+ - **image_roi**: Added EllipticalROI
33
+ ([`af8db0b`](https://github.com/bec-project/bec_widgets/commit/af8db0bede32dd10ad72671a8c2978ca884f4994))
34
+
35
+ ### Refactoring
36
+
37
+ - **image_roi_tree**: Shape switch logic adjusted to reduce code repetition
38
+ ([`f0d48a0`](https://github.com/bec-project/bec_widgets/commit/f0d48a05085bb8c628e516d4a976d776ee63c7c3))
39
+
40
+
4
41
  ## v2.13.2 (2025-06-13)
5
42
 
6
43
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 2.13.2
3
+ Version: 2.15.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
@@ -1044,6 +1044,128 @@ class DeviceLineEdit(RPCBase):
1044
1044
  """
1045
1045
 
1046
1046
 
1047
+ class EllipticalROI(RPCBase):
1048
+ """Elliptical Region of Interest with centre/width/height tracking and auto-labelling."""
1049
+
1050
+ @property
1051
+ @rpc_call
1052
+ def label(self) -> "str":
1053
+ """
1054
+ Gets the display name of this ROI.
1055
+
1056
+ Returns:
1057
+ str: The current name of the ROI.
1058
+ """
1059
+
1060
+ @label.setter
1061
+ @rpc_call
1062
+ def label(self) -> "str":
1063
+ """
1064
+ Gets the display name of this ROI.
1065
+
1066
+ Returns:
1067
+ str: The current name of the ROI.
1068
+ """
1069
+
1070
+ @property
1071
+ @rpc_call
1072
+ def movable(self) -> "bool":
1073
+ """
1074
+ Gets whether this ROI is movable.
1075
+
1076
+ Returns:
1077
+ bool: True if the ROI can be moved, False otherwise.
1078
+ """
1079
+
1080
+ @movable.setter
1081
+ @rpc_call
1082
+ def movable(self) -> "bool":
1083
+ """
1084
+ Gets whether this ROI is movable.
1085
+
1086
+ Returns:
1087
+ bool: True if the ROI can be moved, False otherwise.
1088
+ """
1089
+
1090
+ @property
1091
+ @rpc_call
1092
+ def line_color(self) -> "str":
1093
+ """
1094
+ Gets the current line color of the ROI.
1095
+
1096
+ Returns:
1097
+ str: The current line color as a string (e.g., hex color code).
1098
+ """
1099
+
1100
+ @line_color.setter
1101
+ @rpc_call
1102
+ def line_color(self) -> "str":
1103
+ """
1104
+ Gets the current line color of the ROI.
1105
+
1106
+ Returns:
1107
+ str: The current line color as a string (e.g., hex color code).
1108
+ """
1109
+
1110
+ @property
1111
+ @rpc_call
1112
+ def line_width(self) -> "int":
1113
+ """
1114
+ Gets the current line width of the ROI.
1115
+
1116
+ Returns:
1117
+ int: The current line width in pixels.
1118
+ """
1119
+
1120
+ @line_width.setter
1121
+ @rpc_call
1122
+ def line_width(self) -> "int":
1123
+ """
1124
+ Gets the current line width of the ROI.
1125
+
1126
+ Returns:
1127
+ int: The current line width in pixels.
1128
+ """
1129
+
1130
+ @rpc_call
1131
+ def get_coordinates(self, typed: "bool | None" = None) -> "dict | tuple":
1132
+ """
1133
+ Return the ellipse's centre and size.
1134
+
1135
+ Args:
1136
+ typed (bool | None): If True returns dict; otherwise tuple.
1137
+ """
1138
+
1139
+ @rpc_call
1140
+ def get_data_from_image(
1141
+ self, image_item: "pg.ImageItem | None" = None, returnMappedCoords: "bool" = False, **kwargs
1142
+ ):
1143
+ """
1144
+ Wrapper around `pyqtgraph.ROI.getArrayRegion`.
1145
+
1146
+ Args:
1147
+ image_item (pg.ImageItem or None): The ImageItem to sample. If None, auto-detects
1148
+ the first `ImageItem` in the same GraphicsScene as this ROI.
1149
+ returnMappedCoords (bool): If True, also returns the coordinate array generated by
1150
+ *getArrayRegion*.
1151
+ **kwargs: Additional keyword arguments passed to *getArrayRegion* or *affineSlice*,
1152
+ such as `axes`, `order`, `shape`, etc.
1153
+
1154
+ Returns:
1155
+ ndarray: Pixel data inside the ROI, or (data, coords) if *returnMappedCoords* is True.
1156
+ """
1157
+
1158
+ @rpc_call
1159
+ def set_position(self, x: "float", y: "float"):
1160
+ """
1161
+ Sets the position of the ROI.
1162
+
1163
+ Args:
1164
+ x (float): The x-coordinate of the new position.
1165
+ y (float): The y-coordinate of the new position.
1166
+ """
1167
+
1168
+
1047
1169
  class Image(RPCBase):
1048
1170
  """Image widget for displaying 2D data."""
1049
1171
 
@@ -1529,7 +1651,7 @@ class Image(RPCBase):
1529
1651
  @rpc_call
1530
1652
  def add_roi(
1531
1653
  self,
1532
- kind: "Literal['rect', 'circle']" = "rect",
1654
+ kind: "Literal['rect', 'circle', 'ellipse']" = "rect",
1533
1655
  name: "str | None" = None,
1534
1656
  line_width: "int | None" = 5,
1535
1657
  pos: "tuple[float, float] | None" = (10, 10),
@@ -0,0 +1,89 @@
1
+ from qtpy.QtCore import QTimer
2
+ from qtpy.QtGui import QFontMetrics, QPainter
3
+ from qtpy.QtWidgets import QLabel
4
+
5
+
6
+ class ScrollLabel(QLabel):
7
+ """A QLabel that scrolls its text horizontally across the widget."""
8
+
9
+ def __init__(self, parent=None, speed_ms=30, step_px=1, delay_ms=2000):
10
+ super().__init__(parent=parent)
11
+ self._offset = 0
12
+ self._text_width = 0
13
+
14
+ # scrolling timer (runs continuously once started)
15
+ self._timer = QTimer(self)
16
+ self._timer.setInterval(speed_ms)
17
+ self._timer.timeout.connect(self._scroll)
18
+
19
+ # delay‑before‑scroll timer (single‑shot)
20
+ self._delay_timer = QTimer(self)
21
+ self._delay_timer.setSingleShot(True)
22
+ self._delay_timer.setInterval(delay_ms)
23
+ self._delay_timer.timeout.connect(self._timer.start)
24
+
25
+ self._step_px = step_px
26
+
27
+ def setText(self, text):
28
+ super().setText(text)
29
+ fm = QFontMetrics(self.font())
30
+ self._text_width = fm.horizontalAdvance(text)
31
+ self._offset = 0
32
+ self._update_timer()
33
+
34
+ def resizeEvent(self, event):
35
+ super().resizeEvent(event)
36
+ self._update_timer()
37
+
38
+ def _update_timer(self):
39
+ """
40
+ Decide whether to start or stop scrolling.
41
+
42
+ If the text is wider than the visible area, start a single‑shot
43
+ delay timer (2s by default). Scrolling begins only after this
44
+ delay. Any change (resize or new text) restarts the logic.
45
+ """
46
+ needs_scroll = self._text_width > self.width()
47
+
48
+ if needs_scroll:
49
+ if self._timer.isActive():
50
+ self._timer.stop()
51
+ self._offset = 0
52
+ if not self._delay_timer.isActive():
53
+ self._delay_timer.start()
54
+ else:
55
+ if self._delay_timer.isActive():
56
+ self._delay_timer.stop()
57
+ if self._timer.isActive():
58
+ self._timer.stop()
59
+ self.update()
60
+
61
+ def _scroll(self):
62
+ self._offset += self._step_px
63
+ if self._offset >= self._text_width:
64
+ self._offset = 0
65
+ self.update()
66
+
67
+ def paintEvent(self, event):
68
+ painter = QPainter(self)
69
+ painter.setRenderHint(QPainter.TextAntialiasing)
70
+ text = self.text()
71
+ if not text:
72
+ return
73
+ fm = QFontMetrics(self.font())
74
+ y = (self.height() + fm.ascent() - fm.descent()) // 2
75
+ if self._text_width <= self.width():
76
+ painter.drawText(0, y, text)
77
+ else:
78
+ x = -self._offset
79
+ gap = 50 # space between repeating text blocks
80
+ while x < self.width():
81
+ painter.drawText(x, y, text)
82
+ x += self._text_width + gap
83
+
84
+ def cleanup(self):
85
+ """Stop all timers to prevent memory leaks."""
86
+ if self._timer.isActive():
87
+ self._timer.stop()
88
+ if self._delay_timer.isActive():
89
+ self._delay_timer.stop()
@@ -1,16 +1,17 @@
1
1
  import os
2
2
 
3
- from qtpy.QtCore import QEvent, QSize
3
+ from bec_lib.endpoints import MessageEndpoints
4
+ from qtpy.QtCore import QEvent, QSize, Qt
4
5
  from qtpy.QtGui import QAction, QActionGroup, QIcon
5
- from qtpy.QtWidgets import QApplication, QMainWindow, QStyle
6
+ from qtpy.QtWidgets import QApplication, QFrame, QLabel, QMainWindow, QStyle, QVBoxLayout, QWidget
6
7
 
7
8
  import bec_widgets
8
9
  from bec_widgets.utils import UILoader
9
10
  from bec_widgets.utils.bec_widget import BECWidget
10
11
  from bec_widgets.utils.colors import apply_theme
11
- from bec_widgets.utils.container_utils import WidgetContainerUtils
12
12
  from bec_widgets.utils.error_popups import SafeSlot
13
13
  from bec_widgets.utils.widget_io import WidgetHierarchy
14
+ from bec_widgets.widgets.containers.main_window.addons.scroll_label import ScrollLabel
14
15
  from bec_widgets.widgets.containers.main_window.addons.web_links import BECWebLinksMixin
15
16
 
16
17
  MODULE_PATH = os.path.dirname(bec_widgets.__file__)
@@ -36,6 +37,14 @@ class BECMainWindow(BECWidget, QMainWindow):
36
37
  self._init_ui()
37
38
  self._connect_to_theme_change()
38
39
 
40
+ # Connections to BEC Notifications
41
+ self.bec_dispatcher.connect_slot(
42
+ self.display_client_message, MessageEndpoints.client_info()
43
+ )
44
+
45
+ ################################################################################
46
+ # MainWindow Elements Initialization
47
+ ################################################################################
39
48
  def _init_ui(self):
40
49
 
41
50
  # Set the icon
@@ -43,40 +52,72 @@ class BECMainWindow(BECWidget, QMainWindow):
43
52
 
44
53
  # Set Menu and Status bar
45
54
  self._setup_menu_bar()
55
+ self._init_status_bar_widgets()
46
56
 
47
57
  # BEC Specific UI
48
58
  self.display_app_id()
49
59
 
60
+ def _init_status_bar_widgets(self):
61
+ """
62
+ Prepare the BEC specific widgets in the status bar.
63
+ """
64
+ status_bar = self.statusBar()
65
+
66
+ # Left: App‑ID label
67
+ self._app_id_label = QLabel()
68
+ self._app_id_label.setAlignment(
69
+ Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter
70
+ )
71
+ status_bar.addWidget(self._app_id_label)
72
+
73
+ # Add a separator after the app ID label
74
+ self._add_separator()
75
+
76
+ # Centre: Client‑info label (stretch=1 so it expands)
77
+ self._client_info_label = ScrollLabel()
78
+ self._client_info_label.setAlignment(
79
+ Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter
80
+ )
81
+ status_bar.addWidget(self._client_info_label, 1)
82
+
83
+ def _add_separator(self):
84
+ """
85
+ Add a vertically centred separator to the status bar.
86
+ """
87
+ status_bar = self.statusBar()
88
+
89
+ # The actual line
90
+ line = QFrame()
91
+ line.setFrameShape(QFrame.VLine)
92
+ line.setFrameShadow(QFrame.Sunken)
93
+ line.setFixedHeight(status_bar.sizeHint().height() - 2)
94
+
95
+ # Wrapper to center the line vertically -> work around for QFrame not being able to center itself
96
+ wrapper = QWidget()
97
+ vbox = QVBoxLayout(wrapper)
98
+ vbox.setContentsMargins(0, 0, 0, 0)
99
+ vbox.addStretch()
100
+ vbox.addWidget(line, alignment=Qt.AlignHCenter)
101
+ vbox.addStretch()
102
+ wrapper.setFixedWidth(line.sizeHint().width())
103
+
104
+ status_bar.addWidget(wrapper)
105
+
50
106
  def _init_bec_icon(self):
51
107
  icon = self.app.windowIcon()
52
108
  if icon.isNull():
53
- print("No icon is set, setting default icon")
54
109
  icon = QIcon()
55
110
  icon.addFile(
56
111
  os.path.join(MODULE_PATH, "assets", "app_icons", "bec_widgets_icon.png"),
57
112
  size=QSize(48, 48),
58
113
  )
59
114
  self.app.setWindowIcon(icon)
60
- else:
61
- print("An icon is set")
62
115
 
63
116
  def load_ui(self, ui_file):
64
117
  loader = UILoader(self)
65
118
  self.ui = loader.loader(ui_file)
66
119
  self.setCentralWidget(self.ui)
67
120
 
68
- def display_app_id(self):
69
- """
70
- Display the app ID in the status bar.
71
- """
72
- if self.bec_dispatcher.cli_server is None:
73
- status_message = "Not connected"
74
- else:
75
- # Get the server ID from the dispatcher
76
- server_id = self.bec_dispatcher.cli_server.gui_id
77
- status_message = f"App ID: {server_id}"
78
- self.statusBar().showMessage(status_message)
79
-
80
121
  def _fetch_theme(self) -> str:
81
122
  return self.app.theme.theme
82
123
 
@@ -164,8 +205,37 @@ class BECMainWindow(BECWidget, QMainWindow):
164
205
  help_menu.addAction(widgets_docs)
165
206
  help_menu.addAction(bug_report)
166
207
 
208
+ ################################################################################
209
+ # Status Bar Addons
210
+ ################################################################################
211
+ def display_app_id(self):
212
+ """
213
+ Display the app ID in the status bar.
214
+ """
215
+ if self.bec_dispatcher.cli_server is None:
216
+ status_message = "Not connected"
217
+ else:
218
+ # Get the server ID from the dispatcher
219
+ server_id = self.bec_dispatcher.cli_server.gui_id
220
+ status_message = f"App ID: {server_id}"
221
+ self._app_id_label.setText(status_message)
222
+
223
+ @SafeSlot(dict, dict)
224
+ def display_client_message(self, msg: dict, meta: dict):
225
+ message = msg.get("message", "")
226
+ self._client_info_label.setText(message)
227
+
228
+ ################################################################################
229
+ # General and Cleanup Methods
230
+ ################################################################################
167
231
  @SafeSlot(str)
168
232
  def change_theme(self, theme: str):
233
+ """
234
+ Change the theme of the application.
235
+
236
+ Args:
237
+ theme(str): The theme to apply, either "light" or "dark".
238
+ """
169
239
  apply_theme(theme)
170
240
 
171
241
  def event(self, event):
@@ -175,8 +245,9 @@ class BECMainWindow(BECWidget, QMainWindow):
175
245
 
176
246
  def cleanup(self):
177
247
  central_widget = self.centralWidget()
178
- central_widget.close()
179
- central_widget.deleteLater()
248
+ if central_widget is not None:
249
+ central_widget.close()
250
+ central_widget.deleteLater()
180
251
  if not isinstance(central_widget, BECWidget):
181
252
  # if the central widget is not a BECWidget, we need to call the cleanup method
182
253
  # of all widgets whose parent is the current BECMainWindow
@@ -187,6 +258,9 @@ class BECMainWindow(BECWidget, QMainWindow):
187
258
  child.cleanup()
188
259
  child.close()
189
260
  child.deleteLater()
261
+
262
+ # Status bar widgets cleanup
263
+ self._client_info_label.cleanup()
190
264
  super().cleanup()
191
265
 
192
266
 
@@ -24,6 +24,7 @@ from bec_widgets.widgets.plots.plot_base import PlotBase
24
24
  from bec_widgets.widgets.plots.roi.image_roi import (
25
25
  BaseROI,
26
26
  CircularROI,
27
+ EllipticalROI,
27
28
  RectangularROI,
28
29
  ROIController,
29
30
  )
@@ -554,7 +555,7 @@ class ImageBase(PlotBase):
554
555
 
555
556
  def add_roi(
556
557
  self,
557
- kind: Literal["rect", "circle"] = "rect",
558
+ kind: Literal["rect", "circle", "ellipse"] = "rect",
558
559
  name: str | None = None,
559
560
  line_width: int | None = 5,
560
561
  pos: tuple[float, float] | None = (10, 10),
@@ -599,6 +600,16 @@ class ImageBase(PlotBase):
599
600
  movable=movable,
600
601
  **pg_kwargs,
601
602
  )
603
+ elif kind == "ellipse":
604
+ roi = EllipticalROI(
605
+ pos=pos,
606
+ size=size,
607
+ parent_image=self,
608
+ line_width=line_width,
609
+ label=name,
610
+ movable=movable,
611
+ **pg_kwargs,
612
+ )
602
613
  else:
603
614
  raise ValueError("kind must be 'rect' or 'circle'")
604
615
 
@@ -24,6 +24,7 @@ from bec_widgets.utils.toolbar import MaterialIconAction, ModularToolBar
24
24
  from bec_widgets.widgets.plots.roi.image_roi import (
25
25
  BaseROI,
26
26
  CircularROI,
27
+ EllipticalROI,
27
28
  RectangularROI,
28
29
  ROIController,
29
30
  )
@@ -121,11 +122,21 @@ class ROIPropertyTree(BECWidget, QWidget):
121
122
  # --------------------------------------------------------------------- UI
122
123
  def _init_toolbar(self):
123
124
  tb = ModularToolBar(self, self, orientation="horizontal")
125
+ self._draw_actions: dict[str, MaterialIconAction] = {}
124
126
  # --- ROI draw actions (toggleable) ---
125
127
  self.add_rect_action = MaterialIconAction("add_box", "Add Rect ROI", True, self)
126
- self.add_circle_action = MaterialIconAction("add_circle", "Add Circle ROI", True, self)
127
128
  tb.add_action("Add Rect ROI", self.add_rect_action, self)
129
+ self._draw_actions["rect"] = self.add_rect_action
130
+ self.add_circle_action = MaterialIconAction("add_circle", "Add Circle ROI", True, self)
128
131
  tb.add_action("Add Circle ROI", self.add_circle_action, self)
132
+ self._draw_actions["circle"] = self.add_circle_action
133
+ # --- Ellipse ROI draw action ---
134
+ self.add_ellipse_action = MaterialIconAction("vignette", "Add Ellipse ROI", True, self)
135
+ tb.add_action("Add Ellipse ROI", self.add_ellipse_action, self)
136
+ self._draw_actions["ellipse"] = self.add_ellipse_action
137
+
138
+ for mode, act in self._draw_actions.items():
139
+ act.action.toggled.connect(lambda on, m=mode: self._on_draw_action_toggled(m, on))
129
140
 
130
141
  # Expand/Collapse toggle
131
142
  self.expand_toggle = MaterialIconAction(
@@ -174,17 +185,9 @@ class ROIPropertyTree(BECWidget, QWidget):
174
185
  self.controller.paletteChanged.connect(lambda cmap: setattr(self.cmap, "colormap", cmap))
175
186
 
176
187
  # ROI drawing state
177
- self._roi_draw_mode = None # 'rect' | 'circle' | None
188
+ self._roi_draw_mode = None # 'rect' | 'circle' | 'ellipse' | None
178
189
  self._roi_start_pos = None # QPointF in image coords
179
190
  self._temp_roi = None # live ROI being resized while dragging
180
-
181
- # toggle handlers
182
- self.add_rect_action.action.toggled.connect(
183
- lambda on: self._set_roi_draw_mode("rect" if on else None)
184
- )
185
- self.add_circle_action.action.toggled.connect(
186
- lambda on: self._set_roi_draw_mode("circle" if on else None)
187
- )
188
191
  # capture mouse events on the plot scene
189
192
  self.plot.scene().installEventFilter(self)
190
193
 
@@ -214,16 +217,12 @@ class ROIPropertyTree(BECWidget, QWidget):
214
217
  return str(value)
215
218
 
216
219
  def _set_roi_draw_mode(self, mode: str | None):
217
- # Ensure only the selected action is toggled on
218
- if mode == "rect":
219
- self.add_rect_action.action.setChecked(True)
220
- self.add_circle_action.action.setChecked(False)
221
- elif mode == "circle":
222
- self.add_rect_action.action.setChecked(False)
223
- self.add_circle_action.action.setChecked(True)
224
- else:
225
- self.add_rect_action.action.setChecked(False)
226
- self.add_circle_action.action.setChecked(False)
220
+ # Update toolbar actions so that only the selected mode is checked
221
+ for m, act in self._draw_actions.items():
222
+ act.action.blockSignals(True)
223
+ act.action.setChecked(m == mode)
224
+ act.action.blockSignals(False)
225
+
227
226
  self._roi_draw_mode = mode
228
227
  self._roi_start_pos = None
229
228
  # remove any unfinished temp ROI
@@ -231,6 +230,15 @@ class ROIPropertyTree(BECWidget, QWidget):
231
230
  self.plot.removeItem(self._temp_roi)
232
231
  self._temp_roi = None
233
232
 
233
+ def _on_draw_action_toggled(self, mode: str, checked: bool):
234
+ if checked:
235
+ # Activate selected mode
236
+ self._set_roi_draw_mode(mode)
237
+ else:
238
+ # If the active mode is being unchecked, clear mode
239
+ if self._roi_draw_mode == mode:
240
+ self._set_roi_draw_mode(None)
241
+
234
242
  def eventFilter(self, obj, event):
235
243
  if self._roi_draw_mode is None:
236
244
  return super().eventFilter(obj, event)
@@ -243,12 +251,18 @@ class ROIPropertyTree(BECWidget, QWidget):
243
251
  parent_image=self.image_widget,
244
252
  resize_handles=False,
245
253
  )
246
- if self._roi_draw_mode == "circle":
254
+ elif self._roi_draw_mode == "circle":
247
255
  self._temp_roi = CircularROI(
248
256
  pos=[self._roi_start_pos.x() - 2.5, self._roi_start_pos.y() - 2.5],
249
257
  size=[5, 5],
250
258
  parent_image=self.image_widget,
251
259
  )
260
+ elif self._roi_draw_mode == "ellipse":
261
+ self._temp_roi = EllipticalROI(
262
+ pos=[self._roi_start_pos.x() - 2.5, self._roi_start_pos.y() - 2.5],
263
+ size=[5, 5],
264
+ parent_image=self.image_widget,
265
+ )
252
266
  self.plot.addItem(self._temp_roi)
253
267
  return True
254
268
  elif event.type() == QEvent.GraphicsSceneMouseMove and self._temp_roi is not None:
@@ -258,13 +272,19 @@ class ROIPropertyTree(BECWidget, QWidget):
258
272
 
259
273
  if self._roi_draw_mode == "rect":
260
274
  self._temp_roi.setSize([dx, dy])
261
- if self._roi_draw_mode == "circle":
275
+ elif self._roi_draw_mode == "circle":
262
276
  r = max(
263
277
  1, math.hypot(dx, dy)
264
278
  ) # radius never smaller than 1 for safety of handle mapping, otherwise SEGFAULT
265
279
  d = 2 * r # diameter
266
280
  self._temp_roi.setPos(self._roi_start_pos.x() - r, self._roi_start_pos.y() - r)
267
281
  self._temp_roi.setSize([d, d])
282
+ elif self._roi_draw_mode == "ellipse":
283
+ # Safeguard: enforce a minimum ellipse width/height of 2 px
284
+ min_dim = 2.0
285
+ w = dx if abs(dx) >= min_dim else math.copysign(min_dim, dx or 1.0)
286
+ h = dy if abs(dy) >= min_dim else math.copysign(min_dim, dy or 1.0)
287
+ self._temp_roi.setSize([w, h])
268
288
  return True
269
289
  elif (
270
290
  event.type() == QEvent.GraphicsSceneMouseRelease