Library filtering menu. Also applied to table model.
This commit is contained in:
2
TODO
2
TODO
@@ -26,6 +26,7 @@ TODO
|
|||||||
Information dialog widget
|
Information dialog widget
|
||||||
Context menu: Cache, Read, Edit database, delete, Mark read/unread
|
Context menu: Cache, Read, Edit database, delete, Mark read/unread
|
||||||
Set focus to newly added file
|
Set focus to newly added file
|
||||||
|
Allow editing of database data through the UI
|
||||||
Reading:
|
Reading:
|
||||||
✓ Drop down for TOC
|
✓ Drop down for TOC
|
||||||
✓ Override the keypress event of the textedit
|
✓ Override the keypress event of the textedit
|
||||||
@@ -44,6 +45,7 @@ TODO
|
|||||||
Record progress
|
Record progress
|
||||||
Pagination
|
Pagination
|
||||||
Set context menu for definitions and the like
|
Set context menu for definitions and the like
|
||||||
|
Line spacing
|
||||||
Filetypes:
|
Filetypes:
|
||||||
✓ cbz, cbr support
|
✓ cbz, cbr support
|
||||||
✓ Keep font settings enabled but only for background color
|
✓ Keep font settings enabled but only for background color
|
||||||
|
28
__main__.py
28
__main__.py
@@ -49,7 +49,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
self.current_profile_index = None
|
self.current_profile_index = None
|
||||||
self.comic_profile = {}
|
self.comic_profile = {}
|
||||||
self.database_path = None
|
self.database_path = None
|
||||||
self.library_filter_menu = None
|
self.active_library_filters = []
|
||||||
|
|
||||||
# Initialize toolbars
|
# Initialize toolbars
|
||||||
self.libraryToolBar = LibraryToolBar(self)
|
self.libraryToolBar = LibraryToolBar(self)
|
||||||
@@ -185,6 +185,8 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
self.lib_ref.create_table_model()
|
self.lib_ref.create_table_model()
|
||||||
self.lib_ref.create_proxymodel()
|
self.lib_ref.create_proxymodel()
|
||||||
self.lib_ref.generate_library_tags()
|
self.lib_ref.generate_library_tags()
|
||||||
|
self.set_library_filter()
|
||||||
|
self.start_culling_timer()
|
||||||
|
|
||||||
# ListView
|
# ListView
|
||||||
self.listView.setGridSize(QtCore.QSize(175, 240))
|
self.listView.setGridSize(QtCore.QSize(175, 240))
|
||||||
@@ -327,6 +329,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
# Remember file addition modality
|
# Remember file addition modality
|
||||||
# If a file is added from here, it should not be removed
|
# If a file is added from here, it should not be removed
|
||||||
# from the libary in case of a database refresh
|
# from the libary in case of a database refresh
|
||||||
|
# Individually added files are not subject to library filtering
|
||||||
|
|
||||||
opened_files = QtWidgets.QFileDialog.getOpenFileNames(
|
opened_files = QtWidgets.QFileDialog.getOpenFileNames(
|
||||||
self, 'Open file', self.settings['last_open_path'],
|
self, 'Open file', self.settings['last_open_path'],
|
||||||
@@ -827,8 +830,27 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
self.libraryToolBar.libraryFilterButton.setMenu(self.library_filter_menu)
|
self.libraryToolBar.libraryFilterButton.setMenu(self.library_filter_menu)
|
||||||
|
|
||||||
def set_library_filter(self, event=None):
|
def set_library_filter(self, event=None):
|
||||||
print(event)
|
self.active_library_filters = []
|
||||||
print(self.sender().text())
|
something_was_unchecked = False
|
||||||
|
|
||||||
|
if self.sender(): # Program startup sends a None here
|
||||||
|
if self.sender().text() == 'All':
|
||||||
|
for i in self.library_filter_menu.actions():
|
||||||
|
i.setChecked(self.sender().isChecked())
|
||||||
|
|
||||||
|
for i in self.library_filter_menu.actions()[:-2]:
|
||||||
|
if i.isChecked():
|
||||||
|
self.active_library_filters.append(i.text())
|
||||||
|
else:
|
||||||
|
something_was_unchecked = True
|
||||||
|
|
||||||
|
if something_was_unchecked:
|
||||||
|
self.library_filter_menu.actions()[-1].setChecked(False)
|
||||||
|
else:
|
||||||
|
self.library_filter_menu.actions()[-1].setChecked(True)
|
||||||
|
|
||||||
|
self.lib_ref.update_proxymodel()
|
||||||
|
self.lib_ref.update_table_proxy_model()
|
||||||
|
|
||||||
def toggle_toolbars(self):
|
def toggle_toolbars(self):
|
||||||
self.settings['show_toolbars'] = not self.settings['show_toolbars']
|
self.settings['show_toolbars'] = not self.settings['show_toolbars']
|
||||||
|
@@ -35,9 +35,6 @@ class DatabaseInit:
|
|||||||
def create_database(self):
|
def create_database(self):
|
||||||
# TODO
|
# TODO
|
||||||
# Add separate columns for:
|
# Add separate columns for:
|
||||||
# directory tags
|
|
||||||
# bookmarks
|
|
||||||
# date added
|
|
||||||
# addition mode
|
# addition mode
|
||||||
self.database.execute(
|
self.database.execute(
|
||||||
"CREATE TABLE books \
|
"CREATE TABLE books \
|
||||||
|
10
library.py
10
library.py
@@ -26,7 +26,7 @@ import pathlib
|
|||||||
from PyQt5 import QtGui, QtCore
|
from PyQt5 import QtGui, QtCore
|
||||||
|
|
||||||
import database
|
import database
|
||||||
from models import MostExcellentTableModel, TableProxyModel
|
from models import MostExcellentTableModel, TableProxyModel, ItemProxyModel
|
||||||
|
|
||||||
|
|
||||||
class Library:
|
class Library:
|
||||||
@@ -131,6 +131,9 @@ class Library:
|
|||||||
item.setToolTip(tooltip_string)
|
item.setToolTip(tooltip_string)
|
||||||
|
|
||||||
# The following order is needed to keep sorting working
|
# The following order is needed to keep sorting working
|
||||||
|
# search_workaround_base is present in 2 places so that the UserRole + 10
|
||||||
|
# value can be used to create a new UserRole + 4 value whenever there's
|
||||||
|
# a change in the directory tags
|
||||||
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)
|
||||||
item.setData(year, QtCore.Qt.UserRole + 2)
|
item.setData(year, QtCore.Qt.UserRole + 2)
|
||||||
@@ -169,7 +172,9 @@ class Library:
|
|||||||
def update_table_proxy_model(self):
|
def update_table_proxy_model(self):
|
||||||
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(), [0, 1, 4])
|
self.parent.libraryToolBar.searchBar.text(),
|
||||||
|
[0, 1, 4],
|
||||||
|
self.parent.active_library_filters)
|
||||||
# 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(
|
||||||
@@ -177,6 +182,7 @@ class Library:
|
|||||||
|
|
||||||
def create_proxymodel(self):
|
def create_proxymodel(self):
|
||||||
self.proxy_model = QtCore.QSortFilterProxyModel()
|
self.proxy_model = QtCore.QSortFilterProxyModel()
|
||||||
|
# self.proxy_model = ItemProxyModel()
|
||||||
self.proxy_model.setSourceModel(self.view_model)
|
self.proxy_model.setSourceModel(self.view_model)
|
||||||
self.proxy_model.setSortCaseSensitivity(False)
|
self.proxy_model.setSortCaseSensitivity(False)
|
||||||
s = QtCore.QSize(160, 250) # Set icon sizing here
|
s = QtCore.QSize(160, 250) # Set icon sizing here
|
||||||
|
19
models.py
19
models.py
@@ -21,14 +21,13 @@ import pathlib
|
|||||||
from PyQt5 import QtCore, QtWidgets
|
from PyQt5 import QtCore, QtWidgets
|
||||||
from resources import pie_chart
|
from resources import pie_chart
|
||||||
|
|
||||||
|
|
||||||
class ItemProxyModel(QtCore.QSortFilterProxyModel):
|
class ItemProxyModel(QtCore.QSortFilterProxyModel):
|
||||||
# TODO
|
|
||||||
# Implement filterAcceptsRow
|
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(ItemProxyModel, self).__init__(parent)
|
super(ItemProxyModel, self).__init__(parent)
|
||||||
|
|
||||||
|
def filterAcceptsRow(self, row, parent):
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class MostExcellentTableModel(QtCore.QAbstractTableModel):
|
class MostExcellentTableModel(QtCore.QAbstractTableModel):
|
||||||
# Sorting is taken care of by the QSortFilterProxy model
|
# Sorting is taken care of by the QSortFilterProxy model
|
||||||
@@ -131,10 +130,12 @@ class TableProxyModel(QtCore.QSortFilterProxyModel):
|
|||||||
super(TableProxyModel, self).__init__(parent)
|
super(TableProxyModel, self).__init__(parent)
|
||||||
self.filter_string = None
|
self.filter_string = None
|
||||||
self.filter_columns = None
|
self.filter_columns = None
|
||||||
|
self.active_library_filters = None
|
||||||
|
|
||||||
def setFilterParams(self, filter_text, filter_columns):
|
def setFilterParams(self, filter_text, filter_columns, active_library_filters):
|
||||||
self.filter_string = filter_text.lower()
|
self.filter_string = filter_text.lower()
|
||||||
self.filter_columns = filter_columns
|
self.filter_columns = filter_columns
|
||||||
|
self.active_library_filters = active_library_filters
|
||||||
|
|
||||||
def filterAcceptsRow(self, row_num, parent):
|
def filterAcceptsRow(self, row_num, parent):
|
||||||
if self.filter_string is None or self.filter_columns is None:
|
if self.filter_string is None or self.filter_columns is None:
|
||||||
@@ -152,6 +153,14 @@ class TableProxyModel(QtCore.QSortFilterProxyModel):
|
|||||||
except IndexError: # Columns 7 and 8 are added after creation of the model
|
except IndexError: # Columns 7 and 8 are added after creation of the model
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Filter out all books not in the active library filters
|
||||||
|
if self.active_library_filters:
|
||||||
|
current_library_name = valid_data[-2]
|
||||||
|
if current_library_name not in self.active_library_filters:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
for i in valid_data:
|
for i in valid_data:
|
||||||
if i:
|
if i:
|
||||||
if self.filter_string in i:
|
if self.filter_string in i:
|
||||||
|
Reference in New Issue
Block a user