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
This commit is contained in:
Kovid Goyal 2014-04-11 21:41:59 +05:30
parent 5068f62f0f
commit f1842ae443
34 changed files with 148 additions and 92 deletions

View File

@ -6,6 +6,8 @@ from __future__ import (unicode_literals, division, absolute_import,
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
# QT5XX: See why mouse wheel is not working in diff view
# QT5XX: Delete this file after migration is completed # QT5XX: Delete this file after migration is completed
import os import os

View File

@ -216,7 +216,7 @@ class AddAction(InterfaceAction):
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'): 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() self.gui.tags_view.recount()
if ids: if ids:
ids.reverse() 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.model().books_added(self._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'): 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() self.gui.tags_view.recount()
if getattr(self._adder, 'merged_books', False): if getattr(self._adder, 'merged_books', False):

View File

@ -79,7 +79,7 @@ class GenerateCatalogAction(InterfaceAction):
if job.failed: if job.failed:
return self.gui.job_exception(job) return self.gui.job_exception(job)
id = self.gui.library_view.model().add_catalog(job.catalog_file_path, job.catalog_title) 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: if job.catalog_sync:
sync = dynamic.get('catalogs_to_be_synced', set([])) sync = dynamic.get('catalogs_to_be_synced', set([]))
sync.add(id) sync.add(id)

View File

@ -75,7 +75,7 @@ class FetchNewsAction(InterfaceAction):
if ids_to_delete: if ids_to_delete:
self.gui.library_view.model().delete_books_by_id(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 = self.gui.news_to_be_synced
sync.add(id) sync.add(id)
self.gui.news_to_be_synced = sync self.gui.news_to_be_synced = sync

View File

@ -261,7 +261,7 @@ class AutoAdder(QObject):
'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'): if hasattr(gui, 'db_images'):
gui.db_images.reset() 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

@ -26,13 +26,14 @@ class CompleteModel(QAbstractListModel):
def set_items(self, items): def set_items(self, items):
items = [unicode(x.strip()) for x in items] items = [unicode(x.strip()) for x in items]
self.beginResetModel()
if len(items) < 2500: if len(items) < 2500:
self.items = sorted(items, key=sort_key) self.items = sorted(items, key=sort_key)
self.sorting = QCompleter.UnsortedModel self.sorting = QCompleter.UnsortedModel
else: else:
self.items = sorted(items, key=lambda x:x.lower()) self.items = sorted(items, key=lambda x:x.lower())
self.sorting = QCompleter.CaseInsensitivelySortedModel self.sorting = QCompleter.CaseInsensitivelySortedModel
self.reset() self.endResetModel()
def rowCount(self, *args): def rowCount(self, *args):
return len(self.items) return len(self.items)

View File

@ -15,7 +15,6 @@ from PyQt5.Qt import (QLineEdit, QAbstractListModel, Qt, pyqtSignal, QObject,
from calibre.constants import isosx, get_osx_version from calibre.constants import isosx, get_osx_version
from calibre.utils.icu import sort_key, primary_startswith, primary_contains 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.gui2.widgets import EnComboBox, LineEditECM
from calibre.utils.config import tweaks from calibre.utils.config import tweaks
@ -34,9 +33,10 @@ class CompleteModel(QAbstractListModel): # {{{
items = [unicode(x.strip()) for x in items] items = [unicode(x.strip()) for x in items]
items = [x for x in items if x] items = [x for x in items if x]
items = tuple(sorted(items, key=self.sort_func)) items = tuple(sorted(items, key=self.sort_func))
self.beginResetModel()
self.all_items = self.current_items = items self.all_items = self.current_items = items
self.current_prefix = '' self.current_prefix = ''
self.reset() self.endResetModel()
def set_completion_prefix(self, prefix): def set_completion_prefix(self, prefix):
old_prefix = self.current_prefix old_prefix = self.current_prefix
@ -44,14 +44,16 @@ class CompleteModel(QAbstractListModel): # {{{
if prefix == old_prefix: if prefix == old_prefix:
return return
if not prefix: if not prefix:
self.beginResetModel()
self.current_items = self.all_items self.current_items = self.all_items
self.reset() self.endResetModel()
return return
subset = prefix.startswith(old_prefix) subset = prefix.startswith(old_prefix)
universe = self.current_items if subset else self.all_items universe = self.current_items if subset else self.all_items
func = primary_startswith if tweaks['completion_mode'] == 'prefix' else containsq 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.current_items = tuple(x for x in universe if func(x, prefix))
self.reset() self.endResetModel()
def rowCount(self, *args): def rowCount(self, *args):
return len(self.current_items) return len(self.current_items)
@ -62,7 +64,6 @@ class CompleteModel(QAbstractListModel): # {{{
return self.current_items[index.row()] return self.current_items[index.row()]
except IndexError: except IndexError:
pass pass
return NONE
def index_for_prefix(self, prefix): def index_for_prefix(self, prefix):
for i, item in enumerate(self.current_items): for i, item in enumerate(self.current_items):

View File

@ -105,8 +105,14 @@ if pictureflow is not None:
return '' return ''
def reset(self): def reset(self):
self.beginResetModel(), self.endResetModel()
def beginResetModel(self):
self.dataChanged.emit() self.dataChanged.emit()
def endResetModel(self):
pass
def image(self, index): def image(self, index):
return self.model.cover(index) return self.model.cover(index)

View File

@ -673,7 +673,7 @@ class PluginUpdaterDialog(SizePersistedDialog):
return return
self._uninstall_plugin(display_plugin.name) self._uninstall_plugin(display_plugin.name)
if self.proxy_model.filter_criteria in [FILTER_INSTALLED, FILTER_UPDATE_AVAILABLE]: 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() self._select_and_focus_view()
else: else:
self._select_and_focus_view(change_selection=False) self._select_and_focus_view(change_selection=False)
@ -755,7 +755,7 @@ class PluginUpdaterDialog(SizePersistedDialog):
display_plugin.uninstall_plugins = [] display_plugin.uninstall_plugins = []
if self.proxy_model.filter_criteria in [FILTER_NOT_INSTALLED, FILTER_UPDATE_AVAILABLE]: 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() self._select_and_focus_view()
else: else:
self.model.refresh_plugin(display_plugin) self.model.refresh_plugin(display_plugin)

View File

@ -57,8 +57,9 @@ class CustomRecipeModel(QAbstractListModel):
if x.get('title', False) == title: if x.get('title', False) == title:
urn = x.get('id') urn = x.get('id')
if urn is not None: if urn is not None:
self.beginResetModel()
self.recipe_model.update_custom_recipe(urn, title, script) self.recipe_model.update_custom_recipe(urn, title, script)
self.reset() self.endResetModel()
def replace_many_by_title(self, scriptmap): def replace_many_by_title(self, scriptmap):
script_urn_map = {} script_urn_map = {}
@ -71,16 +72,19 @@ class CustomRecipeModel(QAbstractListModel):
script_urn_map.update({urn: (title, script)}) script_urn_map.update({urn: (title, script)})
if script_urn_map: if script_urn_map:
self.beginResetModel()
self.recipe_model.update_custom_recipes(script_urn_map) self.recipe_model.update_custom_recipes(script_urn_map)
self.reset() self.endResetModel()
def add(self, title, script): def add(self, title, script):
self.beginResetModel()
self.recipe_model.add_custom_recipe(title, script) self.recipe_model.add_custom_recipe(title, script)
self.reset() self.endResetModel()
def add_many(self, scriptmap): def add_many(self, scriptmap):
self.beginResetModel()
self.recipe_model.add_custom_recipes(scriptmap) self.recipe_model.add_custom_recipes(scriptmap)
self.reset() self.endResetModel()
def remove(self, rows): def remove(self, rows):
urns = [] urns = []
@ -90,8 +94,9 @@ class CustomRecipeModel(QAbstractListModel):
urns.append(urn) urns.append(urn)
except: except:
pass pass
self.beginResetModel()
self.recipe_model.remove_custom_recipes(urns) self.recipe_model.remove_custom_recipes(urns)
self.reset() self.endResetModel()
class UserProfiles(ResizableDialog, Ui_Dialog): class UserProfiles(ResizableDialog, Ui_Dialog):

View File

@ -285,8 +285,9 @@ class FontFamilyDialog(QDialog):
for f in files: for f in files:
shutil.copyfile(f, os.path.join(dest, os.path.basename(f))) shutil.copyfile(f, os.path.join(dest, os.path.basename(f)))
self.font_scanner.do_scan() self.font_scanner.do_scan()
self.m.beginResetModel()
self.build_font_list() self.build_font_list()
self.m.reset() self.m.endResetModel()
self.view.setCurrentIndex(self.m.index(0)) self.view.setCurrentIndex(self.m.index(0))
if families: if families:
for i, val in enumerate(self.families): for i, val in enumerate(self.families):

View File

@ -373,8 +373,9 @@ class FilterModel(QSortFilterProxyModel): # {{{
except ParseException: except ParseException:
ok = False ok = False
self.search_filter = val self.search_filter = val
self.beginResetModel()
self.search_done.emit(ok) self.search_done.emit(ok)
self.reset() self.endResetModel()
# }}} # }}}
@ -459,7 +460,7 @@ class JobsButton(QFrame): # {{{
if not horizontal: if not horizontal:
self.layout().setAlignment(self._jobs, Qt.AlignHCenter) self.layout().setAlignment(self._jobs, Qt.AlignHCenter)
self._jobs.setMargin(0) self._jobs.setMargin(0)
self.layout().setMargin(0) self.layout().setContentsMargins(0, 0, 0, 0)
self._jobs.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self._jobs.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
self.setCursor(Qt.PointingHandCursor) self.setCursor(Qt.PointingHandCursor)
b = _('Click to see list of jobs') b = _('Click to see list of jobs')
@ -620,12 +621,12 @@ class JobsDialog(QDialog, Ui_JobsDialog):
return error_dialog(self, _('No job'), return error_dialog(self, _('No job'),
_('No job selected'), show=True) _('No job selected'), show=True)
self.model.hide_jobs(rows) self.model.hide_jobs(rows)
self.proxy_model.reset() self.proxy_model.beginResetModel(), self.proxy_model.endResetModel()
def hide_all(self, *args): def hide_all(self, *args):
self.model.hide_jobs(list(xrange(0, self.model.hide_jobs(list(xrange(0,
self.model.rowCount(QModelIndex())))) self.model.rowCount(QModelIndex()))))
self.proxy_model.reset() self.proxy_model.beginResetModel(), self.proxy_model.endResetModel()
def show_hidden(self, *args): def show_hidden(self, *args):
self.model.show_hidden_jobs() self.model.show_hidden_jobs()

View File

@ -278,7 +278,7 @@ class BooksModel(QAbstractTableModel): # {{{
self.headers[col] = self.custom_columns[col]['name'] self.headers[col] = self.custom_columns[col]['name']
self.build_data_convertors() self.build_data_convertors()
self.reset() self.beginResetModel(), self.endResetModel()
self.database_changed.emit(db) self.database_changed.emit(db)
self.stop_metadata_backup() self.stop_metadata_backup()
self.start_metadata_backup() self.start_metadata_backup()
@ -312,7 +312,7 @@ class BooksModel(QAbstractTableModel): # {{{
def close(self): def close(self):
self.db.close() self.db.close()
self.db = None self.db = None
self.reset() self.beginResetModel(), self.endResetModel()
def add_books(self, paths, formats, metadata, add_duplicates=False, def add_books(self, paths, formats, metadata, add_duplicates=False,
return_ids=False): return_ids=False):
@ -351,7 +351,7 @@ class BooksModel(QAbstractTableModel): # {{{
def books_deleted(self): def books_deleted(self):
self.count_changed() self.count_changed()
self.reset() self.beginResetModel(), self.endResetModel()
def delete_books(self, indices, permanent=False): def delete_books(self, indices, permanent=False):
ids = map(self.id, indices) ids = map(self.id, indices)
@ -410,7 +410,7 @@ class BooksModel(QAbstractTableModel): # {{{
self.current_highlighted_idx = 0 self.current_highlighted_idx = 0
else: else:
self.current_highlighted_idx = None self.current_highlighted_idx = None
self.reset() self.beginResetModel(), self.endResetModel()
def search(self, text, reset=True): def search(self, text, reset=True):
try: try:
@ -437,7 +437,7 @@ class BooksModel(QAbstractTableModel): # {{{
return return
self.last_search = text self.last_search = text
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
if self.last_search: if self.last_search:
# Do not issue search done for the null search. It is used to clear # Do not issue search done for the null search. It is used to clear
# the search and count records for restrictions # the search and count records for restrictions
@ -460,7 +460,7 @@ class BooksModel(QAbstractTableModel): # {{{
self.about_to_be_sorted.emit(self.db.id) self.about_to_be_sorted.emit(self.db.id)
self.db.data.incremental_sort([(label, order)]) self.db.data.incremental_sort([(label, order)])
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
self.sorted_on = (label, order) self.sorted_on = (label, order)
self.sort_history.insert(0, self.sorted_on) self.sort_history.insert(0, self.sorted_on)
self.sorting_done.emit(self.db.index) self.sorting_done.emit(self.db.index)
@ -469,16 +469,19 @@ class BooksModel(QAbstractTableModel): # {{{
self.db.refresh(field=None) self.db.refresh(field=None)
self.resort(reset=reset) self.resort(reset=reset)
def reset(self): def beginResetModel(self):
self._clear_caches() self._clear_caches()
QAbstractTableModel.reset(self) QAbstractTableModel.beginResetModel(self)
def reset(self):
self.beginResetModel(), self.endResetModel()
def resort(self, reset=True): def resort(self, reset=True):
if not self.db: if not self.db:
return return
self.db.multisort(self.sort_history[:tweaks['maximum_resort_levels']]) self.db.multisort(self.sort_history[:tweaks['maximum_resort_levels']])
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
def research(self, reset=True): def research(self, reset=True):
self.search(self.last_search, reset=reset) 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)] db_items = [self.db[i] for i in db_indices if -1 < i < len(self.db)]
self.marked_for_deletion[job] = db_items self.marked_for_deletion[job] = db_items
if rows_are_ids: if rows_are_ids:
self.reset() self.beginResetModel(), self.endResetModel()
else: else:
for row in rows: for row in rows:
indices = self.row_indices(row) indices = self.row_indices(row)
@ -1313,7 +1316,7 @@ class DeviceBooksModel(BooksModel): # {{{
app_id = getattr(data, 'application_id', None) app_id = getattr(data, 'application_id', None)
if app_id is not None and app_id in db_ids: if app_id is not None and app_id in db_ids:
data.in_library = to_what data.in_library = to_what
self.reset() self.beginResetModel(), self.endResetModel()
def flags(self, index): def flags(self, index):
if self.is_row_marked_for_deletion(index.row()): if self.is_row_marked_for_deletion(index.row()):
@ -1350,7 +1353,7 @@ class DeviceBooksModel(BooksModel): # {{{
self.map.append(i) self.map.append(i)
self.resort(reset=False) self.resort(reset=False)
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
self.last_search = text self.last_search = text
if self.last_search: if self.last_search:
self.searched.emit(True) self.searched.emit(True)
@ -1399,14 +1402,14 @@ class DeviceBooksModel(BooksModel): # {{{
if hasattr(keygen, 'db'): if hasattr(keygen, 'db'):
keygen.db = None keygen.db = None
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
def resort(self, reset=True): def resort(self, reset=True):
if self.sorted_on: if self.sorted_on:
self.sort(self.column_map.index(self.sorted_on[0]), self.sort(self.column_map.index(self.sorted_on[0]),
self.sorted_on[1], reset=False) self.sorted_on[1], reset=False)
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
def columnCount(self, parent): def columnCount(self, parent):
if parent and parent.isValid(): if parent and parent.isValid():

View File

@ -24,12 +24,13 @@ class FieldsModel(FM): # {{{
def initialize(self): def initialize(self):
fields = self.plugin.touched_fields fields = self.plugin.touched_fields
self.beginResetModel()
self.fields = [] self.fields = []
for x in fields: for x in fields:
if not x.startswith('identifier:') and x not in self.exclude: if not x.startswith('identifier:') and x not in self.exclude:
self.fields.append(x) self.fields.append(x)
self.fields.sort(key=lambda x:self.descs.get(x, x)) self.fields.sort(key=lambda x:self.descs.get(x, x))
self.reset() self.endResetModel()
def state(self, field, defaults=False): def state(self, field, defaults=False):
src = self.prefs.defaults if defaults else self.prefs src = self.prefs.defaults if defaults else self.prefs
@ -37,8 +38,9 @@ class FieldsModel(FM): # {{{
else Qt.Checked) else Qt.Checked)
def restore_defaults(self): def restore_defaults(self):
self.beginResetModel()
self.overrides = dict([(f, self.state(f, True)) for f in self.fields]) self.overrides = dict([(f, self.state(f, True)) for f in self.fields])
self.reset() self.endResetModel()
def commit(self): def commit(self):
ignored_fields = set([x for x in self.prefs['ignore_fields'] if x not in ignored_fields = set([x for x in self.prefs['ignore_fields'] if x not in

View File

@ -227,8 +227,9 @@ class ResultsModel(QAbstractTableModel): # {{{
elif key == 4: elif key == 4:
key = lambda x: bool(x.comments) key = lambda x: bool(x.comments)
self.beginResetModel()
self.results.sort(key=key, reverse=order==Qt.AscendingOrder) 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] self.plugin_map[plugin] = [i+1]
if do_reset: if do_reset:
self.reset() self.beginResetModel(), self.endResetModel()
def get_item(self, src, pmap, waiting=False): def get_item(self, src, pmap, waiting=False):
sz = '%dx%d'%(pmap.width(), pmap.height()) sz = '%dx%d'%(pmap.width(), pmap.height())
@ -711,7 +712,7 @@ class CoversModel(QAbstractListModel): # {{{
pmap[plugin] = [len(good)-1] pmap[plugin] = [len(good)-1]
self.covers = good self.covers = good
self.plugin_map = pmap self.plugin_map = pmap
self.reset() self.beginResetModel(), self.endResetModel()
def pointer_from_index(self, index): def pointer_from_index(self, index):
row = index.row() if hasattr(index, 'row') else index row = index.row() if hasattr(index, 'row') else index

View File

@ -714,8 +714,9 @@ class RulesModel(QAbstractListModel): # {{{
return (kind, col, rule) return (kind, col, rule)
def add_rule(self, kind, col, rule): def add_rule(self, kind, col, rule):
self.beginResetModel()
self.rules.append((kind, col, rule)) self.rules.append((kind, col, rule))
self.reset() self.endResetModel()
return self.index(len(self.rules)-1) return self.index(len(self.rules)-1)
def replace_rule(self, index, kind, col, r): def replace_rule(self, index, kind, col, r):
@ -723,8 +724,9 @@ class RulesModel(QAbstractListModel): # {{{
self.dataChanged.emit(index, index) self.dataChanged.emit(index, index)
def remove_rule(self, index): def remove_rule(self, index):
self.beginResetModel()
self.rules.remove(self.rules[index.row()]) self.rules.remove(self.rules[index.row()])
self.reset() self.endResetModel()
def commit(self, prefs): def commit(self, prefs):
rules = [] rules = []
@ -751,7 +753,8 @@ class RulesModel(QAbstractListModel): # {{{
def clear(self): def clear(self):
self.rules = [] self.rules = []
self.reset() self.beginResetModel()
self.endResetModel()
def rule_to_html(self, kind, col, rule): def rule_to_html(self, kind, col, rule):
trans_kind = 'not found' trans_kind = 'not found'

View File

@ -118,11 +118,12 @@ class EmailAccounts(QAbstractTableModel): # {{{
def make_default(self, index): def make_default(self, index):
if index.isValid(): if index.isValid():
self.beginResetModel()
row = index.row() row = index.row()
for x in self.accounts.values(): for x in self.accounts.values():
x[2] = False x[2] = False
self.accounts[self.account_order[row]][2] = True self.accounts[self.account_order[row]][2] = True
self.reset() self.endResetModel()
def add(self): def add(self):
x = _('new email address') x = _('new email address')
@ -132,10 +133,11 @@ class EmailAccounts(QAbstractTableModel): # {{{
c += 1 c += 1
y = x + str(c) y = x + str(c)
auto_send = len(self.accounts) < 1 auto_send = len(self.accounts) < 1
self.beginResetModel()
self.accounts[y] = ['MOBI, EPUB', auto_send, self.accounts[y] = ['MOBI, EPUB', auto_send,
len(self.account_order) == 0] len(self.account_order) == 0]
self.account_order = sorted(self.accounts.keys()) self.account_order = sorted(self.accounts.keys())
self.reset() self.endResetModel()
return self.index(self.account_order.index(y), 0) return self.index(self.account_order.index(y), 0)
def remove(self, index): def remove(self, index):
@ -152,7 +154,8 @@ class EmailAccounts(QAbstractTableModel): # {{{
if not has_default and self.account_order: if not has_default and self.account_order:
self.accounts[self.account_order[0]][2] = True self.accounts[self.account_order[0]][2] = True
self.reset() self.beginResetModel()
self.endResetModel()
# }}} # }}}

View File

@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en'
import textwrap import textwrap
from PyQt5.Qt import QComboBox, QStringList, Qt from PyQt5.Qt import QComboBox, Qt
from calibre.gui2 import config as gui_conf from calibre.gui2 import config as gui_conf
@ -32,7 +32,7 @@ class HistoryBox(QComboBox):
if val not in history: if val not in history:
history.append(val) history.append(val)
self.clear() self.clear()
self.addItems(QStringList(history)) self.addItems(history)
self.setCurrentIndex(self.findText(val, Qt.MatchFixedString)) self.setCurrentIndex(self.findText(val, Qt.MatchFixedString))
def save_history(self, opt_name): def save_history(self, opt_name):

View File

@ -35,10 +35,11 @@ class DisplayedFields(QAbstractListModel): # {{{
self.changed = False self.changed = False
def initialize(self, use_defaults=False): def initialize(self, use_defaults=False):
self.beginResetModel()
self.fields = [[x[0], x[1]] for x in self.fields = [[x[0], x[1]] for x in
get_field_list(self.db.field_metadata, get_field_list(self.db.field_metadata,
use_defaults=use_defaults)] use_defaults=use_defaults)]
self.reset() self.endResetModel()
self.changed = True self.changed = True
def rowCount(self, *args): def rowCount(self, *args):
@ -469,7 +470,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
return rr return rr
def refresh_gui(self, gui): def refresh_gui(self, gui):
gui.library_view.model().reset() m = gui.library_view.model()
m.beginResetModel(), m.endResetModel()
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()

View File

@ -30,11 +30,12 @@ class SourcesModel(QAbstractTableModel): # {{{
self.cover_overrides = {} self.cover_overrides = {}
def initialize(self): def initialize(self):
self.beginResetModel()
self.plugins = list(all_metadata_plugins()) self.plugins = list(all_metadata_plugins())
self.plugins.sort(key=attrgetter('name')) self.plugins.sort(key=attrgetter('name'))
self.enabled_overrides = {} self.enabled_overrides = {}
self.cover_overrides = {} self.cover_overrides = {}
self.reset() self.endResetModel()
def rowCount(self, parent=None): def rowCount(self, parent=None):
return len(self.plugins) return len(self.plugins)
@ -135,12 +136,13 @@ class SourcesModel(QAbstractTableModel): # {{{
self.cover_overrides = {} self.cover_overrides = {}
def restore_defaults(self): def restore_defaults(self):
self.beginResetModel()
self.enabled_overrides = dict([(p, (Qt.Unchecked if p.name in self.enabled_overrides = dict([(p, (Qt.Unchecked if p.name in
default_disabled_plugins else Qt.Checked)) for p in self.plugins]) default_disabled_plugins else Qt.Checked)) for p in self.plugins])
self.cover_overrides = dict([(p, self.cover_overrides = dict([(p,
msprefs.defaults['cover_priorities'].get(p.name, 1)) msprefs.defaults['cover_priorities'].get(p.name, 1))
for p in self.plugins]) for p in self.plugins])
self.reset() self.endResetModel()
# }}} # }}}
@ -173,12 +175,13 @@ class FieldsModel(QAbstractListModel): # {{{
fields = set() fields = set()
for p in all_metadata_plugins(): for p in all_metadata_plugins():
fields |= p.touched_fields fields |= p.touched_fields
self.beginResetModel()
self.fields = [] self.fields = []
for x in fields: for x in fields:
if not x.startswith('identifier:') and x not in self.exclude: if not x.startswith('identifier:') and x not in self.exclude:
self.fields.append(x) self.fields.append(x)
self.fields.sort(key=lambda x:self.descs.get(x, x)) self.fields.sort(key=lambda x:self.descs.get(x, x))
self.reset() self.endResetModel()
def state(self, field, defaults=False): def state(self, field, defaults=False):
src = msprefs.defaults if defaults else msprefs src = msprefs.defaults if defaults else msprefs
@ -201,16 +204,19 @@ class FieldsModel(QAbstractListModel): # {{{
return ans | Qt.ItemIsUserCheckable return ans | Qt.ItemIsUserCheckable
def restore_defaults(self): def restore_defaults(self):
self.beginResetModel()
self.overrides = dict([(f, self.state(f, Qt.Checked)) for f in self.fields]) self.overrides = dict([(f, self.state(f, Qt.Checked)) for f in self.fields])
self.reset() self.endResetModel()
def select_all(self): def select_all(self):
self.beginResetModel()
self.overrides = dict([(f, Qt.Checked) for f in self.fields]) self.overrides = dict([(f, Qt.Checked) for f in self.fields])
self.reset() self.endResetModel()
def clear_all(self): def clear_all(self):
self.beginResetModel()
self.overrides = dict([(f, Qt.Unchecked) for f in self.fields]) self.overrides = dict([(f, Qt.Unchecked) for f in self.fields])
self.reset() self.endResetModel()
def setData(self, index, val, role): def setData(self, index, val, role):
try: try:
@ -239,8 +245,9 @@ class FieldsModel(QAbstractListModel): # {{{
else Qt.Checked) else Qt.Checked)
def select_user_defaults(self): def select_user_defaults(self):
self.beginResetModel()
self.overrides = dict([(f, self.user_default_state(f)) for f in self.fields]) self.overrides = dict([(f, self.user_default_state(f)) for f in self.fields])
self.reset() self.endResetModel()
def commit_user_defaults(self): def commit_user_defaults(self):
default_ignored_fields = set([x for x in msprefs['user_default_ignore_fields'] if x not in default_ignored_fields = set([x for x in msprefs['user_default_ignore_fields'] if x not in

View File

@ -37,8 +37,9 @@ class PluginModel(QAbstractItemModel, SearchQueryParser): # {{{
def toggle_shown_plugins(self, show_only_user_plugins): def toggle_shown_plugins(self, show_only_user_plugins):
self.show_only_user_plugins = show_only_user_plugins self.show_only_user_plugins = show_only_user_plugins
self.beginResetModel()
self.populate() self.populate()
self.reset() self.endResetModel()
def populate(self): def populate(self):
self._data = {} self._data = {}
@ -311,8 +312,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
except NameConflict as e: except NameConflict as e:
return error_dialog(self, _('Already exists'), return error_dialog(self, _('Already exists'),
unicode(e), show=True) unicode(e), show=True)
self._plugin_model.beginResetModel()
self._plugin_model.populate() self._plugin_model.populate()
self._plugin_model.reset() self._plugin_model.endResetModel()
self.changed_signal.emit() self.changed_signal.emit()
self.check_for_add_to_toolbars(plugin, previously_installed=plugin.name in installed_plugins) self.check_for_add_to_toolbars(plugin, previously_installed=plugin.name in installed_plugins)
info_dialog(self, _('Success'), info_dialog(self, _('Success'),
@ -371,8 +373,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
msg = _('Plugin <b>{0}</b> successfully removed').format(plugin.name) msg = _('Plugin <b>{0}</b> successfully removed').format(plugin.name)
if remove_plugin(plugin): if remove_plugin(plugin):
self._plugin_model.beginResetModel()
self._plugin_model.populate() self._plugin_model.populate()
self._plugin_model.reset() self._plugin_model.endResetModel()
self.changed_signal.emit() self.changed_signal.emit()
info_dialog(self, _('Success'), msg, show=True, info_dialog(self, _('Success'), msg, show=True,
show_copy_button=False) show_copy_button=False)
@ -390,8 +393,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
mode = FILTER_NOT_INSTALLED if not_installed else FILTER_UPDATE_AVAILABLE mode = FILTER_NOT_INSTALLED if not_installed else FILTER_UPDATE_AVAILABLE
d = PluginUpdaterDialog(self.gui, initial_filter=mode) d = PluginUpdaterDialog(self.gui, initial_filter=mode)
d.exec_() d.exec_()
self._plugin_model.beginResetModel()
self._plugin_model.populate() self._plugin_model.populate()
self._plugin_model.reset() self._plugin_model.endResetModel()
self.changed_signal.emit() self.changed_signal.emit()
if d.do_restart: if d.do_restart:
self.restart_now.emit() self.restart_now.emit()

View File

@ -112,9 +112,10 @@ class AllModel(BaseModel):
for name in names: for name in names:
if name is None or name.startswith('---'): continue if name is None or name.startswith('---'): continue
actions.append(self.name_to_action(name, self.gui)) actions.append(self.name_to_action(name, self.gui))
self.beginResetModel()
self._data.extend(actions) self._data.extend(actions)
self._data.sort() self._data.sort()
self.reset() self.endResetModel()
def remove(self, indices, allowed): def remove(self, indices, allowed):
rows = [i.row() for i in indices] rows = [i.row() for i in indices]
@ -128,13 +129,15 @@ class AllModel(BaseModel):
for i, ac in enumerate(self._data): for i, ac in enumerate(self._data):
if i not in remove: if i not in remove:
ndata.append(ac) ndata.append(ac)
self.beginResetModel()
self._data = ndata self._data = ndata
self.reset() self.endResetModel()
def restore_defaults(self): def restore_defaults(self):
current = gprefs.defaults[self.gprefs_name] current = gprefs.defaults[self.gprefs_name]
self.beginResetModel()
self._data = self.get_all_actions(current) self._data = self.get_all_actions(current)
self.reset() self.endResetModel()
class CurrentModel(BaseModel): class CurrentModel(BaseModel):
@ -172,8 +175,9 @@ class CurrentModel(BaseModel):
else: else:
actions.append(ac) actions.append(ac)
self.beginResetModel()
self._data.extend(actions) self._data.extend(actions)
self.reset() self.endResetModel()
return reject return reject
def remove(self, indices): def remove(self, indices):
@ -189,8 +193,9 @@ class CurrentModel(BaseModel):
for i, ac in enumerate(self._data): for i, ac in enumerate(self._data):
if i not in remove: if i not in remove:
ndata.append(ac) ndata.append(ac)
self.beginResetModel()
self._data = ndata self._data = ndata
self.reset() self.endResetModel()
return rejected return rejected
def commit(self): def commit(self):
@ -211,8 +216,9 @@ class CurrentModel(BaseModel):
def restore_defaults(self): def restore_defaults(self):
current = gprefs.defaults[self.gprefs_name] current = gprefs.defaults[self.gprefs_name]
self.beginResetModel()
self._data = [self.name_to_action(x, self.gui) for x in current] self._data = [self.name_to_action(x, self.gui) for x in current]
self.reset() self.endResetModel()
class ConfigWidget(ConfigWidgetBase, Ui_Form): class ConfigWidget(ConfigWidgetBase, Ui_Form):

View File

@ -10,7 +10,7 @@ import re, time
from functools import partial 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, \ pyqtSignal, QCompleter, QAction, QKeySequence, QTimer, \
QString, QIcon, QMenu QString, QIcon, QMenu
@ -108,7 +108,7 @@ class SearchBox2(QComboBox): # {{{
for item in config[opt_name]: for item in config[opt_name]:
if item not in items: if item not in items:
items.append(item) items.append(item)
self.addItems(QStringList(items)) self.addItems(items)
try: try:
self.line_edit.setPlaceholderText(help_text) self.line_edit.setPlaceholderText(help_text)
except: except:

View File

@ -10,7 +10,7 @@ from functools import partial
from PyQt5.Qt import ( from PyQt5.Qt import (
Qt, QMenu, QPoint, QIcon, QDialog, QGridLayout, QLabel, QLineEdit, QComboBox, 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 import error_dialog, question_dialog, gprefs
from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.confirm_delete import confirm
@ -30,7 +30,7 @@ class SelectNames(QDialog): # {{{
l.addWidget(la) l.addWidget(la)
self._names = QListWidget(self) 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) self._names.setSelectionMode(self._names.ExtendedSelection)
l.addWidget(self._names) l.addWidget(self._names)

View File

@ -186,7 +186,7 @@ class Matches(QAbstractItemModel):
lambda x: sort_key(unicode(self.data_as_text(x, col))), lambda x: sort_key(unicode(self.data_as_text(x, col))),
descending) descending)
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
class SearchFilter(SearchQueryParser): class SearchFilter(SearchQueryParser):

View File

@ -85,7 +85,7 @@ class Matches(QAbstractItemModel):
self.cover_pool.abort() self.cover_pool.abort()
self.details_pool.abort() self.details_pool.abort()
self.total_changed.emit(self.rowCount()) self.total_changed.emit(self.rowCount())
self.reset() self.beginResetModel(), self.endResetModel()
def add_result(self, result, store_plugin): def add_result(self, result, store_plugin):
if result not in self.all_matches: if result not in self.all_matches:
@ -287,7 +287,7 @@ class Matches(QAbstractItemModel):
descending) descending)
self.reorder_matches() self.reorder_matches()
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
def reorder_matches(self): def reorder_matches(self):
def keygen(x): def keygen(x):

View File

@ -108,7 +108,7 @@ class BooksModel(QAbstractItemModel):
lambda x: sort_key(unicode(self.data_as_text(x, col))), lambda x: sort_key(unicode(self.data_as_text(x, col))),
descending) descending)
if reset: if reset:
self.reset() self.beginResetModel(), self.endResetModel()
class SearchFilter(SearchQueryParser): class SearchFilter(SearchQueryParser):

View File

@ -563,8 +563,9 @@ class CharModel(QAbstractListModel):
self.chars[x] = None self.chars[x] = None
for x in reversed(codes): for x in reversed(codes):
self.chars.insert(row, x) self.chars.insert(row, x)
self.beginResetModel()
self.chars = [x for x in self.chars if x is not None] self.chars = [x for x in self.chars if x is not None]
self.reset() self.endResetModel()
tprefs['charmap_favorites'] = list(self.chars) tprefs['charmap_favorites'] = list(self.chars)
return True return True
@ -651,8 +652,9 @@ class CharView(QListView):
def show_chars(self, name, codes): def show_chars(self, name, codes):
self.showing_favorites = name == _('Favorites') self.showing_favorites = name == _('Favorites')
self._model.beginResetModel()
self._model.chars = codes self._model.chars = codes
self._model.reset() self._model.endResetModel()
self.scrollToTop() self.scrollToTop()
def mouseMoveEvent(self, ev): def mouseMoveEvent(self, ev):
@ -687,8 +689,9 @@ class CharView(QListView):
def restore_defaults(self): def restore_defaults(self):
del tprefs['charmap_favorites'] del tprefs['charmap_favorites']
self.model().beginResetModel()
self.model().chars = list(tprefs['charmap_favorites']) self.model().chars = list(tprefs['charmap_favorites'])
self.model().reset() self.model().endResetModel()
def copy_to_clipboard(self, char_code): def copy_to_clipboard(self, char_code):
c = QApplication.clipboard() c = QApplication.clipboard()
@ -702,8 +705,9 @@ class CharView(QListView):
elif char_code in existing: elif char_code in existing:
existing.remove(char_code) existing.remove(char_code)
tprefs['charmap_favorites'] = existing tprefs['charmap_favorites'] = existing
self.model().beginResetModel()
self.model().chars.remove(char_code) self.model().chars.remove(char_code)
self.model().reset() self.model().endResetModel()
class CharSelect(Dialog): class CharSelect(Dialog):

View File

@ -894,7 +894,7 @@ class DiffView(QWidget): # {{{
self.l = l = QHBoxLayout(self) self.l = l = QHBoxLayout(self)
self.setLayout(l) self.setLayout(l)
self.syncpos = 0 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) self.view = DiffSplit(self, show_open_in_editor=show_open_in_editor)
l.addWidget(self.view) l.addWidget(self.view)
self.add_diff = self.view.add_diff self.add_diff = self.view.add_diff

View File

@ -150,8 +150,9 @@ class Images(QAbstractListModel):
self.image_names.append(name) self.image_names.append(name)
def refresh(self): def refresh(self):
self.beginResetModel()
self.build() self.build()
self.reset() self.endResetModel()
def rowCount(self, *args): def rowCount(self, *args):
return len(self.image_names) return len(self.image_names)

View File

@ -417,11 +417,12 @@ class SearchesModel(QAbstractListModel):
def do_filter(self, text): def do_filter(self, text):
text = unicode(text) text = unicode(text)
self.beginResetModel()
self.filtered_searches = [] self.filtered_searches = []
for i, search in enumerate(self.searches): for i, search in enumerate(self.searches):
if primary_contains(text, search['name']): if primary_contains(text, search['name']):
self.filtered_searches.append(i) self.filtered_searches.append(i)
self.reset() self.endResetModel()
def move_entry(self, row, delta): def move_entry(self, row, delta):
a, b = row, row + delta a, b = row, row + delta
@ -433,9 +434,10 @@ class SearchesModel(QAbstractListModel):
tprefs['saved_searches'] = self.searches tprefs['saved_searches'] = self.searches
def add_searches(self, count=1): def add_searches(self, count=1):
self.beginResetModel()
self.searches = tprefs['saved_searches'] self.searches = tprefs['saved_searches']
self.filtered_searches.extend(xrange(len(self.searches) - 1, len(self.searches) - 1 - count, -1)) self.filtered_searches.extend(xrange(len(self.searches) - 1, len(self.searches) - 1 - count, -1))
self.reset() self.endResetModel()
def remove_searches(self, rows): def remove_searches(self, rows):
rows = sorted(set(rows), reverse=True) rows = sorted(set(rows), reverse=True)

View File

@ -77,9 +77,10 @@ class GlobalUndoHistory(QAbstractListModel):
return self.states[self.pos - 1].container return self.states[self.pos - 1].container
def open_book(self, container): def open_book(self, container):
self.beginResetModel()
self.states = [State(container)] self.states = [State(container)]
self.pos = 0 self.pos = 0
self.reset() self.endResetModel()
def truncate(self): def truncate(self):
extra = self.states[self.pos+1:] extra = self.states[self.pos+1:]

View File

@ -20,7 +20,7 @@ from PyQt5.Qt import (
from calibre import prepare_string_for_xml, human_readable from calibre import prepare_string_for_xml, human_readable
from calibre.ebooks.oeb.polish.utils import lead_text, guess_type 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.gui2.tweak_book import tprefs, current_container
from calibre.utils.icu import primary_sort_key, sort_key, primary_contains from calibre.utils.icu import primary_sort_key, sort_key, primary_contains
from calibre.utils.matcher import get_char, Matcher from calibre.utils.matcher import get_char, Matcher
@ -452,7 +452,7 @@ class QuickOpen(Dialog):
Simply type in the characters: Simply type in the characters:
{chars} {chars}
and press Enter.''').format(example=example, chars=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) l.addWidget(hl)
self.results = Results(self) self.results = Results(self)
self.results.setVisible(False) self.results.setVisible(False)
@ -554,15 +554,15 @@ class NamesModel(QAbstractListModel):
return QVariant(self.items[index.row()]) return QVariant(self.items[index.row()])
if role == Qt.DisplayRole: if role == Qt.DisplayRole:
return QVariant('\xa0' * 20) return QVariant('\xa0' * 20)
return NONE
def filter(self, query): def filter(self, query):
query = unicode(query or '') query = unicode(query or '')
self.beginResetModel()
if not query: if not query:
self.items = tuple((text, None) for text in self.names) self.items = tuple((text, None) for text in self.names)
else: else:
self.items = tuple(self.matcher(query).iteritems()) self.items = tuple(self.matcher(query).iteritems())
self.reset() self.endResetModel()
self.filtered.emit(not bool(query)) self.filtered.emit(not bool(query))
def find_name(self, name): def find_name(self, name):

View File

@ -10,7 +10,7 @@ from PyQt5.Qt import (QIcon, QFont, QLabel, QListWidget, QAction,
QCursor, QColor, QWidget, QPixmap, QSplitterHandle, QToolButton, QCursor, QColor, QWidget, QPixmap, QSplitterHandle, QToolButton,
QVariant, Qt, pyqtSignal, QRegExp, QSize, QSplitter, QPainter, QVariant, Qt, pyqtSignal, QRegExp, QSize, QSplitter, QPainter,
QLineEdit, QComboBox, QPen, QGraphicsScene, QMenu, QStringListModel, 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, from calibre.gui2 import (error_dialog, pixmap_to_data, gprefs,
warning_dialog) warning_dialog)
@ -625,7 +625,7 @@ class HistoryLineEdit(QComboBox): # {{{
def initialize(self, name): def initialize(self, name):
self._name = name self._name = name
self.addItems(QStringList(history.get(self.store_name, []))) self.addItems(history.get(self.store_name, []))
self.setEditText('') self.setEditText('')
self.lineEdit().editingFinished.connect(self.save_history) self.lineEdit().editingFinished.connect(self.save_history)