34
34
class BaseWindow :
35
35
def __init__ (self ) -> None :
36
36
"""Base class for MainWindow and all widgets."""
37
- self .module : Optional [Proxy ] = None
37
+ self .modules : List [Proxy ] = []
38
38
self .comm : Optional [Comm ] = None
39
39
self .observer : Optional [Observer ] = None
40
40
self .vfs : Optional [Union [VirtualFileSystem , Dict [str , Any ]]] = None
41
41
self ._base_widgets : List [BaseWidget ] = []
42
42
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
+
43
89
def create_widget (self , config : Union [Dict [str , Any ], type ], ** kwargs : Any ) -> "BaseWidget" :
44
90
"""Creates new widget.
45
91
@@ -67,13 +113,13 @@ def create_widget(self, config: Union[Dict[str, Any], type], **kwargs: Any) -> "
67
113
68
114
async def open (
69
115
self ,
70
- module : Optional [Proxy ] = None ,
116
+ modules : Optional [List [ Proxy ] ] = None ,
71
117
comm : Optional [Comm ] = None ,
72
118
observer : Optional [Observer ] = None ,
73
119
vfs : Optional [Union [VirtualFileSystem , Dict [str , Any ]]] = None ,
74
120
) -> None :
75
121
# store
76
- self .module = module
122
+ self .modules = [] if modules is None else modules
77
123
self .vfs = vfs
78
124
self .comm = comm
79
125
self .observer = observer
@@ -83,7 +129,7 @@ async def open(
83
129
await self ._open_child (widget )
84
130
85
131
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 )
87
133
88
134
89
135
class BaseWidget (BaseWindow ):
0 commit comments