diff --git a/typetapper/hierarchy_graph_view.py b/typetapper/hierarchy_graph_view.py index 8ea9480..304c2ed 100644 --- a/typetapper/hierarchy_graph_view.py +++ b/typetapper/hierarchy_graph_view.py @@ -135,6 +135,25 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): self.current_group.am_event() elif isinstance(node, RelativeAtom): self.instance.workspace.jump_to(node.atom.loc.ins_addr) + elif isinstance(node, ExternNode): + atlas = self.ng.succ[node.adj_to] + rev = False + if self.current_group.am_obj not in atlas: + atlas = self.ng.pred[node.adj_to] + rev = True + if self.current_group.am_obj not in atlas: + l.error("?????") + return + attrs = next(iter(atlas[self.current_group.am_obj].values())) + further_edge = attrs['prev' if rev else 'next'] + further_node = further_edge[0 if rev else 1] + if self.current_group.am_obj.parent == further_node: + target = ExternNode(self.current_group.am_obj) + else: + target = further_node + self.current_group.am_obj = self.current_group.parent + self.current_group.am_event(focus=target) + def label(self, node: RelativeAtomOrGroup) -> str: if node not in self._labels: @@ -563,15 +582,17 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): # objectcontainer event handlers - def _on_change_group(self, **kwargs): + def _on_change_group(self, focus=None, **kwargs): old_group = self._old_group self._old_group = self.current_group.am_obj self._layouts[old_group] = {qnode.model: qnode.center for qnode in self.qnodes} self._layout(600) self._update_scene_rect(True) - if old_group in self.ug_reverse: - self.qnodes[self.ug_reverse[old_group]].setSelected(True) - self.centerOn(self.qnodes[self.ug_reverse[old_group]].center) + if focus is None: + focus = old_group + if focus in self.ug_reverse: + self.qnodes[self.ug_reverse[focus]].setSelected(True) + self.centerOn(self.qnodes[self.ug_reverse[focus]].center) def _on_selection_changed(self, src=None, **kwargs): if src == 'qt':