class Channel(Connection): ''' Subclass of Connection used to draw channels between processes ''' in_sig = out_sig = None def __init__(self, process): ''' Set generic parameters from Connection class ''' super(Channel, self).__init__(process, process) self.label_in = QGraphicsTextItem('[]', parent=self) self.label_out = QGraphicsTextItem('[]', parent=self) if not Channel.in_sig: # keep at class level as long as only one process is supported # when copy-pasting a process the challel in/out signal lists # are not parsed. Workaround is to keep the list "global" # to allow a copy of both process and channel # Needed for the image exporter, that copies the scene to a # temporary one Channel.in_sig = '[{}]'.format(',\n'.join( sig['name'] for sig in process.input_signals)) Channel.out_sig = '[{}]'.format(',\n'.join( sig['name'] for sig in process.output_signals)) font = QFont('Ubuntu', pointSize=8) for each in (self.label_in, self.label_out): each.setFont(font) each.show() self.process = process self.reshape() @property def start_point(self): ''' Compute connection origin - redefined function ''' parent_rect = self.process.boundingRect() return QPointF(parent_rect.x(), parent_rect.height() / 2) @property def end_point(self): ''' Compute connection end point - redefined function ''' # Arrow always bumps at the screen edge try: view = self.scene().views()[0] view_pos = view.mapToScene( view.viewport().geometry()).boundingRect().topLeft() scene_pos_x = self.mapFromScene(view_pos).x() return QPointF(scene_pos_x, self.start_point.y()) except (IndexError, AttributeError): # In case there is no view (e.g. Export PNG from cmd line) return QPointF(self.start_point.x() - 250, self.start_point.y()) def reshape(self): ''' Redefine shape function to add the text areas ''' super(Channel, self).reshape() self.label_in.setPlainText(self.in_sig) self.label_out.setPlainText(self.out_sig) width_in = self.label_in.boundingRect().width() self.label_in.setX(self.start_point.x() - width_in) self.label_in.setY(self.start_point.y() + 5) self.label_out.setX(self.end_point.x() + 10) self.label_out.setY(self.end_point.y() + 5)
class Channel(Connection): ''' Subclass of Connection used to draw channels between processes ''' in_sig = out_sig = None def __init__(self, process): ''' Set generic parameters from Connection class ''' super(Channel, self).__init__(process, process) self.label_in = QGraphicsTextItem('[]', parent=self) self.label_out = QGraphicsTextItem('[]', parent=self) if not Channel.in_sig: # keep at class level as long as only one process is supported # when copy-pasting a process the challel in/out signal lists # are not parsed. Workaround is to keep the list "global" # to allow a copy of both process and channel # Needed for the image exporter, that copies the scene to a # temporary one Channel.in_sig = '[{}]'.format(',\n'.join(sig['name'] for sig in process.input_signals)) Channel.out_sig = '[{}]'.format(',\n'.join(sig['name'] for sig in process.output_signals)) font = QFont('Ubuntu', pointSize=8) for each in (self.label_in, self.label_out): each.setFont(font) each.show() self.process = process self.reshape() @property def start_point(self): ''' Compute connection origin - redefined function ''' parent_rect = self.process.boundingRect() return QPointF(parent_rect.x(), parent_rect.height() / 2) @property def end_point(self): ''' Compute connection end point - redefined function ''' # Arrow always bumps at the screen edge try: view = self.scene().views()[0] view_pos = view.mapToScene( view.viewport().geometry()).boundingRect().topLeft() scene_pos_x = self.mapFromScene(view_pos).x() return QPointF(scene_pos_x, self.start_point.y()) except (IndexError, AttributeError): # In case there is no view (e.g. Export PNG from cmd line) return QPointF(self.start_point.x() - 250, self.start_point.y()) def reshape(self): ''' Redefine shape function to add the text areas ''' super(Channel, self).reshape() self.label_in.setPlainText(self.in_sig) self.label_out.setPlainText(self.out_sig) width_in = self.label_in.boundingRect().width() self.label_in.setX(self.start_point.x() - width_in) self.label_in.setY(self.start_point.y() + 5) self.label_out.setX(self.end_point.x() + 10) self.label_out.setY(self.end_point.y() + 5)
class QNEPort(QGraphicsPathItem): (NamePort, TypePort) = (1, 2) (Type) = (QGraphicsItem.UserType + 1) def __init__(self, parent): super(QNEPort, self).__init__(parent) self.label = QGraphicsTextItem(self) self.radius_ = 4 self.margin = 3 self.widgetWidth = 50 self.setPen(QPen(QApplication.palette().text().color(), 1)) self.setBrush(QApplication.palette().highlight()) self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges) self.valueText = QNEValue(self) self.valueText.setPort(self) self.outputPort = QNEOutputPort(self) self.m_portFlags = 0 self.hasInput_ = False self.hasOutput_ = False self.m_block = None self.m_connections = [] def __del__(self): #print("Del QNEPort %s" % self.name) pass def delete(self): for connection in self.m_connections: connection.delete() if self.scene(): self.scene().removeItem(self) self.m_block = None self.m_connections = [] def setName(self, name): self.name = name self.label.setPlainText(name) self.label.setPos(self.radius_ + self.margin, -self.label.boundingRect().height() / 2) def setValue(self, value): self.value = value self.valueText.showValue(value) def setCanConnect(self, hasInput, hasOutput): self.hasInput_ = hasInput self.hasOutput_ = hasOutput if self.hasOutput_: self.outputPort.setVisible(True) else: self.outputPort.setVisible(False) path = QPainterPath() if self.hasInput_: path.addEllipse(0, -self.radius_, 2 * self.radius_, 2 * self.radius_) else: pass self.setPath(path) def setWidth(self, width): self.outputPort.setPos(width, 0) self.valueText.setPos( width - self.widgetWidth - self.radius_ - self.margin, -self.valueText.boundingRect().height() / 2) def setNEBlock(self, block): self.m_block = block def setPortFlags(self, flags): self.m_portFlags = flags if self.m_portFlags & self.TypePort: font = self.scene().font() font.setItalic(True) self.label.setFont(font) self.valueText.setVisible(False) self.setPath(QPainterPath()) elif self.m_portFlags & self.NamePort: font = self.scene().font() font.setBold(True) self.label.setFont(font) self.valueText.setVisible(False) self.setPath(QPainterPath()) def innerSize(self): fontmetrics = QFontMetrics(self.scene().font()) height = fontmetrics.height() width = fontmetrics.width(self.name) if self.m_portFlags == 0: width = width + self.widgetWidth return QSize(width, height) def type(self): return self.Type def radius(self): return self.radius_ def portName(self): return self.name def hasInput(self): return self.hasInput_ def hasOutput(self): return self.hasOutput_ def isInput(self): return True def isOutput(self): return False def block(self): return self.m_block def portFlags(self): return self.m_portFlags def addConnection(self, connection): self.m_connections.append(connection) def removeConnection(self, connection): try: self.m_connections.remove(connection) except: pass def connections(self): return self.m_connections def isConnected(self, other): for connection in self.m_connections: if connection.port1() == other or connection.port2() == other: return True return False def itemChange(self, change, value): if change == QGraphicsItem.ItemScenePositionHasChanged: for connection in self.m_connections: connection.updatePosFromPorts() connection.updatePath() return value
class QNEPort(QGraphicsPathItem): (NamePort, TypePort) = (1, 2) (Type) = (QGraphicsItem.UserType +1) def __init__(self, parent): super(QNEPort, self).__init__(parent) self.label = QGraphicsTextItem(self) self.radius_ = 4 self.margin = 3 self.widgetWidth = 50 self.setPen(QPen(QApplication.palette().text().color(), 1)) self.setBrush(QApplication.palette().highlight()) self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges) self.valueText = QNEValue(self) self.valueText.setPort(self) self.outputPort = QNEOutputPort(self) self.m_portFlags = 0 self.hasInput_ = False self.hasOutput_ = False self.m_block = None self.m_connections = [] def __del__(self): #print("Del QNEPort %s" % self.name) pass def delete(self): for connection in self.m_connections: connection.delete() if self.scene(): self.scene().removeItem(self) self.m_block = None self.m_connections = [] def setName(self, name): self.name = name self.label.setPlainText(name) self.label.setPos(self.radius_ + self.margin, -self.label.boundingRect().height()/2) def setValue(self, value): self.value = value self.valueText.showValue(value) def setAccess(self, access): self.valueText.setAccess(access) def setCanConnect(self, hasInput, hasOutput): self.hasInput_ = hasInput self.hasOutput_ = hasOutput if self.hasOutput_: self.outputPort.setVisible(True) else: self.outputPort.setVisible(False) path = QPainterPath() if self.hasInput_: path.addEllipse(0, -self.radius_, 2*self.radius_, 2*self.radius_) else: pass self.setPath(path) def setWidth(self, width): self.outputPort.setPos(width, 0) self.valueText.setPos(width - self.widgetWidth - self.radius_ - self.margin, -self.valueText.boundingRect().height()/2) def setNEBlock(self, block): self.m_block = block def setPortFlags(self, flags): self.m_portFlags = flags if self.m_portFlags & self.TypePort: font = self.scene().font() font.setItalic(True) self.label.setFont(font) self.valueText.setVisible(False) self.setPath(QPainterPath()) elif self.m_portFlags & self.NamePort: font = self.scene().font() font.setBold(True) self.label.setFont(font) self.valueText.setVisible(False) self.setPath(QPainterPath()) def innerSize(self): fontmetrics = QFontMetrics(self.scene().font()) height = fontmetrics.height() width = fontmetrics.width(self.name) if self.m_portFlags == 0: width = width + self.widgetWidth return QSize(width, height) def type(self): return self.Type def radius(self): return self.radius_ def portName(self): return self.name def hasInput(self): return self.hasInput_ def hasOutput(self): return self.hasOutput_ def isInput(self): return True def isOutput(self): return False def block(self): return self.m_block def portFlags(self): return self.m_portFlags def addConnection(self, connection): self.m_connections.append(connection) def removeConnection(self, connection): try: self.m_connections.remove(connection) except: pass def connections(self): return self.m_connections def isConnected(self, other): for connection in self.m_connections: if connection.port1() == other or connection.port2() == other: return True return False def itemChange(self, change, value): if change == QGraphicsItem.ItemScenePositionHasChanged: for connection in self.m_connections: connection.updatePosFromPorts() connection.updatePath() return value
class QNEPort(QGraphicsPathItem): (NamePort, TypePort) = (1, 2) (Type) = (QGraphicsItem.UserType +1) def __init__(self, parent): super(QNEPort, self).__init__(parent) self.label = QGraphicsTextItem(self) self.radius_ = 4 self.margin = 3 path = QPainterPath() path.addEllipse(-self.radius_, -self.radius_, 2*self.radius_, 2*self.radius_); self.setPath(path) self.setPen(QPen(Qt.darkRed)) self.setBrush(Qt.red) self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges) self.m_portFlags = 0 self.isOutput_ = False self.m_block = None self.m_connections = [] def __del__(self): #print("Del QNEPort %s" % self.name) pass def delete(self): for connection in self.m_connections: connection.delete() self.scene().removeItem(self) self.m_block = None self.m_connections = [] def setName(self, name): self.name = name self.label.setPlainText(name) def setIsOutput(self, isOutput): self.isOutput_ = isOutput if self.isOutput_: self.label.setPos(-self.radius_ - self.margin - self.label.boundingRect().width(), -self.label.boundingRect().height()/2); else: self.label.setPos(self.radius_ + self.margin, -self.label.boundingRect().height()/2); def setNEBlock(self, block): self.m_block = block def setPortFlags(self, flags): self.m_portFlags = flags if self.m_portFlags & self.TypePort: font = self.scene().font() font.setItalic(True) self.label.setFont(font) self.setPath(QPainterPath()) elif self.m_portFlags & self.NamePort: font = self.scene().font() font.setBold(True) self.label.setFont(font) self.setPath(QPainterPath()) def setPtr(self, ptr): self.m_ptr = ptr def type(self): return self.Type def radius(self): return self.radius_ def portName(self): return self.name def isOutput(self): return self.isOutput_ def block(self): return self.m_block def portFlags(self): return self.m_portFlags def ptr(self): return self.m_ptr; def addConnection(self, connection): self.m_connections.append(connection) def removeConnection(self, connection): try: self.m_connections.remove(connection) except: pass def connections(self): return self.m_connections def isConnected(self, other): for connection in self.m_connections: if connection.port1() == other or connection.port2() == other: return True return False def itemChange(self, change, value): if change == QGraphicsItem.ItemScenePositionHasChanged: for connection in self.m_connections: connection.updatePosFromPorts() connection.updatePath() return value