bec-widgets 0.56.1__tar.gz → 0.56.3__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 (147) hide show
  1. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.gitlab-ci.yml +1 -1
  2. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/CHANGELOG.md +28 -30
  3. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/PKG-INFO +1 -1
  4. bec_widgets-0.56.3/bec_widgets/cli/__init__.py +1 -0
  5. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/cli/auto_updates.py +45 -13
  6. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/cli/client.py +20 -0
  7. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/cli/client_utils.py +11 -5
  8. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/dock/dock.py +6 -2
  9. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/dock/dock_area.py +8 -3
  10. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/figure.py +1 -1
  11. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/spiral_progress_bar/ring.py +2 -2
  12. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/spiral_progress_bar/spiral_progress_bar.py +1 -2
  13. bec_widgets-0.56.3/docs/_static/custom.css +170 -0
  14. bec_widgets-0.56.1/docs/developer/reference.md → bec_widgets-0.56.3/docs/api_reference/api_reference.md +3 -1
  15. bec_widgets-0.56.3/docs/assets/apps_48dp.svg +1 -0
  16. bec_widgets-0.56.3/docs/assets/display_settings_48dp.svg +1 -0
  17. bec_widgets-0.56.3/docs/assets/index_api.svg +97 -0
  18. bec_widgets-0.56.3/docs/assets/index_contribute.svg +76 -0
  19. bec_widgets-0.56.3/docs/assets/index_getting_started.svg +66 -0
  20. bec_widgets-0.56.3/docs/assets/index_user_guide.svg +67 -0
  21. bec_widgets-0.56.3/docs/assets/rocket_launch_48dp.svg +1 -0
  22. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/conf.py +3 -3
  23. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/developer/developer.md +0 -8
  24. bec_widgets-0.56.3/docs/index.md +70 -0
  25. bec_widgets-0.56.3/docs/user/api_reference/api_reference.md +11 -0
  26. bec_widgets-0.56.1/docs/user/apps.md → bec_widgets-0.56.3/docs/user/applications/applications.md +1 -1
  27. bec_widgets-0.56.3/docs/user/getting_started/getting_started.md +12 -0
  28. {bec_widgets-0.56.1/docs/user → bec_widgets-0.56.3/docs/user/getting_started}/installation.md +1 -1
  29. bec_widgets-0.56.3/docs/user/user.md +67 -0
  30. {bec_widgets-0.56.1/docs/user → bec_widgets-0.56.3/docs/user/widgets}/widgets.md +3 -3
  31. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/pyproject.toml +1 -1
  32. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/end-2-end/test_bec_dock_rpc_e2e.py +73 -5
  33. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_client_utils.py +2 -2
  34. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_spiral_progress_bar.py +5 -5
  35. bec_widgets-0.56.1/bec_widgets/cli/__init__.py +0 -8
  36. bec_widgets-0.56.1/docs/index.md +0 -39
  37. bec_widgets-0.56.1/docs/user/user.md +0 -38
  38. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.git_hooks/pre-commit +0 -0
  39. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.gitignore +0 -0
  40. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.gitlab/issue_templates/bug_report_template.md +0 -0
  41. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  42. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.gitlab/issue_templates/feature_request_template.md +0 -0
  43. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.gitlab/merge_request_templates/default.md +0 -0
  44. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.pylintrc +0 -0
  45. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/.readthedocs.yaml +0 -0
  46. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/LICENSE +0 -0
  47. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/README.md +0 -0
  48. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/__init__.py +0 -0
  49. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/assets/bec_widgets_icon.png +0 -0
  50. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/assets/terminal_icon.png +0 -0
  51. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/cli/generate_cli.py +0 -0
  52. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/cli/rpc_register.py +0 -0
  53. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/cli/rpc_wigdet_handler.py +0 -0
  54. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/cli/server.py +0 -0
  55. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/examples/__init__.py +0 -0
  56. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  57. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  58. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/examples/jupyter_console/jupyter_console_window.ui +0 -0
  59. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/examples/motor_movement/__init__.py +0 -0
  60. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/examples/motor_movement/motor_control_compilations.py +0 -0
  61. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/examples/motor_movement/motor_controller.ui +0 -0
  62. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/__init__.py +0 -0
  63. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/bec_connector.py +0 -0
  64. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/bec_dispatcher.py +0 -0
  65. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/bec_table.py +0 -0
  66. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/colors.py +0 -0
  67. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/container_utils.py +0 -0
  68. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/crosshair.py +0 -0
  69. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/entry_validator.py +0 -0
  70. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/layout_manager.py +0 -0
  71. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/plugin_utils.py +0 -0
  72. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/rpc_decorator.py +0 -0
  73. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/thread_checker.py +0 -0
  74. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/ui_loader.py +0 -0
  75. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/validator_delegate.py +0 -0
  76. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/widget_io.py +0 -0
  77. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/utils/yaml_dialog.py +0 -0
  78. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/__init__.py +0 -0
  79. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/dock/__init__.py +0 -0
  80. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/__init__.py +0 -0
  81. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/__init__.py +0 -0
  82. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/image/__init__.py +0 -0
  83. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/image/image.py +0 -0
  84. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/image/image_item.py +0 -0
  85. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/image/image_processor.py +0 -0
  86. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/motor_map/__init__.py +0 -0
  87. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py +0 -0
  88. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/plot_base.py +0 -0
  89. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/waveform/__init__.py +0 -0
  90. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/waveform/waveform.py +0 -0
  91. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +0 -0
  92. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/__init__.py +0 -0
  93. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/motor_control.py +0 -0
  94. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/motor_table/__init__.py +0 -0
  95. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/motor_table/motor_table.py +0 -0
  96. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/motor_table/motor_table.ui +0 -0
  97. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/movement_absolute/__init__.py +0 -0
  98. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.py +0 -0
  99. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.ui +0 -0
  100. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/movement_relative/__init__.py +0 -0
  101. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.py +0 -0
  102. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.ui +0 -0
  103. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/selection/__init__.py +0 -0
  104. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/selection/selection.py +0 -0
  105. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/motor_control/selection/selection.ui +0 -0
  106. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/scan_control/__init__.py +0 -0
  107. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/scan_control/scan_control.py +0 -0
  108. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/spiral_progress_bar/__init__.py +0 -0
  109. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/toolbar/__init__.py +0 -0
  110. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/bec_widgets/widgets/toolbar/toolbar.py +0 -0
  111. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/Makefile +0 -0
  112. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/_templates/custom-class-template.rst +0 -0
  113. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/_templates/custom-module-template.rst +0 -0
  114. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/introduction/introduction.md +0 -0
  115. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/make.bat +0 -0
  116. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/requirements.txt +0 -0
  117. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/user/customisation.md +0 -0
  118. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/user/widgets/motor.gif +0 -0
  119. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/user/widgets/scatter_2D.gif +0 -0
  120. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/docs/user/widgets/w1D.gif +0 -0
  121. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/__init__.py +0 -0
  122. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/end-2-end/__init__.py +0 -0
  123. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/end-2-end/conftest.py +0 -0
  124. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/end-2-end/test_bec_figure_rpc_e2e.py +0 -0
  125. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/end-2-end/test_rpc_register_e2e.py +0 -0
  126. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/__init__.py +0 -0
  127. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/client_mocks.py +0 -0
  128. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/conftest.py +0 -0
  129. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_bec_connector.py +0 -0
  130. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_bec_dispatcher.py +0 -0
  131. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_bec_dock.py +0 -0
  132. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_bec_figure.py +0 -0
  133. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_bec_motor_map.py +0 -0
  134. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_configs/config_device.yaml +0 -0
  135. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_configs/config_device_no_entry.yaml +0 -0
  136. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_configs/config_scan.yaml +0 -0
  137. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_crosshair.py +0 -0
  138. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_generate_cli_client.py +0 -0
  139. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_motor_control.py +0 -0
  140. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_msgs/__init__.py +0 -0
  141. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_msgs/available_scans_message.py +0 -0
  142. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_plot_base.py +0 -0
  143. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_rpc_register.py +0 -0
  144. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_scan_control.py +0 -0
  145. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_waveform1d.py +0 -0
  146. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_widget_io.py +0 -0
  147. {bec_widgets-0.56.1 → bec_widgets-0.56.3}/tests/unit_tests/test_yaml_dialog.py +0 -0
@@ -273,7 +273,7 @@ end-2-end-conda:
273
273
  - cd ../
274
274
  - pip install -e .[dev,pyqt6]
275
275
  - cd ./tests/end-2-end
276
- - pytest --start-servers --flush-redis --random-order
276
+ - pytest -v --start-servers --flush-redis --random-order
277
277
 
278
278
  artifacts:
279
279
  when: on_failure
@@ -2,6 +2,34 @@
2
2
 
3
3
 
4
4
 
5
+ ## v0.56.3 (2024-06-05)
6
+
7
+ ### Ci
8
+
9
+ * ci: increased verbosity for e2e tests ([`4af1abe`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/4af1abe4e15b62d2f7e70bf987a1a7d8694ef4d5))
10
+
11
+ ### Fix
12
+
13
+ * fix: fixed support for auto updates ([`131f49d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/131f49da8ea65af4d44b50e81c1acfc29cd92093))
14
+
15
+
16
+ ## v0.56.2 (2024-06-05)
17
+
18
+ ### Documentation
19
+
20
+ * docs: restructured docs layout ([`3c9181d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/3c9181d93d68faa4efb3b91c486ca9ca935975a0))
21
+
22
+ ### Fix
23
+
24
+ * fix(bar): ring saves current value in config ([`9648e3e`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/9648e3ea96a4109be6be694d855151ed6d3ad661))
25
+
26
+ * fix(dock): dock saves configs of all children widgets ([`4be756a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/4be756a8676421c3a3451458995232407295df84))
27
+
28
+ * fix(dock_area): save/restore state is saved in config ([`46face0`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/46face0ee59122f04cb383da685a6658beeeb389))
29
+
30
+ * fix(figure): added correct types of configs to subplot widgets ([`6f3b1ea`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/6f3b1ea985c18929b9bab54239eeb600f03b274a))
31
+
32
+
5
33
  ## v0.56.1 (2024-06-04)
6
34
 
7
35
  ### Fix
@@ -145,33 +173,3 @@
145
173
 
146
174
 
147
175
  ## v0.51.0 (2024-05-07)
148
-
149
- ### Build
150
-
151
- * build(cli): changed repo name to bec_widgets ([`799ea55`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/799ea554de9a7f3720d100be4886a63f02c6a390))
152
-
153
- * build(setup): fakeredis added to dev env ([`df32350`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/df323504fea024a97304d96c2e39e61450714069))
154
-
155
- * build(setup): PyQt6 version is set to 6.7 ([`0ab8aa3`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/0ab8aa3a2fe51b5c38b25fca44c1c422bb42478d))
156
-
157
- ### Ci
158
-
159
- * ci: added rule for parent-child pipelines ([`e085125`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/e0851250eecb85503db929d37f75d2ba366308a6))
160
-
161
- ### Feature
162
-
163
- * feat(utils): added plugin helper to find and load ([`5ece269`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/5ece269adb0e9b0c2a468f1dfbaa6212e86d3561))
164
-
165
-
166
- ## v0.50.2 (2024-04-30)
167
-
168
- ### Fix
169
-
170
- * fix: 'disconnect_slot' has to be symmetric with 'connect_slot' regarding QtThreadSafeCallback ([`0dfcaa4`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/0dfcaa4b708948af0a40ec7cf34d03ff1e96ffac))
171
-
172
-
173
- ## v0.50.1 (2024-04-29)
174
-
175
- ### Fix
176
-
177
- * fix(cli): BECFigure takes the port to connect to redis from the current BECClient, supporting plugins ([`57cb136`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/57cb136a098e87a452414bf44e627edb562f6799))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.56.1
3
+ Version: 0.56.3
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
@@ -0,0 +1 @@
1
+ from .client import BECDockArea, BECFigure
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING
5
5
  from pydantic import BaseModel
6
6
 
7
7
  if TYPE_CHECKING:
8
- from .client import BECFigure
8
+ from .client import BECDockArea, BECFigure
9
9
 
10
10
 
11
11
  class ScanInfo(BaseModel):
@@ -18,9 +18,20 @@ class ScanInfo(BaseModel):
18
18
 
19
19
 
20
20
  class AutoUpdates:
21
- def __init__(self, figure: BECFigure, enabled: bool = True):
22
- self.enabled = enabled
23
- self.figure = figure
21
+ create_default_dock: bool = False
22
+ enabled: bool = False
23
+ dock_name: str = None
24
+
25
+ def __init__(self, gui: BECDockArea):
26
+ self.gui = gui
27
+
28
+ def start_default_dock(self):
29
+ """
30
+ Create a default dock for the auto updates.
31
+ """
32
+ dock = self.gui.add_dock("default_figure")
33
+ dock.add_widget_bec("BECFigure")
34
+ self.dock_name = "default_figure"
24
35
 
25
36
  @staticmethod
26
37
  def get_scan_info(msg) -> ScanInfo:
@@ -44,6 +55,18 @@ class AutoUpdates:
44
55
  status=status,
45
56
  )
46
57
 
58
+ def get_default_figure(self) -> BECFigure | None:
59
+ """
60
+ Get the default figure from the GUI.
61
+ """
62
+ dock = self.gui.panels.get(self.dock_name, [])
63
+ if not dock:
64
+ return None
65
+ widgets = dock.widget_list
66
+ if not widgets:
67
+ return None
68
+ return widgets[0]
69
+
47
70
  def run(self, msg):
48
71
  """
49
72
  Run the update function if enabled.
@@ -86,33 +109,42 @@ class AutoUpdates:
86
109
  """
87
110
  Simple line scan.
88
111
  """
112
+ fig = self.get_default_figure()
113
+ if not fig:
114
+ return
89
115
  dev_x = info.scan_report_devices[0]
90
- dev_y = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
116
+ dev_y = self.get_selected_device(info.monitored_devices, self.gui.selected_device)
91
117
  if not dev_y:
92
118
  return
93
- self.figure.clear_all()
94
- plt = self.figure.plot(dev_x, dev_y)
119
+ fig.clear_all()
120
+ plt = fig.plot(x_name=dev_x, y_name=dev_y)
95
121
  plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
96
122
 
97
123
  def simple_grid_scan(self, info: ScanInfo) -> None:
98
124
  """
99
125
  Simple grid scan.
100
126
  """
127
+ fig = self.get_default_figure()
128
+ if not fig:
129
+ return
101
130
  dev_x = info.scan_report_devices[0]
102
131
  dev_y = info.scan_report_devices[1]
103
- dev_z = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
104
- self.figure.clear_all()
105
- plt = self.figure.plot(dev_x, dev_y, dev_z, label=f"Scan {info.scan_number}")
132
+ dev_z = self.get_selected_device(info.monitored_devices, self.gui.selected_device)
133
+ fig.clear_all()
134
+ plt = fig.plot(x_name=dev_x, y_name=dev_y, z_name=dev_z, label=f"Scan {info.scan_number}")
106
135
  plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
107
136
 
108
137
  def best_effort(self, info: ScanInfo) -> None:
109
138
  """
110
139
  Best effort scan.
111
140
  """
141
+ fig = self.get_default_figure()
142
+ if not fig:
143
+ return
112
144
  dev_x = info.scan_report_devices[0]
113
- dev_y = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
145
+ dev_y = self.get_selected_device(info.monitored_devices, self.gui.selected_device)
114
146
  if not dev_y:
115
147
  return
116
- self.figure.clear_all()
117
- plt = self.figure.plot(dev_x, dev_y, label=f"Scan {info.scan_number}")
148
+ fig.clear_all()
149
+ plt = fig.plot(x_name=dev_x, y_name=dev_y, label=f"Scan {info.scan_number}")
118
150
  plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
@@ -1410,6 +1410,16 @@ class BECMotorMap(RPCBase):
1410
1410
 
1411
1411
 
1412
1412
  class BECDock(RPCBase):
1413
+ @property
1414
+ @rpc_call
1415
+ def config_dict(self) -> "dict":
1416
+ """
1417
+ Get the configuration of the widget.
1418
+
1419
+ Returns:
1420
+ dict: The configuration of the widget.
1421
+ """
1422
+
1413
1423
  @property
1414
1424
  @rpc_call
1415
1425
  def rpc_id(self) -> "str":
@@ -1528,6 +1538,16 @@ class BECDock(RPCBase):
1528
1538
 
1529
1539
 
1530
1540
  class BECDockArea(RPCBase, BECGuiClientMixin):
1541
+ @property
1542
+ @rpc_call
1543
+ def config_dict(self) -> "dict":
1544
+ """
1545
+ Get the configuration of the widget.
1546
+
1547
+ Returns:
1548
+ dict: The configuration of the widget.
1549
+ """
1550
+
1531
1551
  @property
1532
1552
  @rpc_call
1533
1553
  def panels(self) -> "dict":
@@ -17,10 +17,13 @@ from bec_lib.utils.import_utils import isinstance_based_on_class_name, lazy_impo
17
17
  from qtpy.QtCore import QCoreApplication
18
18
 
19
19
  import bec_widgets.cli.client as client
20
+ from bec_widgets.cli.auto_updates import AutoUpdates
20
21
 
21
22
  if TYPE_CHECKING:
22
23
  from bec_lib.device import DeviceBase
23
24
 
25
+ from bec_widgets.cli.client import BECDockArea, BECFigure
26
+
24
27
  messages = lazy_import("bec_lib.messages")
25
28
  # from bec_lib.connector import MessageObject
26
29
  MessageObject = lazy_import_from("bec_lib.connector", ("MessageObject",))
@@ -62,16 +65,19 @@ class BECGuiClientMixin:
62
65
  def __init__(self, **kwargs) -> None:
63
66
  super().__init__(**kwargs)
64
67
  self._process = None
65
- self.update_script = self._get_update_script()
68
+ self.auto_updates = self._get_update_script()
66
69
  self._target_endpoint = MessageEndpoints.scan_status()
67
70
  self._selected_device = None
68
71
  self.stderr_output = []
69
72
 
70
- def _get_update_script(self) -> AutoUpdates:
73
+ def _get_update_script(self) -> AutoUpdates | None:
71
74
  eps = imd.entry_points(group="bec.widgets.auto_updates")
72
75
  for ep in eps:
73
76
  if ep.name == "plugin_widgets_update":
74
- return ep.load()(figure=self)
77
+ try:
78
+ return ep.load()(gui=self)
79
+ except Exception as e:
80
+ print(f"Error loading auto update script from plugin: {str(e)}")
75
81
  return None
76
82
 
77
83
  @property
@@ -97,7 +103,7 @@ class BECGuiClientMixin:
97
103
 
98
104
  @staticmethod
99
105
  def _handle_msg_update(msg: MessageObject, parent: BECGuiClientMixin) -> None:
100
- if parent.update_script is not None:
106
+ if parent.auto_updates is not None:
101
107
  # pylint: disable=protected-access
102
108
  parent._update_script_msg_parser(msg.value)
103
109
 
@@ -105,7 +111,7 @@ class BECGuiClientMixin:
105
111
  if isinstance(msg, messages.ScanStatusMessage):
106
112
  if not self.gui_is_alive():
107
113
  return
108
- self.update_script.run(msg)
114
+ self.auto_updates.run(msg)
109
115
 
110
116
  def show(self) -> None:
111
117
  """
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Literal, Optional
3
+ from typing import TYPE_CHECKING, Any, Literal, Optional
4
4
 
5
5
  from pydantic import Field
6
6
  from pyqtgraph.dockarea import Dock
@@ -15,7 +15,7 @@ if TYPE_CHECKING:
15
15
 
16
16
 
17
17
  class DockConfig(ConnectionConfig):
18
- widgets: dict[str, ConnectionConfig] = Field({}, description="The widgets in the dock.")
18
+ widgets: dict[str, Any] = Field({}, description="The widgets in the dock.")
19
19
  position: Literal["bottom", "top", "left", "right", "above", "below"] = Field(
20
20
  "bottom", description="The position of the dock."
21
21
  )
@@ -26,6 +26,7 @@ class DockConfig(ConnectionConfig):
26
26
 
27
27
  class BECDock(BECConnector, Dock):
28
28
  USER_ACCESS = [
29
+ "config_dict",
29
30
  "rpc_id",
30
31
  "widget_list",
31
32
  "show_title_bar",
@@ -179,6 +180,7 @@ class BECDock(BECConnector, Dock):
179
180
 
180
181
  widget = RPCWidgetHandler.create_widget(widget_type)
181
182
  self.addWidget(widget, row=row, col=col, rowspan=rowspan, colspan=colspan)
183
+ self.config.widgets[widget.gui_id] = widget.config
182
184
 
183
185
  return widget
184
186
 
@@ -209,6 +211,7 @@ class BECDock(BECConnector, Dock):
209
211
  self.layout_manager.shift_widgets(shift, start_row=row)
210
212
 
211
213
  self.addWidget(widget, row=row, col=col, rowspan=rowspan, colspan=colspan)
214
+ self.config.widgets[widget.gui_id] = widget.config
212
215
 
213
216
  def move_widget(self, widget: QWidget, new_row: int, new_col: int):
214
217
  """
@@ -242,6 +245,7 @@ class BECDock(BECConnector, Dock):
242
245
  """
243
246
  widget = self.rpc_register.get_rpc_by_id(widget_rpc_id)
244
247
  self.layout.removeWidget(widget)
248
+ self.config.widgets.pop(widget_rpc_id, None)
245
249
  widget.close()
246
250
 
247
251
  def remove(self):
@@ -16,10 +16,14 @@ from .dock import BECDock, DockConfig
16
16
 
17
17
  class DockAreaConfig(ConnectionConfig):
18
18
  docks: dict[str, DockConfig] = Field({}, description="The docks in the dock area.")
19
+ docks_state: Optional[dict] = Field(
20
+ None, description="The state of the docks in the dock area."
21
+ )
19
22
 
20
23
 
21
24
  class BECDockArea(BECConnector, DockArea):
22
25
  USER_ACCESS = [
26
+ "config_dict",
23
27
  "panels",
24
28
  "save_state",
25
29
  "remove_dock",
@@ -81,7 +85,7 @@ class BECDockArea(BECConnector, DockArea):
81
85
  extra(str): Extra docks that are in the dockarea but that are not mentioned in state will be added to the bottom of the dockarea, unless otherwise specified by the extra argument.
82
86
  """
83
87
  if state is None:
84
- state = self._last_state
88
+ state = self.config.docks_state
85
89
  self.restoreState(state, missing=missing, extra=extra)
86
90
 
87
91
  def save_state(self) -> dict:
@@ -91,8 +95,9 @@ class BECDockArea(BECConnector, DockArea):
91
95
  Returns:
92
96
  dict: The state of the dock area.
93
97
  """
94
- self._last_state = self.saveState()
95
- return self._last_state
98
+ last_state = self.saveState()
99
+ self.config.docks_state = last_state
100
+ return last_state
96
101
 
97
102
  def remove_dock(self, name: str):
98
103
  """
@@ -26,7 +26,7 @@ class FigureConfig(ConnectionConfig):
26
26
  theme: Literal["dark", "light"] = Field("dark", description="The theme of the figure widget.")
27
27
  num_cols: int = Field(1, description="The number of columns in the figure widget.")
28
28
  num_rows: int = Field(1, description="The number of rows in the figure widget.")
29
- widgets: dict[str, SubplotConfig] = Field(
29
+ widgets: dict[str, Waveform1DConfig | ImageConfig | MotorMapConfig | SubplotConfig] = Field(
30
30
  {}, description="The list of widgets to be added to the figure widget."
31
31
  )
32
32
 
@@ -36,6 +36,7 @@ class RingConnections(BaseModel):
36
36
 
37
37
 
38
38
  class RingConfig(ConnectionConfig):
39
+ value: int | float | None = Field(0, description="Value for the progress bars.")
39
40
  direction: int | None = Field(
40
41
  -1, description="Direction of the progress bars. -1 for clockwise, 1 for counter-clockwise."
41
42
  )
@@ -102,7 +103,6 @@ class Ring(BECConnector):
102
103
  self.background_color = None
103
104
  self.start_position = None
104
105
  self.config = config
105
- self.value = 0
106
106
  self.RID = None
107
107
  self._init_config_params()
108
108
 
@@ -114,7 +114,7 @@ class Ring(BECConnector):
114
114
  self.set_connections(self.config.connections.slot, self.config.connections.endpoint)
115
115
 
116
116
  def set_value(self, value: int | float):
117
- self.value = round(
117
+ self.config.value = round(
118
118
  max(self.config.min_value, min(self.config.max_value, value)), self.config.precision
119
119
  )
120
120
 
@@ -115,7 +115,6 @@ class SpiralProgressBar(BECConnector, QWidget):
115
115
  self.entry_validator = EntryValidator(self.dev)
116
116
 
117
117
  self.RID = None
118
- self.values = None
119
118
 
120
119
  # For updating bar behaviour
121
120
  self._auto_updates = True
@@ -544,7 +543,7 @@ class SpiralProgressBar(BECConnector, QWidget):
544
543
  pen = QtGui.QPen(ring.color, ring.config.line_width, QtCore.Qt.SolidLine)
545
544
  pen.setCapStyle(QtCore.Qt.RoundCap)
546
545
  painter.setPen(pen)
547
- proportion = (ring.value - ring.config.min_value) / (
546
+ proportion = (ring.config.value - ring.config.min_value) / (
548
547
  (ring.config.max_value - ring.config.min_value) + 1e-3
549
548
  )
550
549
  angle = int(proportion * 360 * 16 * ring.config.direction)
@@ -0,0 +1,170 @@
1
+ /* Template Inherited from SciPy and modified for PyQtGraph purposes
2
+ https://github.com/scipy/scipy/blob/9ae8fd0f4341d7d8785777d460cca4f7b6a93edd/doc/source/_static/scipy.css
3
+ SPDX-License-Identifier: BSD-3-Clause */
4
+
5
+ /* Remove parenthesis around module using fictive font and add them back.
6
+ This is needed for better wrapping in the sidebar. */
7
+ .bd-sidebar .nav li > a > code {
8
+ white-space: nowrap;
9
+ }
10
+
11
+ .bd-sidebar .nav li > a > code:before {
12
+ content:'(';
13
+ }
14
+
15
+ .bd-sidebar .nav li > a > code:after {
16
+ content:')';
17
+ }
18
+
19
+ .bd-sidebar .nav li > a {
20
+ font-family: "no-parens", sans-serif;
21
+ }
22
+
23
+ /* Retrieved from https://codepen.io/jonneal/pen/bXLEdB (MIT)
24
+ It replaces (, ) with a zero-width font. This version is lighter than
25
+ the original font from Adobe.
26
+ */
27
+ @font-face {
28
+ font-family: no-parens;
29
+ src: url("data:application/x-font-woff;base64,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");
30
+ unicode-range: U+0028, U+0029;
31
+ }
32
+
33
+ /* Colors from:
34
+
35
+ Wong, B. Points of view: Color blindness.
36
+ Nat Methods 8, 441 (2011). https://doi.org/10.1038/nmeth.1618
37
+ */
38
+
39
+ /* If the active version has the name "dev", style it orange */
40
+ #version_switcher_button[data-active-version-name*="dev"] {
41
+ background-color: #E69F00;
42
+ border-color: #E69F00;
43
+ color: white;
44
+ }
45
+
46
+ /* green for `stable` */
47
+ #version_switcher_button[data-active-version-name*="stable"] {
48
+ background-color: #009E73;
49
+ border-color: #009E73;
50
+ color: white;
51
+ }
52
+
53
+ /* red for `old` */
54
+ #version_switcher_button:not([data-active-version-name*="stable"]):not([data-active-version-name*="dev"]):not([data-active-version-name*="pull"]) {
55
+ background-color: #980F0F;
56
+ border-color: #980F0F;
57
+ color: white;
58
+ }
59
+
60
+ /* Main index page overview cards */
61
+
62
+ .sd-card {
63
+ background: #fff;
64
+ border-radius: 0;
65
+ padding: 30px 10px 20px 10px;
66
+ margin: 10px 0px;
67
+ }
68
+
69
+ .sd-card .sd-card-header {
70
+ text-align: center;
71
+ }
72
+
73
+ .sd-card .sd-card-header .sd-card-text {
74
+ margin: 0px;
75
+ }
76
+
77
+ .sd-card .sd-card-img-top {
78
+ height: 52px;
79
+ width: 52px;
80
+ margin-left: auto;
81
+ margin-right: auto;
82
+ }
83
+
84
+ .sd-card .sd-card-header {
85
+ border: none;
86
+ background-color:white;
87
+ color: #150458 !important;
88
+ font-size: var(--pst-font-size-h5);
89
+ font-weight: bold;
90
+ padding: 2.5rem 0rem 0.5rem 0rem;
91
+ border-bottom: none !important;
92
+ }
93
+
94
+ .sd-card .sd-card-footer {
95
+ border: none;
96
+ background-color:white;
97
+ border-top: none !important;
98
+ }
99
+
100
+ .sd-card .sd-card-footer .sd-card-text{
101
+ max-width: 220px;
102
+ margin-left: auto;
103
+ margin-right: auto;
104
+ }
105
+
106
+ .custom-button {
107
+ background-color:#DCDCDC;
108
+ border: none;
109
+ color: #484848;
110
+ text-align: center;
111
+ text-decoration: none;
112
+ display: inline-block;
113
+ font-size: 0.9rem;
114
+ border-radius: 0.5rem;
115
+ max-width: 120px;
116
+ padding: 0.5rem 0rem;
117
+ }
118
+
119
+ .custom-button a {
120
+ color: #484848;
121
+ }
122
+
123
+ .custom-button p {
124
+ margin-top: 0;
125
+ margin-bottom: 0rem;
126
+ color: #484848;
127
+ }
128
+
129
+ /* Dark theme tweaking
130
+
131
+ Matplotlib images are in png and inverted while other output
132
+ types are assumed to be normal images.
133
+
134
+ */
135
+ html[data-theme=dark] img[src*='.svg']:not(.only-dark):not(.dark-light) {
136
+ filter: brightness(0.8) invert(0.82) contrast(1.2);
137
+ background: unset
138
+ }
139
+
140
+ html[data-theme=dark] .MathJax_SVG * {
141
+ fill: var(--pst-color-text-base);
142
+ }
143
+
144
+ /* Main index page overview cards */
145
+
146
+ html[data-theme=dark] .sd-card {
147
+ background-color:var(--pst-color-background);
148
+ border: none
149
+ }
150
+
151
+ html[data-theme=dark] .sd-shadow-sm {
152
+ box-shadow: 0 .1rem 0.5rem rgba(250, 250, 250, .2) !important
153
+ }
154
+
155
+ html[data-theme=dark] .sd-card .sd-card-header {
156
+ background-color:var(--pst-color-background);
157
+ color: #150458 !important;
158
+ }
159
+
160
+ html[data-theme=dark] .sd-card .sd-card-footer {
161
+ background-color:var(--pst-color-background);
162
+ }
163
+
164
+ /*
165
+ Hide TypeAlias Classes
166
+ */
167
+
168
+ dt#ColorMapSpecifier {
169
+ visibility: hidden;
170
+ }
@@ -1,4 +1,5 @@
1
- ## API Reference
1
+ (api_reference)=
2
+ # API Reference
2
3
 
3
4
  ```{eval-rst}
4
5
  .. autosummary::
@@ -7,4 +8,5 @@
7
8
  :recursive:
8
9
 
9
10
  bec_widgets
11
+
10
12
  ```
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 0 24 24" width="48px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 20 20" height="48px" viewBox="0 0 20 20" width="48px" fill="#000000"><g><rect fill="none" height="20" width="20" x="0"/></g><g><g><path d="M16.5,3h-13C2.67,3,2,3.67,2,4.5v9C2,14.33,2.67,15,3.5,15H7v2h6v-2h3.5c0.83,0,1.5-0.67,1.5-1.5v-9 C18,3.67,17.33,3,16.5,3z M16.5,13.5h-13v-9h13V13.5z"/><rect height="1" width="7" x="5" y="7"/><polygon points="14,8 15,8 15,7 14,7 14,6 13,6 13,9 14,9"/><rect height="1" width="7" x="8" y="10"/><polygon points="6,12 7,12 7,9 6,9 6,10 5,10 5,11 6,11"/></g></g></svg>