def dropEvent(self, e): """Accept drop events.""" model = QStandardItemModel() model.dropMimeData( e.mimeData(), Qt.CopyAction, 0, 0, QModelIndex()) name = model.item(0).text() item = None if name in ['And', 'Or', 'Nand', 'Nor', 'Not', 'Xor', 'Xnor']: item = CircuitItem( getattr(engine.gates, name + 'Gate')(None, self.mainCircuit)) elif name == 'RSFlipFlop': item = CircuitItem(RSFlipFlop(None, self.mainCircuit)) elif name == 'JKFlipFlop': item = CircuitItem(JKFlipFlop(None, self.mainCircuit)) elif name == self.str_I: item = PlugItem(Plug(True, None, self.mainCircuit)) elif name == self.str_O: item = PlugItem(Plug(False, None, self.mainCircuit)) elif name == self.str_Clock: if not self.clockPlug: self.clockPlug = Clock(self.mainCircuit) self.clockPlug.clkThread.set_extern(self.clockUpdate) item = PlugItem(self.clockPlug) else: self.write(self.str_onlyOneClock) elif model.item(0, 1).text() == 'user': c = Circuit(None, self.mainCircuit) f = open(filePath('user/') + name + '.crc', 'rb') children = pickle.load(f) f.close() for child in children: if isinstance(child[0], Plug): child[0].owner = c if child[0].isInput: c.inputList.append(child[0]) else: c.outputList.append(child[0]) elif isinstance(child[0], Circuit): child[0].owner = c c.circuitList.append(child[0]) c.category = name item = CircuitItem(c) if item: # Fixes the default behaviour of centering the first # item added to scene. if not len(self.scene().items()): self.scene().setSceneRect(0, 0, 1, 1) else: self.scene().setSceneRect(0, 0, 0, 0) self.scene().addItem(item) item.setupPaint() item.setPos( closestGridPoint(item.mapFromScene(self.mapToScene(e.pos())))) for i in self.scene().selectedItems(): i.setSelected(False) item.setSelected(True) self.timer.start()