From 8e23aae7860bfbba7a0bb1dc8c7843c31369f3bb Mon Sep 17 00:00:00 2001 From: Audrey Dutcher Date: Wed, 16 Nov 2022 13:39:22 -0700 Subject: [PATCH] Fix centering and bounds recompute on expand --- typetapper/hierarchy_graph_view.py | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/typetapper/hierarchy_graph_view.py b/typetapper/hierarchy_graph_view.py index 7825e59..f1aa513 100644 --- a/typetapper/hierarchy_graph_view.py +++ b/typetapper/hierarchy_graph_view.py @@ -208,6 +208,8 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): qedge.layout() qedge.enter() + self._update_scene_rect() + @property def is_expanding(self): return bool(self.expansion_qnodes) @@ -491,21 +493,28 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): for edge in self.qedges: edge.layout() - rect = None - for qnode in self.qnodes: - br = qnode.boundingRect() - br.translate(qnode.x(), qnode.y()) - rect = rect.united(br) if rect is not None else br - if rect is None: - rect = QRectF() - rect = rect.marginsAdded(QMarginsF(SCENE_MARGIN, SCENE_MARGIN, SCENE_MARGIN, SCENE_MARGIN)) - self.setSceneRect(rect) + self._update_scene_rect() finally: self._layout_event_occurring = False self._layout_lock.release() else: l.warning("Layout lock conflict. Is the application lagging?") + def _update_scene_rect(self): + rect = None + for item in self.items(): + br = item.boundingRect() + br.translate(item.x(), item.y()) + rect = rect.united(br) if rect is not None else br + if rect is None: + rect = self.mapToScene(self.viewport().rect()).boundingRect() + else: + rect = rect.marginsAdded(QMarginsF(SCENE_MARGIN, SCENE_MARGIN, SCENE_MARGIN, SCENE_MARGIN)) + rect = rect.united(self.mapToScene(self.viewport().rect()).boundingRect()) + center = self.mapToScene(self.viewport().rect().center()) + self.setSceneRect(rect) + self.centerOn(center) + # qt overrides def keyPressEvent(self, event): @@ -700,7 +709,7 @@ class PropChart(QGraphicsItem): self.scene().removeItem(item) data = [(offset, kind, size, count) for offset, v1 in self.prop.struct_data.items() for size, v2 in v1.items() for kind, count in v2.items()] - data.sort() + data.sort(key=lambda x: (x[0], x[1], -x[2], x[3])) cols_allocated = defaultdict(int) row_allocated = 0 offset_allocated = None