示例#1
0
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)
示例#2
0
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."""
	)