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.
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/CHANGELOG.md +37 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/PKG-INFO +1 -1
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/client.py +123 -1
- bec_widgets-2.15.0/bec_widgets/widgets/containers/main_window/addons/scroll_label.py +89 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/main_window.py +94 -20
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_base.py +12 -1
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/setting_widgets/image_roi_tree.py +42 -22
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/roi/image_roi.py +86 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/pyproject.toml +1 -1
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.git_hooks/pre-commit +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/ISSUE_TEMPLATE/documentation_update.md +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/actions/bw_install/action.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/pull_request_template.md +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/scripts/pr_issue_sync/pr_issue_sync.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/scripts/pr_issue_sync/requirements.txt +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/check_pr.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/ci.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/end2end-conda.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/formatter.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/generate-cli-check.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/pytest-matrix.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/pytest.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/semantic_release.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/stale-issues.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.github/workflows/sync-issues-pr.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.gitignore +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.gitlab-ci.yml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.pylintrc +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/.readthedocs.yaml +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/LICENSE +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/README.md +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/applications/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/applications/bw_launch.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/applications/launch_window.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/BEC-General-App.png +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/alignment_1d.png +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/auto_update.png +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/bec_widgets_icon.png +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/ui_loader_tile.png +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/assets/app_icons/widget_launch_tile.png +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/client_utils.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/generate_cli.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/rpc/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/rpc/rpc_base.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/rpc/rpc_register.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/rpc/rpc_widget_handler.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/cli/server.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/general_app/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/general_app/general_app.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/general_app/general_app.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/general_app/web_links.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/tests/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/tests/utils.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_connector.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_designer.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_dispatcher.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_plugin_helper.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_signal_proxy.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_table.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/bec_widget.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/clickable_label.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/collapsible_panel_manager.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/colors.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/compact_popup.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/container_utils.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/crosshair.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/entry_validator.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/error_popups.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/expandable_frame.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/filter_io.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/forms_from_types/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/forms_from_types/forms.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/forms_from_types/items.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/forms_from_types/styles.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/fps_counter.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/generate_designer_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/layout_manager.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/linear_region_selector.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/name_utils.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/ophyd_kind_util.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/palette_viewer.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/plot_indicator_items.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/plugin_templates/plugin.template +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/plugin_templates/register.template +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/plugin_utils.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/redis_message_waiter.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/reference_utils.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/round_frame.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/rpc_decorator.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/rpc_server.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/serialization.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/settings_dialog.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/side_panel.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/thread_checker.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/toolbar.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/ui_loader.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/validator_delegate.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/widget_io.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/widget_state_manager.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/utils/yaml_dialog.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/auto_update/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/auto_update/auto_updates.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/dock.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/dock_area.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/dock_area.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/dock_area_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/dock/register_dock_area.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/layout_manager/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/layout_manager/layout_manager.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/addons/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/addons/web_links.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/abort_button.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/abort_button_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/button_abort.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_abort/register_abort_button.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/button_reset.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/register_reset_button.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/reset_button.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_reset/reset_button_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/button_resume.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/register_resume_button.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/resume_button.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/button_resume/resume_button_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/register_stop_button.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/buttons/stop_button/stop_button_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/position_indicator/register_position_indicator.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py +0 -0
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/base_classes/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py +0 -0
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_combobox/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box.pyproject +0 -0
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py +0 -0
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/device_line_edit/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_combobox/__init__.py +0 -0
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject +0 -0
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/device_input/signal_line_edit/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/register_scan_control.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/scan_control.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/scan_control.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/scan_control_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/control/scan_control/scan_group_box.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/dap_combo_box/register_dap_combo_box.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_compact.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_vertical.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/dap/lmfit_dialog/register_lm_fit_dialog.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/dict_backed_table.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/jupyter_console/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/jupyter_console/jupyter_console.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/_util.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/register_scan_metadata.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/scan_metadata.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/scan_metadata/scan_metadata_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/register_text_box.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/text_box.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/text_box.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/text_box/text_box_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/register_vs_code_editor.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/vs_code_editor.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/vs_code_editor_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/vscode/vscode.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/web_console/register_web_console.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/web_console/web_console.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/web_console/web_console.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/web_console/web_console_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/register_website_widget.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/website.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/website_widget.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/editors/website/website_widget_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/minesweeper.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/minesweeper.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/minesweeper_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/games/register_minesweeper.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_item.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_processor.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/image_roi_plot.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/register_image.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/setting_widgets/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/toolbar_bundles/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/toolbar_bundles/image_selection.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/image/toolbar_bundles/processing.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/motor_map.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/motor_map.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/motor_map_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/register_motor_map.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/settings/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/settings/motor_map_settings.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/settings/motor_map_settings.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/toolbar_bundles/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/motor_map/toolbar_bundles/motor_selection.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/multi_waveform.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/multi_waveform.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/multi_waveform_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/register_multi_waveform.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/settings/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/settings/control_panel.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/settings/multi_waveform_controls.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/monitor_selection.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/plot_base.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/roi/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/register_scatter_waveform.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/scatter_curve.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/scatter_waveform_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/settings/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_setting.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_settings_horizontal.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_settings_vertical.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/setting_menus/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/setting_menus/axis_settings.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/setting_menus/axis_settings_horizontal.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/setting_menus/axis_settings_vertical.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/mouse_interactions.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/plot_export.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/roi_bundle.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/toolbar_bundles/save_state.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/curve.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/register_waveform.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/settings/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/settings/curve_settings/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_setting.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/utils/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/utils/roi_manager.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/waveform.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/waveform.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/plots/waveform/waveform_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/bec_progressbar.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/bec_progressbar/register_bec_progress_bar.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/register_ring_progress_bar.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/ring.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/bec_queue.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/bec_queue.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/bec_queue_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_queue/register_bec_queue.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/bec_status_box_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/register_bec_status_box.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/bec_status_box/status_item.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_browser.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_browser.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_browser.ui +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_browser_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_item/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/device_item/device_item.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/register_device_browser.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/services/device_browser/util.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/_util.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/log_panel.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/log_panel_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/logpanel.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/logpanel/register_log_panel.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/signal_label/register_signal_label.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/signal_label/signal_label.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/signal_label/signal_label.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/signal_label/signal_label_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/bec_spin_box.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/bec_spin_box_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/decimal_spinbox.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinbox/register_bec_spin_box.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/register_spinner_widget.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/spinner.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/spinner_widget.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/spinner/spinner_widget_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/register_toggle_switch.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/toggle.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/toggle_switch.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/toggle/toggle_switch_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/color_button.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/color_button.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/color_button_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button/register_color_button.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button_native/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button_native/color_button_native.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/color_button_native/color_button_native.pyproject +0 -0
- {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
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.pyproject +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector_plugin.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_selector/register_colormap_selector.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_widget/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget.pyproject +0 -0
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/colormap_widget/colormap_widget.py +0 -0
- {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
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/dark_mode_button/__init__.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py +0 -0
- {bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject +0 -0
- {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
- {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
|
@@ -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()
|
{bec_widgets-2.13.2 → bec_widgets-2.15.0}/bec_widgets/widgets/containers/main_window/main_window.py
RENAMED
@@ -1,16 +1,17 @@
|
|
1
1
|
import os
|
2
2
|
|
3
|
-
from
|
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
|
179
|
-
|
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
|
-
#
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
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
|
-
|
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
|
-
|
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
|