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