pyobs-gui 2.0.0.dev20__tar.gz → 2.0.0.dev21__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. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/PKG-INFO +1 -1
  2. pyobs_gui-2.0.0.dev21/README.md +28 -0
  3. pyobs_gui-2.0.0.dev21/docs/source/index.rst +140 -0
  4. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyproject.toml +3 -3
  5. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/uv.lock +73 -38
  6. pyobs_gui-2.0.0.dev20/README.md +0 -3
  7. pyobs_gui-2.0.0.dev20/docs/source/index.rst +0 -51
  8. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/.claude/skills/verify/SKILL.md +0 -0
  9. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/.github/dependabot.yml +0 -0
  10. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/.github/workflows/pypi.yml +0 -0
  11. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/.github/workflows/pyrefly.yml +0 -0
  12. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/.github/workflows/ruff.yml +0 -0
  13. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/.gitignore +0 -0
  14. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/.pre-commit-config.yaml +0 -0
  15. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/.readthedocs.yml +0 -0
  16. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/CHANGELOG.rst +0 -0
  17. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/LICENSE +0 -0
  18. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/bin/mypyuic5 +0 -0
  19. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/docs/Makefile +0 -0
  20. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/docs/make.bat +0 -0
  21. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/docs/requirements.txt +0 -0
  22. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/docs/source/_static/pyobs.gif +0 -0
  23. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/docs/source/conf.py +0 -0
  24. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/mypy.ini +0 -0
  25. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/__init__.py +0 -0
  26. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/__main__.py +0 -0
  27. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/_nuitka_astropy_patch.py +0 -0
  28. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/accounts.py +0 -0
  29. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/acquisitionwidget.py +0 -0
  30. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/autofocuswidget.py +0 -0
  31. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/autoguidingwidget.py +0 -0
  32. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/base.py +0 -0
  33. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/camerawidget.py +0 -0
  34. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/commandinputwidget.py +0 -0
  35. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/compassmovewidget.py +0 -0
  36. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/coolingwidget.py +0 -0
  37. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/datadisplaywidget.py +0 -0
  38. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/eventswidget.py +0 -0
  39. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/filterwidget.py +0 -0
  40. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/fitsheaderswidget.py +0 -0
  41. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/focuswidget.py +0 -0
  42. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/gui.py +0 -0
  43. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/login.py +0 -0
  44. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/loginwindow.py +0 -0
  45. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/logmodel.py +0 -0
  46. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/mainwindow.py +0 -0
  47. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/modewidget.py +0 -0
  48. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/modifiedmixin.py +0 -0
  49. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/modulegui.py +0 -0
  50. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/__init__.py +0 -0
  51. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/acquisitionwidget.ui +0 -0
  52. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/acquisitionwidget_ui.py +0 -0
  53. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/autofocuswidget.ui +0 -0
  54. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/autofocuswidget_ui.py +0 -0
  55. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/autoguidingwidget.ui +0 -0
  56. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/autoguidingwidget_ui.py +0 -0
  57. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/camerawidget.ui +0 -0
  58. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/camerawidget_ui.py +0 -0
  59. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/compassmoveplugin.py +0 -0
  60. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/compassmovewidget.py +0 -0
  61. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/compassmovewidget.ui +0 -0
  62. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/compassmovewidget_ui.py +0 -0
  63. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/compile.sh +0 -0
  64. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/coolingwidget.ui +0 -0
  65. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/coolingwidget_ui.py +0 -0
  66. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/datadisplayplugin.py +0 -0
  67. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/datadisplaywidget.ui +0 -0
  68. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/datadisplaywidget_ui.py +0 -0
  69. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/designer.sh +0 -0
  70. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/eventswidget.ui +0 -0
  71. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/eventswidget_ui.py +0 -0
  72. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/filterwidget.ui +0 -0
  73. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/filterwidget_ui.py +0 -0
  74. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/fitsheaderswidget.ui +0 -0
  75. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/fitsheaderswidget_ui.py +0 -0
  76. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/focuswidget.ui +0 -0
  77. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/focuswidget_ui.py +0 -0
  78. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/mainwindow.ui +0 -0
  79. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/mainwindow_ui.py +0 -0
  80. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/modewidget.ui +0 -0
  81. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/modewidget_ui.py +0 -0
  82. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/arrow-alt-circle-down-solid.svg +0 -0
  83. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/arrow-alt-circle-left-solid.svg +0 -0
  84. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/arrow-alt-circle-right-solid.svg +0 -0
  85. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/arrow-alt-circle-up-solid.svg +0 -0
  86. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/arrow-up-right-from-square-solid.svg +0 -0
  87. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/arrows-to-eye-solid.svg +0 -0
  88. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/chart-line-solid.svg +0 -0
  89. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/circle-question-solid.svg +0 -0
  90. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/cloud-sun-solid.svg +0 -0
  91. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/edit-solid.svg +0 -0
  92. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/search-solid.svg +0 -0
  93. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources/undo-solid.svg +0 -0
  94. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources.qrc +0 -0
  95. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/resources_rc.py +0 -0
  96. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/roofwidget.ui +0 -0
  97. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/roofwidget_ui.py +0 -0
  98. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/shellwidget.ui +0 -0
  99. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/shellwidget_ui.py +0 -0
  100. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/spectrographwidget.ui +0 -0
  101. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/spectrographwidget_ui.py +0 -0
  102. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/telescopewidget.ui +0 -0
  103. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/telescopewidget_ui.py +0 -0
  104. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/temperaturesplotwidget.ui +0 -0
  105. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/temperaturesplotwidget_ui.py +0 -0
  106. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/temperatureswidget.ui +0 -0
  107. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/temperatureswidget_ui.py +0 -0
  108. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/videowidget.ui +0 -0
  109. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/videowidget_ui.py +0 -0
  110. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/weatherwidget.ui +0 -0
  111. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/qt/weatherwidget_ui.py +0 -0
  112. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/roofwidget.py +0 -0
  113. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/shellwidget.py +0 -0
  114. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/spectrographwidget.py +0 -0
  115. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/statuswidget.py +0 -0
  116. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/telescopewidget.py +0 -0
  117. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/temperaturesplotwidget.py +0 -0
  118. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/temperatureswidget.py +0 -0
  119. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/utils.py +0 -0
  120. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/videowidget.py +0 -0
  121. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/watchedlabel.py +0 -0
  122. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pyobs_gui/weatherwidget.py +0 -0
  123. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/pysidedeploy.spec +0 -0
  124. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/specs/2026-08-20-gui-remote-call-error-handling.md +0 -0
  125. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/specs/2026-08-21-gui-widget-startup-responsiveness.md +0 -0
  126. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/specs/index.md +0 -0
  127. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/spike_standalone/main.py +0 -0
  128. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/spike_standalone/pysidedeploy.spec +0 -0
  129. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/acquisition.yaml +0 -0
  130. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/autofocus.yaml +0 -0
  131. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/camera.yaml +0 -0
  132. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/full.yaml +0 -0
  133. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/guiding.yaml +0 -0
  134. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/mode.yaml +0 -0
  135. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/roof.yaml +0 -0
  136. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/spectrograph.yaml +0 -0
  137. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/telescope.yaml +0 -0
  138. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/telescope_acl.yaml +0 -0
  139. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/telescope_acl_denied.yaml +0 -0
  140. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/test/video.yaml +0 -0
  141. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/tests/__init__.py +0 -0
  142. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/tests/conftest.py +0 -0
  143. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/tests/test_accounts.py +0 -0
  144. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/tests/test_camerawidget.py +0 -0
  145. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/tests/test_loginwindow.py +0 -0
  146. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/tests/test_mainwindow_startup.py +0 -0
  147. {pyobs_gui-2.0.0.dev20 → pyobs_gui-2.0.0.dev21}/tests/test_videowidget.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pyobs-gui
3
- Version: 2.0.0.dev20
3
+ Version: 2.0.0.dev21
4
4
  Summary: A remote GUI for pyobs
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -0,0 +1,28 @@
1
+ pyobs-gui
2
+ =========
3
+
4
+ This is a [pyobs](https://www.pyobs.org) GUI for operating the whole system: one page per
5
+ connected module (camera, telescope, roof, focuser, ...), plus Shell/Events/Status tool pages.
6
+
7
+
8
+ Install *pyobs-gui*
9
+ ---------------------
10
+ Clone the repository:
11
+
12
+ git clone https://github.com/pyobs/pyobs-gui.git
13
+ cd pyobs-gui
14
+
15
+ Install it with [uv](https://docs.astral.sh/uv/):
16
+
17
+ uv sync
18
+
19
+
20
+ Running
21
+ -------
22
+ Two ways to start it:
23
+
24
+ - `uv run pyobs-gui` — standalone, interactive login. No YAML config needed; it prompts for XMPP
25
+ credentials (with an optional "store password") and connects directly.
26
+ - `uv run pyobs <config.yaml>` — the standard `pyobs` CLI, driven by a config file whose top-level
27
+ class is `pyobs_gui.GUI` (see `docs/source/index.rst` for a full example, including how to wire
28
+ in a custom widget for a module).
@@ -0,0 +1,140 @@
1
+ pyobs-gui
2
+ #########
3
+
4
+ This is a `pyobs <https://www.pyobs.org>`_ (`documentation <https://docs.pyobs.org>`_) module providing a GUI
5
+ for operating the whole system.
6
+
7
+
8
+ Example configuration
9
+ **********************
10
+
11
+ This is an example configuration for a GUI that defines one custom widget for the ``guiding`` module::
12
+
13
+ class: pyobs_gui.GUI
14
+
15
+ widgets:
16
+ - module: guiding
17
+ overwrite: True
18
+ widget:
19
+ class: mypackage.GuidingWidget
20
+
21
+ comm:
22
+ jid: test@example.com
23
+ password: ***
24
+
25
+ timezone: Europe/Berlin
26
+ location:
27
+ longitude: 9.944333
28
+ latitude: 51.560583
29
+ elevation: 201.
30
+
31
+ vfs:
32
+ class: pyobs.vfs.VirtualFileSystem
33
+ roots:
34
+ cache:
35
+ class: pyobs.vfs.HttpFile
36
+ download: http://localhost:37075/
37
+ webcam:
38
+ class: pyobs.vfs.HttpFile
39
+ download: http://localhost:37077/
40
+
41
+
42
+ Available classes
43
+ ******************
44
+
45
+ There is one single class for the GUI.
46
+
47
+ GUI
48
+ ===
49
+ .. autoclass:: pyobs_gui.GUI
50
+ :members:
51
+ :show-inheritance:
52
+
53
+
54
+ Widgets
55
+ *******
56
+
57
+ The GUI shows one page per connected module, picking a widget by the module's interfaces
58
+ (``DEFAULT_WIDGETS`` in ``mainwindow.py``), plus three always-present "Tools" pages. No screenshots
59
+ yet — this section was written from source, not from a running GUI; add screenshots as a follow-up.
60
+
61
+ Shell
62
+ =====
63
+ Always present. A command console: type shell-like commands against any connected module, with
64
+ tab-completion driven by the module's own docstrings, and a per-module command history.
65
+
66
+ Events
67
+ ======
68
+ Always present. Live feed of events broadcast by connected modules, and lets you send one back.
69
+
70
+ Status
71
+ ======
72
+ Always present. Per-module connection/presence indicator plus a live, expandable tree of each
73
+ connected module's published state.
74
+
75
+ Camera — drives ``ICamera``
76
+ ============================
77
+ Expose/abort control: binning, gain, image format/type, exposure time, full-frame vs. windowed
78
+ readout, and (if the module supports it) data sequences.
79
+
80
+ Telescope — drives ``ITelescope``
81
+ ====================================
82
+ Init/park/stop and move-to-target, offsets in both RA/Dec and Alt/Az, Simbad and JPL Horizons
83
+ target lookup, and tracking of orbital elements or solar-system bodies.
84
+
85
+ Roof — drives ``IRoof``
86
+ ==========================
87
+ Open/close/stop the roof, with live motion and pointing state.
88
+
89
+ Focuser — drives ``IFocuser``
90
+ ================================
91
+ Set an absolute focus value, apply/reset a focus offset.
92
+
93
+ Auto Focus — drives ``IAutoFocus``
94
+ =====================================
95
+ Run or abort an autofocus sequence.
96
+
97
+ Acquisition — drives ``IAcquisition``
98
+ ========================================
99
+ Acquire a target, abort an in-progress acquisition.
100
+
101
+ Auto Guiding — drives ``IAutoGuiding``
102
+ =========================================
103
+ Start/stop guiding and set the guide-exposure time.
104
+
105
+ Weather — drives ``IWeather``
106
+ ================================
107
+ Live sensor values plus a history plot.
108
+
109
+ Video — drives ``IVideo``
110
+ ============================
111
+ Live view (MJPEG/raw stream), grab a still, adjust exposure time/gain/image type.
112
+
113
+ Spectrograph — drives ``ISpectrograph``
114
+ ==========================================
115
+ Grab a spectrum, abort an in-progress exposure.
116
+
117
+ Filter wheel — drives ``IFilters``
118
+ =====================================
119
+ Set the active filter.
120
+
121
+
122
+ Keyboard shortcuts
123
+ *******************
124
+
125
+ Global, not per-widget — bound with the ``Ctrl``/``Ctrl+Alt`` modifier specifically so no
126
+ text/numeric-entry widget can mistake one for ordinary input.
127
+
128
+ =============== ==========================================================
129
+ Shortcut Action
130
+ =============== ==========================================================
131
+ ``Ctrl+1`` Switch to Shell (fixed)
132
+ ``Ctrl+2`` Switch to Events (fixed)
133
+ ``Ctrl+3`` Switch to Status (fixed)
134
+ ``Ctrl+4``..``Ctrl+9``, ``Ctrl+0``
135
+ Switch to whichever module page is bound to that slot
136
+ (no-op if unbound or that module isn't connected)
137
+ ``Ctrl+Alt+4``..``Ctrl+Alt+9``, ``Ctrl+Alt+0``
138
+ Bind the currently selected page to that slot, overwriting
139
+ any previous binding
140
+ =============== ==========================================================
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyobs-gui"
3
- version = "2.0.0.dev20"
3
+ version = "2.0.0.dev21"
4
4
  description = "A remote GUI for pyobs"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11"
@@ -32,8 +32,8 @@ dev = [
32
32
  "pandas-stubs>=2.3.0.250703",
33
33
  "pre-commit>=4.2.0,<5",
34
34
  "pyside6-stubs>=6.7.3.0",
35
- "sphinx-rtd-theme>=3.0.2,<4",
36
- "Sphinx>=8.2.3,<9",
35
+ "sphinx-rtd-theme>=3.0.2",
36
+ "Sphinx>=8.2.3",
37
37
  "types-defusedxml>=0.7.0.20250708",
38
38
  "types-python-dateutil>=2.9.0.20250708",
39
39
  "pytest>=9.1.1",
@@ -3295,7 +3295,7 @@ wheels = [
3295
3295
 
3296
3296
  [[package]]
3297
3297
  name = "pyobs-gui"
3298
- version = "2.0.0.dev20"
3298
+ version = "2.0.0.dev21"
3299
3299
  source = { editable = "." }
3300
3300
  dependencies = [
3301
3301
  { name = "astroplan" },
@@ -3325,7 +3325,8 @@ dev = [
3325
3325
  { name = "pytest-asyncio" },
3326
3326
  { name = "pytest-mock" },
3327
3327
  { name = "ruff" },
3328
- { name = "sphinx" },
3328
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
3329
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
3329
3330
  { name = "sphinx-rtd-theme" },
3330
3331
  { name = "types-defusedxml" },
3331
3332
  { name = "types-python-dateutil" },
@@ -3359,8 +3360,8 @@ dev = [
3359
3360
  { name = "pytest-asyncio", specifier = ">=1.4.0" },
3360
3361
  { name = "pytest-mock", specifier = ">=3.15.1" },
3361
3362
  { name = "ruff", specifier = ">=0.11.0" },
3362
- { name = "sphinx", specifier = ">=8.2.3,<9" },
3363
- { name = "sphinx-rtd-theme", specifier = ">=3.0.2,<4" },
3363
+ { name = "sphinx", specifier = ">=8.2.3" },
3364
+ { name = "sphinx-rtd-theme", specifier = ">=3.0.2" },
3364
3365
  { name = "types-defusedxml", specifier = ">=0.7.0.20250708" },
3365
3366
  { name = "types-python-dateutil", specifier = ">=2.9.0.20250708" },
3366
3367
  ]
@@ -3778,18 +3779,6 @@ wheels = [
3778
3779
  { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" },
3779
3780
  ]
3780
3781
 
3781
- [[package]]
3782
- name = "roman-numerals-py"
3783
- version = "4.1.0"
3784
- source = { registry = "https://pypi.org/simple" }
3785
- dependencies = [
3786
- { name = "roman-numerals" },
3787
- ]
3788
- sdist = { url = "https://files.pythonhosted.org/packages/cb/b5/de96fca640f4f656eb79bbee0e79aeec52e3e0e359f8a3e6a0d366378b64/roman_numerals_py-4.1.0.tar.gz", hash = "sha256:f5d7b2b4ca52dd855ef7ab8eb3590f428c0b1ea480736ce32b01fef2a5f8daf9", size = 4274, upload-time = "2025-12-17T18:25:41.153Z" }
3789
- wheels = [
3790
- { url = "https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl", hash = "sha256:553114c1167141c1283a51743759723ecd05604a1b6b507225e91dc1a6df0780", size = 4547, upload-time = "2025-12-17T18:25:40.136Z" },
3791
- ]
3792
-
3793
3782
  [[package]]
3794
3783
  name = "ruff"
3795
3784
  version = "0.16.2"
@@ -4132,30 +4121,74 @@ wheels = [
4132
4121
 
4133
4122
  [[package]]
4134
4123
  name = "sphinx"
4135
- version = "8.2.3"
4124
+ version = "9.0.4"
4136
4125
  source = { registry = "https://pypi.org/simple" }
4126
+ resolution-markers = [
4127
+ "python_full_version < '3.12' and sys_platform == 'win32'",
4128
+ "python_full_version < '3.12' and sys_platform == 'emscripten'",
4129
+ "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'",
4130
+ ]
4137
4131
  dependencies = [
4138
- { name = "alabaster" },
4139
- { name = "babel" },
4140
- { name = "colorama", marker = "sys_platform == 'win32'" },
4141
- { name = "docutils" },
4142
- { name = "imagesize" },
4143
- { name = "jinja2" },
4144
- { name = "packaging" },
4145
- { name = "pygments" },
4146
- { name = "requests" },
4147
- { name = "roman-numerals-py" },
4148
- { name = "snowballstemmer" },
4149
- { name = "sphinxcontrib-applehelp" },
4150
- { name = "sphinxcontrib-devhelp" },
4151
- { name = "sphinxcontrib-htmlhelp" },
4152
- { name = "sphinxcontrib-jsmath" },
4153
- { name = "sphinxcontrib-qthelp" },
4154
- { name = "sphinxcontrib-serializinghtml" },
4132
+ { name = "alabaster", marker = "python_full_version < '3.12'" },
4133
+ { name = "babel", marker = "python_full_version < '3.12'" },
4134
+ { name = "colorama", marker = "python_full_version < '3.12' and sys_platform == 'win32'" },
4135
+ { name = "docutils", marker = "python_full_version < '3.12'" },
4136
+ { name = "imagesize", marker = "python_full_version < '3.12'" },
4137
+ { name = "jinja2", marker = "python_full_version < '3.12'" },
4138
+ { name = "packaging", marker = "python_full_version < '3.12'" },
4139
+ { name = "pygments", marker = "python_full_version < '3.12'" },
4140
+ { name = "requests", marker = "python_full_version < '3.12'" },
4141
+ { name = "roman-numerals", marker = "python_full_version < '3.12'" },
4142
+ { name = "snowballstemmer", marker = "python_full_version < '3.12'" },
4143
+ { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.12'" },
4144
+ { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.12'" },
4145
+ { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.12'" },
4146
+ { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.12'" },
4147
+ { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.12'" },
4148
+ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.12'" },
4149
+ ]
4150
+ sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" }
4151
+ wheels = [
4152
+ { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" },
4153
+ ]
4154
+
4155
+ [[package]]
4156
+ name = "sphinx"
4157
+ version = "9.1.0"
4158
+ source = { registry = "https://pypi.org/simple" }
4159
+ resolution-markers = [
4160
+ "python_full_version == '3.14.*' and sys_platform == 'win32'",
4161
+ "python_full_version == '3.14.*' and sys_platform == 'emscripten'",
4162
+ "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'",
4163
+ "python_full_version >= '3.15' and sys_platform == 'win32'",
4164
+ "python_full_version >= '3.15' and sys_platform == 'emscripten'",
4165
+ "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'",
4166
+ "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'",
4167
+ "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'",
4168
+ "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'",
4169
+ ]
4170
+ dependencies = [
4171
+ { name = "alabaster", marker = "python_full_version >= '3.12'" },
4172
+ { name = "babel", marker = "python_full_version >= '3.12'" },
4173
+ { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" },
4174
+ { name = "docutils", marker = "python_full_version >= '3.12'" },
4175
+ { name = "imagesize", marker = "python_full_version >= '3.12'" },
4176
+ { name = "jinja2", marker = "python_full_version >= '3.12'" },
4177
+ { name = "packaging", marker = "python_full_version >= '3.12'" },
4178
+ { name = "pygments", marker = "python_full_version >= '3.12'" },
4179
+ { name = "requests", marker = "python_full_version >= '3.12'" },
4180
+ { name = "roman-numerals", marker = "python_full_version >= '3.12'" },
4181
+ { name = "snowballstemmer", marker = "python_full_version >= '3.12'" },
4182
+ { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" },
4183
+ { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" },
4184
+ { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" },
4185
+ { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" },
4186
+ { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" },
4187
+ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" },
4155
4188
  ]
4156
- sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" }
4189
+ sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" }
4157
4190
  wheels = [
4158
- { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" },
4191
+ { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" },
4159
4192
  ]
4160
4193
 
4161
4194
  [[package]]
@@ -4164,7 +4197,8 @@ version = "3.1.0"
4164
4197
  source = { registry = "https://pypi.org/simple" }
4165
4198
  dependencies = [
4166
4199
  { name = "docutils" },
4167
- { name = "sphinx" },
4200
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
4201
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
4168
4202
  { name = "sphinxcontrib-jquery" },
4169
4203
  ]
4170
4204
  sdist = { url = "https://files.pythonhosted.org/packages/84/68/a1bfbf38c0f7bccc9b10bbf76b94606f64acb1552ae394f0b8285bfaea25/sphinx_rtd_theme-3.1.0.tar.gz", hash = "sha256:b44276f2c276e909239a4f6c955aa667aaafeb78597923b1c60babc76db78e4c", size = 7620915, upload-time = "2026-01-12T16:03:31.17Z" }
@@ -4204,7 +4238,8 @@ name = "sphinxcontrib-jquery"
4204
4238
  version = "4.1"
4205
4239
  source = { registry = "https://pypi.org/simple" }
4206
4240
  dependencies = [
4207
- { name = "sphinx" },
4241
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
4242
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
4208
4243
  ]
4209
4244
  sdist = { url = "https://files.pythonhosted.org/packages/de/f3/aa67467e051df70a6330fe7770894b3e4f09436dea6881ae0b4f3d87cad8/sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", size = 122331, upload-time = "2023-03-14T15:01:01.944Z" }
4210
4245
  wheels = [
@@ -1,3 +0,0 @@
1
- # pyobs-gui
2
-
3
- A GUI for pyobs.
@@ -1,51 +0,0 @@
1
- pyobs-gui
2
- #########
3
-
4
- This is a `pyobs <https://www.pyobs.org>`_ (`documentation <https://docs.pyobs.org>`_) module providing a GUI
5
- for operating the whole system.
6
-
7
-
8
- Example configuration
9
- *********************
10
-
11
- This is an example configuration for a GUI that defines one custom widget for the ``guiding`` module::
12
-
13
- class: pyobs_gui.GUI
14
-
15
- widgets:
16
- - module: guiding
17
- overwrite: True
18
- widget:
19
- class: mypackage.GuidingWidget
20
-
21
- comm:
22
- jid: test@example.com
23
- password: ***
24
-
25
- timezone: Europe/Berlin
26
- location:
27
- longitude: 9.944333
28
- latitude: 51.560583
29
- elevation: 201.
30
-
31
- vfs:
32
- class: pyobs.vfs.VirtualFileSystem
33
- roots:
34
- cache:
35
- class: pyobs.vfs.HttpFile
36
- download: http://localhost:37075/
37
- webcam:
38
- class: pyobs.vfs.HttpFile
39
- download: http://localhost:37077/
40
-
41
-
42
- Available classes
43
- *****************
44
-
45
- There is one single class for the GUI.
46
-
47
- GUI
48
- ===
49
- .. autoclass:: pyobs_gui.GUI
50
- :members:
51
- :show-inheritance:
File without changes