diff --git a/models.py b/models.py index f825329..7da8aa6 100644 --- a/models.py +++ b/models.py @@ -16,12 +16,15 @@ class LibraryTableModel(QtCore.QAbstractTableModel): # Sorting is taken care of by the QSortFilterProxy model # which has an inbuilt sort method + # Modifying data in the table model is a case of modifying the + # data sent to it as a list + # In this case, that's self.data_list + def __init__(self, header_data, display_data, temp_dir=None, parent=None): super(LibraryTableModel, self).__init__(parent) self.header_data = header_data self.display_data = display_data - self.temp_dir = temp_dir # Is only needed for the main table - # This model is otherwise reusable if this remains None + self.temp_dir = temp_dir def rowCount(self, parent): return len(self.display_data) @@ -33,42 +36,39 @@ class LibraryTableModel(QtCore.QAbstractTableModel): if not index.isValid(): return None - if role == QtCore.Qt.DecorationRole and index.column() == 2 and self.temp_dir: - return_pixmap = None - file_exists = self.display_data[index.row()][5]['file_exists'] - position = self.display_data[index.row()][5]['position'] + # This block specializaes this function for the library + # Not having a self.temp_dir allows for its reuse elsewhere + if self.temp_dir: + if role == QtCore.Qt.DecorationRole and index.column() == 2: + return_pixmap = None + file_exists = self.display_data[index.row()][5]['file_exists'] + position = self.display_data[index.row()][5]['position'] - if not file_exists: - return_pixmap = QtGui.QIcon(':/images/error.svg').pixmap( - QtCore.Qt.SizeHintRole + 10) + if not file_exists: + return_pixmap = pie_chart.pixmapper( + -1, None, None, QtCore.Qt.SizeHintRole + 10) - if position: - current_chapter = position['current_chapter'] - total_chapters = position['total_chapters'] - progress_percent = int(current_chapter * 100 / total_chapters) + if position: + current_chapter = position['current_chapter'] + total_chapters = position['total_chapters'] - if current_chapter == total_chapters: - return_pixmap = QtGui.QIcon(':/images/checkmark.svg').pixmap( - QtCore.Qt.SizeHintRole + 10) - else: - pie_chart.GeneratePie(progress_percent, self.temp_dir).generate() - svg_path = os.path.join(self.temp_dir, 'lector_progress.svg') - return_pixmap = QtGui.QIcon(svg_path).pixmap( - QtCore.Qt.SizeHintRole + 10) + return_pixmap = pie_chart.pixmapper( + current_chapter, total_chapters, self.temp_dir, QtCore.Qt.SizeHintRole + 10) - return return_pixmap + return return_pixmap - elif role == QtCore.Qt.DisplayRole: - value = self.display_data[index.row()][index.column()] - return value - - elif role == QtCore.Qt.UserRole: # The rest of the roles can be accomodated here. - value = self.display_data[index.row()][5] - return value + elif role == QtCore.Qt.UserRole: + value = self.display_data[index.row()][5] # File metadata + return value - elif role == QtCore.Qt.UserRole + 1: - value = self.display_data[index.row()][6] + elif role == QtCore.Qt.UserRole + 1: + value = self.display_data[index.row()][6] # File hash + return value + + #_________________________________ + if role == QtCore.Qt.DisplayRole: + value = self.display_data[index.row()][index.column()] return value else: diff --git a/resources/pie_chart.py b/resources/pie_chart.py index 1a3763a..f11a5f7 100644 --- a/resources/pie_chart.py +++ b/resources/pie_chart.py @@ -3,13 +3,13 @@ import os import math -class GeneratePie(): - def __init__(self, progress_percent, temp_dir=None): - self.progress_percent = int(progress_percent) - self.temp_dir = temp_dir +from PyQt5 import QtGui - def generate(self): - lSlices = (self.progress_percent, 100 - self.progress_percent) # percentages to show in pie + +def generate_pie(progress_percent, temp_dir=None): + progress_percent = int(progress_percent) + + lSlices = (progress_percent, 100 - progress_percent) # percentages to show in pie lOffsetX = 150 lOffsetY = 150 @@ -85,10 +85,35 @@ class GeneratePie(): """ % (lSvgPath, lOffsetX, lOffsetY) - if self.temp_dir: - svg_path = os.path.join(self.temp_dir, 'lector_progress.svg') + if temp_dir: + svg_path = os.path.join(temp_dir, 'lector_progress.svg') lFile = open(svg_path, 'w') lFile.write(lSvg) lFile.close() else: return lSvg + + +def pixmapper(current_chapter, total_chapters, temp_dir, size): + # A current_chapter of -1 implies the files does not exist + # A chapter number == Total chapters implies the file is unread + return_pixmap = None + + if current_chapter == -1: + return_pixmap = QtGui.QIcon(':/images/error.svg').pixmap(size) + return return_pixmap + + if current_chapter == total_chapters: + return_pixmap = QtGui.QIcon(':/images/checkmark.svg').pixmap(size) + else: + + # TODO + # See if saving the svg to disk can be avoided + # Shift to lines to track progress + + progress_percent = int(current_chapter * 100 / total_chapters) + generate_pie(progress_percent, temp_dir) + svg_path = os.path.join(temp_dir, 'lector_progress.svg') + return_pixmap = QtGui.QIcon(svg_path).pixmap(size) + + return return_pixmap diff --git a/sorter.py b/sorter.py index 4dea22b..3e5c512 100644 --- a/sorter.py +++ b/sorter.py @@ -2,6 +2,7 @@ # TODO # See if you want to include a hash of the book's name and author +# Overwrite book if deleted and then re-added import io import os diff --git a/widgets.py b/widgets.py index 9733ddc..3b76510 100644 --- a/widgets.py +++ b/widgets.py @@ -672,9 +672,6 @@ class LibraryDelegate(QtWidgets.QStyledItemDelegate): file_exists = index.data(QtCore.Qt.UserRole + 5) position = index.data(QtCore.Qt.UserRole + 7) - # TODO - # Calculate progress on the basis of lines - # The shadow pixmap currently is set to 420 x 600 shadow_pixmap = QtGui.QPixmap() shadow_pixmap.load(':/images/gray-shadow.png') @@ -688,7 +685,7 @@ class LibraryDelegate(QtWidgets.QStyledItemDelegate): QtWidgets.QStyledItemDelegate.paint(self, painter, option, index) painter.setOpacity(1) - read_icon = QtGui.QIcon(':/images/error.svg').pixmap(36) + read_icon = pie_chart.pixmapper(-1, None, None, 36) x_draw = option.rect.bottomRight().x() - 30 y_draw = option.rect.bottomRight().y() - 35 painter.drawPixmap(x_draw, y_draw, read_icon) @@ -701,16 +698,9 @@ class LibraryDelegate(QtWidgets.QStyledItemDelegate): if position: current_chapter = position['current_chapter'] total_chapters = position['total_chapters'] - progress_percent = int(current_chapter * 100 / total_chapters) - if current_chapter == total_chapters: - read_icon = QtGui.QIcon(':/images/checkmark.svg').pixmap(36) - else: - # TODO - # See if saving the svg to disk can be avoided - pie_chart.GeneratePie(progress_percent, self.temp_dir).generate() - svg_path = os.path.join(self.temp_dir, 'lector_progress.svg') - read_icon = QtGui.QIcon(svg_path).pixmap(32) + read_icon = pie_chart.pixmapper( + current_chapter, total_chapters, self.temp_dir, 36) x_draw = option.rect.bottomRight().x() - 30 y_draw = option.rect.bottomRight().y() - 35