diff --git a/typetapper/hierarchy_graph_view.py b/typetapper/hierarchy_graph_view.py index 4f01d5f..43587dc 100644 --- a/typetapper/hierarchy_graph_view.py +++ b/typetapper/hierarchy_graph_view.py @@ -7,10 +7,10 @@ import random from threading import Lock import logging -from PySide6.QtCore import QRectF, QPointF, QTimeLine, QEasingCurve, QMarginsF, QTimer, Qt +from PySide6.QtCore import QRectF, QPointF, QTimeLine, QEasingCurve, QMarginsF, QTimer, Qt, QEvent from PySide6.QtGui import QColor, QFont, QBrush, QPainterPath, QPen from PySide6.QtWidgets import QGraphicsItem, QGraphicsRectItem, QGraphicsSimpleTextItem, QHBoxLayout, QGraphicsScene, \ - QGraphicsEllipseItem + QGraphicsEllipseItem, QGraphicsSceneMouseEvent import networkx import pygraphviz @@ -120,6 +120,8 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): self._layout_animation.timeout.connect(self._iterate_layout) self._layout_animation_controller.setSingleShot(True) self._layout_animation_controller.timeout.connect(self._layout_animation.stop) + self.setDragMode(QZoomableDraggableGraphicsView.ScrollHandDrag) + self.viewport().setCursor(Qt.CursorShape.ArrowCursor) self._on_change_group(src='__init__') @@ -572,17 +574,25 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): def mousePressEvent(self, event): self._mouse_is_down = True - super().mousePressEvent(event) + if event.modifiers() & Qt.ShiftModifier == 0: + self.setDragMode(QZoomableDraggableGraphicsView.ScrollHandDrag) + else: + self.setDragMode(QZoomableDraggableGraphicsView.RubberBandDrag) + self.viewport().setCursor(Qt.CursorShape.CrossCursor) + super(QZoomableDraggableGraphicsView, self).mousePressEvent(event) # lol. lmao even def mouseReleaseEvent(self, event): self._mouse_is_down = False if self.drop_target is not None: self.confirm_drop() super().mouseReleaseEvent(event) + self.viewport().setCursor(Qt.CursorShape.ArrowCursor) # objectcontainer event handlers def _on_change_group(self, focus=None, **kwargs): + self.scene().clearSelection() + 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} @@ -597,8 +607,12 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): 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) + qnode = self.qnodes[self.ug_reverse[focus]] + # deliver a bogus event - prevents the selected node from dragging to the origin + event = QGraphicsSceneMouseEvent(QEvent.GraphicsSceneMouseRelease) + qnode.mouseReleaseEvent(event) + qnode.setSelected(True) + self.centerOn(qnode.center) def _on_selection_changed(self, src=None, **kwargs): if src == 'qt': @@ -710,6 +724,9 @@ class HGNode(AnimatableItem): # qt overrides def itemChange(self, change, value): + if change == QGraphicsItem.ItemPositionChange and self.exiting: + # refuse to move while exiting? + return self.pos() if change == QGraphicsItem.ItemPositionHasChanged: if not self.hgw._layout_event_occurring: for edge in self.edges.values(): @@ -874,9 +891,10 @@ class PropChartHG(HGNode, PropChart): def begin_expand(self): if self.timeline.state() == QTimeLine.NotRunning: - # horrifying - QTimer.singleShot(10, lambda: self.hgw.begin_expand(self.model)) + self.hgw.begin_expand(self.model) return True + else: + return False def paint(self, painter, option, widget=...): if self.isSelected(): @@ -1132,8 +1150,9 @@ class PlusButton(QGraphicsItem): def mousePressEvent(self, event): if self.callback(): - event.ignore() - super().mousePressEvent(event) + event.accept() + else: + super().mousePressEvent(event) def hoverEnterEvent(self, event): self.object_bg.setBrush(PLUS_HOVERED_COLOR)