From 03b683e05d3f2c4597f2b7f5f381f3dc9f5e5818 Mon Sep 17 00:00:00 2001 From: BasioMeusPuga Date: Fri, 16 Mar 2018 19:32:25 +0530 Subject: [PATCH] Implement caching for QGraphicsView --- lector/widgets.py | 71 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/lector/widgets.py b/lector/widgets.py index 05f72da..ac3d616 100644 --- a/lector/widgets.py +++ b/lector/widgets.py @@ -441,7 +441,8 @@ class Tab(QtWidgets.QWidget): deleteAction = bookmark_menu.addAction( self.window().QImageFactory.get_image('trash-empty'), 'Delete') - action = bookmark_menu.exec_(self.dockListView.mapToGlobal(position)) + action = bookmark_menu.exec_( + self.dockListView.mapToGlobal(position)) if action == editAction: self.dockListView.edit(index) @@ -477,6 +478,7 @@ class PliantQGraphicsView(QtWidgets.QGraphicsView): self.qimage = None # Will be needed to resize pdf self.image_pixmap = None + self.image_cache = [None for _ in range(4)] self.filepath = filepath self.filetype = os.path.splitext(self.filepath)[1][1:] @@ -509,18 +511,69 @@ class PliantQGraphicsView(QtWidgets.QGraphicsView): # Threaded caching will still work here # Look at a commit where it's not been deleted # For double page view: 1 before, 1 after + all_pages = [i[1] for i in self.parent.metadata['content']] - self.image_pixmap = QtGui.QPixmap() + def load_page(current_page): + image_pixmap = QtGui.QPixmap() - if self.filetype in ('cbz', 'cbr'): - page_data = self.book.read(current_page) - self.image_pixmap.loadFromData(page_data) + if self.filetype in ('cbz', 'cbr'): + page_data = self.book.read(current_page) + image_pixmap.loadFromData(page_data) + elif self.filetype == 'pdf': + page_data = self.book.page(current_page) + page_qimage = page_data.renderToImage(350, 350) + image_pixmap.convertFromImage(page_qimage) + return image_pixmap - if self.filetype == 'pdf': - page_data = self.book.page(current_page) - page_qimage = page_data.renderToImage(350, 350) - self.image_pixmap.convertFromImage(page_qimage) + def generate_image_cache(current_page): + print('Building image cache') + current_page_index = all_pages.index(current_page) + for i in (-1, 0, 1, 2): + try: + this_page = all_pages[current_page_index + i] + this_pixmap = load_page(this_page) + self.image_cache[i + 1] = (this_page, this_pixmap) + except IndexError: + self.image_cache[i + 1] = None + + def refill_cache(remove_value): + remove_index = self.image_cache.index(remove_value) + + if remove_index == 1: + first_path = self.image_cache[0][0] + self.image_cache.pop(3) + previous_page = all_pages[all_pages.index(first_path) - 1] + refill_pixmap = load_page(previous_page) + self.image_cache.insert(0, (previous_page, refill_pixmap)) + + else: + self.image_cache[0] = self.image_cache[1] + self.image_cache.pop(1) + try: + last_page = self.image_cache[2][0] + next_page = all_pages[all_pages.index(last_page) + 1] + refill_pixmap = load_page(next_page) + self.image_cache.append((next_page, refill_pixmap)) + except (IndexError, TypeError): + self.image_cache.append(None) + + def check_cache(current_page): + for i in self.image_cache: + if i: + if i[0] == current_page: + return_pixmap = i[1] + refill_cache(i) + return return_pixmap + + # No return happened so the image isn't in the cache + generate_image_cache(current_page) + + return_pixmap = None + while not return_pixmap: + return_pixmap = check_cache(current_page) + + self.image_pixmap = return_pixmap self.resizeEvent() def resizeEvent(self, *args):