# HG changeset patch # User windel # Date 1352627386 -3600 # Node ID f506f6b7469709bda2deeacea3f66780ed65c064 # Parent 191d70a0ed5248cd8269d9a3b9e5d54bf992c0fc Cleanup diff -r 191d70a0ed52 -r f506f6b74697 python/apps/diagrameditor.py --- a/python/apps/diagrameditor.py Sat Nov 10 11:53:55 2012 +0100 +++ b/python/apps/diagrameditor.py Sun Nov 11 10:49:46 2012 +0100 @@ -19,12 +19,19 @@ path.lineTo(pt) return path +def equalSpace(n, l): + offset = 15 + if n == 1: + return [l / 2] + elif n > 1: + return [offset + (l - offset*2)/(n - 1)*i for i in range(n)] + return [] + class Connection(QGraphicsPathItem): """ Implementation of a connection between blocks """ def __init__(self, fromPort, toPort): super(Connection, self).__init__() - self.pos1, self.pos2 = None, None - self.fromPort, self.toPort = None, None + self.pos2 = self.fromPort = self.toPort = None self.setFlag(self.ItemIsSelectable, True) self.setFlag(self.ItemClipsToShape, True) pen = QPen(Qt.blue, 2) @@ -39,7 +46,7 @@ self.setToPort(toPort) def mouseDoubleClickEvent(self, event): pos = event.scenePos() - pts = [self.pos1] + [v.pos() for v in self.vias] + [self.pos2] + pts = [self.getPos1()] + [v.pos() for v in self.vias] + [self.pos2] idx = 0 tidx = 0 for p1, p2 in zip(pts[0:-1], pts[1:]): @@ -70,7 +77,6 @@ self.setFromPort(None) self.setToPort(None) scene.removeItem(self) - def setFromPort(self, fromPort): if self.fromPort: self.fromPort.posCallbacks.remove(self.setBeginPos) @@ -78,7 +84,7 @@ self.fromPort = fromPort if self.fromPort: self.fromPort.connection = self - self.setBeginPos(fromPort.scenePos()) + self.updateLineStukken() self.fromPort.posCallbacks.append(self.setBeginPos) def setToPort(self, toPort): if self.toPort: @@ -89,8 +95,10 @@ self.setEndPos(toPort.scenePos()) self.toPort.connection = self self.toPort.posCallbacks.append(self.setEndPos) + def getPos1(self): + if self.fromPort: + return self.fromPort.scenePos() def setBeginPos(self, pos1): - self.pos1 = pos1 self.updateLineStukken() def setEndPos(self, endpos): self.pos2 = endpos @@ -107,9 +115,10 @@ This algorithm determines the optimal routing of all signals. TODO: implement nice automatic line router """ - if self.pos1 is None or self.pos2 is None: + pos1 = self.getPos1() + if pos1 is None or self.pos2 is None: return - pts = [self.pos1] + [v.pos() for v in self.vias] + [self.pos2] + pts = [pos1] + [v.pos() for v in self.vias] + [self.pos2] self.arrowhead.setPos(self.pos2) if pts[-1].x() < pts[-2].x(): self.arrowhead.setRotation(-90) @@ -164,7 +173,6 @@ pen = QPen(Qt.blue, 2) pen.setCapStyle(Qt.RoundCap) self.setPen(pen) - self.name = name self.textItem = QGraphicsTextItem(name, self) self.setName(name) self.posCallbacks = [] @@ -209,9 +217,6 @@ """ Move function without moving the other selected elements """ p = self.mapToParent(event.pos()) self.setPos(p) - def mySetPos(self, p): - # TODO: use this instead of itemChange? - self.setPos(p) def itemChange(self, change, value): if change == self.ItemPositionChange: for cb in self.posChangeCallbacks: @@ -264,12 +269,11 @@ self.buttonItemAddOutput = QGraphicsProxyWidget(self) self.buttonItemAddOutput.setWidget(button) self.buttonItemAddOutput.setVisible(False) - # Inputs and outputs of the block: self.inputs = [] self.outputs = [] # Update size: - self.sizer.mySetPos(QPointF(60, 40)) # This is a better resize function + self.sizer.setPos(QPointF(60, 40)) # This is a better resize function def editParameters(self): pd = ParameterDialog(self, self.window()) pd.exec_() @@ -290,7 +294,6 @@ def addOutput(self, o): self.outputs.append(o) self.updateSize() - def contextMenuEvent(self, event): menu = QMenu() pa = menu.addAction('Parameters') @@ -302,54 +305,27 @@ child.setVisible(value) return super(BlockItem, self).itemChange(change, value) def myDelete(self): - # TODO: move the below to blockitem: scene = self.scene() if scene: for p in self.inputs + self.outputs: if p.connection: p.connection.myDelete() scene.removeItem(self) - def updateSize(self): rect = self.rect() h, w = rect.height(), rect.width() self.buttonItemAddInput.setPos(0, h + 4) self.buttonItemAddOutput.setPos(w+10, h+4) - for inp in self.inputs: - inp.setX(0.0) - for inp in self.outputs: - inp.setX(w) - if len(self.inputs) == 1: - self.inputs[0].setPos(0.0, h / 2) - elif len(self.inputs) > 1: - y = 15 - dy = (h - 30) / (len(self.inputs) - 1) - for inp in self.inputs: - inp.setPos(0.0, y) - y += dy - if len(self.outputs) == 1: - self.outputs[0].setPos(w, h / 2) - elif len(self.outputs) > 1: - y = 15 - dy = (h - 30) / (len(self.outputs) - 1) - for outp in self.outputs: - outp.setPos(w, y) - y += dy - + for inp, y in zip(self.inputs, equalSpace(len(self.inputs), h)): + inp.setPos(0.0, y) + for outp, y in zip(self.outputs, equalSpace(len(self.outputs), h)): + outp.setPos(w, y) def changeSize(self, p): - """ Resize block function """ - w, h = p.x(), p.y() - # Limit the block size: - h = 20 if h < 20 else h - w = 40 if w < 40 else w + h = 20 if p.y() < 20 else p.y() + w = 40 if p.x() < 40 else p.x() self.setRect(0.0, 0.0, w, h) - # center label: rect = self.label.boundingRect() - lw, lh = rect.width(), rect.height() - lx = (w - lw) / 2 - ly = (h - lh) / 2 - self.label.setPos(lx, ly) - # Update port positions: + self.label.setPos((w - rect.width()) / 2, (h - rect.height()) / 2) self.updateSize() return QPointF(w, h) @@ -377,7 +353,6 @@ def test(self): self.rotate(30) self.zoomAll() - def wheelEvent(self, event): pos = event.pos() posbefore = self.mapToScene(pos) @@ -415,12 +390,10 @@ def __init__(self, parent=None): super(DiagramScene, self).__init__(parent) self.startedConnection = None - def saveDiagram(self, filename): items = self.items() blocks = [item for item in items if type(item) is BlockItem] connections = [item for item in items if type(item) is Connection] - doc = md.Document() modelElement = doc.createElement('system') doc.appendChild(modelElement) @@ -540,12 +513,12 @@ super(DiagramScene, self).mouseMoveEvent(event) def mouseReleaseEvent(self, event): if self.startedConnection: - items = self.items(event.scenePos()) - for item in items: + for item in self.items(event.scenePos()): if type(item) is PortItem: - self.startedConnection.setToPort(item) - self.startedConnection = None - return + if item.direction == 'input' and item.connection == None: + self.startedConnection.setToPort(item) + self.startedConnection = None + return self.startedConnection.myDelete() self.startedConnection = None super(DiagramScene, self).mouseReleaseEvent(event) @@ -555,7 +528,6 @@ self.startedConnection.setEndPos(pos) self.addItem(self.startedConnection) def deleteItems(self): - # Try to delete all currently selected items: for item in list(self.selectedItems()): item.myDelete() @@ -600,14 +572,11 @@ act('Load', QKeySequence.Open, self.editor.load) act('Full screen', QKeySequence("F11"), self.toggleFullScreen) act('Fit in view', QKeySequence("F8"), self.editor.zoomAll) - self.library = LibraryWidget() libraryDock = QDockWidget('Library', self) libraryDock.setWidget(self.library) self.addDockWidget(Qt.LeftDockWidgetArea, libraryDock) - self.editor.loadDiagram('diagram2.usd') - def toggleFullScreen(self): self.setWindowState(self.windowState() ^ Qt.WindowFullScreen) self.editor.zoomAll() @@ -616,7 +585,6 @@ if sys.version_info.major != 3: print('Please use python 3.x') sys.exit(1) - app = QApplication(sys.argv) main = Main() main.show()