diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 904b6a866d..6a85560e90 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -786,6 +786,15 @@ def decouple(prefix): from calibre.gui2.widgets import history history.decouple(prefix) +_gui_prefs = gprefs + +def gui_prefs(): + return _gui_prefs + +def set_gui_prefs(prefs): + global _gui_prefs + _gui_prefs = prefs + class ResizableDialog(QDialog): # This class is present only for backwards compat with third party plugins diff --git a/src/calibre/gui2/languages.py b/src/calibre/gui2/languages.py index 54025af6ee..a2397e8ba3 100644 --- a/src/calibre/gui2/languages.py +++ b/src/calibre/gui2/languages.py @@ -7,6 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' +from calibre.gui2 import gui_prefs from calibre.gui2.complete2 import EditWithComplete from calibre.utils.localization import lang_map from calibre.utils.icu import sort_key, lower @@ -23,8 +24,10 @@ def get_lang_map(): class LanguagesEdit(EditWithComplete): - def __init__(self, parent=None, db=None): - EditWithComplete.__init__(self, parent) + def __init__(self, parent=None, db=None, prefs=None): + self.prefs = prefs or gui_prefs() + self.refresh_recently_used() + EditWithComplete.__init__(self, parent, sort_func=self.sort_language_items_key) self.setSizeAdjustPolicy(self.AdjustToMinimumContentsLengthWithIcon) self.setMinimumContentsLength(20) @@ -34,17 +37,28 @@ class LanguagesEdit(EditWithComplete): self.comma_rmap = {v:k for k, v in self.comma_map.iteritems()} self._rmap = {lower(v):k for k,v in self._lang_map.iteritems()} self.init_langs(db) + self.item_selected.connect(self.update_recently_used) def init_langs(self, db): - if db is not None: - pmap = {self._lang_map.get(x[1], x[1]):1 for x in - db.get_languages_with_ids()} - all_items = sorted(self._lang_map.itervalues(), - key=lambda x: (-pmap.get(x, 0), sort_key(x))) - else: - all_items = sorted(self._lang_map.itervalues(), - key=lambda x: sort_key(x)) - self.update_items_cache(all_items) + self.update_items_cache(self._lang_map.itervalues()) + + def refresh_recently_used(self): + recently_used = self.prefs.get('recently_used_languages') or () + self.recently_used = {x:i for i, x in enumerate(recently_used) if x} + + def update_recently_used(self): + recently_used = self.prefs.get('recently_used_languages') or [] + vals = self.vals + for x in vals: + if x: + if x in recently_used: + recently_used.remove(x) + recently_used.insert(0, x) + self.prefs.set('recently_used_languages', recently_used[:5]) + + def sort_language_items_key(self, val): + idx = self.recently_used.get(val, 100000) + return (idx, sort_key(val)) @property def vals(self): diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index ae986d7402..e125dcd235 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -391,6 +391,7 @@ class LanguagesDelegate(QStyledItemDelegate, UpdateEditorGeometry): # {{{ def setModelData(self, editor, model, index): val = ','.join(editor.lang_codes) + editor.update_recently_used() model.setData(index, (val), Qt.EditRole) # }}} diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 03d284567a..323fd55953 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -1378,6 +1378,7 @@ class LanguagesEdit(LE, ToMetadataMixin): # {{{ cv = self.current_val if cv != self.original_val: db.set_languages(id_, cv) + self.update_recently_used() # }}} # Identifiers {{{ diff --git a/src/calibre/gui2/tweak_book/editor/insert_resource.py b/src/calibre/gui2/tweak_book/editor/insert_resource.py index 5b0a8570d0..f6905685ba 100644 --- a/src/calibre/gui2/tweak_book/editor/insert_resource.py +++ b/src/calibre/gui2/tweak_book/editor/insert_resource.py @@ -434,8 +434,10 @@ class NewBook(Dialog): # {{{ self.fmt = fmt def accept(self): - tprefs.set('previous_new_book_authors', unicode(self.authors.text())) - tprefs.set('previous_new_book_lang', (self.languages.lang_codes or [get_lang()])[0]) + with tprefs: + tprefs.set('previous_new_book_authors', unicode(self.authors.text())) + tprefs.set('previous_new_book_lang', (self.languages.lang_codes or [get_lang()])[0]) + self.languages.update_recently_used() super(NewBook, self).accept() @property diff --git a/src/calibre/gui2/tweak_book/main.py b/src/calibre/gui2/tweak_book/main.py index 144a85b22e..59f5603af6 100644 --- a/src/calibre/gui2/tweak_book/main.py +++ b/src/calibre/gui2/tweak_book/main.py @@ -11,7 +11,7 @@ import sys, os, importlib, time from PyQt5.Qt import QIcon from calibre.constants import islinux, iswindows -from calibre.gui2 import Application, ORG_NAME, APP_UID, setup_gui_option_parser, decouple +from calibre.gui2 import Application, ORG_NAME, APP_UID, setup_gui_option_parser, decouple, set_gui_prefs from calibre.ptempfile import reset_base_dir from calibre.utils.config import OptionParser @@ -60,7 +60,7 @@ def _run(args, notify=None): parser = option_parser() opts, args = parser.parse_args(args) - decouple('edit-book-') + decouple('edit-book-'), set_gui_prefs(tprefs) override = 'calibre-edit-book' if islinux else None app = Application(args, override_program_name=override, color_prefs=tprefs) app.file_event_hook = EventAccumulator() diff --git a/src/calibre/gui2/tweak_book/spell.py b/src/calibre/gui2/tweak_book/spell.py index b0ba49b30e..5b60da0e7f 100644 --- a/src/calibre/gui2/tweak_book/spell.py +++ b/src/calibre/gui2/tweak_book/spell.py @@ -316,6 +316,7 @@ class ManageUserDictionaries(Dialog): l.addRow(bb) if d.exec_() != d.Accepted: return + d.loc.update_recently_used() word = unicode(w.text()) lang = (loc.lang_codes or [canonicalize_lang(get_lang())])[0] if not word: