class transferMonitorWidget(QDockWidget): def __init__(self, mainWindow): super(QDockWidget, self).__init__(mainWindow) self.setToolTip( self.tr("Allows for monitoring and control of file transfers.")) self.setWindowTitle(self.tr("Transfer Monitor")) self.transferDict = {} self.transferTable = QTableWidget(0, 3, mainWindow) self.transferTable.setHorizontalHeaderLabels( ["Client", "Filename", "Status"]) self.widget = QWidget(mainWindow) self.status = QLabel("Initializing", mainWindow) self.layout = QBoxLayout(2) self.layout.addWidget(self.transferTable) self.layout.addWidget(self.status) self.widget.setLayout(self.layout) self.setWidget(self.widget) self.setObjectName("Transfer Monitor") mainWindow.addDockWidget(Qt.BottomDockWidgetArea, self) self.hide() def updateItem(self, client, filename, status): '''Update the status of a transfer, creating a new table row for it if it's new.''' if client.username + filename not in list(self.transferDict.keys()): self.transferDict[client.username + filename] = self.transferTable.rowCount() self.transferTable.setRowCount(self.transferTable.rowCount() + 1) for column in (0, 1, 2): self.transferTable.setItem(self.transferTable.rowCount() - 1, column, QTableWidgetItem("")) self.transferTable.item(self.transferTable.rowCount() - 1, column).setFlags(Qt.NoItemFlags) self.transferTable.item(self.transferDict[client.username + filename], 0).setText(client.username) self.transferTable.item(self.transferDict[client.username + filename], 1).setText(filename) self.transferTable.item(self.transferDict[client.username + filename], 2).setText(status) self.transferTable.update() self.update() def processFileEvent(self, client, filename, event): '''Process a raw file/general status event.''' if len(filename) > 1: self.updateItem(client, filename, event) else: self.status.setText(event) self.update() def processPartialTransferEvent(self, client, filename, size, processed): '''Process a partial transfer event.''' processedAmount = "".join( (UNICODE_STRING(round(float(processed) / float(size) * 100, 1)), "%")) self.updateItem(client, filename, processedAmount)
class scratchPadWidget(QDockWidget): """A mutually-editable shared text widget.""" def __init__(self, mainWindow): """Initializes the user list.""" super(QDockWidget, self).__init__(mainWindow) self.setWindowTitle(self.tr("Scratch Pad")) self.widget = QWidget(mainWindow) self.textArea = QTextEdit(mainWindow) self.currentEditingLabel = QLabel("No one is editing.") self.getLockButton = QPushButton("Edit") self.releaseLockButton = QPushButton("Confirm") #self.saveToFileButton = QPushButton("Save...") #self.loadButton = QPushButton("Load") self.layout = QGridLayout() self.layout.addWidget(self.currentEditingLabel, 0, 0, 1, 2) self.layout.addWidget(self.textArea, 1, 0, 1, 2) self.layout.addWidget(self.getLockButton, 2, 0) self.layout.addWidget(self.releaseLockButton, 2, 1) self.releaseLockButton.pressed.connect(self._releaseLock) self.getLockButton.pressed.connect(self._getLock) self.widget.setLayout(self.layout) self.setWidget(self.widget) self.setObjectName("Scratch Pad Widget") self.hasLock = False self.updateButtonStatus() try: with open(ospath.join(SAVE_DIR, "scratchpad.txt"), 'r') as autosave: self.textArea.setText(autosave.read()) except: pass mainWindow.addDockWidget(Qt.BottomDockWidgetArea, self) @property def currentText(self): return self.textArea.toPlainText() def updateButtonStatus(self): self.getLockButton.setEnabled(not self.hasLock) self.textArea.setReadOnly(not self.hasLock) self.releaseLockButton.setEnabled(self.hasLock) def _getLock(self): self.getScratchPadLock.emit() def _releaseLock(self): self.updateScratchPad.emit() self.releaseScratchPadLock.emit() def getLock(self): self.hasLock = True self.updateButtonStatus() def releaseLock(self, name): self.hasLock = False if name: self.currentEditingLabel.setText("%s is editing." % name) else: self.currentEditingLabel.setText("No one is editing.") self.updateButtonStatus() def updateText(self, txt): if len(txt) > 100000: print("Excessively long scratchpad data received. Might be an attack or just a bug.") return self.textArea.setText(txt) try: with open(ospath.join(SAVE_DIR, "scratchpad.txt"), 'w') as autosave: autosave.write(txt) except: pass getScratchPadLock = signal(doc= """Called to request lock for scratch pad.""" ) releaseScratchPadLock = signal(doc= """Called to indicate relinquishment of scratch pad lock.""" ) updateScratchPad = signal(doc= """Called to request that the scratchpad be updated.""" )