3
3
4
4
from aiida .engine import ProcessState
5
5
from aiidalab_widgets_base import (
6
- AiidaNodeViewWidget ,
7
6
ProcessMonitor ,
8
7
ProcessNodesTreeWidget ,
9
8
WizardAppWidgetStep ,
@@ -36,6 +35,8 @@ def __init__(self, model: ResultsModel, **kwargs):
36
35
37
36
self .rendered = False
38
37
38
+ self .node_views = {} # keep track of the node views
39
+
39
40
def render (self ):
40
41
if self .rendered :
41
42
return
@@ -45,18 +46,14 @@ def render(self):
45
46
(self ._model , "process_uuid" ),
46
47
(self .process_tree , "value" ),
47
48
)
48
-
49
- self .node_view = AiidaNodeViewWidget (layout = {"width" : "auto" , "height" : "auto" })
50
- ipw .dlink (
51
- (self .process_tree , "selected_nodes" ),
52
- (self .node_view , "node" ),
53
- transform = lambda nodes : nodes [0 ] if nodes else None ,
49
+ self .process_tree .observe (
50
+ self ._on_node_selection_change ,
51
+ "selected_nodes" ,
54
52
)
55
53
56
54
self .process_status = ipw .VBox (
57
55
children = [
58
56
self .process_tree ,
59
- self .node_view ,
60
57
],
61
58
)
62
59
@@ -148,6 +145,9 @@ def _on_process_change(self, _):
148
145
self ._update_kill_button_layout ()
149
146
self ._update_clean_scratch_button_layout ()
150
147
148
+ def _on_node_selection_change (self , change ):
149
+ self ._update_node_view (change ["new" ])
150
+
151
151
def _on_kill_button_click (self , _ ):
152
152
self ._model .kill_process ()
153
153
self ._update_kill_button_layout ()
@@ -160,6 +160,31 @@ def _on_clean_scratch_button_click(self, _):
160
160
self ._model .clean_remote_data ()
161
161
self ._update_clean_scratch_button_layout ()
162
162
163
+ def _update_node_view (self , nodes ):
164
+ """Update the node view based on the selected nodes.
165
+
166
+ parameters
167
+ ----------
168
+ `nodes`: `list`
169
+ List of selected nodes.
170
+ """
171
+ from aiidalab_widgets_base .viewers import viewer
172
+
173
+ if not nodes :
174
+ return
175
+ # only show the first selected node
176
+ node = nodes [0 ]
177
+ # check if the viewer is already added
178
+ if node .uuid in self .node_views :
179
+ node_view = self .node_views [node .uuid ]
180
+ else :
181
+ node_view = viewer (node )
182
+ self .node_views [node .uuid ] = node_view
183
+ self .process_status .children = [
184
+ self .process_tree ,
185
+ node_view ,
186
+ ]
187
+
163
188
def _update_kill_button_layout (self ):
164
189
if not self .rendered :
165
190
return
0 commit comments