def upload(self): # login = self.storagonSDK.login(self.mainWindow.username, self.mainWindow.password) # if login: if self.mainWindow.logined: filename = str(self.upload_file).split('/').pop().split('#')[0] self.chooseFileToDownload(filename) if filename in self.threaddownload.keys(): th = self.threaddownload[filename] # thread bi pause, gio cho download tiep if th.downloadFolder == self.fileSavePath and th.pausenow: th.pausenow = False else: self.th = UploadThread(self, filename, self.upload_file, self.mainWindow.username, self.mainWindow.password, folder_id=None) self.th.start() self.threaddownload[filename] = self.th self.mainWindow.trayIcon.showMessage('Uploading ', filename.decode('utf-8')) self.th.finished.connect(lambda: self.upload_complete_signal.emit(str(filename))) else: self.mainWindow.alertAutoClose('Error', "You have not login")
class tabUpload(QtGui.QWidget): trigger = pyqtSignal(long, str) input_link_signal = pyqtSignal(str) def __init__(self, mainWindow, upload_complete_signal): super(tabUpload, self).__init__(mainWindow) self.mainWindow = mainWindow self.storagonSDK = StoragonSDK(serverURL) self.upload_complete_signal = upload_complete_signal self.Ui_tabDownloadForm = Ui_tabUploadForm() self.Ui_tabDownloadForm.setupUi(self) self.table = self.Ui_tabDownloadForm.tableWidget self.table.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.openDownloadMenu) self.setTableWidth() self.show() self.mainWindow = mainWindow self.trigger.connect(self.updateStatus) self.input_link_signal.connect(self.chooseFileToDownload) self.queue = Queue(maxsize=10) # self.Ui_tabDownloadForm.btn_addfile.setIcon(QtGui.QIcon(resource_path('add.png'))) self.clip = self.mainWindow.clip # self.Ui_tabDownloadForm.btn_addfile.setIconSize(QtCore.QSize(24, 24)) self.Ui_tabDownloadForm.choose_upload_file.setIcon(QtGui.QIcon(resource_path('upload2.png'))) self.max_thread_upload = 4 self.running_thread = 0 self.fileSavePath = os.path.expanduser("~") self.upload_file = None self.Ui_tabDownloadForm.choose_upload_file.clicked.connect(self.choose_path) self.file_to_download = [] self.threaddownload = {} self.temp_filename = '' def choose_path(self): f = str(QFileDialog.getOpenFileName(self, "Select File to Upload")) self.upload_file = f self.upload() def upload(self): # login = self.storagonSDK.login(self.mainWindow.username, self.mainWindow.password) # if login: if self.mainWindow.logined: filename = str(self.upload_file).split('/').pop().split('#')[0] self.chooseFileToDownload(filename) if filename in self.threaddownload.keys(): th = self.threaddownload[filename] # thread bi pause, gio cho download tiep if th.downloadFolder == self.fileSavePath and th.pausenow: th.pausenow = False else: self.th = UploadThread(self, filename, self.upload_file, self.mainWindow.username, self.mainWindow.password, folder_id=None) self.th.start() self.threaddownload[filename] = self.th self.mainWindow.trayIcon.showMessage('Uploading ', filename.decode('utf-8')) self.th.finished.connect(lambda: self.upload_complete_signal.emit(str(filename))) else: self.mainWindow.alertAutoClose('Error', "You have not login") # sys.exit(1) def updateStatus(self, threadID, status=None, file_size=None, speed=None, links=None, error=None): # print "Update status here" threadID = unicode(threadID) num_row = self.table.rowCount() for i in range(num_row): try: filename = unicode(self.table.item(i, 0).text()) except: continue if filename == threadID: if file_size: size_item = self.table.item(i, 1) size_item.setText(str(file_size) + ' byte') if speed: status_item = self.table.item(i, 2) message = status + " " + speed status_item.setText(str(message)) elif error: error_item = self.table.item(i, 2) error_item.setText("Error: " + str(error)) self.running_thread -= 1 elif status: status_item = self.table.item(i, 2) status_item.setText(status) # self.table.update(self.table.indexFromItem(status_item)) if status == 'Completed': print("Upload Complete !") self.running_thread -= 1 status_item = self.table.item(i, 2) status_item.setText(status) if links: status_item = self.table.item(i, 3) status_item.setText(links) return True def setTableWidth(self): width = QtGui.QDesktopWidget().width() / 8 for i in range(self.table.columnCount()): self.table.setColumnWidth(i, width) def openDownloadMenu(self, position): menu = QtGui.QMenu(self) Action_pause = menu.addAction('&Pause') Action_pause.triggered.connect(self.run_pause_selected) Action_resume = menu.addAction('&Resume') Action_resume.triggered.connect(self.run_resume_selected) Action_stop = menu.addAction('&Stop And Remove') Action_stop.triggered.connect(self.run_remove_selected) Action_coppy = menu.addAction('&Coppy Download Link') Action_coppy.triggered.connect(self.coppy_download_link) menu.exec_(self.table.viewport().mapToGlobal(position)) def openFolderPath(self, path): if sys.platform == 'darwin': subprocess.call(['open', '--', path]) elif sys.platform == 'linux2': os.system('xdg-open {0}'.format(path)) elif sys.platform == 'win32': print ("Path : %s" % path) ctypes.windll.shell32.ShellExecuteW(None, u'open', u'explorer.exe', u'/n,/select, ' + path, None, 1) def coppy_download_link(self): rows = self.table.selectionModel().selectedRows() for row in rows: r = row.row() status = str(self.table.item(r, 2).text()) if status.find('Completed') != -1: link_download = unicode(self.table.item(r, 3).text()) self.clip.setText(link_download) QtGui.QMessageBox.information(self, 'Infomation', "Link Coppied", QtGui.QMessageBox.Ok) def run_pause_selected(self): row_selected = list(set([item.row() for item in self.table.selectedItems()])) if not row_selected: QtGui.QMessageBox.warning(self, 'Warning', "Please Choose File(s) To Pause", QtGui.QMessageBox.Ok) else: for row in row_selected: filename = unicode(self.table.item(row, 0).text()) for threadID in self.threaddownload.keys(): if threadID == filename: th = self.threaddownload[threadID] if not th.pausenow: th.pausenow = True self.running_thread -= 1 status_item = self.table.item(row, 2) message = "Paused" status_item.setText(str(message)) def run_resume_selected(self): row_selected = list(set([item.row() for item in self.table.selectedItems()])) if not row_selected: row_selected = range(self.table.rowCount()) error = 0 list_remove_thread = [] for row in row_selected: filename = unicode(self.table.item(row, 0).text()) for threadID in self.threaddownload.keys(): if threadID == filename: th = self.threaddownload[threadID] if th.pausenow: if self.running_thread < self.maxthreaddownload: th.pausenow = False self.running_thread += 1 else: error = 1 else: status = self.table.item(row, 2).text() # Thread bi loi va gio nguoi dung resume if status.find('Error') != -1: if self.running_thread < self.maxthreaddownload: self.fileToDownload.append(filename) list_remove_thread.append(filename) self.running_thread -= 1 else: error = 1 if list_remove_thread: for th in list_remove_thread: del self.threaddownload[th] self.download() if error == 1: QtGui.QMessageBox.warning(self, 'Warning', "Number Of Running Thread Is Maximum. Please" + "Wait Until Other Files Completed", QtGui.QMessageBox.Ok) def run_remove_selected(self): row_selected = list(set([item.row() for item in self.table.selectedItems()])) while len(row_selected): row = row_selected.pop(0) if len(row_selected): row_selected = [row - 1 for row in row_selected] file_path = unicode(self.table.item(row, 0).text()) status = unicode(self.table.item(row, 2).text()) self.table.removeRow(row) def showinputbox(self): if self.inputbox is None: self.inputbox = tabDownload_InputBox(tab_download=self) def chooseFileToDownload(self, filename): curRow = self.table.rowCount() self.table.insertRow(curRow) self.table.setItem(curRow, 0, QtGui.QTableWidgetItem(filename.decode('utf-8'))) self.table.setItem(curRow, 1, QtGui.QTableWidgetItem(u'Updating...')) self.table.setItem(curRow, 2, QtGui.QTableWidgetItem(u'Ready')) self.table.setItem(curRow, 3, QtGui.QTableWidgetItem())