Skip to content

Commit 5a55a5c

Browse files
authored
Store already added node viewer and load it when needed (#921)
In aiidalab-widgets-base/viewer.py, it creates a new viewer every time we select a new AiiDA node, and the viewer is not saved in the app, so we can not reuse it later. This PR stores the already added viewer and reuses it later.
1 parent 2924582 commit 5a55a5c

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

src/aiidalab_qe/app/result/__init__.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from aiida.engine import ProcessState
66
from aiida.engine.processes import control
77
from aiidalab_widgets_base import (
8-
AiidaNodeViewWidget,
98
ProcessMonitor,
109
ProcessNodesTreeWidget,
1110
WizardAppWidgetStep,
@@ -28,14 +27,10 @@ def __init__(self, **kwargs):
2827
(self, "process"),
2928
(self.process_tree, "value"),
3029
)
31-
32-
self.node_view = AiidaNodeViewWidget(layout={"width": "auto", "height": "auto"})
33-
ipw.dlink(
34-
(self.process_tree, "selected_nodes"),
35-
(self.node_view, "node"),
36-
transform=lambda nodes: nodes[0] if nodes else None,
37-
)
38-
self.process_status = ipw.VBox(children=[self.process_tree, self.node_view])
30+
self.process_tree.observe(self._update_node_view, names="selected_nodes")
31+
# keep track of the node views
32+
self.node_views = {}
33+
self.process_status = ipw.VBox(children=[self.process_tree])
3934

4035
# Setup process monitor
4136
self.process_monitor = ProcessMonitor(
@@ -215,3 +210,20 @@ def _observe_process(self, _):
215210
self._update_state()
216211
self._update_kill_button_layout()
217212
self._update_clean_scratch_button_layout()
213+
214+
def _update_node_view(self, change):
215+
"""Callback for when the a new node is selected."""
216+
from aiidalab_widgets_base.viewers import viewer
217+
218+
nodes = change["new"]
219+
if not nodes:
220+
return
221+
# only show the first selected node
222+
node = nodes[0]
223+
# check if the viewer is already added
224+
if node.uuid in self.node_views:
225+
node_view = self.node_views[node.uuid]
226+
else:
227+
node_view = viewer(node)
228+
self.node_views[node.uuid] = node_view
229+
self.process_status.children = [self.process_tree, node_view]

0 commit comments

Comments
 (0)