From 338cb03313e8983f03522965564700244e2f52d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Del=C3=A8gue?= Date: Wed, 27 Oct 2021 22:02:01 +0200 Subject: [PATCH 1/2] :tada: When selecting an OCBBlock, it is brought to the front. It's a small cosmetic change but it's something nice to have. --- .gitignore | 3 +++ opencodeblocks/graphics/view.py | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ba6a909d..0cdfdc6f 100644 --- a/.gitignore +++ b/.gitignore @@ -123,3 +123,6 @@ dmypy.json # VSCode .vscode + +# Sublime text +*.sublime-workspace \ No newline at end of file diff --git a/opencodeblocks/graphics/view.py b/opencodeblocks/graphics/view.py index f76308b2..3d13e40a 100644 --- a/opencodeblocks/graphics/view.py +++ b/opencodeblocks/graphics/view.py @@ -10,6 +10,7 @@ from opencodeblocks.graphics.scene import OCBScene from opencodeblocks.graphics.socket import OCBSocket from opencodeblocks.graphics.edge import OCBEdge +from opencodeblocks.graphics.blocks import OCBBlock MODE_NOOP = 0 MODE_EDGE_DRAG = 1 @@ -98,6 +99,7 @@ def middleMouseButtonRelease(self, event: QMouseEvent): super().mouseReleaseEvent(event) def leftMouseButtonPress(self, event: QMouseEvent): + event = self.bring_forward(event) event = self.drag_edge(event, 'press') if event is not None: super().mousePressEvent(event) @@ -137,6 +139,22 @@ def deleteSelected(self): selected_item.remove() scene.history.checkpoint("Delete selected elements") + def bring_forward(self, event: QMouseEvent, action="press"): + """ When a codeblock is selected, it will be drawn in front of other blocks""" + scene = self.scene() + item_at_click = self.itemAt(event.pos()) + + while item_at_click.parentItem() != None: + item_at_click = item_at_click.parentItem() + + if isinstance(item_at_click, OCBBlock): + for item in scene.items(): + if isinstance(item,OCBBlock): + item.setZValue(0) + item_at_click.setZValue(1) + return event # This is never considered as a handling of the event. + + def drag_scene(self, event: QMouseEvent, action="press"): """ Drag the scene around. """ if action == "press": @@ -168,7 +186,6 @@ def drag_edge(self, event: QMouseEvent, action="press"): return elif action == "release": if self.mode == MODE_EDGE_DRAG: - item_at_click = self.itemAt(event.pos()) if isinstance(item_at_click, OCBSocket) and \ item_at_click is not self.edge_drag.source_socket: item_at_click.add_edge(self.edge_drag) From 9016152e2c170c3eda2a74701cd3da41f74c3d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Del=C3=A8gue?= Date: Thu, 28 Oct 2021 00:03:39 +0200 Subject: [PATCH 2/2] :rocket: The `bring_forward` method now works in constant time (or log if you count the depth of the Qt graphics tree) --- opencodeblocks/graphics/view.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/opencodeblocks/graphics/view.py b/opencodeblocks/graphics/view.py index 3d13e40a..db9eb37d 100644 --- a/opencodeblocks/graphics/view.py +++ b/opencodeblocks/graphics/view.py @@ -36,6 +36,7 @@ def __init__(self, scene:OCBScene, parent=None, self.edge_drag = None self.lastMousePos = QPointF(0, 0) + self.currentSelectedBlock = None self.init_ui() self.setScene(scene) @@ -139,19 +140,24 @@ def deleteSelected(self): selected_item.remove() scene.history.checkpoint("Delete selected elements") - def bring_forward(self, event: QMouseEvent, action="press"): - """ When a codeblock is selected, it will be drawn in front of other blocks""" + def bring_forward(self, event: QMouseEvent): + """ When a codeblock is selected, it will be drawn in front of other blocks """ scene = self.scene() item_at_click = self.itemAt(event.pos()) + if item_at_click is None: + return event - while item_at_click.parentItem() != None: + while item_at_click.parentItem() is not None: + if isinstance(item_at_click,OCBBlock): + break item_at_click = item_at_click.parentItem() if isinstance(item_at_click, OCBBlock): - for item in scene.items(): - if isinstance(item,OCBBlock): - item.setZValue(0) - item_at_click.setZValue(1) + if self.currentSelectedBlock is not None: + self.currentSelectedBlock.setZValue(0) + item_at_click.setZValue(1) + self.currentSelectedBlock = item_at_click + return event # This is never considered as a handling of the event.