diff --git a/__main__.py b/__main__.py index 0a9f810..f794603 100755 --- a/__main__.py +++ b/__main__.py @@ -212,7 +212,8 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): self.tableView.doubleClicked.connect(self.library_doubleclick) self.tableView.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.Interactive) - self.tableView.horizontalHeader().setSortIndicator(0, QtCore.Qt.AscendingOrder) + self.tableView.horizontalHeader().setSortIndicator(1, QtCore.Qt.AscendingOrder) + self.tableView.setColumnHidden(0, True) self.tableView.horizontalHeader().setHighlightSections(False) if self.settings['main_window_headers']: for count, i in enumerate(self.settings['main_window_headers']): @@ -640,11 +641,14 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): sender = self.sender().objectName() if sender == 'listView': - metadata = self.lib_ref.proxy_model.data(index, QtCore.Qt.UserRole + 3) + source_index = self.lib_ref.proxy_model.mapToSource(index) elif sender == 'tableView': - metadata = self.lib_ref.table_proxy_model.data(index, QtCore.Qt.UserRole) + source_index = self.lib_ref.table_proxy_model.mapToSource(index) + item = self.lib_ref.view_model.item(source_index.row(), 0) + metadata = item.data(QtCore.Qt.UserRole + 3) path = {metadata['path']: metadata['hash']} + self.open_files(path) def open_files(self, path_hash_dictionary): diff --git a/library.py b/library.py index 39081bb..053aed0 100644 --- a/library.py +++ b/library.py @@ -38,6 +38,7 @@ class Library: if mode == 'build': self.table_rows = [] self.view_model = QtGui.QStandardItemModel() + self.view_model.setColumnCount(10) books = database.DatabaseFunctions( self.parent.database_path).fetch_data( @@ -115,7 +116,8 @@ class Library: # That is to be achieved by way of the culling function img_pixmap = QtGui.QPixmap() img_pixmap.load(':/images/blank.png') - img_pixmap = img_pixmap.scaled(420, 600, QtCore.Qt.IgnoreAspectRatio) + img_pixmap = img_pixmap.scaled( + 420, 600, QtCore.Qt.IgnoreAspectRatio) item = QtGui.QStandardItem() item.setToolTip(tooltip_string) @@ -132,12 +134,8 @@ class Library: item.setData(date_added, QtCore.Qt.UserRole + 9) item.setData(last_accessed, QtCore.Qt.UserRole + 12) item.setIcon(QtGui.QIcon(img_pixmap)) - self.view_model.appendRow(item) - # all_metadata is just being sent. It is not being displayed - # It will be correlated to the current row as its first userrole - self.table_rows.append( - [title, author, None, year, tags, all_metadata, i[8]]) + self.view_model.appendRow(item) # The is_database_ready boolean is required when a new thread sends # books here for model generation. @@ -151,8 +149,8 @@ class Library: self.create_table_proxy_model() def create_table_proxy_model(self): - self.table_proxy_model = TableProxyModel() - self.table_proxy_model.setSourceModel(self.table_model) + self.table_proxy_model = TableProxyModel(self.parent.temp_dir.path()) + self.table_proxy_model.setSourceModel(self.view_model) self.table_proxy_model.setSortCaseSensitivity(False) self.table_proxy_model.sort(0, QtCore.Qt.AscendingOrder) self.parent.tableView.setModel(self.table_proxy_model) @@ -164,8 +162,8 @@ class Library: self.table_proxy_model.invalidateFilter() self.table_proxy_model.setFilterParams( self.parent.libraryToolBar.searchBar.text(), - [0, 1, 4], - self.parent.active_library_filters) + self.parent.active_library_filters, + self.parent.libraryToolBar.sortingBox.currentIndex()) # This isn't needed, but it forces a model update every time the # text in the line edit changes. So I guess it is needed. self.table_proxy_model.setFilterFixedString( diff --git a/models.py b/models.py index cae8864..f2c5a77 100644 --- a/models.py +++ b/models.py @@ -53,14 +53,105 @@ class ItemProxyModel(QtCore.QSortFilterProxyModel): self.filter_text = None self.active_library_filters = None self.sorting_box_position = None + self.common_functions = ProxyModelsCommonFunctions(self) def setFilterParams(self, filter_text, active_library_filters, sorting_box_position): - self.filter_text = filter_text - self.active_library_filters = [i.lower() for i in active_library_filters] - self.sorting_box_position = sorting_box_position + self.common_functions.setFilterParams( + filter_text, active_library_filters, sorting_box_position) def filterAcceptsRow(self, row, parent): - model = self.sourceModel() + output = self.common_functions.filterAcceptsRow(row, parent) + return output + + +class TableProxyModel(QtCore.QSortFilterProxyModel): + def __init__(self, temp_dir, parent=None): + # TODO + # The setData method + super(TableProxyModel, self).__init__(parent) + self.header_data = [None, 'Title', 'Author', 'Status', 'Year', 'Tags'] + self.temp_dir = temp_dir + self.filter_text = None + self.active_library_filters = None + self.sorting_box_position = None + self.common_functions = ProxyModelsCommonFunctions(self) + + def columnCount(self, parent): + return 6 + + def headerData(self, column, orientation, role): + if role == QtCore.Qt.DisplayRole: + return self.header_data[column] + + def flags(self, index): + # This means only the Tags column is editable + if index.column() == 4: + return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable + else: + # These are standard select but don't edit values + return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable + + def data(self, index, role): + source_index = self.mapToSource(index) + item = self.sourceModel().item(source_index.row(), 0) + + if role == QtCore.Qt.DecorationRole: + if index.column() == 3: + return_pixmap = None + + file_exists = item.data(QtCore.Qt.UserRole + 5) + position = item.data(QtCore.Qt.UserRole + 7) + + 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'] + + return_pixmap = pie_chart.pixmapper( + current_chapter, total_chapters, self.temp_dir, + QtCore.Qt.SizeHintRole + 10) + + return return_pixmap + + elif role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole: + + if index.column() in (0, 3): # Cover and Status + return QtCore.QVariant() + + role_dictionary = { + 1: QtCore.Qt.UserRole, # Title + 2: QtCore.Qt.UserRole + 1, # Author + 4: QtCore.Qt.UserRole + 2, # Year + 5: QtCore.Qt.UserRole + 4} # Tags + + return item.data(role_dictionary[index.column()]) + + else: + return QtCore.QVariant() + + def setFilterParams(self, filter_text, active_library_filters, sorting_box_position): + self.common_functions.setFilterParams( + filter_text, active_library_filters, sorting_box_position) + + def filterAcceptsRow(self, row, parent): + output = self.common_functions.filterAcceptsRow(row, parent) + return output + + +class ProxyModelsCommonFunctions: + def __init__(self, parent_model): + self.parent_model = parent_model + + def setFilterParams(self, filter_text, active_library_filters, sorting_box_position): + self.parent_model.filter_text = filter_text + self.parent_model.active_library_filters = [i.lower() for i in active_library_filters] + self.parent_model.sorting_box_position = sorting_box_position + + def filterAcceptsRow(self, row, parent): + model = self.parent_model.sourceModel() this_index = model.index(row, 0) @@ -72,23 +163,23 @@ class ItemProxyModel(QtCore.QSortFilterProxyModel): last_accessed = model.data(this_index, QtCore.Qt.UserRole + 12) # Hide untouched files when sorting by last accessed - if self.sorting_box_position == 4 and not last_accessed: + if self.parent_model.sorting_box_position == 4 and not last_accessed: return False - if self.active_library_filters: - if directory_name not in self.active_library_filters: + if self.parent_model.active_library_filters: + if directory_name not in self.parent_model.active_library_filters: return False else: return False - if not self.filter_text: + if not self.parent_model.filter_text: return True else: valid_data = [ i.lower() for i in ( title, author, tags, directory_name, directory_tags) if i is not None] for i in valid_data: - if self.filter_text.lower() in i: + if self.parent_model.filter_text.lower() in i: return True return False @@ -189,9 +280,9 @@ class MostExcellentTableModel(QtCore.QAbstractTableModel): return True -class TableProxyModel(QtCore.QSortFilterProxyModel): +class TableProxyModel2(QtCore.QSortFilterProxyModel): def __init__(self, parent=None): - super(TableProxyModel, self).__init__(parent) + super(TableProxyModel2, self).__init__(parent) self.filter_string = None self.filter_columns = None self.active_library_filters = None