# HG changeset patch # User windel # Date 1352791019 -3600 # Node ID 44f075fe71ebb7fc489918c793c4420cd6be9e7c # Parent 85bfa15c01f1158dbd87342f7f5efa92b10416d4 Changed to use inputport and outputport diff -r 85bfa15c01f1 -r 44f075fe71eb python/apps/diagrameditor.py --- a/python/apps/diagrameditor.py Mon Nov 12 20:25:41 2012 +0100 +++ b/python/apps/diagrameditor.py Tue Nov 13 08:16:59 2012 +0100 @@ -132,19 +132,13 @@ class PortItem(QGraphicsPathItem): """ Represents a port to a subsystem """ - def __init__(self, name, block, direction): + def __init__(self, name, block): super(PortItem, self).__init__(block) + self.textItem = QGraphicsTextItem(self) self.connection = None - d = 10.0 - if direction == 'input': - self.setPath(buildPath([QPointF(-d, -d), QPointF(0, 0), QPointF(-d, d)])) - else: - self.setPath(buildPath([QPointF(0.0, -d), QPointF(d, 0), QPointF(0.0, d)])) - self.direction = direction self.block = block self.setCursor(QCursor(Qt.CrossCursor)) self.setPen(QPen(Qt.blue, 2, cap=Qt.RoundCap)) - self.textItem = QGraphicsTextItem(self) self.name = name self.posCallbacks = [] self.setFlag(self.ItemSendsScenePositionChanges, True) @@ -153,25 +147,30 @@ self.textItem.setPlainText(name) rect = self.textItem.boundingRect() lw, lh = rect.width(), rect.height() - lx = 3 if self.direction == 'input' else -3 - lw + lx = 3 if type(self) is InputPort else -3 - lw self.textItem.setPos(lx, -lh / 2) name = property(getName, setName) - def getDict(self): - return {'name': self.name} + def getDict(self): return {'name': self.name} Dict = property(getDict) def itemChange(self, change, value): if change == self.ItemScenePositionHasChanged: - for cb in self.posCallbacks: - cb(value) + for cb in self.posCallbacks: cb(value) return value return super(PortItem, self).itemChange(change, value) - def mousePressEvent(self, event): - if self.direction == 'output': - self.scene().startConnection(self) class OutputPort(PortItem): - # TODO: create a subclass OR make a member porttype - pass + def __init__(self, name, block): + super(OutputPort, self).__init__(name, block) + d = 10.0 + self.setPath(buildPath([QPointF(0.0, -d), QPointF(d, 0), QPointF(0.0, d)])) + def mousePressEvent(self, event): + self.scene().startConnection(self) + +class InputPort(PortItem): + def __init__(self, name, block): + super(InputPort, self).__init__(name, block) + d = 10.0 + self.setPath(buildPath([QPointF(-d, -d), QPointF(0, 0), QPointF(-d, d)])) class HandleItem(QGraphicsEllipseItem): """ A handle that can be moved by the mouse """ @@ -240,10 +239,10 @@ view.zoomAll() def newInputPort(self): names = [i.name for i in self.inputs + self.outputs] - self.addInput(PortItem(uniqify('in', names), self, 'input')) + self.addInput(InputPort(uniqify('in', names), self)) def newOutputPort(self): names = [i.name for i in self.inputs + self.outputs] - self.addOutput(PortItem(uniqify('out', names), self, 'output')) + self.addOutput(OutputPort(uniqify('out', names), self)) def setName(self, name): self.label.setPlainText(name) def getName(self): return self.label.toPlainText() name = property(getName, setName) @@ -260,10 +259,8 @@ self.code = d['code'] self.setPos(d['x'], d['y']) self.sizer.setPos(d['width'], d['height']) - for inp in d['inputs']: - self.addInput(PortItem(inp['name'], self, 'input')) - for outp in d['outputs']: - self.addOutput(PortItem(outp['name'], self, 'output')) + for inp in d['inputs']: self.addInput(InputPort(inp['name'], self)) + for outp in d['outputs']: self.addOutput(OutputPort(outp['name'], self)) Dict = property(getDict, setDict) def addInput(self, i): self.inputs.append(i) @@ -368,7 +365,7 @@ class ModelHierarchyModel(QStandardItemModel): def __init__(self): super(ModelHierarchyModel, self).__init__() - self.items = [] + self.rootDiagram = DiagramScene() def flags(self, idx): if idx.isValid(): return Qt.ItemIsSelectable | Qt.ItemIsEnabled @@ -399,24 +396,18 @@ c = Connection(fromPort, toPort) self.addItem(c) def getDict(self): - d = {} - d['blocks'] = [b.Dict for b in self.blocks] - d['connections'] = [c.Dict for c in self.connections] - return d + return {'blocks': [b.Dict for b in self.blocks], 'connections': [c.Dict for c in self.connections]} Dict = property(getDict, setDict) def findPort(self, blockname, portname): block = self.findBlock(blockname) if block: for port in block.inputs + block.outputs: - if port.name == portname: - return port + if port.name == portname: return port def findBlock(self, blockname): - blocks = [item for item in self.items() if type(item) is BlockItem] - for block in blocks: - if block.name == blockname: - return block + for block in self.blocks: + if block.name == blockname: return block def addNewBlock(self, pos, name): - blocknames = [item.name for item in self.items() if type(item) is BlockItem] + blocknames = [item.name for item in self.blocks] b1 = BlockItem(uniqify(name, blocknames)) b1.setPos(pos) self.addItem(b1) @@ -428,11 +419,10 @@ def mouseReleaseEvent(self, event): if self.startedConnection: for item in self.items(event.scenePos()): - if type(item) is PortItem: - if item.direction == 'input' and item.connection == None: - self.startedConnection.setToPort(item) - self.startedConnection = None - return + if type(item) is InputPort and item.connection == None: + self.startedConnection.setToPort(item) + self.startedConnection = None + return self.startedConnection.myDelete() self.startedConnection = None super(DiagramScene, self).mouseReleaseEvent(event) @@ -517,6 +507,6 @@ main.show() main.resize(700, 500) main.editor.model = loadModel('diagram4.usd') - main.editor.zoomAll() + #main.editor.model = DiagramScene() app.exec_()