bec-widgets 0.83.1__py3-none-any.whl → 0.85.0__py3-none-any.whl

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 (25) hide show
  1. CHANGELOG.md +40 -42
  2. PKG-INFO +1 -1
  3. bec_widgets/cli/client.py +61 -8
  4. bec_widgets/examples/jupyter_console/jupyter_console_window.py +105 -57
  5. bec_widgets/utils/bec_dispatcher.py +5 -2
  6. bec_widgets/widgets/color_map_selector/__init__.py +0 -0
  7. bec_widgets/widgets/color_map_selector/assets/color_map_selector_icon.png +0 -0
  8. bec_widgets/widgets/color_map_selector/color_map_selector.py +111 -0
  9. bec_widgets/widgets/color_map_selector/color_map_selector.pyproject +1 -0
  10. bec_widgets/widgets/color_map_selector/color_map_selector_plugin.py +57 -0
  11. bec_widgets/widgets/color_map_selector/register_color_map_selector.py +17 -0
  12. bec_widgets/widgets/figure/figure.py +21 -114
  13. bec_widgets/widgets/figure/plots/waveform/waveform.py +651 -94
  14. bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +9 -2
  15. {bec_widgets-0.83.1.dist-info → bec_widgets-0.85.0.dist-info}/METADATA +1 -1
  16. {bec_widgets-0.83.1.dist-info → bec_widgets-0.85.0.dist-info}/RECORD +24 -18
  17. pyproject.toml +1 -1
  18. tests/unit_tests/client_mocks.py +13 -4
  19. tests/unit_tests/test_color_map_selector.py +43 -0
  20. tests/unit_tests/test_device_input_widgets.py +2 -0
  21. tests/unit_tests/test_waveform1d.py +202 -23
  22. bec_widgets/examples/jupyter_console/jupyter_console_window.ui +0 -54
  23. {bec_widgets-0.83.1.dist-info → bec_widgets-0.85.0.dist-info}/WHEEL +0 -0
  24. {bec_widgets-0.83.1.dist-info → bec_widgets-0.85.0.dist-info}/entry_points.txt +0 -0
  25. {bec_widgets-0.83.1.dist-info → bec_widgets-0.85.0.dist-info}/licenses/LICENSE +0 -0
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Any, Literal, Optional
4
4
 
5
+ import numpy as np
5
6
  import pyqtgraph as pg
6
7
  from pydantic import BaseModel, Field, field_validator
7
8
  from pydantic_core import PydanticCustomError
@@ -28,7 +29,7 @@ class Signal(BaseModel):
28
29
  """The configuration of a signal in the 1D waveform widget."""
29
30
 
30
31
  source: str
31
- x: SignalData # TODO maybe add metadata for config gui later
32
+ x: Optional[SignalData] = None
32
33
  y: SignalData
33
34
  z: Optional[SignalData] = None
34
35
  dap: Optional[str] = None
@@ -248,9 +249,15 @@ class BECCurve(BECConnector, pg.PlotDataItem):
248
249
  Returns:
249
250
  tuple[np.ndarray,np.ndarray]: X and Y data of the curve.
250
251
  """
251
- x_data, y_data = self.getData()
252
+ try:
253
+ x_data, y_data = self.getData()
254
+ except TypeError:
255
+ x_data, y_data = np.array([]), np.array([])
252
256
  return x_data, y_data
253
257
 
258
+ def clear_data(self):
259
+ self.setData([], [])
260
+
254
261
  def remove(self):
255
262
  """Remove the curve from the plot."""
256
263
  # self.parent_item.removeItem(self)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.83.1
3
+ Version: 0.85.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
@@ -2,11 +2,11 @@
2
2
  .gitlab-ci.yml,sha256=zvb4A6QI5lQTsdfI5nPPL-tUNfcrz__SQjxW03QZ5Ek,8204
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
5
- CHANGELOG.md,sha256=XIRZNOiAJ6U-HWIqQIZQrJ-seB-mrY8_bRoAA-QMH6w,6629
5
+ CHANGELOG.md,sha256=qfCubB8BgPi9QiPtGGeDxjPct_eSvK1Ep9UIP9Rgh34,7430
6
6
  LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
7
- PKG-INFO,sha256=DQQ4PF3OQf7ROCg2O2cIkgZoV2jsXd_1z6I-P2Z5Px0,1308
7
+ PKG-INFO,sha256=WWcaoP_OMmYA22TW83DKHT9_qQS5IpZxIOV5wcyUPkM,1308
8
8
  README.md,sha256=Od69x-RS85Hph0-WwWACwal4yUd67XkEn4APEfHhHFw,2649
9
- pyproject.toml,sha256=LyalVcXB0KNBOfUgjPnaHLv6kQFZCn7vvbFlnjZ_bnc,2357
9
+ pyproject.toml,sha256=bCu_XxdOirPXbnbNVdYtCKmbhJCJFxnxINDiZU02bnE,2357
10
10
  .git_hooks/pre-commit,sha256=n3RofIZHJl8zfJJIUomcMyYGFi_rwq4CC19z0snz3FI,286
11
11
  .gitlab/issue_templates/bug_report_template.md,sha256=gAuyEwl7XlnebBrkiJ9AqffSNOywmr8vygUFWKTuQeI,386
12
12
  .gitlab/issue_templates/documentation_update_template.md,sha256=FHLdb3TS_D9aL4CYZCjyXSulbaW5mrN2CmwTaeLPbNw,860
@@ -17,7 +17,7 @@ bec_widgets/assets/bec_widgets_icon.png,sha256=K8dgGwIjalDh9PRHUsSQBqgdX7a00nM3i
17
17
  bec_widgets/assets/terminal_icon.png,sha256=bJl7Tft4Fi2uxvuXI8o14uMHnI9eAWKSU2uftXCH9ws,3889
18
18
  bec_widgets/cli/__init__.py,sha256=d0Q6Fn44e7wFfLabDOBxpcJ1DPKWlFunGYDUBmO-4hA,22
19
19
  bec_widgets/cli/auto_updates.py,sha256=DyBV3HnjMSH-cvVkYNcDiYKVf0Xut4Qy2qGQqkW47Bw,4833
20
- bec_widgets/cli/client.py,sha256=MMDy1edr1j9klgVGZZmD1dzLxi74gp75Jf4FNed9al8,60084
20
+ bec_widgets/cli/client.py,sha256=4zUI7gm0J2gdKCvfDuK-47PRZ2x3WRchObhhmt0FMsU,61843
21
21
  bec_widgets/cli/client_utils.py,sha256=cDhabblwaP88a0jlVpbn_RWWKVbsyjhmmGtMh9gesEw,12388
22
22
  bec_widgets/cli/generate_cli.py,sha256=Ea5px9KblUlcGg-1JbJBTIU7laGg2n8PM7Efw9WVVzM,5889
23
23
  bec_widgets/cli/rpc_register.py,sha256=QxXUZu5XNg00Yf5O3UHWOXg3-f_pzKjjoZYMOa-MOJc,2216
@@ -25,8 +25,7 @@ bec_widgets/cli/rpc_wigdet_handler.py,sha256=6kQng2DyS6rhLJqSJ7xa0kdgSxp-35A2upc
25
25
  bec_widgets/cli/server.py,sha256=FZkqsjUHIkCUFMKUFm7ls_eslXvhIFzLpINEYxeWP5s,7722
26
26
  bec_widgets/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  bec_widgets/examples/jupyter_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- bec_widgets/examples/jupyter_console/jupyter_console_window.py,sha256=S6OTEp8i1sWRyfB9ZBhl64ZaqBvjonI9xqqtWv2Amp4,5540
29
- bec_widgets/examples/jupyter_console/jupyter_console_window.ui,sha256=2A2mNTUMZBYygz8K4qWzrcjnNqZBMVyeHm26iLZVRWI,1473
28
+ bec_widgets/examples/jupyter_console/jupyter_console_window.py,sha256=iBJD3bNE2tH2sxm2gsdzbdHVEyQRGMMTCzh7utG6lPg,6638
30
29
  bec_widgets/examples/plugin_example_pyside/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
30
  bec_widgets/examples/plugin_example_pyside/main.py,sha256=xdC6RWSRt1rW8Prj0CsDeCPct6-_j3__oJmdgogB5PI,505
32
31
  bec_widgets/examples/plugin_example_pyside/registertictactoe.py,sha256=VNFkHc5Sc30lRKzOFJbhArCHGkp_wRxOeJjZbmaAHRU,448
@@ -40,7 +39,7 @@ bec_widgets/qt_utils/toolbar.py,sha256=UUvC_AwUW3d6MqAzRJIBBqNWLrvBQI9UvekJ9Dw1A
40
39
  bec_widgets/utils/__init__.py,sha256=1930ji1Jj6dVuY81Wd2kYBhHYNV-2R0bN_L4o9zBj1U,533
41
40
  bec_widgets/utils/bec_connector.py,sha256=NypWbIrqb2ls3SIpflM6KihidV9fkroiJu2tQk6KwOA,9604
42
41
  bec_widgets/utils/bec_designer.py,sha256=ak3G8FdojUPjVBBwdPXw7tN5P2Uxr-SSoQt394jXeAA,4308
43
- bec_widgets/utils/bec_dispatcher.py,sha256=dghOw63Ql6rQ-zH1ZaYU6kT9Dg5kNDcZwEdu2YPBJeU,6150
42
+ bec_widgets/utils/bec_dispatcher.py,sha256=fhI7_X0kSZCtXyR55Qn-w7BfNdk2Roc1Tyx0bx3bjoE,6195
44
43
  bec_widgets/utils/bec_table.py,sha256=nA2b8ukSeUfquFMAxGrUVOqdrzMoDYD6O_4EYbOG2zk,717
45
44
  bec_widgets/utils/bec_widget.py,sha256=eC7jhCqyABDf_wGbM6cCdtSF4__rpnVs2Ir1XzGHrCs,238
46
45
  bec_widgets/utils/colors.py,sha256=RAGaA4jdvsFSxGlbhSBYL5mdlwS-9rq45tJM7U-7xXs,10587
@@ -79,6 +78,12 @@ bec_widgets/widgets/color_button/color_button.pyproject,sha256=LUYF4VkDOB4ttVe7Y
79
78
  bec_widgets/widgets/color_button/color_button_plugin.py,sha256=CvO3L6r8pBd-0DNuqjQ7uKF9u1mU6xFs23sS_dsj4tw,1256
80
79
  bec_widgets/widgets/color_button/register_color_button.py,sha256=ZAx3t7G2VI2S-1qcEof31Xi9O0X8deLeZNgS651L1JI,475
81
80
  bec_widgets/widgets/color_button/assets/color_button.png,sha256=dkjgGHSdxu98nM68O16fGpxBjxkkeLN8iu9M_8i5-NY,5618
81
+ bec_widgets/widgets/color_map_selector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
+ bec_widgets/widgets/color_map_selector/color_map_selector.py,sha256=V0nmY2_X76xJmLXOfjW6rG7ipJKFT8swo3bkJZDXBGE,3751
83
+ bec_widgets/widgets/color_map_selector/color_map_selector.pyproject,sha256=sGQE4s6gia1PIz9p6c2mZX12geCk8G384gjL2PE_qEc,36
84
+ bec_widgets/widgets/color_map_selector/color_map_selector_plugin.py,sha256=9V7xvq2SB_YZU7W1E6aEKx38REOTspFNc7x57Fyd9mY,1436
85
+ bec_widgets/widgets/color_map_selector/register_color_map_selector.py,sha256=crZsJcH4z1DHfsfA7iHiQFDggslNyzfuHfo-YdAoca4,514
86
+ bec_widgets/widgets/color_map_selector/assets/color_map_selector_icon.png,sha256=o8zRmMvXhGhMyBklH_Vfjn-jpDL4Nw03fLqDk_wx_JI,11975
82
87
  bec_widgets/widgets/console/console.py,sha256=IW1OerycmS-cm8CKGFig44Qye8mxsmVcKvLHAc3lXco,17845
83
88
  bec_widgets/widgets/device_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
89
  bec_widgets/widgets/device_box/device_box.py,sha256=ofYQJLY02pitmAJG0Y3GWBg8txNmaJDWhQVe9KFQDYA,6938
@@ -102,7 +107,7 @@ bec_widgets/widgets/dock/__init__.py,sha256=B7foHt02gnhM7mFksa7GJVwT7n0j_JvYDCt6
102
107
  bec_widgets/widgets/dock/dock.py,sha256=joymi8NRoIuzuugUj9ccF9e1m57HwLQhhMmjaWiwTnM,7597
103
108
  bec_widgets/widgets/dock/dock_area.py,sha256=WKIt61v7w2YXahfIL4nddWHPfpTpw52uphX4QCbS3q0,7913
104
109
  bec_widgets/widgets/figure/__init__.py,sha256=3hGx_KOV7QHCYAV06aNuUgKq4QIYCjUTad-DrwkUaBM,44
105
- bec_widgets/widgets/figure/figure.py,sha256=5N9GvUMwOOcQgIR78olVhXjIb0W64vIpG6_8WPcoNsc,32014
110
+ bec_widgets/widgets/figure/figure.py,sha256=vuaeAT6XZaK37cLQh_KXX0pE-z6dLkmc_QNe4eydQpk,28520
106
111
  bec_widgets/widgets/figure/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
112
  bec_widgets/widgets/figure/plots/axis_settings.py,sha256=CCvJwo1RjpnLJG9TmGqf9fyPpUNyLT8k7pPEnqVuaGM,2281
108
113
  bec_widgets/widgets/figure/plots/axis_settings.ui,sha256=zMKZK6lH_3KJGO4RA_paXAH7UzZJ4Snlil3MK4pK3L8,11589
@@ -114,8 +119,8 @@ bec_widgets/widgets/figure/plots/image/image_processor.py,sha256=GeTtWjbldy6VejM
114
119
  bec_widgets/widgets/figure/plots/motor_map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
120
  bec_widgets/widgets/figure/plots/motor_map/motor_map.py,sha256=FH3ZSYThGco98jS29r9EGcIh5fYx8e5eOs_nYJNrr48,18210
116
121
  bec_widgets/widgets/figure/plots/waveform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
- bec_widgets/widgets/figure/plots/waveform/waveform.py,sha256=e401GGvUF11rZKf4onB4zYlcUWIv8Zsnm4GcysaXi6U,29226
118
- bec_widgets/widgets/figure/plots/waveform/waveform_curve.py,sha256=yQZGPKs--3X_9Qg2pv0GUiL5WLBQVC3z_PJKRnsHqPU,8293
122
+ bec_widgets/widgets/figure/plots/waveform/waveform.py,sha256=fH3gl1KFVUiKUhfk4UNnBzhW-gyeZq0K_xgrdeKq8PA,52537
123
+ bec_widgets/widgets/figure/plots/waveform/waveform_curve.py,sha256=rQow0EkMtoETJ4xNRRtHbpPuJ4AmNjtn9fx4IM5enh4,8436
119
124
  bec_widgets/widgets/jupyter_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
125
  bec_widgets/widgets/jupyter_console/jupyter_console.py,sha256=ioLYJL31RdBoAOGFSS8PVSnUhkWPWmLC3tiKp7CouO8,2251
121
126
  bec_widgets/widgets/motor_map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -223,7 +228,7 @@ tests/references/SpinnerWidget/SpinnerWidget_linux.png,sha256=OyiGxyQx0XCKEa1OeA
223
228
  tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png,sha256=NA7dOdKY-leFv8JI_5x3OIIY-XlSXSTIflVquz0UUZc,13784
224
229
  tests/references/SpinnerWidget/SpinnerWidget_started_linux.png,sha256=NA7dOdKY-leFv8JI_5x3OIIY-XlSXSTIflVquz0UUZc,13784
225
230
  tests/unit_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
226
- tests/unit_tests/client_mocks.py,sha256=_gtf12kTxmwaXKwSOG5Cc0dqVEY1PHi-hmqdTdLhLTk,4752
231
+ tests/unit_tests/client_mocks.py,sha256=nyI1Qi5ZcDtdfYdNjf46rrL5d5vkVxXcgG0hIZRolO8,5051
227
232
  tests/unit_tests/conftest.py,sha256=KrnktXPWmZhnKNue-xGWOLD1XGEvdz9Vf7V2eO3XQ3A,596
228
233
  tests/unit_tests/test_bec_connector.py,sha256=zGDfNHwLFZTbpyX6-yc7Pwzr2jWO_HGZ8T4NFCNo4IE,2444
229
234
  tests/unit_tests/test_bec_dispatcher.py,sha256=rYPiRizHaswhGZw55IBMneDFxmPiCCLAZQBqjEkpdyY,3992
@@ -234,11 +239,12 @@ tests/unit_tests/test_bec_motor_map.py,sha256=dSYopbZS8lGD9cB26Kwmqw5zBoKCZs8t7D
234
239
  tests/unit_tests/test_bec_queue.py,sha256=u-uc-iZeGAS8P90o6Cxy5oz_60zHpirGAu04OgQPDXw,4598
235
240
  tests/unit_tests/test_bec_status_box.py,sha256=gZdjyy9DNuUP9UwleTLj2Dp5HUImiqnkHjXWiqL0Q-o,4868
236
241
  tests/unit_tests/test_client_utils.py,sha256=CBdWIVJ_UiyFzTJnX3XJm4PGw2uXhFvRCP_Y9ifckbw,2630
242
+ tests/unit_tests/test_color_map_selector.py,sha256=NVnKrz5kFUKgljm7HslIpMII-IpzPAKHIX_KeqpNUew,1518
237
243
  tests/unit_tests/test_color_validation.py,sha256=xbFbtFDia36XLgaNrX2IwvAX3IDC_Odpj5BGoJSgiIE,2389
238
244
  tests/unit_tests/test_crosshair.py,sha256=3OMAJ2ZaISYXMOtkXf1rPdy94vCr8njeLi6uHblBL9Q,5045
239
245
  tests/unit_tests/test_device_box.py,sha256=q9IVFpt1NF3TBF0Jhk-I-LRiuvvHG3FGUalw4jEYwVo,3431
240
246
  tests/unit_tests/test_device_input_base.py,sha256=r1tI7BFAhpv7V7gf_n5gjusyrBFOfuCqIkdVg7YA7vY,2444
241
- tests/unit_tests/test_device_input_widgets.py,sha256=Q40xNKGvJT2dvNttRH68WZi0au8PwpUgBi2EB4LXfC8,5841
247
+ tests/unit_tests/test_device_input_widgets.py,sha256=39MtgF-Q67UWz6qapyYP4ukDEUOD81iEJ_jhATyG7dM,5889
242
248
  tests/unit_tests/test_generate_cli_client.py,sha256=ng-eV5iF7Dhm-6YpxYo99CMY0KgqoaZBQNkMeKULDBU,3355
243
249
  tests/unit_tests/test_generate_plugin.py,sha256=9603ucZChM-pYpHadzsR94U1Zec1KZT34WedX9qzgMo,4464
244
250
  tests/unit_tests/test_motor_map_widget.py,sha256=3nbINg3NYvWUrrGGMRPs8SDtePjXhoehSY_CShFGvEI,7507
@@ -256,7 +262,7 @@ tests/unit_tests/test_stop_button.py,sha256=tpQanzBUyl7qLXjbMUQqm3U3vShbKKARcnLp
256
262
  tests/unit_tests/test_text_box_widget.py,sha256=cT0uEHt_6d-FwST0A_wE9sFW9E3F_nJbKhuBAeU4yHg,1862
257
263
  tests/unit_tests/test_toggle.py,sha256=Amzgres7te0tTQIDR2WMKSx9Kce44TxMpIPR6HZygXQ,832
258
264
  tests/unit_tests/test_vscode_widget.py,sha256=G1G7nCQGXFUn0BnMECE7mHmAm0C6pYx1JpEi_XEhodY,2682
259
- tests/unit_tests/test_waveform1d.py,sha256=inc-CyRA_3-PE99WnR6vDdfRE1vgp-ZoLVJ-Qbq0qFY,15967
265
+ tests/unit_tests/test_waveform1d.py,sha256=ZuHCvGubMuaLIzaMWDvmBUhgzUHCDLdvTZqIOfBKaZg,22713
260
266
  tests/unit_tests/test_website_widget.py,sha256=fBADIJJBAHU4Ro7u95kdemFVNv196UOcuO9oLHuHt8A,761
261
267
  tests/unit_tests/test_widget_io.py,sha256=FeL3ZYSBQnRt6jxj8VGYw1cmcicRQyHKleahw7XIyR0,3475
262
268
  tests/unit_tests/test_yaml_dialog.py,sha256=SEvUgC_poWC6fAoHVWolaORpgMFc7c0Xqqk9cFvHSvo,5826
@@ -265,8 +271,8 @@ tests/unit_tests/test_configs/config_device_no_entry.yaml,sha256=hdvue9KLc_kfNzG
265
271
  tests/unit_tests/test_configs/config_scan.yaml,sha256=vo484BbWOjA_e-h6bTjSV9k7QaQHrlAvx-z8wtY-P4E,1915
266
272
  tests/unit_tests/test_msgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
267
273
  tests/unit_tests/test_msgs/available_scans_message.py,sha256=m_z97hIrjHXXMa2Ex-UvsPmTxOYXfjxyJaGkIY6StTY,46532
268
- bec_widgets-0.83.1.dist-info/METADATA,sha256=DQQ4PF3OQf7ROCg2O2cIkgZoV2jsXd_1z6I-P2Z5Px0,1308
269
- bec_widgets-0.83.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
270
- bec_widgets-0.83.1.dist-info/entry_points.txt,sha256=3otEkCdDB9LZJuBLzG4pFLK5Di0CVybN_12IsZrQ-58,166
271
- bec_widgets-0.83.1.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
272
- bec_widgets-0.83.1.dist-info/RECORD,,
274
+ bec_widgets-0.85.0.dist-info/METADATA,sha256=WWcaoP_OMmYA22TW83DKHT9_qQS5IpZxIOV5wcyUPkM,1308
275
+ bec_widgets-0.85.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
276
+ bec_widgets-0.85.0.dist-info/entry_points.txt,sha256=3otEkCdDB9LZJuBLzG4pFLK5Di0CVybN_12IsZrQ-58,166
277
+ bec_widgets-0.85.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
278
+ bec_widgets-0.85.0.dist-info/RECORD,,
pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_widgets"
7
- version = "0.83.1"
7
+ version = "0.85.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [
@@ -4,7 +4,7 @@ from unittest.mock import MagicMock, patch
4
4
  import fakeredis
5
5
  import pytest
6
6
  from bec_lib.client import BECClient
7
- from bec_lib.device import Positioner
7
+ from bec_lib.device import Positioner, ReadoutPriority
8
8
  from bec_lib.devicemanager import DeviceContainer
9
9
  from bec_lib.redis_connector import RedisConnector
10
10
 
@@ -12,11 +12,12 @@ from bec_lib.redis_connector import RedisConnector
12
12
  class FakeDevice:
13
13
  """Fake minimal positioner class for testing."""
14
14
 
15
- def __init__(self, name, enabled=True):
15
+ def __init__(self, name, enabled=True, readout_priority=ReadoutPriority.MONITORED):
16
16
  self.name = name
17
17
  self.enabled = enabled
18
18
  self.signals = {self.name: {"value": 1.0}}
19
19
  self.description = {self.name: {"source": self.name, "dtype": "number", "shape": []}}
20
+ self.readout_priority = readout_priority
20
21
 
21
22
  def __contains__(self, item):
22
23
  return item == self.name
@@ -43,8 +44,15 @@ class FakeDevice:
43
44
 
44
45
 
45
46
  class FakePositioner(FakeDevice):
46
- def __init__(self, name, enabled=True, limits=None, read_value=1.0):
47
- super().__init__(name, enabled)
47
+ def __init__(
48
+ self,
49
+ name,
50
+ enabled=True,
51
+ limits=None,
52
+ read_value=1.0,
53
+ readout_priority=ReadoutPriority.MONITORED,
54
+ ):
55
+ super().__init__(name, enabled, readout_priority)
48
56
  self.limits = limits if limits is not None else [0, 0]
49
57
  self.read_value = read_value
50
58
  self.name = name
@@ -110,6 +118,7 @@ DEVICES = [
110
118
  FakeDevice("bpm3a"),
111
119
  FakeDevice("bpm3i"),
112
120
  FakeDevice("eiger"),
121
+ FakeDevice("async_device", readout_priority=ReadoutPriority.ASYNC),
113
122
  Positioner("test", limits=[-10, 10], read_value=2.0),
114
123
  ]
115
124
 
@@ -0,0 +1,43 @@
1
+ import pyqtgraph as pg
2
+ import pytest
3
+
4
+ from bec_widgets.widgets.color_map_selector.color_map_selector import ColormapSelector
5
+
6
+
7
+ @pytest.fixture
8
+ def color_map_selector(qtbot):
9
+ widget = ColormapSelector()
10
+ qtbot.addWidget(widget)
11
+ qtbot.waitExposed(widget)
12
+ yield widget
13
+ widget.close()
14
+
15
+
16
+ def test_color_map_selector_init(color_map_selector):
17
+ assert color_map_selector is not None
18
+ assert isinstance(color_map_selector, ColormapSelector)
19
+
20
+ all_maps = pg.colormap.listMaps()
21
+ loaded_maps = [
22
+ color_map_selector.combo.itemText(i) for i in range(color_map_selector.combo.count())
23
+ ]
24
+ assert len(loaded_maps) > 0
25
+ assert all_maps == loaded_maps
26
+
27
+
28
+ def test_color_map_selector_add_color_maps(color_map_selector):
29
+ color_map_selector.add_color_maps(["cividis", "viridis"])
30
+ assert color_map_selector.combo.count() == 2
31
+ assert color_map_selector.combo.itemText(0) == "cividis"
32
+ assert color_map_selector.combo.itemText(1) == "viridis"
33
+ assert color_map_selector.combo.itemText(2) != "cividis"
34
+ assert color_map_selector.combo.itemText(2) != "viridis"
35
+
36
+
37
+ def test_colormap_add_maps_by_property(color_map_selector):
38
+ color_map_selector.colormaps = ["cividis", "viridis"]
39
+ assert color_map_selector.combo.count() == 2
40
+ assert color_map_selector.combo.itemText(0) == "cividis"
41
+ assert color_map_selector.combo.itemText(1) == "viridis"
42
+ assert color_map_selector.combo.itemText(2) != "cividis"
43
+ assert color_map_selector.combo.itemText(2) != "viridis"
@@ -67,6 +67,7 @@ def test_device_input_combobox_init(device_input_combobox):
67
67
  "bpm3a",
68
68
  "bpm3i",
69
69
  "eiger",
70
+ "async_device",
70
71
  "test",
71
72
  ]
72
73
 
@@ -154,6 +155,7 @@ def test_device_input_line_edit_init(device_input_line_edit):
154
155
  "bpm3a",
155
156
  "bpm3i",
156
157
  "eiger",
158
+ "async_device",
157
159
  "test",
158
160
  ]
159
161
 
@@ -14,36 +14,36 @@ def test_adding_curve_to_waveform(bec_figure):
14
14
  w1 = bec_figure.plot()
15
15
 
16
16
  # adding curve which is in bec - only names
17
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i")
17
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i")
18
18
  assert c1.config.label == "bpm4i-bpm4i"
19
19
 
20
20
  # adding curve which is in bec - names and entry
21
- c2 = w1.add_curve_scan(x_name="samx", x_entry="samx", y_name="bpm3a", y_entry="bpm3a")
21
+ c2 = w1.add_curve_bec(x_name="samx", x_entry="samx", y_name="bpm3a", y_entry="bpm3a")
22
22
  assert c2.config.label == "bpm3a-bpm3a"
23
23
 
24
24
  # adding curve which is not in bec
25
25
  with pytest.raises(ValueError) as excinfo:
26
- w1.add_curve_scan(x_name="non_existent_device", y_name="non_existent_device")
26
+ w1.add_curve_bec(x_name="non_existent_device", y_name="non_existent_device")
27
27
  assert "Device 'non_existent_device' not found in current BEC session" in str(excinfo.value)
28
28
 
29
29
  # adding wrong entry for samx
30
30
  with pytest.raises(ValueError) as excinfo:
31
- w1.add_curve_scan(
31
+ w1.add_curve_bec(
32
32
  x_name="samx", x_entry="non_existent_entry", y_name="bpm3a", y_entry="bpm3a"
33
33
  )
34
34
  assert "Entry 'non_existent_entry' not found in device 'samx' signals" in str(excinfo.value)
35
35
 
36
36
  # adding wrong device with validation switched off
37
- c3 = w1.add_curve_scan(x_name="samx", y_name="non_existent_device", validate_bec=False)
37
+ c3 = w1.add_curve_bec(x_name="samx", y_name="non_existent_device", validate_bec=False)
38
38
  assert c3.config.label == "non_existent_device-non_existent_device"
39
39
 
40
40
 
41
41
  def test_adding_curve_with_same_id(bec_figure):
42
42
  w1 = bec_figure.plot()
43
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i", gui_id="test_curve")
43
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i", gui_id="test_curve")
44
44
 
45
45
  with pytest.raises(ValueError) as excinfo:
46
- w1.add_curve_scan(x_name="samx", y_name="bpm4i", gui_id="test_curve")
46
+ w1.add_curve_bec(x_name="samx", y_name="bpm4i", gui_id="test_curve")
47
47
  assert "Curve with ID 'test_curve' already exists." in str(excinfo.value)
48
48
 
49
49
 
@@ -134,7 +134,7 @@ def test_create_waveform1D_by_config(bec_figure):
134
134
 
135
135
  def test_change_gui_id(bec_figure):
136
136
  w1 = bec_figure.plot()
137
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i")
137
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i")
138
138
  w1.change_gui_id("new_id")
139
139
 
140
140
  assert w1.config.gui_id == "new_id"
@@ -143,7 +143,7 @@ def test_change_gui_id(bec_figure):
143
143
 
144
144
  def test_getting_curve(bec_figure):
145
145
  w1 = bec_figure.plot()
146
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i", gui_id="test_curve")
146
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i", gui_id="test_curve")
147
147
  c1_expected_config = CurveConfig(
148
148
  widget_class="BECCurve",
149
149
  gui_id="test_curve",
@@ -166,6 +166,8 @@ def test_getting_curve(bec_figure):
166
166
  assert w1.curves[0].config == c1_expected_config
167
167
  assert w1._curves_data["scan_segment"]["bpm4i-bpm4i"].config == c1_expected_config
168
168
  assert w1.get_curve(0).config == c1_expected_config
169
+ assert w1.get_curve_config("bpm4i-bpm4i", dict_output=True) == c1_expected_config.model_dump()
170
+ assert w1.get_curve_config("bpm4i-bpm4i", dict_output=False) == c1_expected_config
169
171
  assert w1.get_curve("bpm4i-bpm4i").config == c1_expected_config
170
172
  assert c1.get_config(False) == c1_expected_config
171
173
  assert c1.get_config() == c1_expected_config.model_dump()
@@ -173,7 +175,7 @@ def test_getting_curve(bec_figure):
173
175
 
174
176
  def test_getting_curve_errors(bec_figure):
175
177
  w1 = bec_figure.plot()
176
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i", gui_id="test_curve")
178
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i", gui_id="test_curve")
177
179
 
178
180
  with pytest.raises(ValueError) as excinfo:
179
181
  w1.get_curve("non_existent_curve")
@@ -191,7 +193,7 @@ def test_getting_curve_errors(bec_figure):
191
193
  def test_add_curve(bec_figure):
192
194
  w1 = bec_figure.plot()
193
195
 
194
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i")
196
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i")
195
197
 
196
198
  assert len(w1.curves) == 1
197
199
  assert w1._curves_data["scan_segment"] == {"bpm4i-bpm4i": c1}
@@ -202,7 +204,7 @@ def test_add_curve(bec_figure):
202
204
  def test_change_legend_font_size(bec_figure):
203
205
  plot = bec_figure.plot()
204
206
 
205
- w1 = plot.add_curve_scan(x_name="samx", y_name="bpm4i")
207
+ w1 = plot.add_curve_bec(x_name="samx", y_name="bpm4i")
206
208
  my_func = plot.plot_item.legend
207
209
  with mock.patch.object(my_func, "setScale") as mock_set_scale:
208
210
  plot.set_legend_label_size(18)
@@ -214,8 +216,8 @@ def test_change_legend_font_size(bec_figure):
214
216
  def test_remove_curve(bec_figure):
215
217
  w1 = bec_figure.plot()
216
218
 
217
- w1.add_curve_scan(x_name="samx", y_name="bpm4i")
218
- w1.add_curve_scan(x_name="samx", y_name="bpm3a")
219
+ w1.add_curve_bec(x_name="samx", y_name="bpm4i")
220
+ w1.add_curve_bec(x_name="samx", y_name="bpm3a")
219
221
  w1.remove_curve(0)
220
222
  w1.remove_curve("bpm3a-bpm3a")
221
223
 
@@ -232,7 +234,7 @@ def test_remove_curve(bec_figure):
232
234
  def test_change_curve_appearance_methods(bec_figure, qtbot):
233
235
  w1 = bec_figure.plot()
234
236
 
235
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i")
237
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i")
236
238
 
237
239
  c1.set_color("#0000ff")
238
240
  c1.set_symbol("x")
@@ -261,7 +263,7 @@ def test_change_curve_appearance_methods(bec_figure, qtbot):
261
263
  def test_change_curve_appearance_args(bec_figure):
262
264
  w1 = bec_figure.plot()
263
265
 
264
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i")
266
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i")
265
267
 
266
268
  c1.set(
267
269
  color="#0000ff",
@@ -414,7 +416,7 @@ def test_curve_add_by_config(bec_figure):
414
416
  def test_scan_update(bec_figure, qtbot):
415
417
  w1 = bec_figure.plot()
416
418
 
417
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i")
419
+ c1 = w1.add_curve_bec(x_name="samx", y_name="bpm4i")
418
420
 
419
421
  msg_waveform = {
420
422
  "data": {
@@ -448,7 +450,7 @@ def test_scan_update(bec_figure, qtbot):
448
450
  def test_scan_history_with_val_access(bec_figure, qtbot):
449
451
  w1 = bec_figure.plot()
450
452
 
451
- c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i")
453
+ w1.plot(x_name="samx", y_name="bpm4i")
452
454
 
453
455
  mock_scan_data = {
454
456
  "samx": {"samx": mock.MagicMock(val=np.array([1, 2, 3]))}, # Use mock.MagicMock for .val
@@ -464,7 +466,7 @@ def test_scan_history_with_val_access(bec_figure, qtbot):
464
466
 
465
467
  qtbot.wait(500)
466
468
 
467
- x_data, y_data = c1.get_data()
469
+ x_data, y_data = w1.curves[0].get_data()
468
470
 
469
471
  assert np.array_equal(x_data, [1, 2, 3])
470
472
  assert np.array_equal(y_data, [4, 5, 6])
@@ -473,7 +475,7 @@ def test_scan_history_with_val_access(bec_figure, qtbot):
473
475
  def test_scatter_2d_update(bec_figure, qtbot):
474
476
  w1 = bec_figure.plot()
475
477
 
476
- c1 = w1.add_curve_scan(x_name="samx", y_name="samx", z_name="bpm4i")
478
+ c1 = w1.add_curve_bec(x_name="samx", y_name="samx", z_name="bpm4i")
477
479
 
478
480
  msg = {
479
481
  "data": {
@@ -485,8 +487,8 @@ def test_scatter_2d_update(bec_figure, qtbot):
485
487
  }
486
488
  msg_metadata = {"scan_name": "line_scan"}
487
489
 
488
- mock_scan_data = mock.MagicMock()
489
- mock_scan_data.data = {
490
+ mock_scan_item = mock.MagicMock()
491
+ mock_scan_item.data = {
490
492
  device_name: {
491
493
  entry: mock.MagicMock(val=msg["data"][device_name][entry]["value"])
492
494
  for entry in msg["data"][device_name]
@@ -494,7 +496,7 @@ def test_scatter_2d_update(bec_figure, qtbot):
494
496
  for device_name in msg["data"]
495
497
  }
496
498
 
497
- w1.queue.scan_storage.find_scan_by_ID.return_value = mock_scan_data
499
+ w1.queue.scan_storage.find_scan_by_ID.return_value = mock_scan_item
498
500
 
499
501
  w1.on_scan_segment(msg, msg_metadata)
500
502
  qtbot.wait(500)
@@ -508,3 +510,180 @@ def test_scatter_2d_update(bec_figure, qtbot):
508
510
 
509
511
  assert np.array_equal(data, expected_x_y_data)
510
512
  assert colors == expected_z_colors
513
+
514
+
515
+ def test_waveform_single_arg_inputs(bec_figure, qtbot):
516
+ w1 = bec_figure.plot()
517
+
518
+ w1.plot("bpm4i")
519
+ w1.plot([1, 2, 3], label="just_y")
520
+ w1.plot([3, 4, 5], [7, 8, 9], label="x_y")
521
+ w1.plot(x=[1, 2, 3], y=[4, 5, 6], label="x_y_kwargs")
522
+ data_array_1D = np.random.rand(10)
523
+ data_array_2D = np.random.rand(10, 2)
524
+ w1.plot(data_array_1D, label="np_ndarray 1D")
525
+ w1.plot(data_array_2D, label="np_ndarray 2D")
526
+
527
+ qtbot.wait(200)
528
+
529
+ assert w1._curves_data["scan_segment"]["bpm4i-bpm4i"].config.label == "bpm4i-bpm4i"
530
+ assert w1._curves_data["custom"]["just_y"].config.label == "just_y"
531
+ assert w1._curves_data["custom"]["x_y"].config.label == "x_y"
532
+ assert w1._curves_data["custom"]["x_y_kwargs"].config.label == "x_y_kwargs"
533
+
534
+ assert np.array_equal(w1._curves_data["custom"]["just_y"].get_data(), ([0, 1, 2], [1, 2, 3]))
535
+ assert np.array_equal(w1._curves_data["custom"]["just_y"].get_data(), ([0, 1, 2], [1, 2, 3]))
536
+ assert np.array_equal(w1._curves_data["custom"]["x_y"].get_data(), ([3, 4, 5], [7, 8, 9]))
537
+ assert np.array_equal(
538
+ w1._curves_data["custom"]["x_y_kwargs"].get_data(), ([1, 2, 3], [4, 5, 6])
539
+ )
540
+ assert np.array_equal(
541
+ w1._curves_data["custom"]["np_ndarray 1D"].get_data(),
542
+ (np.arange(data_array_1D.size), data_array_1D.T),
543
+ )
544
+ assert np.array_equal(w1._curves_data["custom"]["np_ndarray 2D"].get_data(), data_array_2D.T)
545
+
546
+
547
+ def test_waveform_set_x_sync(bec_figure, qtbot):
548
+ w1 = bec_figure.plot()
549
+ custom_label = "custom_label"
550
+ w1.plot("bpm4i")
551
+ w1.set_x_label(custom_label)
552
+
553
+ scan_item_mock = mock.MagicMock()
554
+ mock_data = {
555
+ "samx": {"samx": mock.MagicMock(val=np.array([1, 2, 3]))},
556
+ "samy": {"samy": mock.MagicMock(val=np.array([4, 5, 6]))},
557
+ "bpm4i": {
558
+ "bpm4i": mock.MagicMock(
559
+ val=np.array([7, 8, 9]),
560
+ timestamps=np.array([1720520189.959115, 1720520189.986618, 1720520190.0157812]),
561
+ )
562
+ },
563
+ }
564
+
565
+ scan_item_mock.data = mock_data
566
+ scan_item_mock.status_message.info = {"scan_report_devices": ["samx"]}
567
+
568
+ w1.queue.scan_storage.find_scan_by_ID.return_value = scan_item_mock
569
+
570
+ w1.on_scan_segment({"scan_id": 1}, {})
571
+ qtbot.wait(200)
572
+
573
+ # Best effort - samx
574
+ x_data, y_data = w1.curves[0].get_data()
575
+ assert np.array_equal(x_data, [1, 2, 3])
576
+ assert np.array_equal(y_data, [7, 8, 9])
577
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [auto: samx-samx]"
578
+
579
+ # Change to samy
580
+ w1.set_x("samy")
581
+ qtbot.wait(200)
582
+ x_data, y_data = w1.curves[0].get_data()
583
+ assert np.array_equal(x_data, [4, 5, 6])
584
+ assert np.array_equal(y_data, [7, 8, 9])
585
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [samy-samy]"
586
+
587
+ # change to index
588
+ w1.set_x("index")
589
+ qtbot.wait(200)
590
+ x_data, y_data = w1.curves[0].get_data()
591
+ assert np.array_equal(x_data, [0, 1, 2])
592
+ assert np.array_equal(y_data, [7, 8, 9])
593
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [index]"
594
+
595
+ # change to timestamp
596
+ w1.set_x("timestamp")
597
+ qtbot.wait(200)
598
+ x_data, y_data = w1.curves[0].get_data()
599
+ assert np.allclose(x_data, np.array([1.72052019e09, 1.72052019e09, 1.72052019e09]))
600
+ assert np.array_equal(y_data, [7, 8, 9])
601
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [timestamp]"
602
+
603
+
604
+ def test_waveform_async_data_update(bec_figure, qtbot):
605
+ w1 = bec_figure.plot("async_device")
606
+ custom_label = "custom_label"
607
+ w1.set_x_label(custom_label)
608
+
609
+ # scan_item_mock = mock.MagicMock()
610
+ # mock_data = {
611
+ # "async_device": {
612
+ # "async_device": mock.MagicMock(
613
+ # val=np.array([7, 8, 9]),
614
+ # timestamps=np.array([1720520189.959115, 1720520189.986618, 1720520190.0157812]),
615
+ # )
616
+ # }
617
+ # }
618
+ #
619
+ # scan_item_mock.async_data = mock_data
620
+ # w1.queue.scan_storage.find_scan_by_ID.return_value = scan_item_mock
621
+
622
+ msg_1 = {"signals": {"async_device": {"value": [7, 8, 9]}}}
623
+ w1.on_async_readback(msg_1, {"async_update": "extend"})
624
+
625
+ qtbot.wait(200)
626
+ x_data, y_data = w1.curves[0].get_data()
627
+ assert np.array_equal(x_data, [0, 1, 2])
628
+ assert np.array_equal(y_data, [7, 8, 9])
629
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [best_effort]"
630
+
631
+ msg_2 = {"signals": {"async_device": {"value": [10, 11, 12]}}}
632
+ w1.on_async_readback(msg_2, {"async_update": "extend"})
633
+
634
+ qtbot.wait(200)
635
+ x_data, y_data = w1.curves[0].get_data()
636
+ assert np.array_equal(x_data, [0, 1, 2, 3, 4, 5])
637
+ assert np.array_equal(y_data, [7, 8, 9, 10, 11, 12])
638
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [best_effort]"
639
+
640
+ msg_3 = {"signals": {"async_device": {"value": [20, 21, 22]}}}
641
+ w1.on_async_readback(msg_3, {"async_update": "replace"})
642
+
643
+ qtbot.wait(200)
644
+ x_data, y_data = w1.curves[0].get_data()
645
+ assert np.array_equal(x_data, [0, 1, 2])
646
+ assert np.array_equal(y_data, [20, 21, 22])
647
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [best_effort]"
648
+
649
+
650
+ def test_waveform_set_x_async(bec_figure, qtbot):
651
+ w1 = bec_figure.plot("async_device")
652
+ custom_label = "custom_label"
653
+ w1.set_x_label(custom_label)
654
+
655
+ scan_item_mock = mock.MagicMock()
656
+ mock_data = {
657
+ "async_device": {
658
+ "async_device": {
659
+ "value": np.array([7, 8, 9]),
660
+ "timestamp": np.array([1720520189.959115, 1720520189.986618, 1720520190.0157812]),
661
+ }
662
+ }
663
+ }
664
+
665
+ scan_item_mock.async_data = mock_data
666
+ w1.queue.scan_storage.find_scan_by_ID.return_value = scan_item_mock
667
+
668
+ w1.on_scan_status({"scan_id": 1})
669
+ w1.replot_async_curve()
670
+
671
+ qtbot.wait(200)
672
+ x_data, y_data = w1.curves[0].get_data()
673
+ assert np.array_equal(x_data, [0, 1, 2])
674
+ assert np.array_equal(y_data, [7, 8, 9])
675
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [best_effort]"
676
+
677
+ w1.set_x("timestamp")
678
+ qtbot.wait(200)
679
+ x_data, y_data = w1.curves[0].get_data()
680
+ assert np.allclose(x_data, np.array([1.72052019e09, 1.72052019e09, 1.72052019e09]))
681
+ assert np.array_equal(y_data, [7, 8, 9])
682
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [timestamp]"
683
+
684
+ w1.set_x("index")
685
+ qtbot.wait(200)
686
+ x_data, y_data = w1.curves[0].get_data()
687
+ assert np.array_equal(x_data, [0, 1, 2])
688
+ assert np.array_equal(y_data, [7, 8, 9])
689
+ assert w1.plot_item.getAxis("bottom").labelText == custom_label + " [index]"