diff --git a/__main__.py b/__main__.py index bdf1420..5a49baa 100755 --- a/__main__.py +++ b/__main__.py @@ -28,7 +28,6 @@ Information dialog widget Context menu: Cache, Read, Edit database, delete, Mark read/unread Set focus to newly added file - Better way to thread than subprocess QThread Reading: ✓ Drop down for TOC ✓ Override the keypress event of the textedit @@ -42,7 +41,7 @@ ✓ Selectable background color for QGraphicsView ✓ View modes for QGraphicsView ✓ View and hide toolbar actions in a list - Comic view kayboard shortcuts + Comic view keyboard shortcuts Record progress Pagination Set context menu for definitions and the like @@ -113,8 +112,10 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): self.statusBar.addPermanentWidget(self.statusMessage) self.sorterProgress = QtWidgets.QProgressBar() self.sorterProgress.setObjectName('sorterProgress') + sorter.progressbar = self.sorterProgress # This is so that updates can be + # connected to setValue self.statusBar.addWidget(self.sorterProgress) - self.sorterProgress.hide() + self.sorterProgress.setVisible(False) # Init the QListView self.lib_ref = Library(self) @@ -247,10 +248,16 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): if my_file[0]: self.last_open_path = os.path.dirname(my_file[0][0]) + self.sorterProgress.setVisible(True) + self.statusMessage.setText('Adding books...') self.thread = BackGroundBookAddition(self, my_file[0], self.database_path) - self.thread.finished.connect(self.lib_ref.create_proxymodel) + self.thread.finished.connect(self.move_on) self.thread.start() + def move_on(self): + self.sorterProgress.setVisible(False) + self.lib_ref.create_proxymodel() + def delete_books(self): selected_books = self.listView.selectedIndexes() if selected_books: @@ -394,7 +401,6 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): file_paths, 'reading', self.database_path, - self, self.temp_dir.path()).initiate_threads() found_a_focusable_tab = False diff --git a/database.py b/database.py index 2154569..94a2bd0 100644 --- a/database.py +++ b/database.py @@ -119,7 +119,11 @@ class DatabaseFunctions: pickled_position = pickle.dumps(position) sql_command = "UPDATE books SET Position = ? WHERE Hash = ?" - self.database.execute(sql_command, [sqlite3.Binary(pickled_position), file_hash]) + try: + self.database.execute(sql_command, [sqlite3.Binary(pickled_position), file_hash]) + except sqlite3.OperationalError: + print('SQLite is in rebellion, Commander') + return self.database.commit() self.close_database() diff --git a/sorter.py b/sorter.py index 1bd57f2..ec4f83d 100644 --- a/sorter.py +++ b/sorter.py @@ -7,6 +7,7 @@ import os import pickle import hashlib from multiprocessing.dummy import Pool +from PyQt5 import QtCore import database @@ -24,9 +25,22 @@ from parsers.epub import ParseEPUB from parsers.cbz import ParseCBZ from parsers.cbr import ParseCBR +progressbar = None # This is populated by __main__ + + +# This is for thread safety +class UpdateProgress(QtCore.QObject): + update_signal = QtCore.pyqtSignal(int) + + def connect_to_progressbar(self): + self.update_signal.connect(progressbar.setValue) + + def update_progress(self, progress_percent): + self.update_signal.emit(progress_percent) + class BookSorter: - def __init__(self, file_list, mode, database_path, parent_window, temp_dir=None): + def __init__(self, file_list, mode, database_path, temp_dir=None): # Have the GUI pass a list of files straight to here # Then, on the basis of what is needed, pass the # filenames to the requisite functions @@ -40,20 +54,12 @@ class BookSorter: self.mode = mode self.database_path = database_path self.temp_dir = temp_dir - self.parent_window = parent_window if database_path: self.database_hashes() - # Maybe check why this isn't working the usual way - for i in self.parent_window.statusBar.children(): - if i.objectName() == 'sorterProgress': - self.progressbar = i - if i.objectName() == 'statusMessage': - self.statuslabel = i - - self.progressbar.show() - self.statuslabel.setText('Adding books...') - self.progressbar.setMaximum(self.statistics[1]) + if self.mode == 'addition': + self.progress_emitter = UpdateProgress() + self.progress_emitter.connect_to_progressbar() def database_hashes(self): all_hashes = database.DatabaseFunctions( @@ -89,12 +95,14 @@ class BookSorter: # This should speed up addition for larger files # without compromising the integrity of the process first_bytes = current_book.read(1024 * 32) # First 32KB of the file - salt = filename.encode() + salt = 'Caesar si viveret, ad remum dareris'.encode() first_bytes += salt file_md5 = hashlib.md5(first_bytes).hexdigest() - self.statistics[0] += 1 - self.progressbar.setValue(self.statistics[0]) + if self.mode == 'addition': + self.statistics[0] += 1 + self.progress_emitter.update_progress( + self.statistics[0] * 100 // self.statistics[1]) # IF the file is NOT being loaded into the reader, # Do not allow addition in case the file is dupicated in the directory @@ -179,6 +187,4 @@ class BookSorter: _pool.close() _pool.join() - self.progressbar.hide() - self.statuslabel.setText('Populating table...') return self.all_books diff --git a/widgets.py b/widgets.py index cb6ab4a..a276cde 100644 --- a/widgets.py +++ b/widgets.py @@ -23,6 +23,7 @@ class BookToolBar(QtWidgets.QToolBar): self.setMovable(False) self.setIconSize(QtCore.QSize(22, 22)) self.setFloatable(False) + self.setContextMenuPolicy(QtCore.Qt.PreventContextMenu) self.setObjectName("LibraryToolBar") # Buttons @@ -257,6 +258,7 @@ class LibraryToolBar(QtWidgets.QToolBar): self.setMovable(False) self.setIconSize(QtCore.QSize(22, 22)) self.setFloatable(False) + self.setContextMenuPolicy(QtCore.Qt.PreventContextMenu) self.setObjectName("LibraryToolBar") # Buttons @@ -735,8 +737,7 @@ class BackGroundBookAddition(QtCore.QThread): books = sorter.BookSorter( self.file_list, 'addition', - self.database_path, - self.parent_window) + self.database_path) parsed_books = books.initiate_threads() database.DatabaseFunctions(self.database_path).add_to_database(parsed_books) self.parent_window.lib_ref.generate_model('addition', parsed_books)