From f1842ae443dfd8de1e44bfbaf288bdfbc59de3cc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 11 Apr 2014 21:41:59 +0530 Subject: [PATCH] Port: setMargin() reset() QStringList() setMargin(): QLayout no longer has a setMargin() function, replace with setContentsMargins() reset(): QAbstractListModel no longer has reset(), replace with beginResetModel(), endResetModel() QStringList: No longer exists, a simply python list of strings works instead --- setup/qt5-migrate.py | 2 ++ src/calibre/gui2/actions/add.py | 4 +-- src/calibre/gui2/actions/catalog.py | 2 +- src/calibre/gui2/actions/fetch_news.py | 2 +- src/calibre/gui2/auto_add.py | 2 +- src/calibre/gui2/complete.py | 3 +- src/calibre/gui2/complete2.py | 11 ++++--- src/calibre/gui2/cover_flow.py | 6 ++++ src/calibre/gui2/dialogs/plugin_updater.py | 4 +-- src/calibre/gui2/dialogs/user_profiles.py | 15 ++++++--- src/calibre/gui2/font_family_chooser.py | 3 +- src/calibre/gui2/jobs.py | 9 +++--- src/calibre/gui2/library/models.py | 31 ++++++++++--------- src/calibre/gui2/metadata/config.py | 6 ++-- src/calibre/gui2/metadata/single_download.py | 7 +++-- src/calibre/gui2/preferences/coloring.py | 9 ++++-- src/calibre/gui2/preferences/emailp.py | 9 ++++-- src/calibre/gui2/preferences/history.py | 4 +-- src/calibre/gui2/preferences/look_feel.py | 6 ++-- .../gui2/preferences/metadata_sources.py | 21 ++++++++----- src/calibre/gui2/preferences/plugins.py | 12 ++++--- src/calibre/gui2/preferences/toolbar.py | 18 +++++++---- src/calibre/gui2/search_box.py | 4 +-- src/calibre/gui2/search_restriction_mixin.py | 4 +-- .../gui2/store/config/chooser/models.py | 2 +- src/calibre/gui2/store/search/models.py | 4 +-- .../gui2/store/stores/mobileread/models.py | 2 +- src/calibre/gui2/tweak_book/char_select.py | 12 ++++--- src/calibre/gui2/tweak_book/diff/view.py | 2 +- .../gui2/tweak_book/editor/insert_resource.py | 3 +- src/calibre/gui2/tweak_book/search.py | 6 ++-- src/calibre/gui2/tweak_book/undo.py | 3 +- src/calibre/gui2/tweak_book/widgets.py | 8 ++--- src/calibre/gui2/widgets.py | 4 +-- 34 files changed, 148 insertions(+), 92 deletions(-) diff --git a/setup/qt5-migrate.py b/setup/qt5-migrate.py index 3f84f2c5a3..e957e95e5a 100644 --- a/setup/qt5-migrate.py +++ b/setup/qt5-migrate.py @@ -6,6 +6,8 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' +# QT5XX: See why mouse wheel is not working in diff view + # QT5XX: Delete this file after migration is completed import os diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index bf6afc8838..df1cc5a067 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -216,7 +216,7 @@ class AddAction(InterfaceAction): 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.reset() + self.gui.db_images.beginResetModel(), self.gui.db_images.endResetModel() self.gui.tags_view.recount() if ids: ids.reverse() @@ -384,7 +384,7 @@ class AddAction(InterfaceAction): self.gui.library_view.model().books_added(self._adder.number_of_books_added) self.gui.library_view.set_current_row(0) if hasattr(self.gui, 'db_images'): - self.gui.db_images.reset() + self.gui.db_images.beginResetModel(), self.gui.db_images.endResetModel() self.gui.tags_view.recount() if getattr(self._adder, 'merged_books', False): diff --git a/src/calibre/gui2/actions/catalog.py b/src/calibre/gui2/actions/catalog.py index ca9b19c2ca..bf9b050848 100644 --- a/src/calibre/gui2/actions/catalog.py +++ b/src/calibre/gui2/actions/catalog.py @@ -79,7 +79,7 @@ class GenerateCatalogAction(InterfaceAction): if job.failed: return self.gui.job_exception(job) id = self.gui.library_view.model().add_catalog(job.catalog_file_path, job.catalog_title) - self.gui.library_view.model().reset() + self.gui.library_view.model().beginResetModel(), self.gui.library_view.model().endResetModel() if job.catalog_sync: sync = dynamic.get('catalogs_to_be_synced', set([])) sync.add(id) diff --git a/src/calibre/gui2/actions/fetch_news.py b/src/calibre/gui2/actions/fetch_news.py index 87597aa4f0..10d4859a40 100644 --- a/src/calibre/gui2/actions/fetch_news.py +++ b/src/calibre/gui2/actions/fetch_news.py @@ -75,7 +75,7 @@ class FetchNewsAction(InterfaceAction): if ids_to_delete: self.gui.library_view.model().delete_books_by_id(ids_to_delete) - self.gui.library_view.model().reset() + self.gui.library_view.model().beginResetModel(), self.gui.library_view.model().endResetModel() sync = self.gui.news_to_be_synced sync.add(id) self.gui.news_to_be_synced = sync diff --git a/src/calibre/gui2/auto_add.py b/src/calibre/gui2/auto_add.py index 7e208f4a67..31cae04579 100644 --- a/src/calibre/gui2/auto_add.py +++ b/src/calibre/gui2/auto_add.py @@ -261,7 +261,7 @@ class AutoAdder(QObject): '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.reset() + gui.db_images.beginResetModel(), gui.db_images.endResetModel() if needs_rescan: QTimer.singleShot(2000, self.dir_changed) diff --git a/src/calibre/gui2/complete.py b/src/calibre/gui2/complete.py index 85667c7636..96b997d4a2 100644 --- a/src/calibre/gui2/complete.py +++ b/src/calibre/gui2/complete.py @@ -26,13 +26,14 @@ class CompleteModel(QAbstractListModel): def set_items(self, items): items = [unicode(x.strip()) for x in items] + self.beginResetModel() if len(items) < 2500: self.items = sorted(items, key=sort_key) self.sorting = QCompleter.UnsortedModel else: self.items = sorted(items, key=lambda x:x.lower()) self.sorting = QCompleter.CaseInsensitivelySortedModel - self.reset() + self.endResetModel() def rowCount(self, *args): return len(self.items) diff --git a/src/calibre/gui2/complete2.py b/src/calibre/gui2/complete2.py index e65dcf2b1a..f0b98fb59a 100644 --- a/src/calibre/gui2/complete2.py +++ b/src/calibre/gui2/complete2.py @@ -15,7 +15,6 @@ from PyQt5.Qt import (QLineEdit, QAbstractListModel, Qt, pyqtSignal, QObject, from calibre.constants import isosx, get_osx_version from calibre.utils.icu import sort_key, primary_startswith, primary_contains -from calibre.gui2 import NONE from calibre.gui2.widgets import EnComboBox, LineEditECM from calibre.utils.config import tweaks @@ -34,9 +33,10 @@ class CompleteModel(QAbstractListModel): # {{{ items = [unicode(x.strip()) for x in items] items = [x for x in items if x] items = tuple(sorted(items, key=self.sort_func)) + self.beginResetModel() self.all_items = self.current_items = items self.current_prefix = '' - self.reset() + self.endResetModel() def set_completion_prefix(self, prefix): old_prefix = self.current_prefix @@ -44,14 +44,16 @@ class CompleteModel(QAbstractListModel): # {{{ if prefix == old_prefix: return if not prefix: + self.beginResetModel() self.current_items = self.all_items - self.reset() + self.endResetModel() return subset = prefix.startswith(old_prefix) universe = self.current_items if subset else self.all_items func = primary_startswith if tweaks['completion_mode'] == 'prefix' else containsq + self.beginResetModel() self.current_items = tuple(x for x in universe if func(x, prefix)) - self.reset() + self.endResetModel() def rowCount(self, *args): return len(self.current_items) @@ -62,7 +64,6 @@ class CompleteModel(QAbstractListModel): # {{{ return self.current_items[index.row()] except IndexError: pass - return NONE def index_for_prefix(self, prefix): for i, item in enumerate(self.current_items): diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index 59f6a4ebb3..57da52624f 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -105,8 +105,14 @@ if pictureflow is not None: return '' def reset(self): + self.beginResetModel(), self.endResetModel() + + def beginResetModel(self): self.dataChanged.emit() + def endResetModel(self): + pass + def image(self, index): return self.model.cover(index) diff --git a/src/calibre/gui2/dialogs/plugin_updater.py b/src/calibre/gui2/dialogs/plugin_updater.py index 6b46e36902..aeb7605c83 100644 --- a/src/calibre/gui2/dialogs/plugin_updater.py +++ b/src/calibre/gui2/dialogs/plugin_updater.py @@ -673,7 +673,7 @@ class PluginUpdaterDialog(SizePersistedDialog): return self._uninstall_plugin(display_plugin.name) if self.proxy_model.filter_criteria in [FILTER_INSTALLED, FILTER_UPDATE_AVAILABLE]: - self.model.reset() + self.model.beginResetModel(), self.model.endResetModel() self._select_and_focus_view() else: self._select_and_focus_view(change_selection=False) @@ -755,7 +755,7 @@ class PluginUpdaterDialog(SizePersistedDialog): display_plugin.uninstall_plugins = [] if self.proxy_model.filter_criteria in [FILTER_NOT_INSTALLED, FILTER_UPDATE_AVAILABLE]: - self.model.reset() + self.model.beginResetModel(), self.model.endResetModel() self._select_and_focus_view() else: self.model.refresh_plugin(display_plugin) diff --git a/src/calibre/gui2/dialogs/user_profiles.py b/src/calibre/gui2/dialogs/user_profiles.py index 58815c0901..56ed09256d 100644 --- a/src/calibre/gui2/dialogs/user_profiles.py +++ b/src/calibre/gui2/dialogs/user_profiles.py @@ -57,8 +57,9 @@ class CustomRecipeModel(QAbstractListModel): if x.get('title', False) == title: urn = x.get('id') if urn is not None: + self.beginResetModel() self.recipe_model.update_custom_recipe(urn, title, script) - self.reset() + self.endResetModel() def replace_many_by_title(self, scriptmap): script_urn_map = {} @@ -71,16 +72,19 @@ class CustomRecipeModel(QAbstractListModel): script_urn_map.update({urn: (title, script)}) if script_urn_map: + self.beginResetModel() self.recipe_model.update_custom_recipes(script_urn_map) - self.reset() + self.endResetModel() def add(self, title, script): + self.beginResetModel() self.recipe_model.add_custom_recipe(title, script) - self.reset() + self.endResetModel() def add_many(self, scriptmap): + self.beginResetModel() self.recipe_model.add_custom_recipes(scriptmap) - self.reset() + self.endResetModel() def remove(self, rows): urns = [] @@ -90,8 +94,9 @@ class CustomRecipeModel(QAbstractListModel): urns.append(urn) except: pass + self.beginResetModel() self.recipe_model.remove_custom_recipes(urns) - self.reset() + self.endResetModel() class UserProfiles(ResizableDialog, Ui_Dialog): diff --git a/src/calibre/gui2/font_family_chooser.py b/src/calibre/gui2/font_family_chooser.py index d60d4175e5..870991ac8d 100644 --- a/src/calibre/gui2/font_family_chooser.py +++ b/src/calibre/gui2/font_family_chooser.py @@ -285,8 +285,9 @@ class FontFamilyDialog(QDialog): for f in files: shutil.copyfile(f, os.path.join(dest, os.path.basename(f))) self.font_scanner.do_scan() + self.m.beginResetModel() self.build_font_list() - self.m.reset() + self.m.endResetModel() self.view.setCurrentIndex(self.m.index(0)) if families: for i, val in enumerate(self.families): diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index f33fdd56bd..4ca4b2a971 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -373,8 +373,9 @@ class FilterModel(QSortFilterProxyModel): # {{{ except ParseException: ok = False self.search_filter = val + self.beginResetModel() self.search_done.emit(ok) - self.reset() + self.endResetModel() # }}} @@ -459,7 +460,7 @@ class JobsButton(QFrame): # {{{ if not horizontal: self.layout().setAlignment(self._jobs, Qt.AlignHCenter) self._jobs.setMargin(0) - self.layout().setMargin(0) + self.layout().setContentsMargins(0, 0, 0, 0) self._jobs.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.setCursor(Qt.PointingHandCursor) b = _('Click to see list of jobs') @@ -620,12 +621,12 @@ class JobsDialog(QDialog, Ui_JobsDialog): return error_dialog(self, _('No job'), _('No job selected'), show=True) self.model.hide_jobs(rows) - self.proxy_model.reset() + self.proxy_model.beginResetModel(), self.proxy_model.endResetModel() def hide_all(self, *args): self.model.hide_jobs(list(xrange(0, self.model.rowCount(QModelIndex())))) - self.proxy_model.reset() + self.proxy_model.beginResetModel(), self.proxy_model.endResetModel() def show_hidden(self, *args): self.model.show_hidden_jobs() diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 4cbe5dc434..6bea39e9f0 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -278,7 +278,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.headers[col] = self.custom_columns[col]['name'] self.build_data_convertors() - self.reset() + self.beginResetModel(), self.endResetModel() self.database_changed.emit(db) self.stop_metadata_backup() self.start_metadata_backup() @@ -312,7 +312,7 @@ class BooksModel(QAbstractTableModel): # {{{ def close(self): self.db.close() self.db = None - self.reset() + self.beginResetModel(), self.endResetModel() def add_books(self, paths, formats, metadata, add_duplicates=False, return_ids=False): @@ -351,7 +351,7 @@ class BooksModel(QAbstractTableModel): # {{{ def books_deleted(self): self.count_changed() - self.reset() + self.beginResetModel(), self.endResetModel() def delete_books(self, indices, permanent=False): ids = map(self.id, indices) @@ -410,7 +410,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.current_highlighted_idx = 0 else: self.current_highlighted_idx = None - self.reset() + self.beginResetModel(), self.endResetModel() def search(self, text, reset=True): try: @@ -437,7 +437,7 @@ class BooksModel(QAbstractTableModel): # {{{ return self.last_search = text if reset: - self.reset() + self.beginResetModel(), self.endResetModel() if self.last_search: # Do not issue search done for the null search. It is used to clear # the search and count records for restrictions @@ -460,7 +460,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.about_to_be_sorted.emit(self.db.id) self.db.data.incremental_sort([(label, order)]) if reset: - self.reset() + self.beginResetModel(), self.endResetModel() self.sorted_on = (label, order) self.sort_history.insert(0, self.sorted_on) self.sorting_done.emit(self.db.index) @@ -469,16 +469,19 @@ class BooksModel(QAbstractTableModel): # {{{ self.db.refresh(field=None) self.resort(reset=reset) - def reset(self): + def beginResetModel(self): self._clear_caches() - QAbstractTableModel.reset(self) + QAbstractTableModel.beginResetModel(self) + + def reset(self): + self.beginResetModel(), self.endResetModel() def resort(self, reset=True): if not self.db: return self.db.multisort(self.sort_history[:tweaks['maximum_resort_levels']]) if reset: - self.reset() + self.beginResetModel(), self.endResetModel() def research(self, reset=True): self.search(self.last_search, reset=reset) @@ -1251,7 +1254,7 @@ class DeviceBooksModel(BooksModel): # {{{ db_items = [self.db[i] for i in db_indices if -1 < i < len(self.db)] self.marked_for_deletion[job] = db_items if rows_are_ids: - self.reset() + self.beginResetModel(), self.endResetModel() else: for row in rows: indices = self.row_indices(row) @@ -1313,7 +1316,7 @@ class DeviceBooksModel(BooksModel): # {{{ app_id = getattr(data, 'application_id', None) if app_id is not None and app_id in db_ids: data.in_library = to_what - self.reset() + self.beginResetModel(), self.endResetModel() def flags(self, index): if self.is_row_marked_for_deletion(index.row()): @@ -1350,7 +1353,7 @@ class DeviceBooksModel(BooksModel): # {{{ self.map.append(i) self.resort(reset=False) if reset: - self.reset() + self.beginResetModel(), self.endResetModel() self.last_search = text if self.last_search: self.searched.emit(True) @@ -1399,14 +1402,14 @@ class DeviceBooksModel(BooksModel): # {{{ if hasattr(keygen, 'db'): keygen.db = None if reset: - self.reset() + self.beginResetModel(), self.endResetModel() def resort(self, reset=True): if self.sorted_on: self.sort(self.column_map.index(self.sorted_on[0]), self.sorted_on[1], reset=False) if reset: - self.reset() + self.beginResetModel(), self.endResetModel() def columnCount(self, parent): if parent and parent.isValid(): diff --git a/src/calibre/gui2/metadata/config.py b/src/calibre/gui2/metadata/config.py index eae4387fcb..794156251a 100644 --- a/src/calibre/gui2/metadata/config.py +++ b/src/calibre/gui2/metadata/config.py @@ -24,12 +24,13 @@ class FieldsModel(FM): # {{{ def initialize(self): fields = self.plugin.touched_fields + self.beginResetModel() self.fields = [] for x in fields: if not x.startswith('identifier:') and x not in self.exclude: self.fields.append(x) self.fields.sort(key=lambda x:self.descs.get(x, x)) - self.reset() + self.endResetModel() def state(self, field, defaults=False): src = self.prefs.defaults if defaults else self.prefs @@ -37,8 +38,9 @@ class FieldsModel(FM): # {{{ else Qt.Checked) def restore_defaults(self): + self.beginResetModel() self.overrides = dict([(f, self.state(f, True)) for f in self.fields]) - self.reset() + self.endResetModel() def commit(self): ignored_fields = set([x for x in self.prefs['ignore_fields'] if x not in diff --git a/src/calibre/gui2/metadata/single_download.py b/src/calibre/gui2/metadata/single_download.py index f923db5964..e264c4225a 100644 --- a/src/calibre/gui2/metadata/single_download.py +++ b/src/calibre/gui2/metadata/single_download.py @@ -227,8 +227,9 @@ class ResultsModel(QAbstractTableModel): # {{{ elif key == 4: key = lambda x: bool(x.comments) + self.beginResetModel() self.results.sort(key=key, reverse=order==Qt.AscendingOrder) - self.reset() + self.endResetModel() # }}} @@ -658,7 +659,7 @@ class CoversModel(QAbstractListModel): # {{{ self.plugin_map[plugin] = [i+1] if do_reset: - self.reset() + self.beginResetModel(), self.endResetModel() def get_item(self, src, pmap, waiting=False): sz = '%dx%d'%(pmap.width(), pmap.height()) @@ -711,7 +712,7 @@ class CoversModel(QAbstractListModel): # {{{ pmap[plugin] = [len(good)-1] self.covers = good self.plugin_map = pmap - self.reset() + self.beginResetModel(), self.endResetModel() def pointer_from_index(self, index): row = index.row() if hasattr(index, 'row') else index diff --git a/src/calibre/gui2/preferences/coloring.py b/src/calibre/gui2/preferences/coloring.py index 6c6f85c60f..95fbbfa0ad 100644 --- a/src/calibre/gui2/preferences/coloring.py +++ b/src/calibre/gui2/preferences/coloring.py @@ -714,8 +714,9 @@ class RulesModel(QAbstractListModel): # {{{ return (kind, col, rule) def add_rule(self, kind, col, rule): + self.beginResetModel() self.rules.append((kind, col, rule)) - self.reset() + self.endResetModel() return self.index(len(self.rules)-1) def replace_rule(self, index, kind, col, r): @@ -723,8 +724,9 @@ class RulesModel(QAbstractListModel): # {{{ self.dataChanged.emit(index, index) def remove_rule(self, index): + self.beginResetModel() self.rules.remove(self.rules[index.row()]) - self.reset() + self.endResetModel() def commit(self, prefs): rules = [] @@ -751,7 +753,8 @@ class RulesModel(QAbstractListModel): # {{{ def clear(self): self.rules = [] - self.reset() + self.beginResetModel() + self.endResetModel() def rule_to_html(self, kind, col, rule): trans_kind = 'not found' diff --git a/src/calibre/gui2/preferences/emailp.py b/src/calibre/gui2/preferences/emailp.py index 04ebbff42f..ffc3333b04 100644 --- a/src/calibre/gui2/preferences/emailp.py +++ b/src/calibre/gui2/preferences/emailp.py @@ -118,11 +118,12 @@ class EmailAccounts(QAbstractTableModel): # {{{ def make_default(self, index): if index.isValid(): + self.beginResetModel() row = index.row() for x in self.accounts.values(): x[2] = False self.accounts[self.account_order[row]][2] = True - self.reset() + self.endResetModel() def add(self): x = _('new email address') @@ -132,10 +133,11 @@ class EmailAccounts(QAbstractTableModel): # {{{ c += 1 y = x + str(c) auto_send = len(self.accounts) < 1 + self.beginResetModel() self.accounts[y] = ['MOBI, EPUB', auto_send, len(self.account_order) == 0] self.account_order = sorted(self.accounts.keys()) - self.reset() + self.endResetModel() return self.index(self.account_order.index(y), 0) def remove(self, index): @@ -152,7 +154,8 @@ class EmailAccounts(QAbstractTableModel): # {{{ if not has_default and self.account_order: self.accounts[self.account_order[0]][2] = True - self.reset() + self.beginResetModel() + self.endResetModel() # }}} diff --git a/src/calibre/gui2/preferences/history.py b/src/calibre/gui2/preferences/history.py index 798a275616..8a8b24ada9 100644 --- a/src/calibre/gui2/preferences/history.py +++ b/src/calibre/gui2/preferences/history.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import textwrap -from PyQt5.Qt import QComboBox, QStringList, Qt +from PyQt5.Qt import QComboBox, Qt from calibre.gui2 import config as gui_conf @@ -32,7 +32,7 @@ class HistoryBox(QComboBox): if val not in history: history.append(val) self.clear() - self.addItems(QStringList(history)) + self.addItems(history) self.setCurrentIndex(self.findText(val, Qt.MatchFixedString)) def save_history(self, opt_name): diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 836d4ff141..8af6043223 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -35,10 +35,11 @@ class DisplayedFields(QAbstractListModel): # {{{ self.changed = False def initialize(self, use_defaults=False): + self.beginResetModel() self.fields = [[x[0], x[1]] for x in get_field_list(self.db.field_metadata, use_defaults=use_defaults)] - self.reset() + self.endResetModel() self.changed = True def rowCount(self, *args): @@ -469,7 +470,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): return rr def refresh_gui(self, gui): - gui.library_view.model().reset() + m = gui.library_view.model() + m.beginResetModel(), m.endResetModel() self.update_font_display() gui.tags_view.reread_collapse_parameters() gui.library_view.refresh_book_details() diff --git a/src/calibre/gui2/preferences/metadata_sources.py b/src/calibre/gui2/preferences/metadata_sources.py index f192622907..e6329d9cc1 100644 --- a/src/calibre/gui2/preferences/metadata_sources.py +++ b/src/calibre/gui2/preferences/metadata_sources.py @@ -30,11 +30,12 @@ class SourcesModel(QAbstractTableModel): # {{{ self.cover_overrides = {} def initialize(self): + self.beginResetModel() self.plugins = list(all_metadata_plugins()) self.plugins.sort(key=attrgetter('name')) self.enabled_overrides = {} self.cover_overrides = {} - self.reset() + self.endResetModel() def rowCount(self, parent=None): return len(self.plugins) @@ -135,12 +136,13 @@ class SourcesModel(QAbstractTableModel): # {{{ self.cover_overrides = {} def restore_defaults(self): + self.beginResetModel() self.enabled_overrides = dict([(p, (Qt.Unchecked if p.name in default_disabled_plugins else Qt.Checked)) for p in self.plugins]) self.cover_overrides = dict([(p, msprefs.defaults['cover_priorities'].get(p.name, 1)) for p in self.plugins]) - self.reset() + self.endResetModel() # }}} @@ -173,12 +175,13 @@ class FieldsModel(QAbstractListModel): # {{{ fields = set() for p in all_metadata_plugins(): fields |= p.touched_fields + self.beginResetModel() self.fields = [] for x in fields: if not x.startswith('identifier:') and x not in self.exclude: self.fields.append(x) self.fields.sort(key=lambda x:self.descs.get(x, x)) - self.reset() + self.endResetModel() def state(self, field, defaults=False): src = msprefs.defaults if defaults else msprefs @@ -201,16 +204,19 @@ class FieldsModel(QAbstractListModel): # {{{ return ans | Qt.ItemIsUserCheckable def restore_defaults(self): + self.beginResetModel() self.overrides = dict([(f, self.state(f, Qt.Checked)) for f in self.fields]) - self.reset() + self.endResetModel() def select_all(self): + self.beginResetModel() self.overrides = dict([(f, Qt.Checked) for f in self.fields]) - self.reset() + self.endResetModel() def clear_all(self): + self.beginResetModel() self.overrides = dict([(f, Qt.Unchecked) for f in self.fields]) - self.reset() + self.endResetModel() def setData(self, index, val, role): try: @@ -239,8 +245,9 @@ class FieldsModel(QAbstractListModel): # {{{ else Qt.Checked) def select_user_defaults(self): + self.beginResetModel() self.overrides = dict([(f, self.user_default_state(f)) for f in self.fields]) - self.reset() + self.endResetModel() def commit_user_defaults(self): default_ignored_fields = set([x for x in msprefs['user_default_ignore_fields'] if x not in diff --git a/src/calibre/gui2/preferences/plugins.py b/src/calibre/gui2/preferences/plugins.py index 2bc07967e2..83a52b82a6 100644 --- a/src/calibre/gui2/preferences/plugins.py +++ b/src/calibre/gui2/preferences/plugins.py @@ -37,8 +37,9 @@ class PluginModel(QAbstractItemModel, SearchQueryParser): # {{{ def toggle_shown_plugins(self, show_only_user_plugins): self.show_only_user_plugins = show_only_user_plugins + self.beginResetModel() self.populate() - self.reset() + self.endResetModel() def populate(self): self._data = {} @@ -311,8 +312,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): except NameConflict as e: return error_dialog(self, _('Already exists'), unicode(e), show=True) + self._plugin_model.beginResetModel() self._plugin_model.populate() - self._plugin_model.reset() + self._plugin_model.endResetModel() self.changed_signal.emit() self.check_for_add_to_toolbars(plugin, previously_installed=plugin.name in installed_plugins) info_dialog(self, _('Success'), @@ -371,8 +373,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): msg = _('Plugin {0} successfully removed').format(plugin.name) if remove_plugin(plugin): + self._plugin_model.beginResetModel() self._plugin_model.populate() - self._plugin_model.reset() + self._plugin_model.endResetModel() self.changed_signal.emit() info_dialog(self, _('Success'), msg, show=True, show_copy_button=False) @@ -390,8 +393,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): mode = FILTER_NOT_INSTALLED if not_installed else FILTER_UPDATE_AVAILABLE d = PluginUpdaterDialog(self.gui, initial_filter=mode) d.exec_() + self._plugin_model.beginResetModel() self._plugin_model.populate() - self._plugin_model.reset() + self._plugin_model.endResetModel() self.changed_signal.emit() if d.do_restart: self.restart_now.emit() diff --git a/src/calibre/gui2/preferences/toolbar.py b/src/calibre/gui2/preferences/toolbar.py index 3b45805121..3503b01161 100644 --- a/src/calibre/gui2/preferences/toolbar.py +++ b/src/calibre/gui2/preferences/toolbar.py @@ -112,9 +112,10 @@ class AllModel(BaseModel): for name in names: if name is None or name.startswith('---'): continue actions.append(self.name_to_action(name, self.gui)) + self.beginResetModel() self._data.extend(actions) self._data.sort() - self.reset() + self.endResetModel() def remove(self, indices, allowed): rows = [i.row() for i in indices] @@ -128,13 +129,15 @@ class AllModel(BaseModel): for i, ac in enumerate(self._data): if i not in remove: ndata.append(ac) + self.beginResetModel() self._data = ndata - self.reset() + self.endResetModel() def restore_defaults(self): current = gprefs.defaults[self.gprefs_name] + self.beginResetModel() self._data = self.get_all_actions(current) - self.reset() + self.endResetModel() class CurrentModel(BaseModel): @@ -172,8 +175,9 @@ class CurrentModel(BaseModel): else: actions.append(ac) + self.beginResetModel() self._data.extend(actions) - self.reset() + self.endResetModel() return reject def remove(self, indices): @@ -189,8 +193,9 @@ class CurrentModel(BaseModel): for i, ac in enumerate(self._data): if i not in remove: ndata.append(ac) + self.beginResetModel() self._data = ndata - self.reset() + self.endResetModel() return rejected def commit(self): @@ -211,8 +216,9 @@ class CurrentModel(BaseModel): def restore_defaults(self): current = gprefs.defaults[self.gprefs_name] + self.beginResetModel() self._data = [self.name_to_action(x, self.gui) for x in current] - self.reset() + self.endResetModel() class ConfigWidget(ConfigWidgetBase, Ui_Form): diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 4e9ebfaadb..49b3e26c7e 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -10,7 +10,7 @@ import re, time from functools import partial -from PyQt5.Qt import QComboBox, Qt, QLineEdit, QStringList, pyqtSlot, QDialog, \ +from PyQt5.Qt import QComboBox, Qt, QLineEdit, pyqtSlot, QDialog, \ pyqtSignal, QCompleter, QAction, QKeySequence, QTimer, \ QString, QIcon, QMenu @@ -108,7 +108,7 @@ class SearchBox2(QComboBox): # {{{ for item in config[opt_name]: if item not in items: items.append(item) - self.addItems(QStringList(items)) + self.addItems(items) try: self.line_edit.setPlaceholderText(help_text) except: diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index a27a9cf7b4..9a5917fd4c 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -10,7 +10,7 @@ from functools import partial from PyQt5.Qt import ( Qt, QMenu, QPoint, QIcon, QDialog, QGridLayout, QLabel, QLineEdit, QComboBox, - QDialogButtonBox, QSize, QVBoxLayout, QListWidget, QStringList, QRadioButton, QAction) + QDialogButtonBox, QSize, QVBoxLayout, QListWidget, QRadioButton, QAction) from calibre.gui2 import error_dialog, question_dialog, gprefs from calibre.gui2.dialogs.confirm_delete import confirm @@ -30,7 +30,7 @@ class SelectNames(QDialog): # {{{ l.addWidget(la) self._names = QListWidget(self) - self._names.addItems(QStringList(sorted(names, key=sort_key))) + self._names.addItems(sorted(names, key=sort_key)) self._names.setSelectionMode(self._names.ExtendedSelection) l.addWidget(self._names) diff --git a/src/calibre/gui2/store/config/chooser/models.py b/src/calibre/gui2/store/config/chooser/models.py index 7be5b1e2c2..5d8c7315c9 100644 --- a/src/calibre/gui2/store/config/chooser/models.py +++ b/src/calibre/gui2/store/config/chooser/models.py @@ -186,7 +186,7 @@ class Matches(QAbstractItemModel): lambda x: sort_key(unicode(self.data_as_text(x, col))), descending) if reset: - self.reset() + self.beginResetModel(), self.endResetModel() class SearchFilter(SearchQueryParser): diff --git a/src/calibre/gui2/store/search/models.py b/src/calibre/gui2/store/search/models.py index 6e693b1294..f0aa1ac5d0 100644 --- a/src/calibre/gui2/store/search/models.py +++ b/src/calibre/gui2/store/search/models.py @@ -85,7 +85,7 @@ class Matches(QAbstractItemModel): self.cover_pool.abort() self.details_pool.abort() self.total_changed.emit(self.rowCount()) - self.reset() + self.beginResetModel(), self.endResetModel() def add_result(self, result, store_plugin): if result not in self.all_matches: @@ -287,7 +287,7 @@ class Matches(QAbstractItemModel): descending) self.reorder_matches() if reset: - self.reset() + self.beginResetModel(), self.endResetModel() def reorder_matches(self): def keygen(x): diff --git a/src/calibre/gui2/store/stores/mobileread/models.py b/src/calibre/gui2/store/stores/mobileread/models.py index be5cf5da87..f7acd8eb72 100644 --- a/src/calibre/gui2/store/stores/mobileread/models.py +++ b/src/calibre/gui2/store/stores/mobileread/models.py @@ -108,7 +108,7 @@ class BooksModel(QAbstractItemModel): lambda x: sort_key(unicode(self.data_as_text(x, col))), descending) if reset: - self.reset() + self.beginResetModel(), self.endResetModel() class SearchFilter(SearchQueryParser): diff --git a/src/calibre/gui2/tweak_book/char_select.py b/src/calibre/gui2/tweak_book/char_select.py index d9f33f59a2..c8de3a8508 100644 --- a/src/calibre/gui2/tweak_book/char_select.py +++ b/src/calibre/gui2/tweak_book/char_select.py @@ -563,8 +563,9 @@ class CharModel(QAbstractListModel): self.chars[x] = None for x in reversed(codes): self.chars.insert(row, x) + self.beginResetModel() self.chars = [x for x in self.chars if x is not None] - self.reset() + self.endResetModel() tprefs['charmap_favorites'] = list(self.chars) return True @@ -651,8 +652,9 @@ class CharView(QListView): def show_chars(self, name, codes): self.showing_favorites = name == _('Favorites') + self._model.beginResetModel() self._model.chars = codes - self._model.reset() + self._model.endResetModel() self.scrollToTop() def mouseMoveEvent(self, ev): @@ -687,8 +689,9 @@ class CharView(QListView): def restore_defaults(self): del tprefs['charmap_favorites'] + self.model().beginResetModel() self.model().chars = list(tprefs['charmap_favorites']) - self.model().reset() + self.model().endResetModel() def copy_to_clipboard(self, char_code): c = QApplication.clipboard() @@ -702,8 +705,9 @@ class CharView(QListView): elif char_code in existing: existing.remove(char_code) tprefs['charmap_favorites'] = existing + self.model().beginResetModel() self.model().chars.remove(char_code) - self.model().reset() + self.model().endResetModel() class CharSelect(Dialog): diff --git a/src/calibre/gui2/tweak_book/diff/view.py b/src/calibre/gui2/tweak_book/diff/view.py index 4004afe30b..1693d0244b 100644 --- a/src/calibre/gui2/tweak_book/diff/view.py +++ b/src/calibre/gui2/tweak_book/diff/view.py @@ -894,7 +894,7 @@ class DiffView(QWidget): # {{{ self.l = l = QHBoxLayout(self) self.setLayout(l) self.syncpos = 0 - l.setMargin(0), l.setSpacing(0) + l.setContentsMargins(0, 0, 0, 0), l.setSpacing(0) self.view = DiffSplit(self, show_open_in_editor=show_open_in_editor) l.addWidget(self.view) self.add_diff = self.view.add_diff diff --git a/src/calibre/gui2/tweak_book/editor/insert_resource.py b/src/calibre/gui2/tweak_book/editor/insert_resource.py index 1690aca65f..d5b3ffb150 100644 --- a/src/calibre/gui2/tweak_book/editor/insert_resource.py +++ b/src/calibre/gui2/tweak_book/editor/insert_resource.py @@ -150,8 +150,9 @@ class Images(QAbstractListModel): self.image_names.append(name) def refresh(self): + self.beginResetModel() self.build() - self.reset() + self.endResetModel() def rowCount(self, *args): return len(self.image_names) diff --git a/src/calibre/gui2/tweak_book/search.py b/src/calibre/gui2/tweak_book/search.py index f4cdc989c9..a3e8fd0756 100644 --- a/src/calibre/gui2/tweak_book/search.py +++ b/src/calibre/gui2/tweak_book/search.py @@ -417,11 +417,12 @@ class SearchesModel(QAbstractListModel): def do_filter(self, text): text = unicode(text) + self.beginResetModel() self.filtered_searches = [] for i, search in enumerate(self.searches): if primary_contains(text, search['name']): self.filtered_searches.append(i) - self.reset() + self.endResetModel() def move_entry(self, row, delta): a, b = row, row + delta @@ -433,9 +434,10 @@ class SearchesModel(QAbstractListModel): tprefs['saved_searches'] = self.searches def add_searches(self, count=1): + self.beginResetModel() self.searches = tprefs['saved_searches'] self.filtered_searches.extend(xrange(len(self.searches) - 1, len(self.searches) - 1 - count, -1)) - self.reset() + self.endResetModel() def remove_searches(self, rows): rows = sorted(set(rows), reverse=True) diff --git a/src/calibre/gui2/tweak_book/undo.py b/src/calibre/gui2/tweak_book/undo.py index b21f363182..27507cee79 100644 --- a/src/calibre/gui2/tweak_book/undo.py +++ b/src/calibre/gui2/tweak_book/undo.py @@ -77,9 +77,10 @@ class GlobalUndoHistory(QAbstractListModel): return self.states[self.pos - 1].container def open_book(self, container): + self.beginResetModel() self.states = [State(container)] self.pos = 0 - self.reset() + self.endResetModel() def truncate(self): extra = self.states[self.pos+1:] diff --git a/src/calibre/gui2/tweak_book/widgets.py b/src/calibre/gui2/tweak_book/widgets.py index b1c9a619f7..0146cec789 100644 --- a/src/calibre/gui2/tweak_book/widgets.py +++ b/src/calibre/gui2/tweak_book/widgets.py @@ -20,7 +20,7 @@ from PyQt5.Qt import ( from calibre import prepare_string_for_xml, human_readable from calibre.ebooks.oeb.polish.utils import lead_text, guess_type -from calibre.gui2 import error_dialog, choose_files, choose_save_file, NONE, info_dialog, choose_images +from calibre.gui2 import error_dialog, choose_files, choose_save_file, info_dialog, choose_images from calibre.gui2.tweak_book import tprefs, current_container from calibre.utils.icu import primary_sort_key, sort_key, primary_contains from calibre.utils.matcher import get_char, Matcher @@ -452,7 +452,7 @@ class QuickOpen(Dialog): Simply type in the characters: {chars} and press Enter.''').format(example=example, chars=chars)) - hl.setMargin(50), hl.setAlignment(Qt.AlignTop | Qt.AlignHCenter) + hl.setContentsMargins(50, 50, 50, 50), hl.setAlignment(Qt.AlignTop | Qt.AlignHCenter) l.addWidget(hl) self.results = Results(self) self.results.setVisible(False) @@ -554,15 +554,15 @@ class NamesModel(QAbstractListModel): return QVariant(self.items[index.row()]) if role == Qt.DisplayRole: return QVariant('\xa0' * 20) - return NONE def filter(self, query): query = unicode(query or '') + self.beginResetModel() if not query: self.items = tuple((text, None) for text in self.names) else: self.items = tuple(self.matcher(query).iteritems()) - self.reset() + self.endResetModel() self.filtered.emit(not bool(query)) def find_name(self, name): diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 3aabb6949d..6ad0f152e5 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -10,7 +10,7 @@ from PyQt5.Qt import (QIcon, QFont, QLabel, QListWidget, QAction, QCursor, QColor, QWidget, QPixmap, QSplitterHandle, QToolButton, QVariant, Qt, pyqtSignal, QRegExp, QSize, QSplitter, QPainter, QLineEdit, QComboBox, QPen, QGraphicsScene, QMenu, QStringListModel, - QCompleter, QStringList, QTimer, QRect, QGraphicsView, QByteArray) + QCompleter, QTimer, QRect, QGraphicsView, QByteArray) from calibre.gui2 import (error_dialog, pixmap_to_data, gprefs, warning_dialog) @@ -625,7 +625,7 @@ class HistoryLineEdit(QComboBox): # {{{ def initialize(self, name): self._name = name - self.addItems(QStringList(history.get(self.store_name, []))) + self.addItems(history.get(self.store_name, [])) self.setEditText('') self.lineEdit().editingFinished.connect(self.save_history)