bec-widgets 1.20.0__tar.gz → 1.21.1__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-1.20.0 → bec_widgets-1.21.1}/CHANGELOG.md +16 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/PKG-INFO +2 -2
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_connector.py +54 -19
- bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/__init__.py +7 -0
- bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/_metadata_widgets.py +275 -0
- bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/_util.py +67 -0
- bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/additional_metadata_table.py +146 -0
- bec_widgets-1.21.1/bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +196 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/pyproject.toml +2 -2
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.git_hooks/pre-commit +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitignore +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab/issue_templates/bug_report_template.md +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab/issue_templates/documentation_update_template.md +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab/issue_templates/feature_request_template.md +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab/merge_request_templates/default.md +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.gitlab-ci.yml +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.pylintrc +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/.readthedocs.yaml +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/LICENSE +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/README.md +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/alignment/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/alignment/alignment_1d/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/alignment/alignment_1d/alignment_1d.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/alignment/alignment_1d/alignment_1d.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/applications/bec_app.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/assets/app_icons/BEC-General-App.png +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/assets/app_icons/alignment_1d.png +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/assets/app_icons/bec_widgets_icon.png +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/auto_updates.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/client.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/client_utils.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/generate_cli.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/rpc/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/rpc/rpc_base.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/rpc/rpc_register.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/rpc/rpc_widget_handler.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/cli/server.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/general_app/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/general_app/general_app.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/general_app/general_app.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/general_app/web_links.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/collapsible_panel_manager.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/compact_popup.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/error_popups.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/palette_viewer.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/redis_message_waiter.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/round_frame.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/settings_dialog.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/side_panel.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/qt_utils/toolbar.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/tests/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/tests/utils.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_designer.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_dispatcher.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_signal_proxy.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_table.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/bec_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/colors.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/container_utils.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/crosshair.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/entry_validator.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/filter_io.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/fps_counter.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/generate_designer_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/layout_manager.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/linear_region_selector.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/ophyd_kind_util.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/plot_indicator_items.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/plugin_templates/plugin.template +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/plugin_templates/register.template +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/plugin_utils.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/reference_utils.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/rpc_decorator.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/thread_checker.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/ui_loader.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/validator_delegate.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/widget_io.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/widget_state_manager.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/utils/yaml_dialog.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/dock.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/dock_area.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/dock_area.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/dock_area_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/dock/register_dock_area.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/figure.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/axis_settings.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/axis_settings.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/image/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/image/image.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/image/image_item.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/image/image_processor.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/motor_map/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/motor_map/motor_map.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/multi_waveform/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/multi_waveform/multi_waveform.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/plot_base.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/waveform/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/waveform/waveform.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/figure/plots/waveform/waveform_curve.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/layout_manager/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/layout_manager/layout_manager.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/main_window/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/containers/main_window/main_window.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/abort_button.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/abort_button_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/button_abort.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_abort/register_abort_button.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/button_reset.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/register_reset_button.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/reset_button.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_reset/reset_button_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/button_resume.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/register_resume_button.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/resume_button.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/button_resume/resume_button_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/register_stop_button.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/stop_button.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/stop_button.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/buttons/stop_button/stop_button_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/position_indicator_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/position_indicator/register_position_indicator.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box/register_positioner_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/register_positioner_box2_d.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/register_positioner_control_line.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/base_classes/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/device_combo_box_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_combobox/register_device_combo_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/device_line_edit/register_device_line_edit.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/register_signal_combo_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/register_signal_line_edit.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/register_scan_control.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/scan_control.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/scan_control.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/scan_control_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/control/scan_control/scan_group_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/dap_combo_box_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/dap_combo_box/register_dap_combo_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lm_fit_dialog_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_compact.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_vertical.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/dap/lmfit_dialog/register_lm_fit_dialog.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/console.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/console.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/console_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/console/register_console.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/jupyter_console/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/jupyter_console/jupyter_console.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/register_text_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/text_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/text_box.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/text_box/text_box_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/register_vs_code_editor.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/vs_code_editor.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/vs_code_editor_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/vscode/vscode.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/register_website_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/website.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/website_widget.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/editors/website/website_widget_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/minesweeper.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/minesweeper.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/minesweeper_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/games/register_minesweeper.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/bec_image_widget.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/bec_image_widget_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/image_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/image/register_bec_image_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/bec_motor_map_widget.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/bec_motor_map_widget_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/motor_map_dialog/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/motor_map_dialog/motor_map_settings.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/motor_map_dialog/motor_map_settings.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/motor_map_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/motor_map/register_bec_motor_map_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/bec_multi_waveform_widget.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/bec_multi_waveform_widget_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/multi_waveform_controls.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/multi_waveform_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/multi_waveform/register_bec_multi_waveform_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/bec_waveform_widget.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/bec_waveform_widget_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/register_bec_waveform_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/curve_dialog.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/curve_dialog.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/dap_summary_dialog/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_popups/dap_summary_dialog/dap_summary_dialog.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots/waveform/waveform_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/plot_base.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/setting_menus/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings_horizontal.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/setting_menus/axis_settings_vertical.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/mouse_interactions.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/plot_export.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/plots_next_gen/toolbar_bundles/save_state.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/bec_progress_bar_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/bec_progressbar.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/bec_progressbar/register_bec_progress_bar.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/register_ring_progress_bar.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/ring.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/bec_queue.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/bec_queue.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/bec_queue_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_queue/register_bec_queue.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/bec_status_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/bec_status_box.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/bec_status_box_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/register_bec_status_box.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/bec_status_box/status_item.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_browser.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_browser.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_browser.ui +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_browser_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_item/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/device_item/device_item.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/services/device_browser/register_device_browser.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/_util.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/log_panel.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/log_panel_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/logpanel.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/logpanel/register_log_panel.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/register_spinner_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/spinner.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/spinner_widget.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/spinner/spinner_widget_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/register_toggle_switch.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/toggle.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/toggle_switch.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/toggle/toggle_switch_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/color_button.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/color_button.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/color_button_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/color_button/register_color_button.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_selector/register_colormap_selector.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/bec_color_map_widget_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/colormap_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/colormap_widget/register_bec_color_map_widget.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/__init__.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py +0 -0
- {bec_widgets-1.20.0 → bec_widgets-1.21.1}/bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py +0 -0
@@ -1,6 +1,22 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
3
|
|
4
|
+
## v1.21.1 (2025-02-17)
|
5
|
+
|
6
|
+
### Bug Fixes
|
7
|
+
|
8
|
+
- **bec_connector**: Workers stored in reference to not be cleaned up with garbage collector
|
9
|
+
([`383936f`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/383936ffc2bd7d2e088d3367c76b14efa3d1732c))
|
10
|
+
|
11
|
+
|
12
|
+
## v1.21.0 (2025-02-17)
|
13
|
+
|
14
|
+
### Features
|
15
|
+
|
16
|
+
- Generated form for scan metadata
|
17
|
+
([`1708bd4`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/1708bd405f86b1353828b01fbf5f98383a19ec2a))
|
18
|
+
|
19
|
+
|
4
20
|
## v1.20.0 (2025-02-06)
|
5
21
|
|
6
22
|
### Features
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: bec_widgets
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.21.1
|
4
4
|
Summary: BEC Widgets
|
5
5
|
Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec_widgets/issues
|
6
6
|
Project-URL: Homepage, https://gitlab.psi.ch/bec/bec_widgets
|
@@ -16,7 +16,7 @@ Requires-Dist: black~=24.0
|
|
16
16
|
Requires-Dist: isort>=5.13.2,~=5.13
|
17
17
|
Requires-Dist: pydantic~=2.0
|
18
18
|
Requires-Dist: pyqtgraph~=0.13
|
19
|
-
Requires-Dist: pyside6
|
19
|
+
Requires-Dist: pyside6>=6.8
|
20
20
|
Requires-Dist: pyte
|
21
21
|
Requires-Dist: qtconsole>=5.5.1,~=5.5
|
22
22
|
Requires-Dist: qtpy~=2.4
|
@@ -111,7 +111,7 @@ class BECConnector:
|
|
111
111
|
|
112
112
|
# register widget to rpc register
|
113
113
|
# be careful: when registering, and the object is not a BECWidget,
|
114
|
-
# cleanup has to called manually since there is no 'closeEvent'
|
114
|
+
# cleanup has to be called manually since there is no 'closeEvent'
|
115
115
|
self.rpc_register = RPCRegister()
|
116
116
|
self.rpc_register.add_rpc(self)
|
117
117
|
|
@@ -119,6 +119,8 @@ class BECConnector:
|
|
119
119
|
self.error_utility = ErrorPopupUtility()
|
120
120
|
|
121
121
|
self._thread_pool = QThreadPool.globalInstance()
|
122
|
+
# Store references to running workers so they're not garbage collected prematurely.
|
123
|
+
self._workers = []
|
122
124
|
|
123
125
|
def submit_task(self, fn, *args, on_complete: pyqtSlot = None, **kwargs) -> Worker:
|
124
126
|
"""
|
@@ -147,11 +149,14 @@ class BECConnector:
|
|
147
149
|
>>> def on_complete():
|
148
150
|
>>> print("Task complete")
|
149
151
|
>>> self.submit_task(my_function, 1, 2, on_complete=on_complete)
|
150
|
-
|
151
152
|
"""
|
152
153
|
worker = Worker(fn, *args, **kwargs)
|
153
154
|
if on_complete:
|
154
155
|
worker.signals.completed.connect(on_complete)
|
156
|
+
# Keep a reference to the worker so it is not garbage collected.
|
157
|
+
self._workers.append(worker)
|
158
|
+
# When the worker is done, remove it from our list.
|
159
|
+
worker.signals.completed.connect(lambda: self._workers.remove(worker))
|
155
160
|
self._thread_pool.start(worker)
|
156
161
|
return worker
|
157
162
|
|
@@ -183,10 +188,10 @@ class BECConnector:
|
|
183
188
|
@_config_dict.setter
|
184
189
|
def _config_dict(self, config: BaseModel) -> None:
|
185
190
|
"""
|
186
|
-
|
191
|
+
Set the configuration of the widget.
|
187
192
|
|
188
|
-
|
189
|
-
|
193
|
+
Args:
|
194
|
+
config (BaseModel): The new configuration model.
|
190
195
|
"""
|
191
196
|
self.config = config
|
192
197
|
|
@@ -195,8 +200,8 @@ class BECConnector:
|
|
195
200
|
Apply the configuration to the widget.
|
196
201
|
|
197
202
|
Args:
|
198
|
-
config(dict): Configuration settings.
|
199
|
-
generate_new_id(bool): If True, generate a new GUI ID for the widget.
|
203
|
+
config (dict): Configuration settings.
|
204
|
+
generate_new_id (bool): If True, generate a new GUI ID for the widget.
|
200
205
|
"""
|
201
206
|
self.config = ConnectionConfig(**config)
|
202
207
|
if generate_new_id is True:
|
@@ -212,8 +217,8 @@ class BECConnector:
|
|
212
217
|
Load the configuration of the widget from YAML.
|
213
218
|
|
214
219
|
Args:
|
215
|
-
path(str): Path to the configuration file for non-GUI dialog mode.
|
216
|
-
gui(bool): If True, use the GUI dialog to load the configuration file.
|
220
|
+
path (str | None): Path to the configuration file for non-GUI dialog mode.
|
221
|
+
gui (bool): If True, use the GUI dialog to load the configuration file.
|
217
222
|
"""
|
218
223
|
if gui is True:
|
219
224
|
config = load_yaml_gui(self)
|
@@ -232,8 +237,8 @@ class BECConnector:
|
|
232
237
|
Save the configuration of the widget to YAML.
|
233
238
|
|
234
239
|
Args:
|
235
|
-
path(str): Path to save the configuration file for non-GUI dialog mode.
|
236
|
-
gui(bool): If True, use the GUI dialog to save the configuration file.
|
240
|
+
path (str | None): Path to save the configuration file for non-GUI dialog mode.
|
241
|
+
gui (bool): If True, use the GUI dialog to save the configuration file.
|
237
242
|
"""
|
238
243
|
if gui is True:
|
239
244
|
save_yaml_gui(self, self._config_dict)
|
@@ -241,7 +246,6 @@ class BECConnector:
|
|
241
246
|
if path is None:
|
242
247
|
path = os.getcwd()
|
243
248
|
file_path = os.path.join(path, f"{self.__class__.__name__}_config.yaml")
|
244
|
-
|
245
249
|
save_yaml(file_path, self._config_dict)
|
246
250
|
|
247
251
|
@pyqtSlot(str)
|
@@ -250,7 +254,7 @@ class BECConnector:
|
|
250
254
|
Set the GUI ID for the widget.
|
251
255
|
|
252
256
|
Args:
|
253
|
-
gui_id(str): GUI ID
|
257
|
+
gui_id (str): GUI ID.
|
254
258
|
"""
|
255
259
|
self.config.gui_id = gui_id
|
256
260
|
self.gui_id = gui_id
|
@@ -271,7 +275,7 @@ class BECConnector:
|
|
271
275
|
"""Update the client and device manager from BEC and create object for BEC shortcuts.
|
272
276
|
|
273
277
|
Args:
|
274
|
-
client: BEC client
|
278
|
+
client: BEC client.
|
275
279
|
"""
|
276
280
|
self.client = client
|
277
281
|
self.get_bec_shortcuts()
|
@@ -282,12 +286,10 @@ class BECConnector:
|
|
282
286
|
Update the configuration for the widget.
|
283
287
|
|
284
288
|
Args:
|
285
|
-
config(ConnectionConfig): Configuration settings.
|
289
|
+
config (ConnectionConfig | dict): Configuration settings.
|
286
290
|
"""
|
287
291
|
if isinstance(config, dict):
|
288
292
|
config = ConnectionConfig(**config)
|
289
|
-
# TODO add error handler
|
290
|
-
|
291
293
|
self.config = config
|
292
294
|
|
293
295
|
def get_config(self, dict_output: bool = True) -> dict | BaseModel:
|
@@ -295,12 +297,45 @@ class BECConnector:
|
|
295
297
|
Get the configuration of the widget.
|
296
298
|
|
297
299
|
Args:
|
298
|
-
dict_output(bool): If True, return the configuration as a dictionary.
|
300
|
+
dict_output (bool): If True, return the configuration as a dictionary.
|
301
|
+
If False, return the configuration as a pydantic model.
|
299
302
|
|
300
303
|
Returns:
|
301
|
-
dict: The configuration of the
|
304
|
+
dict | BaseModel: The configuration of the widget.
|
302
305
|
"""
|
303
306
|
if dict_output:
|
304
307
|
return self.config.model_dump()
|
305
308
|
else:
|
306
309
|
return self.config
|
310
|
+
|
311
|
+
|
312
|
+
# --- Example usage of BECConnector: running a simple task ---
|
313
|
+
if __name__ == "__main__": # pragma: no cover
|
314
|
+
import sys
|
315
|
+
|
316
|
+
# Create a QApplication instance (required for QThreadPool)
|
317
|
+
app = QApplication(sys.argv)
|
318
|
+
|
319
|
+
connector = BECConnector()
|
320
|
+
|
321
|
+
def print_numbers():
|
322
|
+
"""
|
323
|
+
Task function that prints numbers 1 to 10 with a 0.5 second delay between each.
|
324
|
+
"""
|
325
|
+
for i in range(1, 11):
|
326
|
+
print(i)
|
327
|
+
time.sleep(0.5)
|
328
|
+
|
329
|
+
def task_complete():
|
330
|
+
"""
|
331
|
+
Called when the task is complete.
|
332
|
+
"""
|
333
|
+
print("Task complete")
|
334
|
+
# Exit the application after the task completes.
|
335
|
+
app.quit()
|
336
|
+
|
337
|
+
# Submit the task using the connector's submit_task method.
|
338
|
+
connector.submit_task(print_numbers, on_complete=task_complete)
|
339
|
+
|
340
|
+
# Start the Qt event loop.
|
341
|
+
sys.exit(app.exec_())
|
@@ -0,0 +1,7 @@
|
|
1
|
+
from bec_widgets.widgets.editors.scan_metadata.additional_metadata_table import (
|
2
|
+
AdditionalMetadataTable,
|
3
|
+
AdditionalMetadataTableModel,
|
4
|
+
)
|
5
|
+
from bec_widgets.widgets.editors.scan_metadata.scan_metadata import ScanMetadata
|
6
|
+
|
7
|
+
__all__ = ["ScanMetadata", "AdditionalMetadataTable", "AdditionalMetadataTableModel"]
|
@@ -0,0 +1,275 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from abc import abstractmethod
|
4
|
+
from decimal import Decimal
|
5
|
+
from typing import TYPE_CHECKING, Callable, get_args
|
6
|
+
|
7
|
+
from bec_lib.logger import bec_logger
|
8
|
+
from bec_qthemes import material_icon
|
9
|
+
from pydantic import BaseModel, Field
|
10
|
+
from qtpy.QtCore import Signal # type: ignore
|
11
|
+
from qtpy.QtWidgets import (
|
12
|
+
QApplication,
|
13
|
+
QButtonGroup,
|
14
|
+
QCheckBox,
|
15
|
+
QDoubleSpinBox,
|
16
|
+
QGridLayout,
|
17
|
+
QHBoxLayout,
|
18
|
+
QLabel,
|
19
|
+
QLayout,
|
20
|
+
QLineEdit,
|
21
|
+
QRadioButton,
|
22
|
+
QSpinBox,
|
23
|
+
QToolButton,
|
24
|
+
QWidget,
|
25
|
+
)
|
26
|
+
|
27
|
+
from bec_widgets.widgets.editors.scan_metadata._util import (
|
28
|
+
clearable_required,
|
29
|
+
field_default,
|
30
|
+
field_limits,
|
31
|
+
field_maxlen,
|
32
|
+
field_minlen,
|
33
|
+
field_precision,
|
34
|
+
)
|
35
|
+
|
36
|
+
if TYPE_CHECKING:
|
37
|
+
from pydantic.fields import FieldInfo
|
38
|
+
|
39
|
+
logger = bec_logger.logger
|
40
|
+
|
41
|
+
|
42
|
+
class ClearableBoolEntry(QWidget):
|
43
|
+
stateChanged = Signal()
|
44
|
+
|
45
|
+
def __init__(self, parent: QWidget | None = None) -> None:
|
46
|
+
super().__init__(parent)
|
47
|
+
self._layout = QHBoxLayout()
|
48
|
+
self._layout.setContentsMargins(0, 0, 0, 0)
|
49
|
+
self.setLayout(self._layout)
|
50
|
+
self._layout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)
|
51
|
+
self._entry = QButtonGroup()
|
52
|
+
self._true = QRadioButton("true", parent=self)
|
53
|
+
self._false = QRadioButton("false", parent=self)
|
54
|
+
for button in [self._true, self._false]:
|
55
|
+
self._layout.addWidget(button)
|
56
|
+
self._entry.addButton(button)
|
57
|
+
button.toggled.connect(self.stateChanged)
|
58
|
+
|
59
|
+
def clear(self):
|
60
|
+
self._entry.setExclusive(False)
|
61
|
+
self._true.setChecked(False)
|
62
|
+
self._false.setChecked(False)
|
63
|
+
self._entry.setExclusive(True)
|
64
|
+
|
65
|
+
def isChecked(self) -> bool | None:
|
66
|
+
if not self._true.isChecked() and not self._false.isChecked():
|
67
|
+
return None
|
68
|
+
return self._true.isChecked()
|
69
|
+
|
70
|
+
def setChecked(self, value: bool | None):
|
71
|
+
if value is None:
|
72
|
+
self.clear()
|
73
|
+
elif value:
|
74
|
+
self._true.setChecked(True)
|
75
|
+
self._false.setChecked(False)
|
76
|
+
else:
|
77
|
+
self._true.setChecked(False)
|
78
|
+
self._false.setChecked(True)
|
79
|
+
|
80
|
+
def setToolTip(self, tooltip: str):
|
81
|
+
self._true.setToolTip(tooltip)
|
82
|
+
self._false.setToolTip(tooltip)
|
83
|
+
|
84
|
+
|
85
|
+
class MetadataWidget(QWidget):
|
86
|
+
|
87
|
+
valueChanged = Signal()
|
88
|
+
|
89
|
+
def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
|
90
|
+
super().__init__(parent)
|
91
|
+
self._info = info
|
92
|
+
self._layout = QHBoxLayout()
|
93
|
+
self._layout.setContentsMargins(0, 0, 0, 0)
|
94
|
+
self._layout.setSizeConstraint(QLayout.SizeConstraint.SetMaximumSize)
|
95
|
+
self._default = field_default(self._info)
|
96
|
+
self._desc = self._info.description
|
97
|
+
self.setLayout(self._layout)
|
98
|
+
self._add_main_widget()
|
99
|
+
if clearable_required(info):
|
100
|
+
self._add_clear_button()
|
101
|
+
|
102
|
+
@abstractmethod
|
103
|
+
def getValue(self): ...
|
104
|
+
|
105
|
+
@abstractmethod
|
106
|
+
def setValue(self, value): ...
|
107
|
+
|
108
|
+
@abstractmethod
|
109
|
+
def _add_main_widget(self) -> None:
|
110
|
+
"""Add the main data entry widget to self._main_widget and appply any
|
111
|
+
constraints from the field info"""
|
112
|
+
|
113
|
+
def _describe(self, pad=" "):
|
114
|
+
return pad + (self._desc if self._desc else "")
|
115
|
+
|
116
|
+
def _add_clear_button(self):
|
117
|
+
self._clear_button = QToolButton()
|
118
|
+
self._clear_button.setIcon(
|
119
|
+
material_icon(icon_name="close", size=(10, 10), convert_to_pixmap=False)
|
120
|
+
)
|
121
|
+
self._layout.addWidget(self._clear_button)
|
122
|
+
# the widget added in _add_main_widget must implement .clear() if value is not required
|
123
|
+
self._clear_button.setToolTip("Clear value or reset to default.")
|
124
|
+
self._clear_button.clicked.connect(self._main_widget.clear) # type: ignore
|
125
|
+
|
126
|
+
def _value_changed(self, *_, **__):
|
127
|
+
self.valueChanged.emit()
|
128
|
+
|
129
|
+
|
130
|
+
class StrMetadataField(MetadataWidget):
|
131
|
+
def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
|
132
|
+
super().__init__(info, parent)
|
133
|
+
self._main_widget.textChanged.connect(self._value_changed)
|
134
|
+
|
135
|
+
def _add_main_widget(self) -> None:
|
136
|
+
self._main_widget = QLineEdit()
|
137
|
+
self._layout.addWidget(self._main_widget)
|
138
|
+
min_length, max_length = field_minlen(self._info), field_maxlen(self._info)
|
139
|
+
if max_length:
|
140
|
+
self._main_widget.setMaxLength(max_length)
|
141
|
+
self._main_widget.setToolTip(
|
142
|
+
f"(length min: {min_length} max: {max_length}){self._describe()}"
|
143
|
+
)
|
144
|
+
if self._default:
|
145
|
+
self._main_widget.setText(self._default)
|
146
|
+
self._add_clear_button()
|
147
|
+
|
148
|
+
def getValue(self):
|
149
|
+
if self._main_widget.text() == "":
|
150
|
+
return self._default
|
151
|
+
return self._main_widget.text()
|
152
|
+
|
153
|
+
def setValue(self, value: str):
|
154
|
+
if value is None:
|
155
|
+
self._main_widget.setText("")
|
156
|
+
self._main_widget.setText(value)
|
157
|
+
|
158
|
+
|
159
|
+
class IntMetadataField(MetadataWidget):
|
160
|
+
def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
|
161
|
+
super().__init__(info, parent)
|
162
|
+
self._main_widget.textChanged.connect(self._value_changed)
|
163
|
+
|
164
|
+
def _add_main_widget(self) -> None:
|
165
|
+
self._main_widget = QSpinBox()
|
166
|
+
self._layout.addWidget(self._main_widget)
|
167
|
+
min_, max_ = field_limits(self._info, int)
|
168
|
+
self._main_widget.setMinimum(min_)
|
169
|
+
self._main_widget.setMaximum(max_)
|
170
|
+
self._main_widget.setToolTip(f"(range {min_} to {max_}){self._describe()}")
|
171
|
+
if self._default is not None:
|
172
|
+
self._main_widget.setValue(self._default)
|
173
|
+
self._add_clear_button()
|
174
|
+
else:
|
175
|
+
self._main_widget.clear()
|
176
|
+
|
177
|
+
def getValue(self):
|
178
|
+
if self._main_widget.text() == "":
|
179
|
+
return self._default
|
180
|
+
return self._main_widget.value()
|
181
|
+
|
182
|
+
def setValue(self, value: int):
|
183
|
+
if value is None:
|
184
|
+
self._main_widget.clear()
|
185
|
+
self._main_widget.setValue(value)
|
186
|
+
|
187
|
+
|
188
|
+
class FloatDecimalMetadataField(MetadataWidget):
|
189
|
+
def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
|
190
|
+
super().__init__(info, parent)
|
191
|
+
self._main_widget.textChanged.connect(self._value_changed)
|
192
|
+
|
193
|
+
def _add_main_widget(self) -> None:
|
194
|
+
self._main_widget = QDoubleSpinBox()
|
195
|
+
self._layout.addWidget(self._main_widget)
|
196
|
+
min_, max_ = field_limits(self._info, int)
|
197
|
+
self._main_widget.setMinimum(min_)
|
198
|
+
self._main_widget.setMaximum(max_)
|
199
|
+
precision = field_precision(self._info)
|
200
|
+
if precision:
|
201
|
+
self._main_widget.setDecimals(precision)
|
202
|
+
minstr = f"{float(min_):.3f}" if abs(min_) <= 1000 else f"{float(min_):.3e}"
|
203
|
+
maxstr = f"{float(max_):.3f}" if abs(max_) <= 1000 else f"{float(max_):.3e}"
|
204
|
+
self._main_widget.setToolTip(f"(range {minstr} to {maxstr}){self._describe()}")
|
205
|
+
if self._default is not None:
|
206
|
+
self._main_widget.setValue(self._default)
|
207
|
+
self._add_clear_button()
|
208
|
+
else:
|
209
|
+
self._main_widget.clear()
|
210
|
+
|
211
|
+
def getValue(self):
|
212
|
+
if self._main_widget.text() == "":
|
213
|
+
return self._default
|
214
|
+
return self._main_widget.value()
|
215
|
+
|
216
|
+
def setValue(self, value: float):
|
217
|
+
if value is None:
|
218
|
+
self._main_widget.clear()
|
219
|
+
self._main_widget.setValue(value)
|
220
|
+
|
221
|
+
|
222
|
+
class BoolMetadataField(MetadataWidget):
|
223
|
+
def __init__(self, info: FieldInfo, parent: QWidget | None = None) -> None:
|
224
|
+
super().__init__(info, parent)
|
225
|
+
self._main_widget.stateChanged.connect(self._value_changed)
|
226
|
+
|
227
|
+
def _add_main_widget(self) -> None:
|
228
|
+
if clearable_required(self._info):
|
229
|
+
self._main_widget = ClearableBoolEntry()
|
230
|
+
else:
|
231
|
+
self._main_widget = QCheckBox()
|
232
|
+
self._layout.addWidget(self._main_widget)
|
233
|
+
self._main_widget.setToolTip(self._describe(""))
|
234
|
+
self._main_widget.setChecked(self._default) # type: ignore # if there is no default then it will be ClearableBoolEntry and can be set with None
|
235
|
+
|
236
|
+
def getValue(self):
|
237
|
+
return self._main_widget.isChecked()
|
238
|
+
|
239
|
+
def setValue(self, value):
|
240
|
+
self._main_widget.setChecked(value)
|
241
|
+
|
242
|
+
|
243
|
+
def widget_from_type(annotation: type | None) -> Callable[[FieldInfo], MetadataWidget]:
|
244
|
+
if annotation in [str, str | None]:
|
245
|
+
return StrMetadataField
|
246
|
+
if annotation in [int, int | None]:
|
247
|
+
return IntMetadataField
|
248
|
+
if annotation in [float, float | None, Decimal, Decimal | None]:
|
249
|
+
return FloatDecimalMetadataField
|
250
|
+
if annotation in [bool, bool | None]:
|
251
|
+
return BoolMetadataField
|
252
|
+
else:
|
253
|
+
logger.warning(f"Type {annotation} is not (yet) supported in metadata form creation.")
|
254
|
+
return StrMetadataField
|
255
|
+
|
256
|
+
|
257
|
+
if __name__ == "__main__": # pragma: no cover
|
258
|
+
|
259
|
+
class TestModel(BaseModel):
|
260
|
+
value1: str | None = Field(None)
|
261
|
+
value2: bool | None = Field(None)
|
262
|
+
value3: bool = Field(True)
|
263
|
+
value4: int = Field(123)
|
264
|
+
value5: int | None = Field()
|
265
|
+
|
266
|
+
app = QApplication([])
|
267
|
+
w = QWidget()
|
268
|
+
layout = QGridLayout()
|
269
|
+
w.setLayout(layout)
|
270
|
+
for i, (field_name, info) in enumerate(TestModel.model_fields.items()):
|
271
|
+
layout.addWidget(QLabel(field_name), i, 0)
|
272
|
+
layout.addWidget(widget_from_type(info.annotation)(info), i, 1)
|
273
|
+
|
274
|
+
w.show()
|
275
|
+
app.exec()
|
@@ -0,0 +1,67 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import sys
|
4
|
+
from decimal import Decimal
|
5
|
+
from math import inf, nextafter
|
6
|
+
from typing import TYPE_CHECKING, TypeVar, get_args
|
7
|
+
|
8
|
+
from annotated_types import Ge, Gt, Le, Lt
|
9
|
+
from bec_lib.logger import bec_logger
|
10
|
+
from pydantic_core import PydanticUndefined
|
11
|
+
|
12
|
+
if TYPE_CHECKING:
|
13
|
+
from pydantic.fields import FieldInfo
|
14
|
+
|
15
|
+
logger = bec_logger.logger
|
16
|
+
|
17
|
+
|
18
|
+
_MININT = -2147483648
|
19
|
+
_MAXINT = 2147483647
|
20
|
+
_MINFLOAT = -sys.float_info.max
|
21
|
+
_MAXFLOAT = sys.float_info.max
|
22
|
+
|
23
|
+
T = TypeVar("T", int, float, Decimal)
|
24
|
+
|
25
|
+
|
26
|
+
def field_limits(info: FieldInfo, type_: type[T]) -> tuple[T, T]:
|
27
|
+
_min = _MININT if type_ is int else _MINFLOAT
|
28
|
+
_max = _MAXINT if type_ is int else _MAXFLOAT
|
29
|
+
for md in info.metadata:
|
30
|
+
if isinstance(md, Ge):
|
31
|
+
_min = type_(md.ge) # type: ignore
|
32
|
+
if isinstance(md, Gt):
|
33
|
+
_min = type_(md.gt) + 1 if type_ is int else nextafter(type_(md.gt), inf) # type: ignore
|
34
|
+
if isinstance(md, Lt):
|
35
|
+
_max = type_(md.lt) - 1 if type_ is int else nextafter(type_(md.lt), -inf) # type: ignore
|
36
|
+
if isinstance(md, Le):
|
37
|
+
_max = type_(md.le) # type: ignore
|
38
|
+
return _min, _max # type: ignore
|
39
|
+
|
40
|
+
|
41
|
+
def _get_anno(info: FieldInfo, annotation: str, default):
|
42
|
+
for md in info.metadata:
|
43
|
+
if hasattr(md, annotation):
|
44
|
+
return getattr(md, annotation)
|
45
|
+
return default
|
46
|
+
|
47
|
+
|
48
|
+
def field_precision(info: FieldInfo):
|
49
|
+
return _get_anno(info, "decimal_places", 307)
|
50
|
+
|
51
|
+
|
52
|
+
def field_maxlen(info: FieldInfo):
|
53
|
+
return _get_anno(info, "max_length", None)
|
54
|
+
|
55
|
+
|
56
|
+
def field_minlen(info: FieldInfo):
|
57
|
+
return _get_anno(info, "min_length", None)
|
58
|
+
|
59
|
+
|
60
|
+
def field_default(info: FieldInfo):
|
61
|
+
if info.default is PydanticUndefined:
|
62
|
+
return
|
63
|
+
return info.default
|
64
|
+
|
65
|
+
|
66
|
+
def clearable_required(info: FieldInfo):
|
67
|
+
return type(None) in get_args(info.annotation) or info.is_required()
|