Run TableView off the QStandardItemModel
This commit is contained in:
10
__main__.py
10
__main__.py
@@ -212,7 +212,8 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
self.tableView.doubleClicked.connect(self.library_doubleclick)
|
self.tableView.doubleClicked.connect(self.library_doubleclick)
|
||||||
self.tableView.horizontalHeader().setSectionResizeMode(
|
self.tableView.horizontalHeader().setSectionResizeMode(
|
||||||
QtWidgets.QHeaderView.Interactive)
|
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)
|
self.tableView.horizontalHeader().setHighlightSections(False)
|
||||||
if self.settings['main_window_headers']:
|
if self.settings['main_window_headers']:
|
||||||
for count, i in enumerate(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()
|
sender = self.sender().objectName()
|
||||||
|
|
||||||
if sender == 'listView':
|
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':
|
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']}
|
path = {metadata['path']: metadata['hash']}
|
||||||
|
|
||||||
self.open_files(path)
|
self.open_files(path)
|
||||||
|
|
||||||
def open_files(self, path_hash_dictionary):
|
def open_files(self, path_hash_dictionary):
|
||||||
|
18
library.py
18
library.py
@@ -38,6 +38,7 @@ class Library:
|
|||||||
if mode == 'build':
|
if mode == 'build':
|
||||||
self.table_rows = []
|
self.table_rows = []
|
||||||
self.view_model = QtGui.QStandardItemModel()
|
self.view_model = QtGui.QStandardItemModel()
|
||||||
|
self.view_model.setColumnCount(10)
|
||||||
|
|
||||||
books = database.DatabaseFunctions(
|
books = database.DatabaseFunctions(
|
||||||
self.parent.database_path).fetch_data(
|
self.parent.database_path).fetch_data(
|
||||||
@@ -115,7 +116,8 @@ class Library:
|
|||||||
# That is to be achieved by way of the culling function
|
# That is to be achieved by way of the culling function
|
||||||
img_pixmap = QtGui.QPixmap()
|
img_pixmap = QtGui.QPixmap()
|
||||||
img_pixmap.load(':/images/blank.png')
|
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 = QtGui.QStandardItem()
|
||||||
item.setToolTip(tooltip_string)
|
item.setToolTip(tooltip_string)
|
||||||
|
|
||||||
@@ -132,12 +134,8 @@ class Library:
|
|||||||
item.setData(date_added, QtCore.Qt.UserRole + 9)
|
item.setData(date_added, QtCore.Qt.UserRole + 9)
|
||||||
item.setData(last_accessed, QtCore.Qt.UserRole + 12)
|
item.setData(last_accessed, QtCore.Qt.UserRole + 12)
|
||||||
item.setIcon(QtGui.QIcon(img_pixmap))
|
item.setIcon(QtGui.QIcon(img_pixmap))
|
||||||
self.view_model.appendRow(item)
|
|
||||||
|
|
||||||
# all_metadata is just being sent. It is not being displayed
|
self.view_model.appendRow(item)
|
||||||
# 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]])
|
|
||||||
|
|
||||||
# The is_database_ready boolean is required when a new thread sends
|
# The is_database_ready boolean is required when a new thread sends
|
||||||
# books here for model generation.
|
# books here for model generation.
|
||||||
@@ -151,8 +149,8 @@ class Library:
|
|||||||
self.create_table_proxy_model()
|
self.create_table_proxy_model()
|
||||||
|
|
||||||
def create_table_proxy_model(self):
|
def create_table_proxy_model(self):
|
||||||
self.table_proxy_model = TableProxyModel()
|
self.table_proxy_model = TableProxyModel(self.parent.temp_dir.path())
|
||||||
self.table_proxy_model.setSourceModel(self.table_model)
|
self.table_proxy_model.setSourceModel(self.view_model)
|
||||||
self.table_proxy_model.setSortCaseSensitivity(False)
|
self.table_proxy_model.setSortCaseSensitivity(False)
|
||||||
self.table_proxy_model.sort(0, QtCore.Qt.AscendingOrder)
|
self.table_proxy_model.sort(0, QtCore.Qt.AscendingOrder)
|
||||||
self.parent.tableView.setModel(self.table_proxy_model)
|
self.parent.tableView.setModel(self.table_proxy_model)
|
||||||
@@ -164,8 +162,8 @@ class Library:
|
|||||||
self.table_proxy_model.invalidateFilter()
|
self.table_proxy_model.invalidateFilter()
|
||||||
self.table_proxy_model.setFilterParams(
|
self.table_proxy_model.setFilterParams(
|
||||||
self.parent.libraryToolBar.searchBar.text(),
|
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
|
# 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.
|
# text in the line edit changes. So I guess it is needed.
|
||||||
self.table_proxy_model.setFilterFixedString(
|
self.table_proxy_model.setFilterFixedString(
|
||||||
|
113
models.py
113
models.py
@@ -53,14 +53,105 @@ class ItemProxyModel(QtCore.QSortFilterProxyModel):
|
|||||||
self.filter_text = None
|
self.filter_text = None
|
||||||
self.active_library_filters = None
|
self.active_library_filters = None
|
||||||
self.sorting_box_position = None
|
self.sorting_box_position = None
|
||||||
|
self.common_functions = ProxyModelsCommonFunctions(self)
|
||||||
|
|
||||||
def setFilterParams(self, filter_text, active_library_filters, sorting_box_position):
|
def setFilterParams(self, filter_text, active_library_filters, sorting_box_position):
|
||||||
self.filter_text = filter_text
|
self.common_functions.setFilterParams(
|
||||||
self.active_library_filters = [i.lower() for i in active_library_filters]
|
filter_text, active_library_filters, sorting_box_position)
|
||||||
self.sorting_box_position = sorting_box_position
|
|
||||||
|
|
||||||
def filterAcceptsRow(self, row, parent):
|
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)
|
this_index = model.index(row, 0)
|
||||||
|
|
||||||
@@ -72,23 +163,23 @@ class ItemProxyModel(QtCore.QSortFilterProxyModel):
|
|||||||
last_accessed = model.data(this_index, QtCore.Qt.UserRole + 12)
|
last_accessed = model.data(this_index, QtCore.Qt.UserRole + 12)
|
||||||
|
|
||||||
# Hide untouched files when sorting by last accessed
|
# 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
|
return False
|
||||||
|
|
||||||
if self.active_library_filters:
|
if self.parent_model.active_library_filters:
|
||||||
if directory_name not in self.active_library_filters:
|
if directory_name not in self.parent_model.active_library_filters:
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if not self.filter_text:
|
if not self.parent_model.filter_text:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
valid_data = [
|
valid_data = [
|
||||||
i.lower() for i in (
|
i.lower() for i in (
|
||||||
title, author, tags, directory_name, directory_tags) if i is not None]
|
title, author, tags, directory_name, directory_tags) if i is not None]
|
||||||
for i in valid_data:
|
for i in valid_data:
|
||||||
if self.filter_text.lower() in i:
|
if self.parent_model.filter_text.lower() in i:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -189,9 +280,9 @@ class MostExcellentTableModel(QtCore.QAbstractTableModel):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
class TableProxyModel(QtCore.QSortFilterProxyModel):
|
class TableProxyModel2(QtCore.QSortFilterProxyModel):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(TableProxyModel, self).__init__(parent)
|
super(TableProxyModel2, self).__init__(parent)
|
||||||
self.filter_string = None
|
self.filter_string = None
|
||||||
self.filter_columns = None
|
self.filter_columns = None
|
||||||
self.active_library_filters = None
|
self.active_library_filters = None
|
||||||
|
Reference in New Issue
Block a user