bec-widgets 1.16.5__py3-none-any.whl → 1.17.1__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 (34) hide show
  1. CHANGELOG.md +37 -0
  2. PKG-INFO +1 -1
  3. bec_widgets/cli/client.py +46 -0
  4. bec_widgets/utils/bec_signal_proxy.py +39 -11
  5. bec_widgets/widgets/containers/dock/dock_area.py +1 -1
  6. bec_widgets/widgets/control/device_control/positioner_box/__init__.py +11 -0
  7. bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py +3 -0
  8. bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py +243 -0
  9. bec_widgets/widgets/control/device_control/positioner_box/positioner_box/__init__.py +0 -0
  10. bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +242 -0
  11. bec_widgets/widgets/control/device_control/positioner_box/{positioner_box_plugin.py → positioner_box/positioner_box_plugin.py} +1 -1
  12. bec_widgets/widgets/control/device_control/positioner_box/{register_positioner_box.py → positioner_box/register_positioner_box.py} +1 -1
  13. bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/__init__.py +0 -0
  14. bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d.pyproject +1 -0
  15. bec_widgets/widgets/control/{device_input/signal_combobox/signal_combo_box_plugin.py → device_control/positioner_box/positioner_box_2d/positioner_box2_d_plugin.py} +11 -9
  16. bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +482 -0
  17. bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui +562 -0
  18. bec_widgets/widgets/control/{device_input/signal_combobox/register_signal_combo_box.py → device_control/positioner_box/positioner_box_2d/register_positioner_box2_d.py} +3 -3
  19. bec_widgets/widgets/control/device_control/positioner_box/{positioner_control_line.py → positioner_control_line/positioner_control_line.py} +5 -2
  20. bec_widgets/widgets/control/device_control/positioner_box/{positioner_control_line_plugin.py → positioner_control_line/positioner_control_line_plugin.py} +1 -3
  21. bec_widgets/widgets/control/device_control/positioner_box/{register_positioner_control_line.py → positioner_control_line/register_positioner_control_line.py} +1 -1
  22. bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py +7 -6
  23. {bec_widgets-1.16.5.dist-info → bec_widgets-1.17.1.dist-info}/METADATA +1 -1
  24. {bec_widgets-1.16.5.dist-info → bec_widgets-1.17.1.dist-info}/RECORD +32 -26
  25. pyproject.toml +1 -1
  26. bec_widgets/widgets/control/device_control/positioner_box/positioner_box.py +0 -352
  27. bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject +0 -1
  28. /bec_widgets/widgets/control/device_control/positioner_box/{positioner_box.pyproject → positioner_box/positioner_box.pyproject} +0 -0
  29. /bec_widgets/widgets/control/device_control/positioner_box/{positioner_box.ui → positioner_box/positioner_box.ui} +0 -0
  30. /bec_widgets/widgets/control/device_control/positioner_box/{positioner_control_line.pyproject → positioner_control_line/positioner_control_line.pyproject} +0 -0
  31. /bec_widgets/widgets/control/device_control/positioner_box/{positioner_control_line.ui → positioner_control_line/positioner_control_line.ui} +0 -0
  32. {bec_widgets-1.16.5.dist-info → bec_widgets-1.17.1.dist-info}/WHEEL +0 -0
  33. {bec_widgets-1.16.5.dist-info → bec_widgets-1.17.1.dist-info}/entry_points.txt +0 -0
  34. {bec_widgets-1.16.5.dist-info → bec_widgets-1.17.1.dist-info}/licenses/LICENSE +0 -0
@@ -2,11 +2,11 @@
2
2
  .gitlab-ci.yml,sha256=CLlFGYRGKp4FxCPTkyF9p-7qx67KmbM9Yok9JQEU_Ls,8677
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
5
- CHANGELOG.md,sha256=OF6HfuDv9NchdaV6H10f3uWY2ePLRS5Av4KksTZN85g,223617
5
+ CHANGELOG.md,sha256=Jc45hYcb-Nda1rAVVrG_G5rZZsVWbdCA3224lFwYZ-k,224827
6
6
  LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
7
- PKG-INFO,sha256=C0NGJNcZjgiiUjC5prxLegkeJZgITM4cdvISduYqL2k,1339
7
+ PKG-INFO,sha256=4V7myzZuKihozFHbacSECpJYlaTRLTsEKVOFSlp1vZo,1339
8
8
  README.md,sha256=Od69x-RS85Hph0-WwWACwal4yUd67XkEn4APEfHhHFw,2649
9
- pyproject.toml,sha256=fqNyj62EmyfLOZ1R0nQoO6pJnHBP4XPmbAlCyznD4ZE,2596
9
+ pyproject.toml,sha256=yF_AhfRSbZ3Tq677Tt0cf6xCoPf_a9v0p4t2BQoRkyU,2596
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
@@ -24,7 +24,7 @@ bec_widgets/assets/app_icons/alignment_1d.png,sha256=5VouaWieb4lVv3wUBNHaO5ovUW2
24
24
  bec_widgets/assets/app_icons/bec_widgets_icon.png,sha256=K8dgGwIjalDh9PRHUsSQBqgdX7a00nM3igZdc20pkYM,1747017
25
25
  bec_widgets/cli/__init__.py,sha256=d0Q6Fn44e7wFfLabDOBxpcJ1DPKWlFunGYDUBmO-4hA,22
26
26
  bec_widgets/cli/auto_updates.py,sha256=Pj8OHlSlKN3JOAmuuBC5oUMzdfC8TYRY7QKT5BQ2cZo,5171
27
- bec_widgets/cli/client.py,sha256=8JLY18GiUYMlIw4I4WXnNWiGmJ40P5TylrbyUAIv3ik,98833
27
+ bec_widgets/cli/client.py,sha256=QI27Eb6ehePBpFVhNzEFRfxxEOKTMFoCN9LNexsi8-g,99850
28
28
  bec_widgets/cli/client_utils.py,sha256=DXHHw1LNkKVCApbWmOAdZqU_qdvvqx28QiWV-Uf-jos,12207
29
29
  bec_widgets/cli/generate_cli.py,sha256=2BFNgxM_0XLy2OXxG_SX0rgPHFc27oq0_yoOI2h2Rgw,6605
30
30
  bec_widgets/cli/server.py,sha256=Hzhhzhc9PQhTtjpNeu8Jmbmahad0DbyieutaRp7Vejc,10485
@@ -62,7 +62,7 @@ bec_widgets/utils/__init__.py,sha256=1930ji1Jj6dVuY81Wd2kYBhHYNV-2R0bN_L4o9zBj1U
62
62
  bec_widgets/utils/bec_connector.py,sha256=78QAlC7uAtxUW-7KTxoMUJu2aFve7IqnGkURYYNGFDo,10074
63
63
  bec_widgets/utils/bec_designer.py,sha256=XBy38NbNMoRDpvRx5lGP2XnJNG34YKZ7I-ARFkn-gzs,5017
64
64
  bec_widgets/utils/bec_dispatcher.py,sha256=OFmkx9vOz4pA4Sdc14QreyDZ870QYskJ4B5daVVeYg4,6325
65
- bec_widgets/utils/bec_signal_proxy.py,sha256=PKJ7v8pKrAaqA9XNDMZZBlhVtEInX-ae6_0m2cQhiEw,2107
65
+ bec_widgets/utils/bec_signal_proxy.py,sha256=soKdA4pJL8S0d-93C0QqcIUxLA4rfb1-B1jyRXHmMxk,3011
66
66
  bec_widgets/utils/bec_table.py,sha256=nA2b8ukSeUfquFMAxGrUVOqdrzMoDYD6O_4EYbOG2zk,717
67
67
  bec_widgets/utils/bec_widget.py,sha256=1lrHNuvW6uOuPpr-cJBYJNbFekTsqpnQdfTo3P5tbWI,3330
68
68
  bec_widgets/utils/colors.py,sha256=zL9ieD_Bsb2ehd6tPpgfkhu1u5qrQRIE4mvoqM2iqko,16546
@@ -91,7 +91,7 @@ bec_widgets/widgets/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKV
91
91
  bec_widgets/widgets/containers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
92
  bec_widgets/widgets/containers/dock/__init__.py,sha256=B7foHt02gnhM7mFksa7GJVwT7n0j_JvYDCt6wc6XR5g,61
93
93
  bec_widgets/widgets/containers/dock/dock.py,sha256=_cw5bbqCLZxaD5LmosHNmm_eXelMDoTyxFdTnSWkoOI,10379
94
- bec_widgets/widgets/containers/dock/dock_area.py,sha256=0LstkvXHSjizZrjpvICnh76amjMa-xQNaj9f7yBJyfw,17958
94
+ bec_widgets/widgets/containers/dock/dock_area.py,sha256=9325BpsIR_0Del2O__iCIKjxsa_rJsnTzlkG8m21W1o,17943
95
95
  bec_widgets/widgets/containers/dock/dock_area.pyproject,sha256=URW0UrDXCnkzk80rbQmUMgF6Uqay2TjHsq8Dq0g1j-c,37
96
96
  bec_widgets/widgets/containers/dock/dock_area_plugin.py,sha256=fDVXKPZuHr85B2fLfAYf_Ic5d9mZQpnZrODTDquzZpM,1331
97
97
  bec_widgets/widgets/containers/dock/register_dock_area.py,sha256=L7BL4qknCjtqsDP-RMQzk2qRPpcYuzXWlb7sJB_0DDM,475
@@ -144,19 +144,28 @@ bec_widgets/widgets/control/device_control/position_indicator/position_indicator
144
144
  bec_widgets/widgets/control/device_control/position_indicator/position_indicator.pyproject,sha256=s0JEf5YkpMag19ddFSYeRZ8erBau7erO3bqw05YrTyg,36
145
145
  bec_widgets/widgets/control/device_control/position_indicator/position_indicator_plugin.py,sha256=54x8tGkD9P08GfnfAW5MwpW4ybbj53q6942na2VDBbA,1445
146
146
  bec_widgets/widgets/control/device_control/position_indicator/register_position_indicator.py,sha256=ZbN5wPv4dhWEAgX9QD1HL7k7y1O5qZHAgj-xZjwFSho,539
147
- bec_widgets/widgets/control/device_control/positioner_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box.py,sha256=ElXZXFTG4tWZnYQwrnFlHKkEJEieP4P8tbPqkAWHsf4,12469
149
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box.pyproject,sha256=7966pHdDseaHciaPNEKgdQgbUThSZf5wEDCeAEJh9po,32
150
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box.ui,sha256=7LZlM9smIqmkvS2KAIDkBamn04mBAkXeG9T1fpKRQe8,6093
151
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box_plugin.py,sha256=dqYw-r19dH5T6PEWvS2npKXxEY1E2ec-CKXK1KVGTHQ,1436
152
- bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line.py,sha256=GM4--wnBl0v4IVZXqj-Y3aa55k1hHczTnvGMc7bUN6Q,930
153
- bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line.pyproject,sha256=RGIXDjWq3fNCgOnU-08oeIeBLCcjYbRXgyh26drxB7I,41
154
- bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line.ui,sha256=fUq56Bl05jxy81KKlaP9B52lZDDrCjUxMTjMCNFiukw,6170
155
- bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line_plugin.py,sha256=w7Pjx_6ruVT-XGQjS0CWcTNlilpI-xkAyf9TU-6SN9Q,1527
156
- bec_widgets/widgets/control/device_control/positioner_box/register_positioner_box.py,sha256=OVPVeFh_3f-t7TcVH6OQ51Oq9_n1A64tuG6ILhd4HpI,523
157
- bec_widgets/widgets/control/device_control/positioner_box/register_positioner_control_line.py,sha256=8Vxv1Aouq0oBmiUvx6s0afavQs6mS28GvMyClSZjDIQ,548
147
+ bec_widgets/widgets/control/device_control/positioner_box/__init__.py,sha256=0vO7JjxKsO6bbxUjdCGYKELFTY0n4Cv8u4Z1i-MhwL0,476
148
+ bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py,sha256=IiOglwEwd908gs10ZRF6PHGdbRHw0B-ScAmebtQKhXc,84
149
+ bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py,sha256=bxZNAN2hXAdTnQBpQiDrBMaRviMqPmO_UAoyTK94ESE,8775
150
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py,sha256=HDRNbS1w2Do4WHs3VmYI-jEbmkpEEeo85UBjVdT-oos,8035
152
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.pyproject,sha256=7966pHdDseaHciaPNEKgdQgbUThSZf5wEDCeAEJh9po,32
153
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.ui,sha256=7LZlM9smIqmkvS2KAIDkBamn04mBAkXeG9T1fpKRQe8,6093
154
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box_plugin.py,sha256=CKtz61p5uYUh_l30APyhsV3uwJuLFBiBeFZfaOdT0Do,1421
155
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box/register_positioner_box.py,sha256=cp5356x3txtPLg9UkahQgC5oLlWu50GnEMcjrFr9pQI,538
156
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d.pyproject,sha256=BmmaJtz4dvFoDU2Lf8C5aoIrCzcVy1RmS7m2acnSdOA,35
158
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d_plugin.py,sha256=d5vDlT3AwhqV60q1bZprEwdaY8XUdFmG-lKs53AftKA,1402
159
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py,sha256=5f-q9VG3PskMzSXj4QcQ3MYUy8PRZKUsvbbon9-9mZw,16921
160
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui,sha256=d-WRd8LekUwM0PGz8dGr4dB6eiLfLL2jBWkdbQYotyM,17510
161
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/register_positioner_box2_d.py,sha256=YilAE4w0gd8PwUUBSijmqhyIaQ6kuXk_p5ByzZsw_dA,548
162
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.py,sha256=pUo65sk8N2meU09rvdb_ak7MPOo8rt9yKeZywbsm2J0,993
163
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.pyproject,sha256=RGIXDjWq3fNCgOnU-08oeIeBLCcjYbRXgyh26drxB7I,41
164
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.ui,sha256=fUq56Bl05jxy81KKlaP9B52lZDDrCjUxMTjMCNFiukw,6170
165
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line_plugin.py,sha256=GAIFfXXxNRWj39gqKKjMFNtYLJ8yvMTGGN5vS5rDSyM,1494
166
+ bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/register_positioner_control_line.py,sha256=HmHP1P46GqHM1Rh3UCwKqIg0i4TzXsGxTzUJUc4UYGU,572
158
167
  bec_widgets/widgets/control/device_control/positioner_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
- bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py,sha256=SFXwkRtheMQkhgt2lo15upOURSo13z8hm9hQJK_M-GU,5795
168
+ bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py,sha256=r_zDcyLNQoECo4J6OjzH6BoVWtAWTw2oLpuuFp1LvHo,5837
160
169
  bec_widgets/widgets/control/device_control/positioner_group/positioner_group.pyproject,sha256=NV-Hupn3uA4T9KXhxFO3r4MVuUAfdfWaLH4CIm71eqc,35
161
170
  bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plugin.py,sha256=gVzc1yzfs0NyTNM00p8-UDfLqtSF9wgeJOe0E4Ibzmo,1482
162
171
  bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py,sha256=vjoIwn1CQbg3gEwKzgY2MuscfGab2agM5YV0r1_UL0k,531
@@ -175,9 +184,6 @@ bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.pypro
175
184
  bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit_plugin.py,sha256=LoG1VyO21pZ9dbnDVU03xzqgP8P1oEmdeotlkYs_pE8,1466
176
185
  bec_widgets/widgets/control/device_input/device_line_edit/register_device_line_edit.py,sha256=NTB3HghW5S7NvUlPe_k_uFYQLWPYgjgln2bAYipfkpM,527
177
186
  bec_widgets/widgets/control/device_input/signal_combobox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
178
- bec_widgets/widgets/control/device_input/signal_combobox/register_signal_combo_box.py,sha256=VEdFRUfLph7JE2arcnzHw8etsE-4wZkwyzlNLMJBsZk,526
179
- bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject,sha256=mjt4p6NTiZ2j7KCQdw-U2EFiwMptidXNu8UX6oYV3k4,34
180
- bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box_plugin.py,sha256=I3KfF1p7Av94ErNY9CyQKalQ18fah94LEikIIgyDzqs,1315
181
187
  bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py,sha256=0aOAq3e9MdZMXTGJQY7WqQSvl-oPnqwrfHjBKGzeRAI,4572
182
188
  bec_widgets/widgets/control/device_input/signal_line_edit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
189
  bec_widgets/widgets/control/device_input/signal_line_edit/register_signal_line_edit.py,sha256=aQLTy_3gbji0vq5VvvAddHFimpwGGaMYJy5iGgX23aM,527
@@ -326,8 +332,8 @@ bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py,sha256=Z
326
332
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject,sha256=Lbi9zb6HNlIq14k6hlzR-oz6PIFShBuF7QxE6d87d64,34
327
333
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py,sha256=CzChz2SSETYsR8-36meqWnsXCT-FIy_J_xeU5coWDY8,1350
328
334
  bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py,sha256=rMpZ1CaoucwobgPj1FuKTnt07W82bV1GaSYdoqcdMb8,521
329
- bec_widgets-1.16.5.dist-info/METADATA,sha256=C0NGJNcZjgiiUjC5prxLegkeJZgITM4cdvISduYqL2k,1339
330
- bec_widgets-1.16.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
331
- bec_widgets-1.16.5.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
332
- bec_widgets-1.16.5.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
333
- bec_widgets-1.16.5.dist-info/RECORD,,
335
+ bec_widgets-1.17.1.dist-info/METADATA,sha256=4V7myzZuKihozFHbacSECpJYlaTRLTsEKVOFSlp1vZo,1339
336
+ bec_widgets-1.17.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
337
+ bec_widgets-1.17.1.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
338
+ bec_widgets-1.17.1.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
339
+ bec_widgets-1.17.1.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 = "1.16.5"
7
+ version = "1.17.1"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [
@@ -1,352 +0,0 @@
1
- """ Module for a PositionerBox widget to control a positioner device."""
2
-
3
- from __future__ import annotations
4
-
5
- import os
6
- import uuid
7
-
8
- from bec_lib.device import Positioner
9
- from bec_lib.endpoints import MessageEndpoints
10
- from bec_lib.logger import bec_logger
11
- from bec_lib.messages import ScanQueueMessage
12
- from bec_qthemes import material_icon
13
- from qtpy.QtCore import Property, Signal, Slot
14
- from qtpy.QtGui import QDoubleValidator
15
- from qtpy.QtWidgets import QDialog, QDoubleSpinBox, QPushButton, QVBoxLayout
16
-
17
- from bec_widgets.qt_utils.compact_popup import CompactPopupWidget
18
- from bec_widgets.utils import UILoader
19
- from bec_widgets.utils.bec_widget import BECWidget
20
- from bec_widgets.utils.colors import get_accent_colors, set_theme
21
- from bec_widgets.widgets.control.device_input.base_classes.device_input_base import BECDeviceFilter
22
- from bec_widgets.widgets.control.device_input.device_line_edit.device_line_edit import (
23
- DeviceLineEdit,
24
- )
25
-
26
- logger = bec_logger.logger
27
-
28
- MODULE_PATH = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
29
-
30
-
31
- class PositionerBox(BECWidget, CompactPopupWidget):
32
- """Simple Widget to control a positioner in box form"""
33
-
34
- ui_file = "positioner_box.ui"
35
- dimensions = (234, 224)
36
-
37
- PLUGIN = True
38
- ICON_NAME = "switch_right"
39
- USER_ACCESS = ["set_positioner"]
40
- device_changed = Signal(str, str)
41
- # Signal emitted to inform listeners about a position update
42
- position_update = Signal(float)
43
-
44
- def __init__(self, parent=None, device: Positioner = None, **kwargs):
45
- """Initialize the PositionerBox widget.
46
-
47
- Args:
48
- parent: The parent widget.
49
- device (Positioner): The device to control.
50
- """
51
- super().__init__(**kwargs)
52
- CompactPopupWidget.__init__(self, parent=parent, layout=QVBoxLayout)
53
- self.get_bec_shortcuts()
54
- self._device = ""
55
- self._limits = None
56
- self._dialog = None
57
-
58
- self.init_ui()
59
-
60
- if device is not None:
61
- self.device = device
62
- self.init_device()
63
-
64
- def init_ui(self):
65
- """Init the ui"""
66
- self.device_changed.connect(self.on_device_change)
67
-
68
- current_path = os.path.dirname(__file__)
69
- self.ui = UILoader(self).loader(os.path.join(current_path, self.ui_file))
70
-
71
- self.addWidget(self.ui)
72
- self.layout.setSpacing(0)
73
- self.layout.setContentsMargins(0, 0, 0, 0)
74
-
75
- # fix the size of the device box
76
- db = self.ui.device_box
77
- db.setFixedHeight(self.dimensions[0])
78
- db.setFixedWidth(self.dimensions[1])
79
-
80
- self.ui.step_size.setStepType(QDoubleSpinBox.AdaptiveDecimalStepType)
81
- self.ui.stop.clicked.connect(self.on_stop)
82
- self.ui.stop.setToolTip("Stop")
83
- self.ui.stop.setStyleSheet(
84
- f"QPushButton {{background-color: {get_accent_colors().emergency.name()}; color: white;}}"
85
- )
86
- self.ui.tweak_right.clicked.connect(self.on_tweak_right)
87
- self.ui.tweak_right.setToolTip("Tweak right")
88
- self.ui.tweak_left.clicked.connect(self.on_tweak_left)
89
- self.ui.tweak_left.setToolTip("Tweak left")
90
- self.ui.setpoint.returnPressed.connect(self.on_setpoint_change)
91
-
92
- self.setpoint_validator = QDoubleValidator()
93
- self.ui.setpoint.setValidator(self.setpoint_validator)
94
- self.ui.spinner_widget.start()
95
- self.ui.tool_button.clicked.connect(self._open_dialog_selection)
96
- icon = material_icon(icon_name="edit_note", size=(16, 16), convert_to_pixmap=False)
97
- self.ui.tool_button.setIcon(icon)
98
-
99
- def _open_dialog_selection(self):
100
- """Open dialog window for positioner selection"""
101
- self._dialog = QDialog(self)
102
- self._dialog.setWindowTitle("Positioner Selection")
103
- layout = QVBoxLayout()
104
- line_edit = DeviceLineEdit(
105
- self, client=self.client, device_filter=[BECDeviceFilter.POSITIONER]
106
- )
107
- line_edit.textChanged.connect(self.set_positioner)
108
- layout.addWidget(line_edit)
109
- close_button = QPushButton("Close")
110
- close_button.clicked.connect(self._dialog.accept)
111
- layout.addWidget(close_button)
112
- self._dialog.setLayout(layout)
113
- self._dialog.exec()
114
- self._dialog = None
115
-
116
- def init_device(self):
117
- """Init the device view and readback"""
118
- if self._check_device_is_valid(self.device):
119
- data = self.dev[self.device].read()
120
- self.on_device_readback({"signals": data}, {})
121
-
122
- def _toogle_enable_buttons(self, enable: bool) -> None:
123
- """Toogle enable/disable on available buttons
124
-
125
- Args:
126
- enable (bool): Enable buttons
127
- """
128
- self.ui.tweak_left.setEnabled(enable)
129
- self.ui.tweak_right.setEnabled(enable)
130
- self.ui.stop.setEnabled(enable)
131
- self.ui.setpoint.setEnabled(enable)
132
- self.ui.step_size.setEnabled(enable)
133
-
134
- @Property(str)
135
- def device(self):
136
- """Property to set the device"""
137
- return self._device
138
-
139
- @device.setter
140
- def device(self, value: str):
141
- """Setter, checks if device is a string"""
142
- if not value or not isinstance(value, str):
143
- return
144
- if not self._check_device_is_valid(value):
145
- return
146
- old_device = self._device
147
- self._device = value
148
- if not self.label:
149
- self.label = value
150
- self.device_changed.emit(old_device, value)
151
-
152
- @Property(bool)
153
- def hide_device_selection(self):
154
- """Hide the device selection"""
155
- return not self.ui.tool_button.isVisible()
156
-
157
- @hide_device_selection.setter
158
- def hide_device_selection(self, value: bool):
159
- """Set the device selection visibility"""
160
- self.ui.tool_button.setVisible(not value)
161
-
162
- @Slot(bool)
163
- def show_device_selection(self, value: bool):
164
- """Show the device selection
165
-
166
- Args:
167
- value (bool): Show the device selection
168
- """
169
- self.hide_device_selection = not value
170
-
171
- @Slot(str)
172
- def set_positioner(self, positioner: str | Positioner):
173
- """Set the device
174
-
175
- Args:
176
- positioner (Positioner | str) : Positioner to set, accepts str or the device
177
- """
178
- if isinstance(positioner, Positioner):
179
- positioner = positioner.name
180
- self.device = positioner
181
-
182
- def _check_device_is_valid(self, device: str):
183
- """Check if the device is a positioner
184
-
185
- Args:
186
- device (str): The device name
187
- """
188
- if device not in self.dev:
189
- logger.info(f"Device {device} not found in the device list")
190
- return False
191
- if not isinstance(self.dev[device], Positioner):
192
- logger.info(f"Device {device} is not a positioner")
193
- return False
194
- return True
195
-
196
- @Slot(str, str)
197
- def on_device_change(self, old_device: str, new_device: str):
198
- """Upon changing the device, a check will be performed if the device is a Positioner.
199
-
200
- Args:
201
- old_device (str): The old device name.
202
- new_device (str): The new device name.
203
- """
204
- if not self._check_device_is_valid(new_device):
205
- return
206
- logger.info(f"Device changed from {old_device} to {new_device}")
207
- self._toogle_enable_buttons(True)
208
- self.init_device()
209
- self.bec_dispatcher.disconnect_slot(
210
- self.on_device_readback, MessageEndpoints.device_readback(old_device)
211
- )
212
- self.bec_dispatcher.connect_slot(
213
- self.on_device_readback, MessageEndpoints.device_readback(new_device)
214
- )
215
- self.ui.device_box.setTitle(new_device)
216
- self.ui.readback.setToolTip(f"{self.device} readback")
217
- self.ui.setpoint.setToolTip(f"{self.device} setpoint")
218
- self.ui.step_size.setToolTip(f"Step size for {new_device}")
219
-
220
- precision = self.dev[new_device].precision
221
- if precision is not None:
222
- self.ui.step_size.setDecimals(precision)
223
- self.ui.step_size.setValue(10**-precision * 10)
224
-
225
- # pylint: disable=unused-argument
226
- @Slot(dict, dict)
227
- def on_device_readback(self, msg_content: dict, metadata: dict):
228
- """Callback for device readback.
229
-
230
- Args:
231
- msg_content (dict): The message content.
232
- metadata (dict): The message metadata.
233
- """
234
- signals = msg_content.get("signals", {})
235
- # pylint: disable=protected-access
236
- hinted_signals = self.dev[self.device]._hints
237
- precision = self.dev[self.device].precision
238
-
239
- readback_val = None
240
- setpoint_val = None
241
-
242
- if len(hinted_signals) == 1:
243
- signal = hinted_signals[0]
244
- readback_val = signals.get(signal, {}).get("value")
245
-
246
- for setpoint_signal in ["setpoint", "user_setpoint"]:
247
- setpoint_val = signals.get(f"{self.device}_{setpoint_signal}", {}).get("value")
248
- if setpoint_val is not None:
249
- break
250
-
251
- for moving_signal in ["motor_done_move", "motor_is_moving"]:
252
- is_moving = signals.get(f"{self.device}_{moving_signal}", {}).get("value")
253
- if is_moving is not None:
254
- break
255
-
256
- if is_moving is not None:
257
- self.ui.spinner_widget.setVisible(True)
258
- if is_moving:
259
- self.ui.spinner_widget.start()
260
- self.ui.spinner_widget.setToolTip("Device is moving")
261
- self.set_global_state("warning")
262
- else:
263
- self.ui.spinner_widget.stop()
264
- self.ui.spinner_widget.setToolTip("Device is idle")
265
- self.set_global_state("success")
266
- else:
267
- self.ui.spinner_widget.setVisible(False)
268
-
269
- if readback_val is not None:
270
- self.ui.readback.setText(f"{readback_val:.{precision}f}")
271
- self.position_update.emit(readback_val)
272
-
273
- if setpoint_val is not None:
274
- self.ui.setpoint.setText(f"{setpoint_val:.{precision}f}")
275
-
276
- limits = self.dev[self.device].limits
277
- self.update_limits(limits)
278
- if limits is not None and readback_val is not None and limits[0] != limits[1]:
279
- pos = (readback_val - limits[0]) / (limits[1] - limits[0])
280
- self.ui.position_indicator.set_value(pos)
281
-
282
- def update_limits(self, limits: tuple):
283
- """Update limits
284
-
285
- Args:
286
- limits (tuple): Limits of the positioner
287
- """
288
- if limits == self._limits:
289
- return
290
- self._limits = limits
291
- if limits is not None and limits[0] != limits[1]:
292
- self.ui.position_indicator.setToolTip(f"Min: {limits[0]}, Max: {limits[1]}")
293
- self.setpoint_validator.setRange(limits[0], limits[1])
294
- else:
295
- self.ui.position_indicator.setToolTip("No limits set")
296
- self.setpoint_validator.setRange(float("-inf"), float("inf"))
297
-
298
- @Slot()
299
- def on_stop(self):
300
- """Stop call"""
301
- request_id = str(uuid.uuid4())
302
- params = {
303
- "device": self.device,
304
- "rpc_id": request_id,
305
- "func": "stop",
306
- "args": [],
307
- "kwargs": {},
308
- }
309
- msg = ScanQueueMessage(
310
- scan_type="device_rpc",
311
- parameter=params,
312
- queue="emergency",
313
- metadata={"RID": request_id, "response": False},
314
- )
315
- self.client.connector.send(MessageEndpoints.scan_queue_request(), msg)
316
-
317
- @property
318
- def step_size(self):
319
- """Step size for tweak"""
320
- return self.ui.step_size.value()
321
-
322
- @Slot()
323
- def on_tweak_right(self):
324
- """Tweak motor right"""
325
- self.dev[self.device].move(self.step_size, relative=True)
326
-
327
- @Slot()
328
- def on_tweak_left(self):
329
- """Tweak motor left"""
330
- self.dev[self.device].move(-self.step_size, relative=True)
331
-
332
- @Slot()
333
- def on_setpoint_change(self):
334
- """Change the setpoint for the motor"""
335
- self.ui.setpoint.clearFocus()
336
- setpoint = self.ui.setpoint.text()
337
- self.dev[self.device].move(float(setpoint), relative=False)
338
- self.ui.tweak_left.setToolTip(f"Tweak left by {self.step_size}")
339
- self.ui.tweak_right.setToolTip(f"Tweak right by {self.step_size}")
340
-
341
-
342
- if __name__ == "__main__": # pragma: no cover
343
- import sys
344
-
345
- from qtpy.QtWidgets import QApplication # pylint: disable=ungrouped-imports
346
-
347
- app = QApplication(sys.argv)
348
- set_theme("dark")
349
- widget = PositionerBox(device="bpm4i")
350
-
351
- widget.show()
352
- sys.exit(app.exec_())
@@ -1 +0,0 @@
1
- {'files': ['signal_combobox.py']}