bec-widgets 0.66.1__tar.gz → 0.67.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/CHANGELOG.md +22 -20
  2. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/PKG-INFO +1 -1
  3. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/cli/client.py +82 -3
  4. bec_widgets-0.67.0/bec_widgets/widgets/bec_status_box/bec_status_box.py +352 -0
  5. bec_widgets-0.67.0/bec_widgets/widgets/bec_status_box/status_item.py +171 -0
  6. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/developer/widgets/widgets.md +0 -1
  7. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/requirements.txt +1 -0
  8. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/getting_started/installation.md +2 -2
  9. bec_widgets-0.67.0/docs/user/widgets/bec_status_box.gif +0 -0
  10. bec_widgets-0.67.0/docs/user/widgets/bec_status_box.md +30 -0
  11. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/buttons.md +0 -1
  12. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/widgets.md +2 -0
  13. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/pyproject.toml +1 -1
  14. bec_widgets-0.67.0/tests/unit_tests/test_bec_status_box.py +152 -0
  15. bec_widgets-0.67.0/tests/unit_tests/test_msgs/__init__.py +0 -0
  16. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.git_hooks/pre-commit +0 -0
  17. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.gitignore +0 -0
  18. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.gitlab/issue_templates/bug_report_template.md +0 -0
  19. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  20. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.gitlab/issue_templates/feature_request_template.md +0 -0
  21. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.gitlab/merge_request_templates/default.md +0 -0
  22. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.gitlab-ci.yml +0 -0
  23. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.pylintrc +0 -0
  24. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/.readthedocs.yaml +0 -0
  25. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/LICENSE +0 -0
  26. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/README.md +0 -0
  27. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/__init__.py +0 -0
  28. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/assets/bec_widgets_icon.png +0 -0
  29. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/assets/terminal_icon.png +0 -0
  30. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/cli/__init__.py +0 -0
  31. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/cli/auto_updates.py +0 -0
  32. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/cli/client_utils.py +0 -0
  33. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/cli/generate_cli.py +0 -0
  34. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/cli/rpc_register.py +0 -0
  35. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/cli/rpc_wigdet_handler.py +0 -0
  36. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/cli/server.py +0 -0
  37. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/examples/__init__.py +0 -0
  38. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  39. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  40. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/examples/jupyter_console/jupyter_console_window.ui +0 -0
  41. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/examples/motor_movement/__init__.py +0 -0
  42. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/examples/motor_movement/motor_control_compilations.py +0 -0
  43. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/examples/motor_movement/motor_controller.ui +0 -0
  44. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/__init__.py +0 -0
  45. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/bec_connector.py +0 -0
  46. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/bec_dispatcher.py +0 -0
  47. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/bec_table.py +0 -0
  48. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/colors.py +0 -0
  49. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/container_utils.py +0 -0
  50. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/crosshair.py +0 -0
  51. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/entry_validator.py +0 -0
  52. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/layout_manager.py +0 -0
  53. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/plugin_utils.py +0 -0
  54. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/rpc_decorator.py +0 -0
  55. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/thread_checker.py +0 -0
  56. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/ui_loader.py +0 -0
  57. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/validator_delegate.py +0 -0
  58. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/widget_io.py +0 -0
  59. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/utils/yaml_dialog.py +0 -0
  60. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/__init__.py +0 -0
  61. {bec_widgets-0.66.1/bec_widgets/widgets/buttons/stop_button → bec_widgets-0.67.0/bec_widgets/widgets/bec_status_box}/__init__.py +0 -0
  62. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/buttons/__init__.py +0 -0
  63. {bec_widgets-0.66.1/bec_widgets/widgets/device_inputs/device_combobox → bec_widgets-0.67.0/bec_widgets/widgets/buttons/stop_button}/__init__.py +0 -0
  64. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/buttons/stop_button/stop_button.py +0 -0
  65. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/device_inputs/__init__.py +0 -0
  66. {bec_widgets-0.66.1/bec_widgets/widgets/device_inputs/device_line_edit → bec_widgets-0.67.0/bec_widgets/widgets/device_inputs/device_combobox}/__init__.py +0 -0
  67. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/device_inputs/device_combobox/device_combobox.py +0 -0
  68. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/device_inputs/device_input_base.py +0 -0
  69. {bec_widgets-0.66.1/bec_widgets/widgets/figure/plots → bec_widgets-0.67.0/bec_widgets/widgets/device_inputs/device_line_edit}/__init__.py +0 -0
  70. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit.py +0 -0
  71. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/dock/__init__.py +0 -0
  72. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/dock/dock.py +0 -0
  73. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/dock/dock_area.py +0 -0
  74. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/__init__.py +0 -0
  75. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/figure.py +0 -0
  76. {bec_widgets-0.66.1/bec_widgets/widgets/figure/plots/image → bec_widgets-0.67.0/bec_widgets/widgets/figure/plots}/__init__.py +0 -0
  77. {bec_widgets-0.66.1/bec_widgets/widgets/figure/plots/motor_map → bec_widgets-0.67.0/bec_widgets/widgets/figure/plots/image}/__init__.py +0 -0
  78. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/plots/image/image.py +0 -0
  79. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/plots/image/image_item.py +0 -0
  80. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/plots/image/image_processor.py +0 -0
  81. {bec_widgets-0.66.1/bec_widgets/widgets/figure/plots/waveform → bec_widgets-0.67.0/bec_widgets/widgets/figure/plots/motor_map}/__init__.py +0 -0
  82. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py +0 -0
  83. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/plots/plot_base.py +0 -0
  84. {bec_widgets-0.66.1/bec_widgets/widgets/jupyter_console → bec_widgets-0.67.0/bec_widgets/widgets/figure/plots/waveform}/__init__.py +0 -0
  85. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/plots/waveform/waveform.py +0 -0
  86. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +0 -0
  87. {bec_widgets-0.66.1/bec_widgets/widgets/motor_control → bec_widgets-0.67.0/bec_widgets/widgets/jupyter_console}/__init__.py +0 -0
  88. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/jupyter_console/jupyter_console.py +0 -0
  89. {bec_widgets-0.66.1/bec_widgets/widgets/motor_control/motor_table → bec_widgets-0.67.0/bec_widgets/widgets/motor_control}/__init__.py +0 -0
  90. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/motor_control.py +0 -0
  91. {bec_widgets-0.66.1/bec_widgets/widgets/motor_control/movement_absolute → bec_widgets-0.67.0/bec_widgets/widgets/motor_control/motor_table}/__init__.py +0 -0
  92. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/motor_table/motor_table.py +0 -0
  93. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/motor_table/motor_table.ui +0 -0
  94. {bec_widgets-0.66.1/bec_widgets/widgets/motor_control/movement_relative → bec_widgets-0.67.0/bec_widgets/widgets/motor_control/movement_absolute}/__init__.py +0 -0
  95. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.py +0 -0
  96. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.ui +0 -0
  97. {bec_widgets-0.66.1/bec_widgets/widgets/motor_control/selection → bec_widgets-0.67.0/bec_widgets/widgets/motor_control/movement_relative}/__init__.py +0 -0
  98. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.py +0 -0
  99. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.ui +0 -0
  100. {bec_widgets-0.66.1/bec_widgets/widgets/text_box → bec_widgets-0.67.0/bec_widgets/widgets/motor_control/selection}/__init__.py +0 -0
  101. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/selection/selection.py +0 -0
  102. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/motor_control/selection/selection.ui +0 -0
  103. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/scan_control/__init__.py +0 -0
  104. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/scan_control/scan_control.py +0 -0
  105. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/spiral_progress_bar/__init__.py +0 -0
  106. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/spiral_progress_bar/ring.py +0 -0
  107. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/spiral_progress_bar/spiral_progress_bar.py +0 -0
  108. {bec_widgets-0.66.1/bec_widgets/widgets/website → bec_widgets-0.67.0/bec_widgets/widgets/text_box}/__init__.py +0 -0
  109. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/text_box/text_box.py +0 -0
  110. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/toolbar/__init__.py +0 -0
  111. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/toolbar/toolbar.py +0 -0
  112. {bec_widgets-0.66.1/tests → bec_widgets-0.67.0/bec_widgets/widgets/website}/__init__.py +0 -0
  113. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/bec_widgets/widgets/website/website.py +0 -0
  114. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/Makefile +0 -0
  115. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/_static/custom.css +0 -0
  116. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/_templates/custom-class-template.rst +0 -0
  117. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/_templates/custom-module-template.rst +0 -0
  118. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/api_reference/api_reference.md +0 -0
  119. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/assets/apps_48dp.svg +0 -0
  120. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/assets/display_settings_48dp.svg +0 -0
  121. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/assets/index_api.svg +0 -0
  122. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/assets/index_contribute.svg +0 -0
  123. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/assets/index_getting_started.svg +0 -0
  124. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/assets/index_user_guide.svg +0 -0
  125. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/assets/rocket_launch_48dp.svg +0 -0
  126. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/conf.py +0 -0
  127. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/developer/developer.md +0 -0
  128. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/developer/getting_started/development.md +0 -0
  129. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/developer/getting_started/getting_started.md +0 -0
  130. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/index.md +0 -0
  131. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/introduction/introduction.md +0 -0
  132. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/make.bat +0 -0
  133. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/api_reference/api_reference.md +0 -0
  134. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/applications/applications.md +0 -0
  135. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/customisation.md +0 -0
  136. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/getting_started/BECDockArea.png +0 -0
  137. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/getting_started/auto_updates.md +0 -0
  138. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/getting_started/getting_started.md +0 -0
  139. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/getting_started/gui_complex_gui.gif +0 -0
  140. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/getting_started/quick_start.md +0 -0
  141. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/user.md +0 -0
  142. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/BECFigure.png +0 -0
  143. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/bec_figure.md +0 -0
  144. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/image_plot.gif +0 -0
  145. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/motor.gif +0 -0
  146. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/progress_bar.gif +0 -0
  147. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/scatter_2D.gif +0 -0
  148. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/spiral_progress_bar.md +0 -0
  149. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/text_box.md +0 -0
  150. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/w1D.gif +0 -0
  151. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/docs/user/widgets/website.md +0 -0
  152. {bec_widgets-0.66.1/tests/end-2-end → bec_widgets-0.67.0/tests}/__init__.py +0 -0
  153. {bec_widgets-0.66.1/tests/unit_tests → bec_widgets-0.67.0/tests/end-2-end}/__init__.py +0 -0
  154. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/end-2-end/conftest.py +0 -0
  155. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/end-2-end/test_bec_dock_rpc_e2e.py +0 -0
  156. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/end-2-end/test_bec_figure_rpc_e2e.py +0 -0
  157. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/end-2-end/test_rpc_register_e2e.py +0 -0
  158. {bec_widgets-0.66.1/tests/unit_tests/test_msgs → bec_widgets-0.67.0/tests/unit_tests}/__init__.py +0 -0
  159. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/client_mocks.py +0 -0
  160. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/conftest.py +0 -0
  161. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_bec_connector.py +0 -0
  162. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_bec_dispatcher.py +0 -0
  163. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_bec_dock.py +0 -0
  164. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_bec_figure.py +0 -0
  165. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_bec_motor_map.py +0 -0
  166. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_client_utils.py +0 -0
  167. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_color_validation.py +0 -0
  168. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_configs/config_device.yaml +0 -0
  169. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_configs/config_device_no_entry.yaml +0 -0
  170. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_configs/config_scan.yaml +0 -0
  171. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_crosshair.py +0 -0
  172. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_device_input_base.py +0 -0
  173. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_device_input_widgets.py +0 -0
  174. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_generate_cli_client.py +0 -0
  175. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_motor_control.py +0 -0
  176. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_msgs/available_scans_message.py +0 -0
  177. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_plot_base.py +0 -0
  178. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_plugin_utils.py +0 -0
  179. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_rpc_register.py +0 -0
  180. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_rpc_widget_handler.py +0 -0
  181. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_scan_control.py +0 -0
  182. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_spiral_progress_bar.py +0 -0
  183. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_stop_button.py +0 -0
  184. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_text_box_widget.py +0 -0
  185. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_waveform1d.py +0 -0
  186. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_website_widget.py +0 -0
  187. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_widget_io.py +0 -0
  188. {bec_widgets-0.66.1 → bec_widgets-0.67.0}/tests/unit_tests/test_yaml_dialog.py +0 -0
@@ -1,5 +1,27 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.67.0 (2024-06-21)
4
+
5
+ ### Documentation
6
+
7
+ * docs: add widget to documentation ([`6fa1c06`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6fa1c06053131dabd084bb3cf13c853b5d3ce833))
8
+
9
+ ### Feature
10
+
11
+ * feat: introduce BECStatusBox Widget ([`443b6c1`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/443b6c1d7b02c772fda02e2d1eefd5bd40249e0c))
12
+
13
+ ### Refactor
14
+
15
+ * refactor: Change inheritance to QTreeWidget from QWidget ([`d2f2b20`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/d2f2b206bb0eab60b8a9b0d0ac60a6b7887fa6fb))
16
+
17
+ ### Test
18
+
19
+ * test: add test suite for bec_status_box and status_item ([`5d4ca81`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/5d4ca816cdedec4c88aba9eb326f85392504ea1c))
20
+
21
+ ### Unknown
22
+
23
+ * Update file requirements.txt ([`505a5ec`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/505a5ec8334ff4422913b3a7b79d39bcb42ad535))
24
+
3
25
  ## v0.66.1 (2024-06-20)
4
26
 
5
27
  ### Fix
@@ -153,26 +175,6 @@ This reverts commit abc6caa2d0b6141dfbe1f3d025f78ae14deddcb3 ([`fe04dd8`](https:
153
175
 
154
176
  ## v0.60.0 (2024-06-08)
155
177
 
156
- ### Ci
157
-
158
- * ci: added git fetch for target branch ([`fc4f4f8`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/fc4f4f81ad1be99cf5112f2188a46c5bed2679ee))
159
-
160
- * ci: fixed pylint-check ([`6b1d582`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6b1d5827d6599f06a3acd316060a8d25f0686d54))
161
-
162
- ### Feature
163
-
164
- * feat: added isort to bw-generate-cli ([`f0391f5`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/f0391f59c9eb0a51b693fccfe2e399e869d35dda))
165
-
166
178
  ### Fix
167
179
 
168
180
  * fix: removed BECConnector from rpc client interface ([`6428e38`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6428e38ab94c15a2c904e75cc6404bb6d0394e04))
169
-
170
- ### Refactor
171
-
172
- * refactor: minor cleanup ([`3adf6cf`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/3adf6cfd586355c8b8ce7fdc9722f868e22287c5))
173
-
174
- * refactor: disabled pylint for auto-gen client ([`b15816c`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/b15816ca9fd3e4ae87cca5fcfe029b4dfca570ca))
175
-
176
- ### Test
177
-
178
- * test: added missing pylint statement to header ([`f662985`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/f6629852ebc2b4ee239fa560cc310a5ae2627cf7))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.66.1
3
+ Version: 0.67.0
4
4
  Summary: BEC Widgets
5
5
  Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec_widgets/issues
6
6
  Project-URL: Homepage, https://gitlab.psi.ch/bec/bec_widgets
@@ -13,6 +13,7 @@ class Widgets(str, enum.Enum):
13
13
  Enum for the available widgets.
14
14
  """
15
15
 
16
+ BECStatusBox = "BECStatusBox"
16
17
  BECDock = "BECDock"
17
18
  BECDockArea = "BECDockArea"
18
19
  BECFigure = "BECFigure"
@@ -1388,6 +1389,24 @@ class BECPlotBase(RPCBase):
1388
1389
  """
1389
1390
 
1390
1391
 
1392
+ class BECStatusBox(RPCBase):
1393
+ @property
1394
+ @rpc_call
1395
+ def config_dict(self) -> "dict":
1396
+ """
1397
+ Get the configuration of the widget.
1398
+
1399
+ Returns:
1400
+ dict: The configuration of the widget.
1401
+ """
1402
+
1403
+ @rpc_call
1404
+ def get_all_rpc(self) -> "dict":
1405
+ """
1406
+ Get all registered RPC objects.
1407
+ """
1408
+
1409
+
1391
1410
  class BECWaveform(RPCBase):
1392
1411
  @property
1393
1412
  @rpc_call
@@ -1649,6 +1668,60 @@ class BECWaveform(RPCBase):
1649
1668
  """
1650
1669
 
1651
1670
 
1671
+ class DeviceComboBox(RPCBase):
1672
+ @property
1673
+ @rpc_call
1674
+ def config_dict(self) -> "dict":
1675
+ """
1676
+ Get the configuration of the widget.
1677
+
1678
+ Returns:
1679
+ dict: The configuration of the widget.
1680
+ """
1681
+
1682
+ @rpc_call
1683
+ def get_all_rpc(self) -> "dict":
1684
+ """
1685
+ Get all registered RPC objects.
1686
+ """
1687
+
1688
+
1689
+ class DeviceInputBase(RPCBase):
1690
+ @property
1691
+ @rpc_call
1692
+ def config_dict(self) -> "dict":
1693
+ """
1694
+ Get the configuration of the widget.
1695
+
1696
+ Returns:
1697
+ dict: The configuration of the widget.
1698
+ """
1699
+
1700
+ @rpc_call
1701
+ def get_all_rpc(self) -> "dict":
1702
+ """
1703
+ Get all registered RPC objects.
1704
+ """
1705
+
1706
+
1707
+ class DeviceLineEdit(RPCBase):
1708
+ @property
1709
+ @rpc_call
1710
+ def config_dict(self) -> "dict":
1711
+ """
1712
+ Get the configuration of the widget.
1713
+
1714
+ Returns:
1715
+ dict: The configuration of the widget.
1716
+ """
1717
+
1718
+ @rpc_call
1719
+ def get_all_rpc(self) -> "dict":
1720
+ """
1721
+ Get all registered RPC objects.
1722
+ """
1723
+
1724
+
1652
1725
  class Ring(RPCBase):
1653
1726
  @rpc_call
1654
1727
  def get_all_rpc(self) -> "dict":
@@ -1950,7 +2023,7 @@ class TextBox(RPCBase):
1950
2023
  @rpc_call
1951
2024
  def set_color(self, background_color: str, font_color: str) -> None:
1952
2025
  """
1953
- Set the background color of the Widget.
2026
+ Set the background color of the widget.
1954
2027
 
1955
2028
  Args:
1956
2029
  background_color (str): The color to set the background in HEX.
@@ -1960,13 +2033,19 @@ class TextBox(RPCBase):
1960
2033
  @rpc_call
1961
2034
  def set_text(self, text: str) -> None:
1962
2035
  """
1963
- Set the text of the Widget
2036
+ Set the text of the widget.
2037
+
2038
+ Args:
2039
+ text (str): The text to set.
1964
2040
  """
1965
2041
 
1966
2042
  @rpc_call
1967
2043
  def set_font_size(self, size: int) -> None:
1968
2044
  """
1969
- Set the font size of the text in the Widget.
2045
+ Set the font size of the text in the widget.
2046
+
2047
+ Args:
2048
+ size (int): The font size to set.
1970
2049
  """
1971
2050
 
1972
2051
 
@@ -0,0 +1,352 @@
1
+ """This module contains the BECStatusBox widget, which displays the status of different BEC services in a collapsible tree widget.
2
+ The widget automatically updates the status of all running BEC services, and displays their status.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ import sys
8
+ from typing import TYPE_CHECKING
9
+
10
+ import qdarktheme
11
+ from bec_lib.utils.import_utils import lazy_import_from
12
+ from pydantic import BaseModel, Field, field_validator
13
+ from qtpy.QtCore import QObject, QTimer, Signal, Slot
14
+ from qtpy.QtWidgets import QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget
15
+
16
+ from bec_widgets.utils.bec_connector import BECConnector, ConnectionConfig
17
+ from bec_widgets.widgets.bec_status_box.status_item import StatusItem
18
+
19
+ if TYPE_CHECKING:
20
+ from bec_lib.client import BECClient
21
+
22
+ # TODO : Put normal imports back when Pydantic gets faster
23
+ BECStatus = lazy_import_from("bec_lib.messages", ("BECStatus",))
24
+
25
+
26
+ class BECStatusBoxConfig(ConnectionConfig):
27
+ pass
28
+
29
+
30
+ class BECServiceInfoContainer(BaseModel):
31
+ """Container to store information about the BEC services."""
32
+
33
+ service_name: str
34
+ status: BECStatus | str = Field(
35
+ default="NOTCONNECTED",
36
+ description="The status of the service. Can be any of the BECStatus names, or NOTCONNECTED.",
37
+ )
38
+ info: dict
39
+ metrics: dict | None
40
+ model_config: dict = {"validate_assignment": True}
41
+
42
+ @field_validator("status")
43
+ @classmethod
44
+ def validate_status(cls, v):
45
+ """Validate input for status. Accept BECStatus and NOTCONNECTED.
46
+
47
+ Args:
48
+ v (BECStatus | str): The input value.
49
+
50
+ Returns:
51
+ str: The validated status.
52
+ """
53
+ if v in list(BECStatus.__members__.values()):
54
+ return v.name
55
+ if v in list(BECStatus.__members__.keys()) or v == "NOTCONNECTED":
56
+ return v
57
+ raise ValueError(
58
+ f"Status must be one of {BECStatus.__members__.values()} or 'NOTCONNECTED'. Input {v}"
59
+ )
60
+
61
+
62
+ class BECServiceStatusMixin(QObject):
63
+ """A mixin class to update the service status, and metrics.
64
+ It emits a signal 'services_update' when the service status is updated.
65
+
66
+ Args:
67
+ client (BECClient): The client object to connect to the BEC server.
68
+ """
69
+
70
+ services_update = Signal(dict, dict)
71
+
72
+ def __init__(self, client: BECClient):
73
+ super().__init__()
74
+ self.client = client
75
+ self._service_update_timer = QTimer()
76
+ self._service_update_timer.timeout.connect(self._get_service_status)
77
+ self._service_update_timer.start(1000)
78
+
79
+ def _get_service_status(self):
80
+ """Pull latest service and metrics updates from REDIS for all services, and emit both via 'services_update' signal."""
81
+ # pylint: disable=protected-access
82
+ self.client._update_existing_services()
83
+ self.services_update.emit(self.client._services_info, self.client._services_metric)
84
+
85
+
86
+ class BECStatusBox(BECConnector, QTreeWidget):
87
+ """A widget to display the status of different BEC services.
88
+ This widget automatically updates the status of all running BEC services, and displays their status.
89
+ Information about the individual services is collapsible, and double clicking on
90
+ the individual service will display the metrics about the service.
91
+
92
+ Args:
93
+ parent Optional : The parent widget for the BECStatusBox. Defaults to None.
94
+ service_name Optional(str): The name of the top service label. Defaults to "BEC Server".
95
+ client Optional(BECClient): The client object to connect to the BEC server. Defaults to None
96
+ config Optional(BECStatusBoxConfig | dict): The configuration for the status box. Defaults to None.
97
+ gui_id Optional(str): The unique id for the widget. Defaults to None.
98
+ """
99
+
100
+ CORE_SERVICES = ["DeviceServer", "ScanServer", "SciHub", "ScanBundler", "FileWriterManager"]
101
+
102
+ service_update = Signal(dict)
103
+ bec_core_state = Signal(str)
104
+
105
+ def __init__(
106
+ self,
107
+ parent=None,
108
+ service_name: str = "BEC Server",
109
+ client: BECClient = None,
110
+ config: BECStatusBoxConfig | dict = None,
111
+ gui_id: str = None,
112
+ ):
113
+ if config is None:
114
+ config = BECStatusBoxConfig(widget_class=self.__class__.__name__)
115
+ else:
116
+ if isinstance(config, dict):
117
+ config = BECStatusBoxConfig(**config)
118
+ super().__init__(client=client, config=config, gui_id=gui_id)
119
+ QTreeWidget.__init__(self, parent=parent)
120
+
121
+ self.service_name = service_name
122
+ self.config = config
123
+
124
+ self.bec_service_info_container = {}
125
+ self.tree_items = {}
126
+ self.tree_top_item = None
127
+ self.bec_service_status = BECServiceStatusMixin(client=self.client)
128
+
129
+ self.init_ui()
130
+ self.bec_service_status.services_update.connect(self.update_service_status)
131
+ self.bec_core_state.connect(self.update_top_item_status)
132
+ self.itemDoubleClicked.connect(self.on_tree_item_double_clicked)
133
+
134
+ def init_ui(self) -> None:
135
+ """Initialize the UI for the status box, and add QTreeWidget as the basis for the status box."""
136
+ self.init_ui_tree_widget()
137
+ top_label = self._create_status_widget(self.service_name, status=BECStatus.IDLE)
138
+ self.tree_top_item = QTreeWidgetItem()
139
+ self.tree_top_item.setExpanded(True)
140
+ self.tree_top_item.setDisabled(True)
141
+ self.addTopLevelItem(self.tree_top_item)
142
+ self.setItemWidget(self.tree_top_item, 0, top_label)
143
+ self.service_update.connect(top_label.update_config)
144
+
145
+ def _create_status_widget(
146
+ self, service_name: str, status=BECStatus, info: dict = None, metrics: dict = None
147
+ ) -> StatusItem:
148
+ """Creates a StatusItem (QWidget) for the given service, and stores all relevant
149
+ information about the service in the bec_service_info_container.
150
+
151
+ Args:
152
+ service_name (str): The name of the service.
153
+ status (BECStatus): The status of the service.
154
+ info Optional(dict): The information about the service. Default is {}
155
+ metric Optional(dict): Metrics for the respective service. Default is None
156
+
157
+ Returns:
158
+ StatusItem: The status item widget.
159
+ """
160
+ if info is None:
161
+ info = {}
162
+ self._update_bec_service_container(service_name, status, info, metrics)
163
+ item = StatusItem(
164
+ parent=self,
165
+ config={
166
+ "service_name": service_name,
167
+ "status": status.name,
168
+ "info": info,
169
+ "metrics": metrics,
170
+ },
171
+ )
172
+ return item
173
+
174
+ @Slot(str)
175
+ def update_top_item_status(self, status: BECStatus) -> None:
176
+ """Method to update the status of the top item in the tree widget.
177
+ Gets the status from the Signal 'bec_core_state' and updates the StatusItem via the signal 'service_update'.
178
+
179
+ Args:
180
+ status (BECStatus): The state of the core services.
181
+ """
182
+ self.bec_service_info_container[self.service_name].status = status
183
+ self.service_update.emit(self.bec_service_info_container[self.service_name].model_dump())
184
+
185
+ def _update_bec_service_container(
186
+ self, service_name: str, status: BECStatus, info: dict, metrics: dict = None
187
+ ) -> None:
188
+ """Update the bec_service_info_container with the newest status and metrics for the BEC service.
189
+ If information about the service already exists, it will create a new entry.
190
+
191
+ Args:
192
+ service_name (str): The name of the service.
193
+ service_info (StatusMessage): A class containing the service status.
194
+ service_metric (ServiceMetricMessage): A class containing the service metrics.
195
+ """
196
+ container = self.bec_service_info_container.get(service_name, None)
197
+ if container:
198
+ container.status = status
199
+ container.info = info
200
+ container.metrics = metrics
201
+ return
202
+ service_info_item = BECServiceInfoContainer(
203
+ service_name=service_name, status=status, info=info, metrics=metrics
204
+ )
205
+ self.bec_service_info_container.update({service_name: service_info_item})
206
+
207
+ @Slot(dict, dict)
208
+ def update_service_status(self, services_info: dict, services_metric: dict) -> None:
209
+ """Callback function services_metric from BECServiceStatusMixin.
210
+ It updates the status of all services.
211
+
212
+ Args:
213
+ services_info (dict): A dictionary containing the service status for all running BEC services.
214
+ services_metric (dict): A dictionary containing the service metrics for all running BEC services.
215
+ """
216
+ checked = []
217
+ services_info = self.update_core_services(services_info, services_metric)
218
+ checked.extend(self.CORE_SERVICES)
219
+
220
+ for service_name, msg in sorted(services_info.items()):
221
+ checked.append(service_name)
222
+ metric_msg = services_metric.get(service_name, None)
223
+ metrics = metric_msg.metrics if metric_msg else None
224
+ if service_name in self.tree_items:
225
+ self._update_bec_service_container(
226
+ service_name=service_name, status=msg.status, info=msg.info, metrics=metrics
227
+ )
228
+ self.service_update.emit(self.bec_service_info_container[service_name].model_dump())
229
+ continue
230
+
231
+ item_widget = self._create_status_widget(
232
+ service_name=service_name, status=msg.status, info=msg.info, metrics=metrics
233
+ )
234
+ item = QTreeWidgetItem()
235
+ item.setDisabled(True)
236
+ self.service_update.connect(item_widget.update_config)
237
+ self.tree_top_item.addChild(item)
238
+ self.setItemWidget(item, 0, item_widget)
239
+ self.tree_items.update({service_name: (item, item_widget)})
240
+
241
+ self.check_redundant_tree_items(checked)
242
+
243
+ def update_core_services(self, services_info: dict, services_metric: dict) -> dict:
244
+ """Method to process status and metrics updates of core services (stored in CORE_SERVICES).
245
+ If a core services is not connected, it should not be removed from the status widget
246
+
247
+ Args:
248
+ services_info (dict): A dictionary containing the service status of different services.
249
+ services_metric (dict): A dictionary containing the service metrics of different services.
250
+
251
+ Returns:
252
+ dict: The services_info dictionary after removing the info updates related to the CORE_SERVICES
253
+ """
254
+ bec_core_state = "RUNNING"
255
+ for service_name in sorted(self.CORE_SERVICES):
256
+ metric_msg = services_metric.get(service_name, None)
257
+ metrics = metric_msg.metrics if metric_msg else None
258
+ if service_name not in services_info:
259
+ self.bec_service_info_container[service_name].status = "NOTCONNECTED"
260
+ bec_core_state = "ERROR"
261
+ else:
262
+ msg = services_info.pop(service_name)
263
+ self._update_bec_service_container(
264
+ service_name=service_name, status=msg.status, info=msg.info, metrics=metrics
265
+ )
266
+ bec_core_state = (
267
+ "RUNNING" if (msg.status.value > 1 and bec_core_state == "RUNNING") else "ERROR"
268
+ )
269
+
270
+ if service_name in self.tree_items:
271
+ self.service_update.emit(self.bec_service_info_container[service_name].model_dump())
272
+ continue
273
+ self.add_tree_item(service_name, msg.status, msg.info, metrics)
274
+
275
+ self.bec_core_state.emit(bec_core_state)
276
+ return services_info
277
+
278
+ def check_redundant_tree_items(self, checked: list) -> None:
279
+ """Utility method to check and remove redundant objects from the BECStatusBox.
280
+
281
+ Args:
282
+ checked (list): A list of services that are currently running.
283
+ """
284
+ to_be_deleted = [key for key in self.tree_items if key not in checked]
285
+
286
+ for key in to_be_deleted:
287
+ item, _ = self.tree_items.pop(key)
288
+ self.tree_top_item.removeChild(item)
289
+
290
+ def add_tree_item(
291
+ self, service_name: str, status: BECStatus, info: dict = None, metrics: dict = None
292
+ ) -> None:
293
+ """Method to add a new QTreeWidgetItem together with a StatusItem to the tree widget.
294
+
295
+ Args:
296
+ service_name (str): The name of the service.
297
+ service_status_msg (StatusMessage): The status of the service.
298
+ metrics (dict): The metrics of the service.
299
+ """
300
+ item_widget = self._create_status_widget(
301
+ service_name=service_name, status=status, info=info, metrics=metrics
302
+ )
303
+ item = QTreeWidgetItem()
304
+ self.service_update.connect(item_widget.update_config)
305
+ self.tree_top_item.addChild(item)
306
+ self.setItemWidget(item, 0, item_widget)
307
+ self.tree_items.update({service_name: (item, item_widget)})
308
+
309
+ def init_ui_tree_widget(self) -> None:
310
+ """Initialise the tree widget for the status box."""
311
+ self.setHeaderHidden(True)
312
+ self.setStyleSheet(
313
+ "QTreeWidget::item:!selected "
314
+ "{ "
315
+ "border: 1px solid gainsboro; "
316
+ "border-left: none; "
317
+ "border-top: none; "
318
+ "}"
319
+ "QTreeWidget::item:selected {}"
320
+ )
321
+
322
+ @Slot(QTreeWidgetItem, int)
323
+ def on_tree_item_double_clicked(self, item: QTreeWidgetItem, column: int) -> None:
324
+ """Callback function for double clicks on individual QTreeWidgetItems in the collapsed section.
325
+
326
+ Args:
327
+ item (QTreeWidgetItem): The item that was double clicked.
328
+ column (int): The column that was double clicked.
329
+ """
330
+ for _, (tree_item, status_widget) in self.tree_items.items():
331
+ if tree_item == item:
332
+ status_widget.show_popup()
333
+
334
+ def closeEvent(self, event):
335
+ super().cleanup()
336
+ QTreeWidget().closeEvent(event)
337
+
338
+
339
+ def main():
340
+ """Main method to run the BECStatusBox widget."""
341
+ # pylint: disable=import-outside-toplevel
342
+ from qtpy.QtWidgets import QApplication
343
+
344
+ app = QApplication(sys.argv)
345
+ qdarktheme.setup_theme("auto")
346
+ main_window = BECStatusBox()
347
+ main_window.show()
348
+ sys.exit(app.exec())
349
+
350
+
351
+ if __name__ == "__main__":
352
+ main()