From a2eca6bb149bc9496ddde219b5c05c91981a5b27 Mon Sep 17 00:00:00 2001 From: BasioMeusPuga Date: Wed, 28 Feb 2018 22:57:40 +0530 Subject: [PATCH] Begin bookmark editing --- TODO | 5 +++-- models.py | 25 ++++++++++++++++++++++ widgets.py | 62 ++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 69 insertions(+), 23 deletions(-) diff --git a/TODO b/TODO index 86bb768..07925fd 100644 --- a/TODO +++ b/TODO @@ -27,7 +27,7 @@ TODO Information dialog widget Context menu: Cache, Read, Edit database, delete, Mark read/unread Set focus to newly added file - Allow editing of database data through the UI + Allow editing of database data through the UI + for Bookmarks Reading: ✓ Drop down for TOC ✓ Override the keypress event of the textedit @@ -43,6 +43,7 @@ TODO ✓ View and hide toolbar actions in a list ✓ Line spacing ✓ Record progress + ✓ Text alignment Bookmarks Set context menu for definitions and the like Search document using QTextCursor? @@ -59,7 +60,7 @@ TODO mobi, azw support Other: ✓ Define every widget in code - ✓ Include icons for emblems + Include icons for filetype emblems Bugs: If there are files open and the database is deleted, TypeErrors result Closing a fullscreened contentView does not save settings diff --git a/models.py b/models.py index 5261141..ccd1982 100644 --- a/models.py +++ b/models.py @@ -22,6 +22,31 @@ from PyQt5 import QtCore, QtWidgets from resources import pie_chart +class BookmarkProxyModel(QtCore.QSortFilterProxyModel): + def __init__(self, parent=None): + super(BookmarkProxyModel, self).__init__(parent) + self.parent = parent + self.filter_string = None + + def setFilterParams(self, filter_text): + self.filter_text = filter_text + + def filterAcceptsRow(self, row, parent): + # TODO + # Connect this to the search bar + return True + + def setData(self, index, value, role): + if role == QtCore.Qt.EditRole: + source_index = self.mapToSource(index) + self.sourceModel().setData(source_index, value, QtCore.Qt.DisplayRole) + + row = index.row() + print(self.parent.metadata['bookmarks']) + + return True + + class ItemProxyModel(QtCore.QSortFilterProxyModel): def __init__(self, parent=None): super(ItemProxyModel, self).__init__(parent) diff --git a/widgets.py b/widgets.py index 74dd088..c08eb83 100644 --- a/widgets.py +++ b/widgets.py @@ -26,6 +26,7 @@ import os from PyQt5 import QtWidgets, QtGui, QtCore from resources import pie_chart +from models import BookmarkProxyModel class Tab(QtWidgets.QWidget): @@ -89,7 +90,7 @@ class Tab(QtWidgets.QWidget): QtCore.Qt.ScrollBarAlwaysOff) # Create the dock widget for context specific display - self.dockWidget = QtWidgets.QDockWidget(self) + self.dockWidget = PliantDockWidget(self) self.dockWidget.setFeatures(QtWidgets.QDockWidget.DockWidgetClosable) self.dockWidget.setFloating(False) self.dockWidget.hide() @@ -102,9 +103,9 @@ class Tab(QtWidgets.QWidget): self.dockListView.clicked.connect(self.navigate_to_bookmark) self.dockWidget.setWidget(self.dockListView) - self.bookmark_model = QtGui.QStandardItemModel() + self.bookmark_model = QtGui.QStandardItemModel(self) + self.proxy_model = BookmarkProxyModel(self) self.generate_bookmark_model() - self.dockListView.setModel(self.bookmark_model) self.generate_keyboard_shortcuts() @@ -249,7 +250,6 @@ class Tab(QtWidgets.QWidget): font, font_size, foreground.name(), background.name())) # Line spacing - # Iterate over each block using the QTextCursor # Set line spacing per a block format # This is proportional line spacing so assume a divisor of 100 block_format = QtGui.QTextBlockFormat() @@ -298,6 +298,25 @@ class Tab(QtWidgets.QWidget): self.metadata['bookmarks'].append([ chapter, search_data, description]) self.add_bookmark_to_model(description, chapter, search_data) + self.dockWidget.setVisible(True) + + def add_bookmark_to_model(self, description, chapter, search_data): + bookmark = QtGui.QStandardItem() + bookmark.setData(description, QtCore.Qt.DisplayRole) + bookmark.setData(chapter, QtCore.Qt.UserRole) + bookmark.setData(search_data, QtCore.Qt.UserRole + 1) + + self.bookmark_model.appendRow(bookmark) + + def navigate_to_bookmark(self, index): + if not index.isValid(): + return + + chapter = self.proxy_model.data(index, QtCore.Qt.UserRole) + search_data = self.proxy_model.data(index, QtCore.Qt.UserRole + 1) + + self.window().bookToolBar.tocBox.setCurrentIndex(chapter - 1) + self.set_scroll_value(False, search_data) def generate_bookmark_model(self): bookmarks = self.metadata['bookmarks'] @@ -313,23 +332,12 @@ class Tab(QtWidgets.QWidget): for i in bookmarks: self.add_bookmark_to_model(i[2], i[0], i[1]) - def add_bookmark_to_model(self, description, chapter, search_data): - bookmark = QtGui.QStandardItem() - bookmark.setData(description, QtCore.Qt.DisplayRole) - bookmark.setData(chapter, QtCore.Qt.UserRole) - bookmark.setData(search_data, QtCore.Qt.UserRole + 1) + self.generate_proxy_model() - self.bookmark_model.appendRow(bookmark) - - def navigate_to_bookmark(self, index): - if not index.isValid(): - return - - chapter = self.bookmark_model.data(index, QtCore.Qt.UserRole) - search_data = self.bookmark_model.data(index, QtCore.Qt.UserRole + 1) - - self.window().bookToolBar.tocBox.setCurrentIndex(chapter - 1) - self.set_scroll_value(False, search_data) + def generate_proxy_model(self): + self.proxy_model.setSourceModel(self.bookmark_model) + self.proxy_model.setSortCaseSensitivity(False) + self.dockListView.setModel(self.proxy_model) def hide_mouse(self): self.contentView.setCursor(QtCore.Qt.BlankCursor) @@ -620,7 +628,7 @@ class BookmarkDelegate(QtWidgets.QStyledItemDelegate): self.parent = parent def sizeHint(self, *args): - dockwidget_width = self.parent.width() + dockwidget_width = self.parent.width() - 20 return QtCore.QSize(dockwidget_width, 50) def paint(self, painter, option, index): @@ -637,3 +645,15 @@ class BookmarkDelegate(QtWidgets.QStyledItemDelegate): option.rect, QtCore.Qt.AlignBottom|QtCore.Qt.AlignRight|QtCore.Qt.TextWordWrap, ' ' + chapter_name) + + +class PliantDockWidget(QtWidgets.QDockWidget): + def __init__(self, parent=None): + super(PliantDockWidget, self).__init__(parent) + self.parent = parent + + def showEvent(self, event): + self.parent.window().bookToolBar.bookmarkButton.setChecked(True) + + def hideEvent(self, event): + self.parent.window().bookToolBar.bookmarkButton.setChecked(False)