def start_upload(self): if not self.image_list.unsaved_files_dialog(with_discard=False): return # make list of items to upload upload_list = [] for image in self.image_list.get_selected_images(): params = self.get_upload_params(image) if not params: continue convert = self.get_conversion_function(image, params) if convert == 'omit': continue upload_list.append((image, convert, params)) if not upload_list: self.upload_button.setChecked(False) return self.upload_button.set_checked(True) self.upload_config.setEnabled(False) self.user_connect.setEnabled(False) # do uploading in separate thread, so GUI can continue self.upload_worker = UploadWorker(self.session_factory, upload_list) thread = QtCore.QThread(self) self.upload_worker.moveToThread(thread) self.upload_worker.upload_error.connect( self.upload_error, Qt.BlockingQueuedConnection) self.abort_upload.connect( self.upload_worker.abort_upload, Qt.DirectConnection) self.upload_worker.upload_progress.connect(self.upload_progress) thread.started.connect(self.upload_worker.start) self.upload_worker.finished.connect(self.uploader_finished) self.upload_worker.finished.connect(thread.quit) self.upload_worker.finished.connect(self.upload_worker.deleteLater) thread.finished.connect(thread.deleteLater) thread.start()
def __init__(self, session_factory, params): super(UploadWorker, self).__init__() self.session = session_factory(auto_refresh=False) self.params = params self.fileobj = None self.thread = QtCore.QThread(self) self.moveToThread(self.thread)
def copy_selected(self, move=False): copy_list = [] for item in self.file_list_widget.selectedItems(): name = item.data(Qt.UserRole) info = self.file_data[name] if (move and 'path' in info and self.image_list.get_image(info['path'])): # don't rename an open file logger.warning('Please close image %s before moving it', info['name']) else: copy_list.append(info) if not copy_list: return if move: self.move_button.set_checked(True) self.copy_button.setEnabled(False) else: self.copy_button.set_checked(True) self.move_button.setEnabled(False) self.last_file_copied = None, datetime.min # start file copier in a separate thread self.file_copier = FileCopier(self.source, copy_list, move, self.updating) self.file_copier_thread = QtCore.QThread(self) self.file_copier.moveToThread(self.file_copier_thread) self.file_copier.output.connect(self.file_copied) self.file_copier_thread.started.connect(self.file_copier.start) self.file_copier_thread.start()
def start_upload(self): if not self.image_list.unsaved_files_dialog(with_discard=False): return # make list of items to upload self.upload_list = [] for image in self.image_list.get_selected_images(): params = self.get_upload_params(image) if not params: continue convert = self.get_conversion_function(image, params) if convert == 'omit': continue self.upload_list.append((image, convert, params)) if not self.upload_list: self.upload_button.setChecked(False) return self.upload_button.set_checked(True) # start uploading in separate thread, so GUI can continue self.upload_worker = UploadWorker(self.session_factory) self.upload_worker_thread = QtCore.QThread(self) self.upload_worker.moveToThread(self.upload_worker_thread) self.upload_file.connect(self.upload_worker.upload_file) self.upload_worker.upload_progress.connect( self.total_progress.setValue) self.upload_worker.upload_file_done.connect(self.upload_file_done) self.upload_worker_thread.started.connect(self.upload_worker.start) self.upload_worker_thread.start() self.upload_config.setEnabled(False) self.user_connect.setEnabled(False) self.uploads_done = 0 self.next_upload()
def copy_selected(self): copy_list = [] for item in self.file_list_widget.selectedItems(): name = item.data(Qt.UserRole) copy_list.append(self.file_data[name]) if not copy_list: return self.copy_button.set_checked(True) self.last_file_copied = None, datetime.min # start file writer in a thread self.file_writer = FileWriter() self.file_writer_thread = QtCore.QThread(self) self.file_writer.moveToThread(self.file_writer_thread) self.file_writer.output.connect(self.file_copied) self.file_writer_thread.start() # start file reader in another thread self.file_reader = FileReader(self.source, copy_list) self.file_reader_thread = QtCore.QThread(self) self.file_reader.moveToThread(self.file_reader_thread) self.file_reader.output.connect(self.file_writer.input) self.file_reader_thread.started.connect(self.file_reader.start) self.file_reader_thread.start()
def authorise(self): with Busy(): # do full authentication procedure if self.auth_server: self.auth_server.running = False self.auth_server_thread.quit() self.auth_server = AuthServer() self.auth_server_thread = QtCore.QThread(self) self.auth_server.moveToThread(self.auth_server_thread) self.auth_server.response.connect(self.auth_response) self.auth_server_thread.started.connect(self.auth_server.start) self.auth_server_thread.start() redirect_uri = 'http://127.0.0.1:' + str(self.auth_server.port) auth_url = self.session.get_auth_url(redirect_uri) if not webbrowser.open(auth_url, new=2, autoraise=0): logger.error('Failed to open web browser') self.auth_server.running = False self.auth_server = None self.auth_server_thread.quit()
def authorise(self): with Busy(): # do full authentication procedure http_server = HTTPServer(('127.0.0.1', 0), AuthRequestHandler) redirect_uri = 'http://127.0.0.1:' + str(http_server.server_port) auth_url = self.session.get_auth_url(redirect_uri) if not auth_url: logger.error('Failed to get auth URL') http_server.server_close() return server = AuthServer() thread = QtCore.QThread(self) server.moveToThread(thread) server.server = http_server server.response.connect(self.auth_response) thread.started.connect(server.handle_requests) server.finished.connect(thread.quit) server.finished.connect(server.deleteLater) thread.finished.connect(thread.deleteLater) thread.start() if QtGui.QDesktopServices.openUrl(QtCore.QUrl(auth_url)): return logger.error('Failed to open web browser')
def copy_selected(self, move=False): copy_list = [] for item in self.file_list_widget.selectedItems(): name = item.data(Qt.UserRole) info = self.file_data[name] if (move and 'path' in info and self.image_list.get_image(info['path'])): # don't rename an open file logger.warning('Please close image %s before moving it', info['name']) else: copy_list.append(info) if not copy_list: return if move: self.move_button.set_checked(True) self.copy_button.setEnabled(False) else: self.copy_button.set_checked(True) self.move_button.setEnabled(False) last_file_copied = None, datetime.min copier_result = deque() # start file copier in a separate thread self.file_copier = FileCopier(self.source, copy_list, move, copier_result) copier_thread = QtCore.QThread(self) self.file_copier.moveToThread(copier_thread) copier_thread.started.connect(self.file_copier.start) copier_thread.start() # show files as they're copied while self.file_copier.running: if copier_result: info, status = copier_result.popleft() if not info: # copier thread has finished break if status != 'ok': self._fail() break if last_file_copied[1] < info['timestamp']: last_file_copied = info['dest_path'], info['timestamp'] for n in range(self.file_list_widget.count()): item = self.file_list_widget.item(n) if item.data(Qt.UserRole) == info['name']: item.setFlags(Qt.NoItemFlags) self.file_list_widget.scrollToItem( item, QtWidgets.QAbstractItemView.PositionAtTop) self.selection_changed() break self.image_list.open_file(info['dest_path']) else: # wait for copier result self.app.processEvents() self.move_button.set_checked(False) self.copy_button.set_checked(False) self.file_copier = None copier_thread.quit() copier_thread.wait() if last_file_copied[0]: self.config_store.set(self.config_section, 'last_transfer', last_file_copied[1].isoformat(' ')) self.image_list.done_opening(last_file_copied[0]) self.list_files()