Prevent the cover browser from being refreshed and therefore using resources when it is hidden

This commit is contained in:
Kovid Goyal 2015-04-30 12:05:04 +05:30
parent 67948df37f
commit 9a3f901ca4
8 changed files with 42 additions and 36 deletions

View File

@ -272,8 +272,7 @@ class AddAction(InterfaceAction):
fmts = [pt.name] fmts = [pt.name]
ids.append(db.import_book(mi, fmts)) ids.append(db.import_book(mi, fmts))
self.gui.library_view.model().books_added(num) self.gui.library_view.model().books_added(num)
if hasattr(self.gui, 'db_images'): self.gui.refresh_cover_browser()
self.gui.db_images.beginResetModel(), self.gui.db_images.endResetModel()
self.gui.tags_view.recount() self.gui.tags_view.recount()
if ids: if ids:
ids.reverse() ids.reverse()
@ -374,8 +373,7 @@ class AddAction(InterfaceAction):
if current_idx.isValid(): if current_idx.isValid():
self.gui.library_view.model().current_changed(current_idx, current_idx) self.gui.library_view.model().current_changed(current_idx, current_idx)
if cover_changed: if cover_changed:
if self.gui.cover_flow: self.gui.refresh_cover_browser()
self.gui.cover_flow.dataChanged()
def __add_filesystem_book(self, paths, allow_device=True): def __add_filesystem_book(self, paths, allow_device=True):
if isinstance(paths, basestring): if isinstance(paths, basestring):
@ -440,8 +438,7 @@ class AddAction(InterfaceAction):
if adder.number_of_books_added > 0: if adder.number_of_books_added > 0:
self.gui.library_view.model().books_added(adder.number_of_books_added) self.gui.library_view.model().books_added(adder.number_of_books_added)
self.gui.library_view.set_current_row(0) self.gui.library_view.set_current_row(0)
if hasattr(self.gui, 'db_images'): self.gui.refresh_cover_browser()
self.gui.db_images.beginResetModel(), self.gui.db_images.endResetModel()
self.gui.tags_view.recount() self.gui.tags_view.recount()
if adder.merged_books: if adder.merged_books:

View File

@ -333,8 +333,7 @@ class EditMetadataAction(InterfaceAction):
m = self.gui.library_view.model() m = self.gui.library_view.model()
m.refresh_ids(list(book_ids)) m.refresh_ids(list(book_ids))
current = self.gui.library_view.currentIndex() current = self.gui.library_view.currentIndex()
if self.gui.cover_flow: self.gui.refresh_cover_browser()
self.gui.cover_flow.dataChanged()
m.current_changed(current, previous or current) m.current_changed(current, previous or current)
self.gui.tags_view.recount() self.gui.tags_view.recount()
@ -401,8 +400,7 @@ class EditMetadataAction(InterfaceAction):
else: else:
m.refresh_ids(refresh_books) m.refresh_ids(refresh_books)
self.gui.tags_view.recount() self.gui.tags_view.recount()
if self.gui.cover_flow: self.gui.refresh_cover_browser()
self.gui.cover_flow.dataChanged()
self.gui.library_view.select_rows(book_ids) self.gui.library_view.select_rows(book_ids)
# Merge books {{{ # Merge books {{{
@ -755,8 +753,8 @@ class EditMetadataAction(InterfaceAction):
cr = self.gui.library_view.currentIndex().row() cr = self.gui.library_view.currentIndex().row()
self.gui.library_view.model().refresh_ids( self.gui.library_view.model().refresh_ids(
list(book_ids), cr) list(book_ids), cr)
if covers_changed and self.gui.cover_flow: if covers_changed:
self.gui.cover_flow.dataChanged() self.gui.refresh_cover_browser()
if tag_browser_changed: if tag_browser_changed:
self.gui.tags_view.recount() self.gui.tags_view.recount()

View File

@ -260,8 +260,7 @@ class AutoAdder(QObject):
gui.status_bar.show_message(_( gui.status_bar.show_message(_(
'Added %(num)d book(s) automatically from %(src)s') % 'Added %(num)d book(s) automatically from %(src)s') %
dict(num=count, src=self.worker.path), 2000) dict(num=count, src=self.worker.path), 2000)
if hasattr(gui, 'db_images'): gui.refresh_cover_browser()
gui.db_images.beginResetModel(), gui.db_images.endResetModel()
if needs_rescan: if needs_rescan:
QTimer.singleShot(2000, self.dir_changed) QTimer.singleShot(2000, self.dir_changed)

View File

@ -78,9 +78,10 @@ if pictureflow is not None:
class DatabaseImages(pictureflow.FlowImages): class DatabaseImages(pictureflow.FlowImages):
def __init__(self, model, buffer=20): def __init__(self, model, is_cover_browser_visible):
pictureflow.FlowImages.__init__(self) pictureflow.FlowImages.__init__(self)
self.model = model self.model = model
self.is_cover_browser_visible = is_cover_browser_visible
self.model.modelReset.connect(self.reset, type=Qt.QueuedConnection) self.model.modelReset.connect(self.reset, type=Qt.QueuedConnection)
def count(self): def count(self):
@ -108,7 +109,8 @@ if pictureflow is not None:
self.beginResetModel(), self.endResetModel() self.beginResetModel(), self.endResetModel()
def beginResetModel(self): def beginResetModel(self):
self.dataChanged.emit() if self.is_cover_browser_visible():
self.dataChanged.emit()
def endResetModel(self): def endResetModel(self):
pass pass
@ -244,9 +246,8 @@ class CoverFlowMixin(object):
self.cover_flow = CoverFlow(parent=self) self.cover_flow = CoverFlow(parent=self)
self.cover_flow.currentChanged.connect(self.sync_listview_to_cf) self.cover_flow.currentChanged.connect(self.sync_listview_to_cf)
self.cover_flow.context_menu_requested.connect(self.cf_context_menu_requested) self.cover_flow.context_menu_requested.connect(self.cf_context_menu_requested)
self.library_view.selectionModel().currentRowChanged.connect( self.library_view.selectionModel().currentRowChanged.connect(self.sync_cf_to_listview)
self.sync_cf_to_listview) self.db_images = DatabaseImages(self.library_view.model(), self.is_cover_browser_visible)
self.db_images = DatabaseImages(self.library_view.model())
self.cover_flow.setImages(self.db_images) self.cover_flow.setImages(self.db_images)
self.cover_flow.itemActivated.connect(self.iactions['View'].view_specific_book) self.cover_flow.itemActivated.connect(self.iactions['View'].view_specific_book)
else: else:
@ -254,6 +255,7 @@ class CoverFlowMixin(object):
'<br>'+pictureflowerror) '<br>'+pictureflowerror)
self.cover_flow.setWordWrap(True) self.cover_flow.setWordWrap(True)
if config['separate_cover_flow']: if config['separate_cover_flow']:
self.separate_cover_browser = True
self.cb_splitter.button.clicked.connect(self.toggle_cover_browser) self.cb_splitter.button.clicked.connect(self.toggle_cover_browser)
self.cb_splitter.button.set_state_to_show() self.cb_splitter.button.set_state_to_show()
self.cb_splitter.action_toggle.triggered.connect(self.toggle_cover_browser) 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.stop.connect(self.hide_cover_browser)
self.cover_flow.setVisible(False) self.cover_flow.setVisible(False)
else: else:
self.separate_cover_browser = False
self.cb_splitter.insertWidget(self.cb_splitter.side_index, self.cover_flow) self.cb_splitter.insertWidget(self.cb_splitter.side_index, self.cover_flow)
if CoverFlow is not None: if CoverFlow is not None:
self.cover_flow.stop.connect(self.cb_splitter.hide_side_pane) self.cover_flow.stop.connect(self.cb_splitter.hide_side_pane)
@ -321,9 +324,23 @@ class CoverFlowMixin(object):
self.cb_dialog = None self.cb_dialog = None
self.cb_splitter.button.set_state_to_show() 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): def sync_cf_to_listview(self, current, previous):
if self.cover_flow_sync_flag and self.cover_flow.isVisible() and \ if (self.cover_flow_sync_flag and self.is_cover_browser_visible() and self.cover_flow.currentSlide() != current.row()):
self.cover_flow.currentSlide() != current.row():
self.cover_flow.setCurrentSlide(current.row()) self.cover_flow.setCurrentSlide(current.row())
self.cover_flow_sync_flag = True self.cover_flow_sync_flag = True
@ -338,8 +355,7 @@ class CoverFlowMixin(object):
def cover_flow_do_sync(self): def cover_flow_do_sync(self):
self.cover_flow_sync_flag = True self.cover_flow_sync_flag = True
try: try:
if self.cover_flow.isVisible() and self.cf_last_updated_at is not None and \ 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):
time.time() - self.cf_last_updated_at > 0.5:
self.cf_last_updated_at = None self.cf_last_updated_at = None
row = self.cover_flow.currentSlide() row = self.cover_flow.currentSlide()
m = self.library_view.model() m = self.library_view.model()

View File

@ -130,8 +130,7 @@ class BookInfo(QDialog):
if self.current_row is not None: if self.current_row is not None:
id_ = self.view.model().id(self.current_row) id_ = self.view.model().id(self.current_row)
self.view.model().db.set_cover(id_, data) self.view.model().db.set_cover(id_, data)
if self.gui.cover_flow: self.gui.refresh_cover_browser()
self.gui.cover_flow.dataChanged()
ci = self.view.currentIndex() ci = self.view.currentIndex()
if ci.isValid(): if ci.isValid():
self.view.model().current_changed(ci, ci) self.view.model().current_changed(ci, ci)

View File

@ -528,8 +528,7 @@ class LayoutMixin(object): # {{{
def bd_cover_changed(self, id_, cdata): def bd_cover_changed(self, id_, cdata):
self.library_view.model().db.set_cover(id_, cdata) self.library_view.model().db.set_cover(id_, cdata)
if self.cover_flow: self.refresh_cover_browser()
self.cover_flow.dataChanged()
def bd_open_cover_with(self, book_id, entry): def bd_open_cover_with(self, book_id, entry):
cpath = self.current_db.new_api.format_abspath(book_id, '__COVER_INTERNAL__') 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_): def bd_cover_removed(self, id_):
self.library_view.model().db.remove_cover(id_, commit=True, self.library_view.model().db.remove_cover(id_, commit=True,
notify=False) notify=False)
if self.cover_flow: self.refresh_cover_browser()
self.cover_flow.dataChanged()
def bd_copy_link(self, url): def bd_copy_link(self, url):
if url: if url:

View File

@ -470,9 +470,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
self.update_font_display() self.update_font_display()
gui.tags_view.reread_collapse_parameters() gui.tags_view.reread_collapse_parameters()
gui.library_view.refresh_book_details() gui.library_view.refresh_book_details()
if hasattr(gui.cover_flow, 'setShowReflections'): gui.cover_flow.setShowReflections(gprefs['cover_browser_reflections'])
gui.cover_flow.setShowReflections(gprefs['cover_browser_reflections']) gui.cover_flow.setPreserveAspectRatio(gprefs['cb_preserve_aspect_ratio'])
gui.cover_flow.setPreserveAspectRatio(gprefs['cb_preserve_aspect_ratio'])
gui.library_view.refresh_row_sizing() gui.library_view.refresh_row_sizing()
gui.grid_view.refresh_settings() gui.grid_view.refresh_settings()

View File

@ -87,7 +87,7 @@ _gui = None
def get_gui(): def get_gui():
return _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.metadata.meta import get_metadata
from calibre.ebooks import calibre_cover from calibre.ebooks import calibre_cover
from calibre.utils.zipfile import safe_replace 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]) library_view.model().add_books([tmp.name], ['epub'], [mi])
os.remove(tmp.name) os.remove(tmp.name)
library_view.model().books_added(1) library_view.model().books_added(1)
if hasattr(db_images, 'reset'): if refresh_cover_browser is not None:
db_images.reset() refresh_cover_browser()
if library_view.model().rowCount(None) < 3: if library_view.model().rowCount(None) < 3:
library_view.resizeColumnsToContents() library_view.resizeColumnsToContents()
@ -342,7 +342,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{
self.iactions['Choose Library'].count_changed) self.iactions['Choose Library'].count_changed)
if not gprefs.get('quick_start_guide_added', False): if not gprefs.get('quick_start_guide_added', False):
try: try:
add_quick_start_guide(self.library_view, getattr(self, 'db_images', None)) add_quick_start_guide(self.library_view)
except: except:
import traceback import traceback
traceback.print_exc() traceback.print_exc()