Skip to content

Commit

Permalink
Refactor graphical node
Browse files Browse the repository at this point in the history
  • Loading branch information
don4get committed Apr 12, 2020
1 parent 30366bb commit f6d2ee1
Show file tree
Hide file tree
Showing 9 changed files with 137 additions and 60 deletions.
13 changes: 7 additions & 6 deletions nodedge/edge.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,17 +184,15 @@ def updatePos(self) -> None:

if self.sourceSocket is not None:
sourcePos = (
self.sourceSocket.socketPos()
+ self.sourceSocket.node.graphicsNode.pos()
self.sourceSocket.pos + self.sourceSocket.node.graphicsNode.pos()
)
if self.graphicsEdge is not None:
self.graphicsEdge.sourcePos = sourcePos
# TODO: simplify terminology: end -> target | start -> source

if self.targetSocket is not None:
targetPos = (
self.targetSocket.socketPos()
+ self.targetSocket.node.graphicsNode.pos()
self.targetSocket.pos + self.targetSocket.node.graphicsNode.pos()
)
if self.graphicsEdge is not None:
self.graphicsEdge.targetPos = targetPos
Expand Down Expand Up @@ -230,7 +228,7 @@ def removeFromSockets(self):
self.targetSocket = None
self.sourceSocket = None

def remove(self):
def remove(self, silentForSocket: Optional[Socket] = None):
"""
Safely remove this `Edge`.
Expand All @@ -241,6 +239,9 @@ def remove(self):
Triggered Node Slots:
- :py:meth:`~nodedge.node.Node.onEdgeConnectionChanged`
- :py:meth:`~nodedge.node.Node.onInputChanged`
:param silentForSocket: Socket for whom the removal is silent
:type silentForSocket: Optional[:class:`~nodedge.socket.Socket`]
"""

oldSockets = [self.sourceSocket, self.targetSocket]
Expand All @@ -250,7 +251,7 @@ def remove(self):

self.__logger.debug(f"Removing Graphical edge: {self.graphicsEdge}")
self.scene.graphicsScene.removeItem(self.graphicsEdge)
self.graphicsEdge = None
self.graphicsEdge = None # type: ignore

self.__logger.debug(f"Removing {self}")
try:
Expand Down
15 changes: 4 additions & 11 deletions nodedge/graphics_edge.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,8 @@
QGraphicsPathItem,
QGraphicsSceneHoverEvent,
QGraphicsSceneMouseEvent,
QWidget,
)

from nodedge.socket import SocketLocation


class GraphicsEdge(QGraphicsPathItem):
""":class:`~nodedge.graphics_edge.GraphicsEdge` class
Expand Down Expand Up @@ -277,14 +274,10 @@ def calcPath(self) -> QPainterPath:
cpy_d: float = 0

if self.edge.sourceSocket is not None:
sspos = self.edge.sourceSocket.location

if (
sx > dx
and sspos in [SocketLocation.RIGHT_TOP, SocketLocation.RIGHT_BOTTOM]
) or (
sx < dx
and sspos in [SocketLocation.LEFT_BOTTOM, SocketLocation.LEFT_TOP]
sourceSocketIsInput = self.edge.sourceSocket.isInput

if (sx > dx and not sourceSocketIsInput) or (
sx < dx and sourceSocketIsInput
):
cpx_d *= -1.0
cpx_s *= -1.0
Expand Down
40 changes: 27 additions & 13 deletions nodedge/graphics_node.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
"""
Graphics node module containing :class:`~nodedge.node.Node` class.
Graphics node module containing :class:`~nodedge.graphics_node.GraphicsNode` class.
"""

import logging
Expand All @@ -10,11 +10,13 @@
from PyQt5.QtGui import QBrush, QColor, QFont, QPainterPath, QPen
from PyQt5.QtWidgets import (
QGraphicsItem,
QGraphicsProxyWidget,
QGraphicsSceneHoverEvent,
QGraphicsTextItem,
QGraphicsSceneMouseEvent,
)

from nodedge.graphics_node_content import GraphicsNodeContentProxy
from nodedge.graphics_node_title_item import GraphicsNodeTitleItem


class GraphicsNode(QGraphicsItem):
""":class:`~nodedge.node.Node` class
Expand Down Expand Up @@ -117,12 +119,11 @@ def initTitle(self) -> None:
"""
Set up the title Graphics representation: font, color, position, etc.
"""
self.titleItem = QGraphicsTextItem(self)
self.titleItem: GraphicsNodeTitleItem = GraphicsNodeTitleItem(self)
self.titleItem.setDefaultTextColor(self._titleColor)
self.titleItem.setFont(self._titleFont)
self.titleItem.setPos(self.titleHorizontalPadding, 0)
self.titleItem.setTextWidth(self.width - 2 * self.titleHorizontalPadding)
self.titleItem.node = self.node # type: ignore

self.title = self.node.title

Expand All @@ -131,14 +132,15 @@ def initContent(self) -> None:
"""
Set up the `grContent` - ``QGraphicsProxyWidget`` to have a container for `GraphicsContent`.
"""
self.graphicsContent = QGraphicsProxyWidget(self)

self.content.setGeometry(
self.edgePadding,
self.titleHeight + self.edgePadding,
self.width - 2 * self.edgePadding,
self.height - 2 * self.edgePadding - self.titleHeight,
int(self.edgePadding),
int(self.titleHeight + self.edgePadding),
int(self.width - 2 * self.edgePadding),
int(self.height - 2 * self.edgePadding - self.titleHeight),
)
self.graphicsContent.setWidget(self.content)
self.graphicsContentProxy = GraphicsNodeContentProxy(self)
self.graphicsContentProxy.setWidget(self.content)

def boundingRect(self):
"""
Expand Down Expand Up @@ -196,7 +198,12 @@ def paint(self, painter, QStyleOptionGraphicsItem, widget=None):
# outline
pathOutline = QPainterPath()
pathOutline.addRoundedRect(
0, 0, self.width, self.height, self.edgeRoundness, self.edgeRoundness
-1,
-1,
self.width + 2,
self.height + 2,
self.edgeRoundness,
self.edgeRoundness,
)
painter.setBrush(Qt.NoBrush)

Expand Down Expand Up @@ -232,7 +239,7 @@ def mouseReleaseEvent(self, event):
self.node.scene.history.store("Move a node")

self.node.scene.resetLastSelectedStates()
self._lastSelectedState = True
self.selectedState = True

# Store the last selected, because moving does also select the blocks.
self.node.scene.lastSelectedItems = self.node.scene.selectedItems
Expand Down Expand Up @@ -265,6 +272,13 @@ def hoverLeaveEvent(self, event: QGraphicsSceneHoverEvent) -> None:
self.hovered = False
self.update()

def mouseDoubleClickEvent(self, event: QGraphicsSceneMouseEvent):
"""
Qt's overridden event for doubleclick.
Resend to :func:`~nodedge.node.Node.onDoubleClicked`
"""
self.node.onDoubleClicked(event)

def onSelected(self):
"""
Handle when the node has been selected.
Expand Down
10 changes: 8 additions & 2 deletions nodedge/graphics_node_content.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFocusEvent
from PyQt5.QtWidgets import QTextEdit, QVBoxLayout, QWidget
from PyQt5.QtWidgets import QGraphicsProxyWidget, QTextEdit, QVBoxLayout, QWidget

from nodedge.serializable import Serializable

Expand Down Expand Up @@ -47,7 +47,7 @@ def initUI(self):
self.layout.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.layout)

self.layout.addWidget(TextEdit("X3"))
self.layout.addWidget(TextEdit("N"))

def setEditingFlag(self, value: bool) -> None:
"""
Expand Down Expand Up @@ -126,3 +126,9 @@ def focusOutEvent(self, event: QFocusEvent) -> None:
parent: GraphicsNodeContent = cast(GraphicsNodeContent, super().parentWidget())
parent.setEditingFlag(False)
super().focusOutEvent(event)


class GraphicsNodeContentProxy(QGraphicsProxyWidget):
def __init__(self, graphicsNodeParent: "GraphicsNode"): # type: ignore
super().__init__(graphicsNodeParent)
self.setWidget(graphicsNodeParent.content)
12 changes: 12 additions & 0 deletions nodedge/graphics_node_title_item.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
"""
Graphics node title item module containing :class:`~nodedge.graphics_node_title_item.GraphicsNodeTitleItem` class.
"""

from PyQt5.QtWidgets import QGraphicsTextItem


class GraphicsNodeTitleItem(QGraphicsTextItem):
def __init__(self, graphicsNodeParent: "GraphicsNode"): # type: ignore
super().__init__(graphicsNodeParent)
self.graphicsNode = graphicsNodeParent
2 changes: 1 addition & 1 deletion nodedge/graphics_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def __init__(self, graphicsScene: GraphicsScene, parent: Optional[QWidget] = Non
super().__init__(graphicsScene, parent)

self.__logger = logging.getLogger(__name__)
self.__logger.setLevel(logging.INFO)
self.__logger.setLevel(logging.DEBUG)

self.graphicsScene: GraphicsScene = graphicsScene
self.initUI()
Expand Down
3 changes: 2 additions & 1 deletion nodedge/mdi_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ def setActiveSubWindow(self, window):
if window:
self.mdiArea.setActiveSubWindow(window)

# noinspection PyAttributeOutsideInit
def createNodesDock(self):
self.nodesListWidget = NodeListWidget()

Expand Down Expand Up @@ -396,7 +397,7 @@ def about(self):
)

def onNodesToolbarTriggered(self):
self.__logger.debug("")
self.__logger.debug("Toolbar triggered")

if self.nodesDock.isVisible():
self.nodesDock.hide()
Expand Down
11 changes: 11 additions & 0 deletions nodedge/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from typing import Collection, List, Optional, Tuple, TypeVar

from PyQt5.QtCore import QPoint, QPointF
from PyQt5.QtWidgets import QGraphicsSceneMouseEvent

from nodedge.edge import Edge
from nodedge.graphics_node import GraphicsNode
Expand Down Expand Up @@ -575,3 +576,13 @@ def deserialize(self, data, hashmap=None, restoreId=True) -> bool:
res = self.content.deserialize(data["content"], hashmap)

return bool(True & res)

def onDoubleClicked(self, event: QGraphicsSceneMouseEvent) -> None:
"""
Callback when the :class:`~nodedge.graphics_node.GraphicsNode` is double clicked.
:param event: Qt double click event
:type: ``QMouseEvent``
"""

self.__logger.debug("Graphics node has been double clicked.")

0 comments on commit f6d2ee1

Please sign in to comment.