Skip to content

Commit e361264

Browse files
committed
implemented slicer pipe
1 parent 42840c8 commit e361264

File tree

3 files changed

+76
-16
lines changed

3 files changed

+76
-16
lines changed

NodeGraphQt/qgraphics/slicer.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#!/usr/bin/python
2+
from NodeGraphQt import QtCore, QtGui, QtWidgets
3+
from NodeGraphQt.constants import Z_VAL_NODE_WIDGET, PIPE_SLICER_COLOR
4+
5+
6+
class SlicerPipe(QtWidgets.QGraphicsPathItem):
7+
"""
8+
Base item used for drawing the pipe connection slicer.
9+
"""
10+
11+
def __init__(self):
12+
super(SlicerPipe, self).__init__()
13+
self.setZValue(Z_VAL_NODE_WIDGET + 2)
14+
15+
def paint(self, painter, option, widget):
16+
"""
17+
Draws the slicer pipe.
18+
19+
Args:
20+
painter (QtGui.QPainter): painter used for drawing the item.
21+
option (QtGui.QStyleOptionGraphicsItem):
22+
used to describe the parameters needed to draw.
23+
widget (QtWidgets.QWidget): not used.
24+
"""
25+
color = QtGui.QColor(*PIPE_SLICER_COLOR)
26+
p1 = self.path().pointAtPercent(0)
27+
p2 = self.path().pointAtPercent(1)
28+
size = 6.0
29+
offset = size / 2
30+
31+
painter.save()
32+
painter.setRenderHint(painter.Antialiasing, True)
33+
34+
font = painter.font()
35+
font.setPointSize(12)
36+
painter.setFont(font)
37+
text = 'slice'
38+
text_x = painter.fontMetrics().width(text) / 2
39+
text_y = painter.fontMetrics().height() / 1.5
40+
text_pos = QtCore.QPointF(p1.x() - text_x, p1.y() - text_y)
41+
text_color = QtGui.QColor(*PIPE_SLICER_COLOR)
42+
text_color.setAlpha(80)
43+
painter.setPen(QtGui.QPen(text_color, 1.5, QtCore.Qt.SolidLine))
44+
painter.drawText(text_pos, text)
45+
46+
painter.setPen(QtGui.QPen(color, 1.5, QtCore.Qt.DashLine))
47+
painter.drawPath(self.path())
48+
49+
painter.setPen(QtGui.QPen(color, 1.5, QtCore.Qt.SolidLine))
50+
painter.setBrush(color)
51+
52+
rect = QtCore.QRectF(p1.x() - offset, p1.y() - offset, size, size)
53+
painter.drawEllipse(rect)
54+
55+
rect = QtCore.QRectF(p2.x() - offset, p2.y() - offset, size, size)
56+
painter.drawEllipse(rect)
57+
painter.restore()
58+
59+
def draw_path(self, p1, p2):
60+
path = QtGui.QPainterPath()
61+
path.moveTo(p1)
62+
path.lineTo(p2)
63+
self.setPath(path)

NodeGraphQt/widgets/viewer.py

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66
from NodeGraphQt.constants import (IN_PORT, OUT_PORT,
77
PIPE_LAYOUT_CURVED,
88
PIPE_LAYOUT_STRAIGHT,
9-
PIPE_SLICER_COLOR,
109
PIPE_STYLE_DASHED,
11-
Z_VAL_NODE_WIDGET,
1210
SCENE_AREA)
1311
from NodeGraphQt.qgraphics.node_abstract import AbstractNodeItem
1412
from NodeGraphQt.qgraphics.node_backdrop import BackdropNodeItem
1513
from NodeGraphQt.qgraphics.pipe import Pipe
1614
from NodeGraphQt.qgraphics.port import PortItem
15+
from NodeGraphQt.qgraphics.slicer import SlicerPipe
1716
from NodeGraphQt.widgets.scene import NodeScene
1817
from NodeGraphQt.widgets.stylesheet import STYLE_QMENU
1918
from NodeGraphQt.widgets.tab_search import TabSearchWidget
@@ -66,12 +65,8 @@ def __init__(self, parent=None):
6665
self._rubber_band = QtWidgets.QRubberBand(
6766
QtWidgets.QRubberBand.Rectangle, self
6867
)
69-
slicer_color = QtGui.QColor(*PIPE_SLICER_COLOR)
70-
slicer_pen = QtGui.QPen(slicer_color, 1.5, QtCore.Qt.DashLine)
71-
self._pipe_slicer = QtWidgets.QGraphicsLineItem()
72-
self._pipe_slicer.setPen(slicer_pen)
68+
self._pipe_slicer = SlicerPipe()
7369
self._pipe_slicer.setVisible(False)
74-
self._pipe_slicer.setZValue(Z_VAL_NODE_WIDGET + 2)
7570
self.scene().addItem(self._pipe_slicer)
7671

7772
self._undo_stack = QtWidgets.QUndoStack(self)
@@ -137,10 +132,7 @@ def _on_search_submitted(self, node_type):
137132
pos = self.mapToScene(self._previous_pos)
138133
self.search_triggered.emit(node_type, (pos.x(), pos.y()))
139134

140-
def _on_pipes_sliced(self, line):
141-
path = QtGui.QPainterPath()
142-
path.moveTo(line.p1())
143-
path.lineTo(line.p2())
135+
def _on_pipes_sliced(self, path):
144136
self.connection_sliced.emit([
145137
[i.input_port, i.output_port]
146138
for i in self.scene().items(path) if isinstance(i, Pipe)
@@ -178,7 +170,7 @@ def mousePressEvent(self, event):
178170

179171
# pipe slicer enabled.
180172
if event.modifiers() == (QtCore.Qt.AltModifier | QtCore.Qt.ShiftModifier):
181-
self._pipe_slicer.setLine(QtCore.QLineF(map_pos, map_pos))
173+
self._pipe_slicer.draw_path(map_pos, map_pos)
182174
self._pipe_slicer.setVisible(True)
183175
return
184176

@@ -220,8 +212,9 @@ def mouseReleaseEvent(self, event):
220212

221213
# hide pipe slicer.
222214
if self._pipe_slicer.isVisible():
223-
self._on_pipes_sliced(self._pipe_slicer.line())
224-
self._pipe_slicer.setLine(QtCore.QLineF(0.0, 0.0, 0.0, 0.0))
215+
self._on_pipes_sliced(self._pipe_slicer.path())
216+
p = QtCore.QPointF(0.0, 0.0)
217+
self._pipe_slicer.draw_path(p, p)
225218
self._pipe_slicer.setVisible(False)
226219

227220
# hide selection marquee
@@ -249,9 +242,9 @@ def mouseMoveEvent(self, event):
249242
shift_modifier = event.modifiers() == QtCore.Qt.ShiftModifier
250243
if event.modifiers() == (QtCore.Qt.AltModifier | QtCore.Qt.ShiftModifier):
251244
if self.LMB_state:
252-
p1 = self._pipe_slicer.line().p1()
245+
p1 = self._pipe_slicer.path().pointAtPercent(0)
253246
p2 = self.mapToScene(self._previous_pos)
254-
self._pipe_slicer.setLine(QtCore.QLineF(p1, p2))
247+
self._pipe_slicer.draw_path(p1, p2)
255248
self._previous_pos = event.pos()
256249
super(NodeViewer, self).mouseMoveEvent(event)
257250
return

docs/overview.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ Navigation
2020
Port Connections
2121
================
2222

23+
.. image:: _images/slicer.png
24+
:width: 600px
25+
26+
2327
+---------------------+----------------------------+
2428
| action | controls |
2529
+=====================+============================+

0 commit comments

Comments
 (0)