From 9a3f901ca44296bdbe08c26b4be9e1ad81143e50 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 30 Apr 2015 12:05:04 +0530 Subject: [PATCH] Prevent the cover browser from being refreshed and therefore using resources when it is hidden --- src/calibre/gui2/actions/add.py | 9 ++---- src/calibre/gui2/actions/edit_metadata.py | 10 +++---- src/calibre/gui2/auto_add.py | 3 +- src/calibre/gui2/cover_flow.py | 34 +++++++++++++++++------ src/calibre/gui2/dialogs/book_info.py | 3 +- src/calibre/gui2/init.py | 6 ++-- src/calibre/gui2/preferences/look_feel.py | 5 ++-- src/calibre/gui2/ui.py | 8 +++--- 8 files changed, 42 insertions(+), 36 deletions(-) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 022076ee6b..88ecc0f89b 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -272,8 +272,7 @@ class AddAction(InterfaceAction): fmts = [pt.name] ids.append(db.import_book(mi, fmts)) self.gui.library_view.model().books_added(num) - if hasattr(self.gui, 'db_images'): - self.gui.db_images.beginResetModel(), self.gui.db_images.endResetModel() + self.gui.refresh_cover_browser() self.gui.tags_view.recount() if ids: ids.reverse() @@ -374,8 +373,7 @@ class AddAction(InterfaceAction): if current_idx.isValid(): self.gui.library_view.model().current_changed(current_idx, current_idx) if cover_changed: - if self.gui.cover_flow: - self.gui.cover_flow.dataChanged() + self.gui.refresh_cover_browser() def __add_filesystem_book(self, paths, allow_device=True): if isinstance(paths, basestring): @@ -440,8 +438,7 @@ class AddAction(InterfaceAction): if adder.number_of_books_added > 0: self.gui.library_view.model().books_added(adder.number_of_books_added) self.gui.library_view.set_current_row(0) - if hasattr(self.gui, 'db_images'): - self.gui.db_images.beginResetModel(), self.gui.db_images.endResetModel() + self.gui.refresh_cover_browser() self.gui.tags_view.recount() if adder.merged_books: diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index d7eff04e97..53a1c8de2e 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -333,8 +333,7 @@ class EditMetadataAction(InterfaceAction): m = self.gui.library_view.model() m.refresh_ids(list(book_ids)) current = self.gui.library_view.currentIndex() - if self.gui.cover_flow: - self.gui.cover_flow.dataChanged() + self.gui.refresh_cover_browser() m.current_changed(current, previous or current) self.gui.tags_view.recount() @@ -401,8 +400,7 @@ class EditMetadataAction(InterfaceAction): else: m.refresh_ids(refresh_books) self.gui.tags_view.recount() - if self.gui.cover_flow: - self.gui.cover_flow.dataChanged() + self.gui.refresh_cover_browser() self.gui.library_view.select_rows(book_ids) # Merge books {{{ @@ -755,8 +753,8 @@ class EditMetadataAction(InterfaceAction): cr = self.gui.library_view.currentIndex().row() self.gui.library_view.model().refresh_ids( list(book_ids), cr) - if covers_changed and self.gui.cover_flow: - self.gui.cover_flow.dataChanged() + if covers_changed: + self.gui.refresh_cover_browser() if tag_browser_changed: self.gui.tags_view.recount() diff --git a/src/calibre/gui2/auto_add.py b/src/calibre/gui2/auto_add.py index db5c4ca947..f5dd1fcaaf 100644 --- a/src/calibre/gui2/auto_add.py +++ b/src/calibre/gui2/auto_add.py @@ -260,8 +260,7 @@ class AutoAdder(QObject): gui.status_bar.show_message(_( 'Added %(num)d book(s) automatically from %(src)s') % dict(num=count, src=self.worker.path), 2000) - if hasattr(gui, 'db_images'): - gui.db_images.beginResetModel(), gui.db_images.endResetModel() + gui.refresh_cover_browser() if needs_rescan: QTimer.singleShot(2000, self.dir_changed) diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index 6b69d8c2b0..bdce7ab856 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -78,9 +78,10 @@ if pictureflow is not None: class DatabaseImages(pictureflow.FlowImages): - def __init__(self, model, buffer=20): + def __init__(self, model, is_cover_browser_visible): pictureflow.FlowImages.__init__(self) self.model = model + self.is_cover_browser_visible = is_cover_browser_visible self.model.modelReset.connect(self.reset, type=Qt.QueuedConnection) def count(self): @@ -108,7 +109,8 @@ if pictureflow is not None: self.beginResetModel(), self.endResetModel() def beginResetModel(self): - self.dataChanged.emit() + if self.is_cover_browser_visible(): + self.dataChanged.emit() def endResetModel(self): pass @@ -244,9 +246,8 @@ class CoverFlowMixin(object): self.cover_flow = CoverFlow(parent=self) self.cover_flow.currentChanged.connect(self.sync_listview_to_cf) self.cover_flow.context_menu_requested.connect(self.cf_context_menu_requested) - self.library_view.selectionModel().currentRowChanged.connect( - self.sync_cf_to_listview) - self.db_images = DatabaseImages(self.library_view.model()) + self.library_view.selectionModel().currentRowChanged.connect(self.sync_cf_to_listview) + self.db_images = DatabaseImages(self.library_view.model(), self.is_cover_browser_visible) self.cover_flow.setImages(self.db_images) self.cover_flow.itemActivated.connect(self.iactions['View'].view_specific_book) else: @@ -254,6 +255,7 @@ class CoverFlowMixin(object): '
'+pictureflowerror) self.cover_flow.setWordWrap(True) if config['separate_cover_flow']: + self.separate_cover_browser = True self.cb_splitter.button.clicked.connect(self.toggle_cover_browser) self.cb_splitter.button.set_state_to_show() self.cb_splitter.action_toggle.triggered.connect(self.toggle_cover_browser) @@ -261,6 +263,7 @@ class CoverFlowMixin(object): self.cover_flow.stop.connect(self.hide_cover_browser) self.cover_flow.setVisible(False) else: + self.separate_cover_browser = False self.cb_splitter.insertWidget(self.cb_splitter.side_index, self.cover_flow) if CoverFlow is not None: self.cover_flow.stop.connect(self.cb_splitter.hide_side_pane) @@ -321,9 +324,23 @@ class CoverFlowMixin(object): self.cb_dialog = None self.cb_splitter.button.set_state_to_show() + def is_cover_browser_visible(self): + try: + if self.separate_cover_browser: + return self.cover_flow.isVisible() + except AttributeError: + return False # called before init_cover_flow_mixin + return not self.cb_splitter.is_side_index_hidden + + def refresh_cover_browser(self): + try: + if self.is_cover_browser_visible() and not isinstance(self.cover_flow, QLabel): + self.cover_flow.dataChanged() + except AttributeError: + pass # called before init_cover_flow_mixin + def sync_cf_to_listview(self, current, previous): - if self.cover_flow_sync_flag and self.cover_flow.isVisible() and \ - self.cover_flow.currentSlide() != current.row(): + if (self.cover_flow_sync_flag and self.is_cover_browser_visible() and self.cover_flow.currentSlide() != current.row()): self.cover_flow.setCurrentSlide(current.row()) self.cover_flow_sync_flag = True @@ -338,8 +355,7 @@ class CoverFlowMixin(object): def cover_flow_do_sync(self): self.cover_flow_sync_flag = True try: - if self.cover_flow.isVisible() and self.cf_last_updated_at is not None and \ - time.time() - self.cf_last_updated_at > 0.5: + if (self.is_cover_browser_visible() and self.cf_last_updated_at is not None and time.time() - self.cf_last_updated_at > 0.5): self.cf_last_updated_at = None row = self.cover_flow.currentSlide() m = self.library_view.model() diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index 24128c2017..d220fe4b95 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -130,8 +130,7 @@ class BookInfo(QDialog): if self.current_row is not None: id_ = self.view.model().id(self.current_row) self.view.model().db.set_cover(id_, data) - if self.gui.cover_flow: - self.gui.cover_flow.dataChanged() + self.gui.refresh_cover_browser() ci = self.view.currentIndex() if ci.isValid(): self.view.model().current_changed(ci, ci) diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index 869e17a2c4..715f524651 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -528,8 +528,7 @@ class LayoutMixin(object): # {{{ def bd_cover_changed(self, id_, cdata): self.library_view.model().db.set_cover(id_, cdata) - if self.cover_flow: - self.cover_flow.dataChanged() + self.refresh_cover_browser() def bd_open_cover_with(self, book_id, entry): cpath = self.current_db.new_api.format_abspath(book_id, '__COVER_INTERNAL__') @@ -560,8 +559,7 @@ class LayoutMixin(object): # {{{ def bd_cover_removed(self, id_): self.library_view.model().db.remove_cover(id_, commit=True, notify=False) - if self.cover_flow: - self.cover_flow.dataChanged() + self.refresh_cover_browser() def bd_copy_link(self, url): if url: diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 0af4f5e169..5e2bc3b45d 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -470,9 +470,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.update_font_display() gui.tags_view.reread_collapse_parameters() gui.library_view.refresh_book_details() - if hasattr(gui.cover_flow, 'setShowReflections'): - gui.cover_flow.setShowReflections(gprefs['cover_browser_reflections']) - gui.cover_flow.setPreserveAspectRatio(gprefs['cb_preserve_aspect_ratio']) + gui.cover_flow.setShowReflections(gprefs['cover_browser_reflections']) + gui.cover_flow.setPreserveAspectRatio(gprefs['cb_preserve_aspect_ratio']) gui.library_view.refresh_row_sizing() gui.grid_view.refresh_settings() diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index ac957cff55..c11609e8c2 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -87,7 +87,7 @@ _gui = None def get_gui(): return _gui -def add_quick_start_guide(library_view, db_images): +def add_quick_start_guide(library_view, refresh_cover_browser=None): from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks import calibre_cover from calibre.utils.zipfile import safe_replace @@ -112,8 +112,8 @@ def add_quick_start_guide(library_view, db_images): library_view.model().add_books([tmp.name], ['epub'], [mi]) os.remove(tmp.name) library_view.model().books_added(1) - if hasattr(db_images, 'reset'): - db_images.reset() + if refresh_cover_browser is not None: + refresh_cover_browser() if library_view.model().rowCount(None) < 3: library_view.resizeColumnsToContents() @@ -342,7 +342,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ self.iactions['Choose Library'].count_changed) if not gprefs.get('quick_start_guide_added', False): try: - add_quick_start_guide(self.library_view, getattr(self, 'db_images', None)) + add_quick_start_guide(self.library_view) except: import traceback traceback.print_exc()