Skip to content

Commit 588bd68

Browse files
authored
v1.0.6
version 1.0.6
2 parents 3a53420 + 2d463e4 commit 588bd68

18 files changed

+1840
-1157
lines changed

poetry.lock

+1,472-1,007
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyobs_gui/base.py

+50-4
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,58 @@
3434
class BaseWindow:
3535
def __init__(self) -> None:
3636
"""Base class for MainWindow and all widgets."""
37-
self.module: Optional[Proxy] = None
37+
self.modules: List[Proxy] = []
3838
self.comm: Optional[Comm] = None
3939
self.observer: Optional[Observer] = None
4040
self.vfs: Optional[Union[VirtualFileSystem, Dict[str, Any]]] = None
4141
self._base_widgets: List[BaseWidget] = []
4242

43+
@property
44+
def module(self) -> Optional[Proxy]:
45+
"""Returns the first module in the list or None, if list is empty"""
46+
return self.modules[0] if len(self.modules) > 0 else None
47+
48+
def module_by_name(self, name: str) -> Optional[Proxy]:
49+
"""Return the module with the given name or None, if not exists.
50+
51+
Args:
52+
name: Name of module to return.
53+
54+
Returns:
55+
Module or None.
56+
"""
57+
58+
# loop all modules and check name
59+
for module in self.modules:
60+
if module.name == name:
61+
return module
62+
63+
# nothing found
64+
return None
65+
66+
def modules_by_interface(self, interface: Any) -> List[Proxy]:
67+
"""Returns all modules that implement the given interface.
68+
69+
Args:
70+
interface: Interface that modules must implement.
71+
72+
Returns:
73+
List of modules.
74+
"""
75+
return list(filter(lambda m: isinstance(m, interface), self.modules))
76+
77+
def module_by_interface(self, interface: Any) -> Optional[Proxy]:
78+
"""Returns first modules that implement the given interface, or None, if no exist.
79+
80+
Args:
81+
interface: Interface that module must implement.
82+
83+
Returns:
84+
Module or None.
85+
"""
86+
modules = self.modules_by_interface(interface)
87+
return None if len(modules) == 0 else modules[0]
88+
4389
def create_widget(self, config: Union[Dict[str, Any], type], **kwargs: Any) -> "BaseWidget":
4490
"""Creates new widget.
4591
@@ -67,13 +113,13 @@ def create_widget(self, config: Union[Dict[str, Any], type], **kwargs: Any) -> "
67113

68114
async def open(
69115
self,
70-
module: Optional[Proxy] = None,
116+
modules: Optional[List[Proxy]] = None,
71117
comm: Optional[Comm] = None,
72118
observer: Optional[Observer] = None,
73119
vfs: Optional[Union[VirtualFileSystem, Dict[str, Any]]] = None,
74120
) -> None:
75121
# store
76-
self.module = module
122+
self.modules = [] if modules is None else modules
77123
self.vfs = vfs
78124
self.comm = comm
79125
self.observer = observer
@@ -83,7 +129,7 @@ async def open(
83129
await self._open_child(widget)
84130

85131
async def _open_child(self, widget: BaseWidget):
86-
await widget.open(module=self.module, vfs=self.vfs, comm=self.comm, observer=self.observer)
132+
await widget.open(modules=self.modules, vfs=self.vfs, comm=self.comm, observer=self.observer)
87133

88134

89135
class BaseWidget(BaseWindow):

pyobs_gui/camerawidget.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import asyncio
22
import logging
33
import os
4-
from typing import Any, Optional, Union, Dict
4+
from typing import Any, Optional, Union, Dict, List
55
from PyQt5 import QtWidgets, QtCore
66
from astroplan import Observer
77

@@ -53,14 +53,14 @@ def __init__(self, **kwargs: Any):
5353

5454
async def open(
5555
self,
56-
module: Optional[Proxy] = None,
56+
modules: Optional[List[Proxy]] = None,
5757
comm: Optional[Comm] = None,
5858
observer: Optional[Observer] = None,
5959
vfs: Optional[Union[VirtualFileSystem, Dict[str, Any]]] = None,
6060
) -> None:
6161
"""Open module."""
62-
await BaseWidget.open(self, module=module, comm=comm, observer=observer, vfs=vfs)
63-
await self.datadisplay.open(module=module, comm=comm, observer=observer, vfs=vfs)
62+
await BaseWidget.open(self, modules=modules, comm=comm, observer=observer, vfs=vfs)
63+
await self.datadisplay.open(modules=modules, comm=comm, observer=observer, vfs=vfs)
6464

6565
# set exposure types
6666
image_types = sorted([it.name for it in ImageType])

pyobs_gui/datadisplaywidget.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22
import os
3-
from typing import Any, Optional, cast, Union, Dict
3+
from typing import Any, Optional, cast, Union, Dict, List
44
import numpy as np
55
from PyQt5 import QtWidgets, QtCore
66
from astroplan import Observer
@@ -55,13 +55,13 @@ def __init__(self, parent, **kwargs: Any):
5555

5656
async def open(
5757
self,
58-
module: Optional[Proxy] = None,
58+
modules: Optional[List[Proxy]] = None,
5959
comm: Optional[Comm] = None,
6060
observer: Optional[Observer] = None,
6161
vfs: Optional[Union[VirtualFileSystem, Dict[str, Any]]] = None,
6262
) -> None:
6363
"""Open module."""
64-
await BaseWidget.open(self, module=module, comm=comm, observer=observer, vfs=vfs)
64+
await BaseWidget.open(self, modules=modules, comm=comm, observer=observer, vfs=vfs)
6565

6666
# add image panel
6767
self.imageLayout = QtWidgets.QVBoxLayout(self.tabImage)

pyobs_gui/eventswidget.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import asyncio
22
from datetime import datetime
33
from enum import Enum, EnumMeta
4-
from typing import Any, Type, Dict, Optional, Union, get_origin, get_args
4+
from typing import Any, Type, Dict, Optional, Union, get_origin, get_args, List
55
from PyQt5 import QtWidgets, QtCore
66
import inspect
77

@@ -30,13 +30,13 @@ def __init__(self, **kwargs: Any):
3030

3131
async def open(
3232
self,
33-
module: Optional[Proxy] = None,
33+
modules: Optional[List[Proxy]] = None,
3434
comm: Optional[Comm] = None,
3535
observer: Optional[Observer] = None,
3636
vfs: Optional[Union[VirtualFileSystem, Dict[str, Any]]] = None,
3737
) -> None:
3838
"""Open module."""
39-
await BaseWidget.open(self, module=module, comm=comm, observer=observer, vfs=vfs)
39+
await BaseWidget.open(self, modules=modules, comm=comm, observer=observer, vfs=vfs)
4040

4141
# loop all event types
4242
for name, cls in pyobs.events.__dict__.items():

pyobs_gui/filterwidget.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ def __init__(self, **kwargs: Any):
3232

3333
async def open(
3434
self,
35-
module: Optional[Proxy] = None,
35+
modules: Optional[List[Proxy]] = None,
3636
comm: Optional[Comm] = None,
3737
observer: Optional[Observer] = None,
3838
vfs: Optional[Union[VirtualFileSystem, Dict[str, Any]]] = None,
3939
) -> None:
4040
"""Open module."""
41-
await BaseWidget.open(self, module=module, comm=comm, observer=observer, vfs=vfs)
41+
await BaseWidget.open(self, modules=modules, comm=comm, observer=observer, vfs=vfs)
4242

4343
# subscribe to events
4444
await self.comm.register_event(FilterChangedEvent, self._on_filter_changed)

pyobs_gui/focuswidget.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from typing import Any, Optional, Union, Dict
2+
from typing import Any, Optional, Union, Dict, List
33

44
from PyQt5 import QtWidgets, QtCore
55
from astroplan import Observer
@@ -43,13 +43,13 @@ def __init__(self, **kwargs: Any):
4343

4444
async def open(
4545
self,
46-
module: Optional[Proxy] = None,
46+
modules: Optional[List[Proxy]] = None,
4747
comm: Optional[Comm] = None,
4848
observer: Optional[Observer] = None,
4949
vfs: Optional[Union[VirtualFileSystem, Dict[str, Any]]] = None,
5050
) -> None:
5151
"""Open module."""
52-
await BaseWidget.open(self, module=module, comm=comm, observer=observer, vfs=vfs)
52+
await BaseWidget.open(self, modules=modules, comm=comm, observer=observer, vfs=vfs)
5353

5454
# subscribe to events
5555
if self.comm is not None:

pyobs_gui/mainwindow.py

+20-2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,21 @@
6161
}
6262

6363

64+
DEFAULT_CONFIG = [
65+
{"widget": ShellWidget, "label": "Shell", "always": True},
66+
{"widget": EventsWidget, "label": "Events", "always": True},
67+
{"widget": StatusWidget, "label": "Status", "always": True},
68+
{"widget": CameraWidget, "interfaces": "ICamera", "icon": "fa5s.camera"},
69+
{"widget": TelescopeWidget, "interfaces": "ITelescope", "icon": "msc.telescope"},
70+
{"widget": RoofWidget, "interfaces": "IRoof", "icon": "ph.house"},
71+
{"widget": FocusWidget, "interfaces": "IFocuser", "icon": "mdi.image-filter-center-focus"},
72+
{"widget": WeatherWidget, "interfaces": "IWeather", "icon": "fa5s.cloud-sun"},
73+
{"widget": VideoWidget, "interfaces": "IVideo", "icon": "fa5s.video"},
74+
{"widget": SpectrographWidget, "interfaces": "ISpectrograph", "icon": "ei.graph"},
75+
{"widget": FilterWidget, "interfaces": "IFilters", "icon": "mdi.air-filter"},
76+
]
77+
78+
6479
class PagesListWidgetItem(QtWidgets.QListWidgetItem):
6580
"""ListWidgetItem for the pages list. Always sorts Shell and Events first"""
6681

@@ -152,8 +167,11 @@ def __init__(
152167
async def open(self, **kwargs: Any) -> None:
153168
"""Open module."""
154169

170+
# get module
171+
module = kwargs.pop("module")
172+
155173
# open widgets
156-
await BaseWindow.open(self, **kwargs)
174+
await BaseWindow.open(self, modules=[module], **kwargs)
157175

158176
# shell
159177
if self.show_shell:
@@ -229,7 +247,7 @@ async def _add_client(
229247
self.listPages.sortItems()
230248

231249
# open and add widget
232-
await widget.open(module=proxy, comm=self.comm, observer=self.observer, vfs=self.vfs)
250+
await widget.open(modules=[proxy], comm=self.comm, observer=self.observer, vfs=self.vfs)
233251
self.stackedWidget.addWidget(widget)
234252

235253
# store

pyobs_gui/modulegui.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ async def open(self, module: Optional[Module] = None, **kwargs: Any) -> None:
3131
break
3232

3333
# open widgets
34-
await BaseWindow.open(self, module=module, **kwargs)
34+
await BaseWindow.open(self, modules=[module], **kwargs)
3535

3636
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
3737
self.gui_module.quit()

0 commit comments

Comments
 (0)