Improvements to the Table view
This commit is contained in:
21
__main__.py
21
__main__.py
@@ -199,14 +199,16 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
# ListView
|
# ListView
|
||||||
self.listView.setGridSize(QtCore.QSize(175, 240))
|
self.listView.setGridSize(QtCore.QSize(175, 240))
|
||||||
self.listView.setMouseTracking(True)
|
self.listView.setMouseTracking(True)
|
||||||
self.listView.verticalScrollBar().setSingleStep(7)
|
self.listView.verticalScrollBar().setSingleStep(9)
|
||||||
self.listView.doubleClicked.connect(self.list_doubleclick)
|
self.listView.doubleClicked.connect(self.library_doubleclick)
|
||||||
self.listView.setItemDelegate(LibraryDelegate(self.temp_dir.path()))
|
self.listView.setItemDelegate(LibraryDelegate(self.temp_dir.path()))
|
||||||
|
|
||||||
# TableView
|
# TableView
|
||||||
self.tableView.horizontalHeader().setSectionResizeMode(
|
self.tableView.horizontalHeader().setSectionResizeMode(
|
||||||
QtWidgets.QHeaderView.ResizeToContents)
|
QtWidgets.QHeaderView.ResizeToContents) # TODO Change this to manual column sizing
|
||||||
self.tableView.horizontalHeader().setStretchLastSection(True)
|
self.tableView.horizontalHeader().setStretchLastSection(True)
|
||||||
|
self.tableView.horizontalHeader().setSortIndicator(0, QtCore.Qt.AscendingOrder)
|
||||||
|
self.tableView.doubleClicked.connect(self.library_doubleclick)
|
||||||
|
|
||||||
# Keyboard shortcuts
|
# Keyboard shortcuts
|
||||||
self.ks_close_tab = QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+W'), self)
|
self.ks_close_tab = QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+W'), self)
|
||||||
@@ -283,6 +285,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
# TODO
|
# TODO
|
||||||
# Use maptosource() here to get the view_model
|
# Use maptosource() here to get the view_model
|
||||||
# indices selected in the listView
|
# indices selected in the listView
|
||||||
|
# Implement this for the tableview
|
||||||
|
|
||||||
selected_books = self.listView.selectedIndexes()
|
selected_books = self.listView.selectedIndexes()
|
||||||
if selected_books:
|
if selected_books:
|
||||||
@@ -409,9 +412,15 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
current_tab_widget = self.tabWidget.widget(current_tab)
|
current_tab_widget = self.tabWidget.widget(current_tab)
|
||||||
current_tab_widget.go_fullscreen()
|
current_tab_widget.go_fullscreen()
|
||||||
|
|
||||||
def list_doubleclick(self, myindex):
|
def library_doubleclick(self, myindex):
|
||||||
index = self.listView.model().index(myindex.row(), 0)
|
sender = self.sender().objectName()
|
||||||
metadata = self.listView.model().data(index, QtCore.Qt.UserRole + 3)
|
|
||||||
|
if sender == 'listView':
|
||||||
|
index = self.lib_ref.proxy_model.index(myindex.row(), 0)
|
||||||
|
metadata = self.lib_ref.proxy_model.data(index, QtCore.Qt.UserRole + 3)
|
||||||
|
elif sender == 'tableView':
|
||||||
|
index = self.lib_ref.table_proxy_model.index(myindex.row(), 0)
|
||||||
|
metadata = self.lib_ref.table_proxy_model.data(index, QtCore.Qt.UserRole)
|
||||||
|
|
||||||
# Shift focus to the tab that has the book open (if there is one)
|
# Shift focus to the tab that has the book open (if there is one)
|
||||||
for i in range(1, self.tabWidget.count()):
|
for i in range(1, self.tabWidget.count()):
|
||||||
|
13
library.py
13
library.py
@@ -14,6 +14,7 @@ class Library:
|
|||||||
self.view_model = None
|
self.view_model = None
|
||||||
self.proxy_model = None
|
self.proxy_model = None
|
||||||
self.table_model = None
|
self.table_model = None
|
||||||
|
self.table_proxy_model = None
|
||||||
self.table_rows = []
|
self.table_rows = []
|
||||||
|
|
||||||
def generate_model(self, mode, parsed_books=None):
|
def generate_model(self, mode, parsed_books=None):
|
||||||
@@ -111,6 +112,10 @@ class Library:
|
|||||||
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)
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# Simplify this mess
|
||||||
|
|
||||||
# The following order is needed to keep sorting working
|
# The following order is needed to keep sorting working
|
||||||
item.setData(title, QtCore.Qt.UserRole)
|
item.setData(title, QtCore.Qt.UserRole)
|
||||||
item.setData(author, QtCore.Qt.UserRole + 1)
|
item.setData(author, QtCore.Qt.UserRole + 1)
|
||||||
@@ -123,19 +128,20 @@ class Library:
|
|||||||
item.setIcon(QtGui.QIcon(img_pixmap))
|
item.setIcon(QtGui.QIcon(img_pixmap))
|
||||||
self.view_model.appendRow(item)
|
self.view_model.appendRow(item)
|
||||||
|
|
||||||
# Path is just being sent. It is not being displayed
|
# 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(
|
self.table_rows.append(
|
||||||
(title, author, year, tags, path))
|
(title, author, year, tags, all_metadata))
|
||||||
|
|
||||||
def create_table_model(self):
|
def create_table_model(self):
|
||||||
table_header = ['Title', 'Author', 'Year', 'Tags']
|
table_header = ['Title', 'Author', 'Year', 'Tags']
|
||||||
# self.table_rows.sort(key=lambda x: x[0])
|
|
||||||
self.table_model = LibraryTableModel(table_header, self.table_rows)
|
self.table_model = LibraryTableModel(table_header, self.table_rows)
|
||||||
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.table_proxy_model.setSourceModel(self.table_model)
|
self.table_proxy_model.setSourceModel(self.table_model)
|
||||||
|
self.table_proxy_model.setSortCaseSensitivity(False)
|
||||||
self.parent_window.tableView.setModel(self.table_proxy_model)
|
self.parent_window.tableView.setModel(self.table_proxy_model)
|
||||||
|
|
||||||
def update_table_proxy_model(self):
|
def update_table_proxy_model(self):
|
||||||
@@ -153,6 +159,7 @@ class Library:
|
|||||||
def create_proxymodel(self):
|
def create_proxymodel(self):
|
||||||
self.proxy_model = QtCore.QSortFilterProxyModel()
|
self.proxy_model = QtCore.QSortFilterProxyModel()
|
||||||
self.proxy_model.setSourceModel(self.view_model)
|
self.proxy_model.setSourceModel(self.view_model)
|
||||||
|
self.proxy_model.setSortCaseSensitivity(False)
|
||||||
s = QtCore.QSize(160, 250) # Set icon sizing here
|
s = QtCore.QSize(160, 250) # Set icon sizing here
|
||||||
self.parent_window.listView.setIconSize(s)
|
self.parent_window.listView.setIconSize(s)
|
||||||
self.parent_window.listView.setModel(self.proxy_model)
|
self.parent_window.listView.setModel(self.proxy_model)
|
||||||
|
17
models.py
17
models.py
@@ -11,10 +11,11 @@ class LibraryItemModel(QtGui.QStandardItemModel, QtCore.QAbstractItemModel):
|
|||||||
|
|
||||||
class LibraryTableModel(QtCore.QAbstractTableModel):
|
class LibraryTableModel(QtCore.QAbstractTableModel):
|
||||||
# TODO
|
# TODO
|
||||||
# Speed up sorting
|
|
||||||
# Double clicking
|
|
||||||
# Auto resize with emphasis on Name
|
# Auto resize with emphasis on Name
|
||||||
|
|
||||||
|
# Sorting is taken care of by the QSortFilterProxy model
|
||||||
|
# which has an inbuilt sort method
|
||||||
|
|
||||||
def __init__(self, header_data, display_data, parent=None):
|
def __init__(self, header_data, display_data, parent=None):
|
||||||
super(LibraryTableModel, self).__init__(parent)
|
super(LibraryTableModel, self).__init__(parent)
|
||||||
self.header_data = header_data
|
self.header_data = header_data
|
||||||
@@ -33,6 +34,10 @@ class LibraryTableModel(QtCore.QAbstractTableModel):
|
|||||||
if role == QtCore.Qt.DisplayRole:
|
if role == QtCore.Qt.DisplayRole:
|
||||||
value = self.display_data[index.row()][index.column()]
|
value = self.display_data[index.row()][index.column()]
|
||||||
return value
|
return value
|
||||||
|
elif role == QtCore.Qt.UserRole:
|
||||||
|
# The rest of the roles can be accomodated here.
|
||||||
|
value = self.display_data[index.row()][4]
|
||||||
|
return value
|
||||||
else:
|
else:
|
||||||
return QtCore.QVariant()
|
return QtCore.QVariant()
|
||||||
|
|
||||||
@@ -41,14 +46,6 @@ class LibraryTableModel(QtCore.QAbstractTableModel):
|
|||||||
return self.header_data[col]
|
return self.header_data[col]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def sort(self, col, order):
|
|
||||||
# self.emit(SIGNAL("layoutAboutToBeChanged()"))
|
|
||||||
self.display_data.sort(key=lambda x: x[col])
|
|
||||||
if order == QtCore.Qt.DescendingOrder:
|
|
||||||
self.display_data.sort(key=lambda x: x[col], reverse=True)
|
|
||||||
|
|
||||||
# self.emit(SIGNAL("layoutChanged()"))
|
|
||||||
|
|
||||||
|
|
||||||
class TableProxyModel(QtCore.QSortFilterProxyModel):
|
class TableProxyModel(QtCore.QSortFilterProxyModel):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|
@@ -27,6 +27,8 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QTableView" name="tableView"/>
|
<widget class="QTableView" name="tableView"/>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="lineEdit">
|
<widget class="QLineEdit" name="lineEdit">
|
||||||
<property name="placeholderText">
|
<property name="placeholderText">
|
||||||
@@ -34,8 +36,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="addButton">
|
<widget class="QPushButton" name="addButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -93,6 +93,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="checkBox_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Cover Shadows</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# Form implementation generated from reading ui file 'raw/settings.ui'
|
# Form implementation generated from reading ui file 'raw/settings.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.9.1
|
# Created by: PyQt5 UI code generator 5.9.2
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING! All changes made in this file will be lost!
|
||||||
|
|
||||||
@@ -25,11 +25,11 @@ class Ui_Dialog(object):
|
|||||||
self.tableView = QtWidgets.QTableView(self.groupBox_2)
|
self.tableView = QtWidgets.QTableView(self.groupBox_2)
|
||||||
self.tableView.setObjectName("tableView")
|
self.tableView.setObjectName("tableView")
|
||||||
self.verticalLayout.addWidget(self.tableView)
|
self.verticalLayout.addWidget(self.tableView)
|
||||||
self.lineEdit = QtWidgets.QLineEdit(self.groupBox_2)
|
|
||||||
self.lineEdit.setObjectName("lineEdit")
|
|
||||||
self.verticalLayout.addWidget(self.lineEdit)
|
|
||||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||||
|
self.lineEdit = QtWidgets.QLineEdit(self.groupBox_2)
|
||||||
|
self.lineEdit.setObjectName("lineEdit")
|
||||||
|
self.horizontalLayout.addWidget(self.lineEdit)
|
||||||
self.addButton = QtWidgets.QPushButton(self.groupBox_2)
|
self.addButton = QtWidgets.QPushButton(self.groupBox_2)
|
||||||
self.addButton.setObjectName("addButton")
|
self.addButton.setObjectName("addButton")
|
||||||
self.horizontalLayout.addWidget(self.addButton)
|
self.horizontalLayout.addWidget(self.addButton)
|
||||||
@@ -57,6 +57,9 @@ class Ui_Dialog(object):
|
|||||||
self.checkBox_2 = QtWidgets.QCheckBox(self.groupBox)
|
self.checkBox_2 = QtWidgets.QCheckBox(self.groupBox)
|
||||||
self.checkBox_2.setObjectName("checkBox_2")
|
self.checkBox_2.setObjectName("checkBox_2")
|
||||||
self.horizontalLayout_3.addWidget(self.checkBox_2)
|
self.horizontalLayout_3.addWidget(self.checkBox_2)
|
||||||
|
self.checkBox_3 = QtWidgets.QCheckBox(self.groupBox)
|
||||||
|
self.checkBox_3.setObjectName("checkBox_3")
|
||||||
|
self.horizontalLayout_3.addWidget(self.checkBox_3)
|
||||||
self.gridLayout.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
|
self.gridLayout.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
|
||||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||||
@@ -85,6 +88,7 @@ class Ui_Dialog(object):
|
|||||||
self.checkBox.setText(_translate("Dialog", "Auto add files"))
|
self.checkBox.setText(_translate("Dialog", "Auto add files"))
|
||||||
self.fileRemember.setText(_translate("Dialog", "Remember open files"))
|
self.fileRemember.setText(_translate("Dialog", "Remember open files"))
|
||||||
self.checkBox_2.setText(_translate("Dialog", "Show Library"))
|
self.checkBox_2.setText(_translate("Dialog", "Show Library"))
|
||||||
|
self.checkBox_3.setText(_translate("Dialog", "Cover Shadows"))
|
||||||
self.aboutButton.setText(_translate("Dialog", "About"))
|
self.aboutButton.setText(_translate("Dialog", "About"))
|
||||||
self.okButton.setText(_translate("Dialog", "OK"))
|
self.okButton.setText(_translate("Dialog", "OK"))
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user