This repository has been archived by the owner on Dec 15, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
qneconnection.py
124 lines (88 loc) · 3.89 KB
/
qneconnection.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# Copyright (c) 2014, ALDO HOEBEN
# Copyright (c) 2012, STANISLAW ADASZEWSKI
#All rights reserved.
#
#Redistribution and use in source and binary forms, with or without
#modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of STANISLAW ADASZEWSKI nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#DISCLAIMED. IN NO EVENT SHALL STANISLAW ADASZEWSKI BE LIABLE FOR ANY
#DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from PySide.QtCore import (Qt, QPointF)
from PySide.QtGui import (QBrush, QPen, QPainterPath)
from PySide.QtGui import (QApplication, QGraphicsItem, QGraphicsPathItem)
class QNEConnection(QGraphicsPathItem):
(Type) = (QGraphicsItem.UserType +2)
def __init__(self, parent):
super(QNEConnection, self).__init__(parent)
self.normalPen = QPen(QApplication.palette().text().color(), 2)
self.selectedPen = QPen(QApplication.palette().text().color(), 2, Qt.DashLine)
self.setPen(self.normalPen)
self.setBrush(QBrush(Qt.NoBrush))
self.setZValue(-1)
self.setFlag(QGraphicsItem.ItemIsSelectable)
self.m_port1 = None
self.m_port2 = None
self.pos1 = QPointF()
self.pos2 = QPointF()
def __del__(self):
#print("Del QNEConnection")
pass
def delete(self):
if self.m_port1:
self.m_port1.removeConnection(self)
if self.m_port2:
self.m_port2.removeConnection(self)
if self.scene():
self.scene().removeItem(self)
self.m_port1 = None
self.m_port2 = None
def paint(self, painter, option, widget):
if self.isSelected():
painter.setPen(self.selectedPen)
else:
painter.setPen(self.normalPen)
painter.drawPath(self.path())
def setPos1(self, pos):
self.pos1 = pos
def setPos2(self, pos):
self.pos2 = pos
def setPort1(self, port):
self.m_port1 = port
self.m_port1.addConnection(self)
def setPort2(self, port):
self.m_port2 = port
self.m_port2.addConnection(self)
def updatePosFromPorts(self):
self.pos1 = self.m_port1.scenePos()+QPointF(self.m_port1.radius(),0)
self.pos2 = self.m_port2.scenePos()+QPointF(self.m_port2.radius(),0)
def updatePath(self):
path = QPainterPath()
path.moveTo(self.pos1)
dx = self.pos2.x() - self.pos1.x()
dy = self.pos2.y() - self.pos1.y()
ctr1 = QPointF(self.pos1.x() + dx * 0.25, self.pos1.y() + dy * 0.1)
ctr2 = QPointF(self.pos1.x() + dx * 0.75, self.pos1.y() + dy * 0.9)
path.cubicTo(ctr1, ctr2, self.pos2)
self.setPath(path)
def type(self):
return self.Type
def port1(self):
return self.m_port1
def port2(self):
return self.m_port2