From 32a52b9e052b978590eae075bbf5de852569e324 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 10 Jul 2012 15:57:35 +0530 Subject: [PATCH] Make the list of displayed fields in the book details panel a per library setting --- src/calibre/db/backend.py | 67 +++++++++++++++++++++++ src/calibre/gui2/__init__.py | 8 --- src/calibre/gui2/book_details.py | 12 +++- src/calibre/gui2/preferences/look_feel.py | 2 +- src/calibre/library/database2.py | 8 +++ src/calibre/library/prefs.py | 3 + 6 files changed, 90 insertions(+), 10 deletions(-) diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 075f337765..f99a04adce 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -81,6 +81,9 @@ class DBPrefs(dict): # {{{ def to_raw(self, val): return json.dumps(val, indent=2, default=to_json) + def has_setting(self, key): + return key in self + def __getitem__(self, key): try: return dict.__getitem__(self, key) @@ -102,6 +105,53 @@ class DBPrefs(dict): # {{{ def set(self, key, val): self.__setitem__(key, val) + def get_namespaced(self, namespace, key, default=None): + key = u'namespaced:%s:%s'%(namespace, key) + try: + return dict.__getitem__(self, key) + except KeyError: + return default + + def set_namespaced(self, namespace, key, val): + if u':' in key: raise KeyError('Colons are not allowed in keys') + if u':' in namespace: raise KeyError('Colons are not allowed in' + ' the namespace') + key = u'namespaced:%s:%s'%(namespace, key) + self[key] = val + + def write_serialized(self, library_path): + try: + to_filename = os.path.join(library_path, 'metadata_db_prefs_backup.json') + with open(to_filename, "wb") as f: + f.write(json.dumps(self, indent=2, default=to_json)) + except: + import traceback + traceback.print_exc() + + @classmethod + def read_serialized(cls, library_path, recreate_prefs=False): + try: + from_filename = os.path.join(library_path, + 'metadata_db_prefs_backup.json') + with open(from_filename, "rb") as f: + d = json.load(f, object_hook=from_json) + if not recreate_prefs: + return d + cls.clear() + cls.db.conn.execute('DELETE FROM preferences') + for k,v in d.iteritems(): + raw = cls.to_raw(v) + cls.db.conn.execute( + 'INSERT INTO preferences (key,val) VALUES (?,?)', (k, raw)) + cls.db.conn.commit() + cls.clear() + cls.update(d) + return d + except: + import traceback + traceback.print_exc() + raise + return None # }}} # Extra collators {{{ @@ -350,6 +400,23 @@ class DB(object): defs['gui_restriction'] = defs['cs_restriction'] = '' defs['categories_using_hierarchy'] = [] defs['column_color_rules'] = [] + defs['grouped_search_make_user_categories'] = [] + defs['similar_authors_search_key'] = 'authors' + defs['similar_authors_match_kind'] = 'match_any' + defs['similar_publisher_search_key'] = 'publisher' + defs['similar_publisher_match_kind'] = 'match_any' + defs['similar_tags_search_key'] = 'tags' + defs['similar_tags_match_kind'] = 'match_all' + defs['similar_series_search_key'] = 'series' + defs['similar_series_match_kind'] = 'match_any' + defs['book_display_fields'] = [ + ('title', False), ('authors', True), ('formats', True), + ('series', True), ('identifiers', True), ('tags', True), + ('path', True), ('publisher', False), ('rating', False), + ('author_sort', False), ('sort', False), ('timestamp', False), + ('uuid', False), ('comments', True), ('id', False), ('pubdate', False), + ('last_modified', False), ('size', False), ('languages', False), + ] # Migrate the bool tristate tweak defs['bools_are_tristate'] = \ diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index f1778bb38e..370e2dc993 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -89,14 +89,6 @@ gprefs.defaults['tags_browser_partition_method'] = 'first letter' gprefs.defaults['tags_browser_collapse_at'] = 100 gprefs.defaults['tag_browser_dont_collapse'] = [] gprefs.defaults['edit_metadata_single_layout'] = 'default' -gprefs.defaults['book_display_fields'] = [ - ('title', False), ('authors', True), ('formats', True), - ('series', True), ('identifiers', True), ('tags', True), - ('path', True), ('publisher', False), ('rating', False), - ('author_sort', False), ('sort', False), ('timestamp', False), - ('uuid', False), ('comments', True), ('id', False), ('pubdate', False), - ('last_modified', False), ('size', False), ('languages', False), - ] gprefs.defaults['default_author_link'] = 'http://en.wikipedia.org/w/index.php?search={author}' gprefs.defaults['preserve_date_on_ctl'] = True gprefs.defaults['cb_fullscreen'] = False diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 3e57442591..a8e5e20a70 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -84,7 +84,17 @@ def render_html(mi, css, vertical, widget, all_fields=False): # {{{ return ans def get_field_list(fm, use_defaults=False): - src = gprefs.defaults if use_defaults else gprefs + from calibre.gui2.ui import get_gui + db = get_gui().current_db + if use_defaults: + src = db.prefs.defaults + else: + old_val = gprefs.get('book_display_fields', None) + if old_val is not None and not db.prefs.has_setting( + 'book_display_fields'): + src = gprefs + else: + src = db.prefs fieldlist = list(src['book_display_fields']) names = frozenset([x[0] for x in fieldlist]) for field in fm.displayable_field_keys(): diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 3d2b0da8e7..8ca6b96379 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -75,7 +75,7 @@ class DisplayedFields(QAbstractListModel): # {{{ def commit(self): if self.changed: - gprefs['book_display_fields'] = self.fields + self.db.prefs['book_display_fields'] = self.fields def move(self, idx, delta): row = idx.row() + delta diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 905eb84fa4..ba660be49f 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -251,6 +251,14 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): defs['similar_tags_match_kind'] = 'match_all' defs['similar_series_search_key'] = 'series' defs['similar_series_match_kind'] = 'match_any' + defs['book_display_fields'] = [ + ('title', False), ('authors', True), ('formats', True), + ('series', True), ('identifiers', True), ('tags', True), + ('path', True), ('publisher', False), ('rating', False), + ('author_sort', False), ('sort', False), ('timestamp', False), + ('uuid', False), ('comments', True), ('id', False), ('pubdate', False), + ('last_modified', False), ('size', False), ('languages', False), + ] # Migrate the bool tristate tweak defs['bools_are_tristate'] = \ diff --git a/src/calibre/library/prefs.py b/src/calibre/library/prefs.py index d4264a14db..8be69461b7 100644 --- a/src/calibre/library/prefs.py +++ b/src/calibre/library/prefs.py @@ -34,6 +34,9 @@ class DBPrefs(dict): def to_raw(self, val): return json.dumps(val, indent=2, default=to_json) + def has_setting(self, key): + return key in self + def __getitem__(self, key): try: return dict.__getitem__(self, key)