Thread safety, Disable toolbar context menu
This commit is contained in:
16
__main__.py
16
__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
|
||||
|
@@ -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()
|
||||
|
40
sorter.py
40
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
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user