Improvements to the Table view

This commit is contained in:
BasioMeusPuga
2017-11-28 19:15:43 +05:30
parent af1cd21ec3
commit a32d140980
5 changed files with 55 additions and 31 deletions

View File

@@ -199,14 +199,16 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
# ListView
self.listView.setGridSize(QtCore.QSize(175, 240))
self.listView.setMouseTracking(True)
self.listView.verticalScrollBar().setSingleStep(7)
self.listView.doubleClicked.connect(self.list_doubleclick)
self.listView.verticalScrollBar().setSingleStep(9)
self.listView.doubleClicked.connect(self.library_doubleclick)
self.listView.setItemDelegate(LibraryDelegate(self.temp_dir.path()))
# TableView
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().setSortIndicator(0, QtCore.Qt.AscendingOrder)
self.tableView.doubleClicked.connect(self.library_doubleclick)
# Keyboard shortcuts
self.ks_close_tab = QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+W'), self)
@@ -281,8 +283,9 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
def delete_books(self):
# TODO
# Use maptosource() here to get the view_model
# Use maptosource() here to get the view_model
# indices selected in the listView
# Implement this for the tableview
selected_books = self.listView.selectedIndexes()
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.go_fullscreen()
def list_doubleclick(self, myindex):
index = self.listView.model().index(myindex.row(), 0)
metadata = self.listView.model().data(index, QtCore.Qt.UserRole + 3)
def library_doubleclick(self, myindex):
sender = self.sender().objectName()
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)
for i in range(1, self.tabWidget.count()):

View File

@@ -14,6 +14,7 @@ class Library:
self.view_model = None
self.proxy_model = None
self.table_model = None
self.table_proxy_model = None
self.table_rows = []
def generate_model(self, mode, parsed_books=None):
@@ -111,6 +112,10 @@ class Library:
img_pixmap = img_pixmap.scaled(420, 600, QtCore.Qt.IgnoreAspectRatio)
item = QtGui.QStandardItem()
item.setToolTip(tooltip_string)
# TODO
# Simplify this mess
# The following order is needed to keep sorting working
item.setData(title, QtCore.Qt.UserRole)
item.setData(author, QtCore.Qt.UserRole + 1)
@@ -123,19 +128,20 @@ class Library:
item.setIcon(QtGui.QIcon(img_pixmap))
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(
(title, author, year, tags, path))
(title, author, year, tags, all_metadata))
def create_table_model(self):
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.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.setSortCaseSensitivity(False)
self.parent_window.tableView.setModel(self.table_proxy_model)
def update_table_proxy_model(self):
@@ -153,6 +159,7 @@ class Library:
def create_proxymodel(self):
self.proxy_model = QtCore.QSortFilterProxyModel()
self.proxy_model.setSourceModel(self.view_model)
self.proxy_model.setSortCaseSensitivity(False)
s = QtCore.QSize(160, 250) # Set icon sizing here
self.parent_window.listView.setIconSize(s)
self.parent_window.listView.setModel(self.proxy_model)

View File

@@ -11,10 +11,11 @@ class LibraryItemModel(QtGui.QStandardItemModel, QtCore.QAbstractItemModel):
class LibraryTableModel(QtCore.QAbstractTableModel):
# TODO
# Speed up sorting
# Double clicking
# 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):
super(LibraryTableModel, self).__init__(parent)
self.header_data = header_data
@@ -33,6 +34,10 @@ class LibraryTableModel(QtCore.QAbstractTableModel):
if 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()][4]
return value
else:
return QtCore.QVariant()
@@ -41,14 +46,6 @@ class LibraryTableModel(QtCore.QAbstractTableModel):
return self.header_data[col]
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):
def __init__(self, parent=None):

View File

@@ -27,15 +27,15 @@
<item>
<widget class="QTableView" name="tableView"/>
</item>
<item>
<widget class="QLineEdit" name="lineEdit">
<property name="placeholderText">
<string>Search for Paths, Names, Tags...</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="lineEdit">
<property name="placeholderText">
<string>Search for Paths, Names, Tags...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addButton">
<property name="text">
@@ -93,6 +93,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_3">
<property name="text">
<string>Cover Shadows</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">

View File

@@ -2,7 +2,7 @@
# 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!
@@ -25,11 +25,11 @@ class Ui_Dialog(object):
self.tableView = QtWidgets.QTableView(self.groupBox_2)
self.tableView.setObjectName("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.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.setObjectName("addButton")
self.horizontalLayout.addWidget(self.addButton)
@@ -57,6 +57,9 @@ class Ui_Dialog(object):
self.checkBox_2 = QtWidgets.QCheckBox(self.groupBox)
self.checkBox_2.setObjectName("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.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
@@ -85,6 +88,7 @@ class Ui_Dialog(object):
self.checkBox.setText(_translate("Dialog", "Auto add files"))
self.fileRemember.setText(_translate("Dialog", "Remember open files"))
self.checkBox_2.setText(_translate("Dialog", "Show Library"))
self.checkBox_3.setText(_translate("Dialog", "Cover Shadows"))
self.aboutButton.setText(_translate("Dialog", "About"))
self.okButton.setText(_translate("Dialog", "OK"))