From 30a2aa6253c696be1e82ffdb6d0e672561e7b98d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 25 Jun 2011 09:34:58 +0100 Subject: [PATCH 1/5] Make clicking on first letter nodes in the tag browser work better --- src/calibre/gui2/tag_view.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index caf9e1b95d..5d6b4cc597 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -1686,10 +1686,19 @@ class TagsModel(QAbstractItemModel): # {{{ if self.collapse_model == 'first letter' and \ tag_item.temporary and not key.startswith('@') \ and tag_item.tag.state: - if node_searches[tag_item.tag.state] == 'true': - ans.append('%s:~^%s'%(key, tag_item.py_name)) + k = 'author_sort' if key == 'authors' else key + letters_seen = {} + for subnode in tag_item.children: + letters_seen[subnode.tag.sort[0]] = True + charclass = ''.join(letters_seen) + if k == 'author_sort': + expr = r'%s:"~(^[%s])|(&\\s*[%s])"'%(k, charclass, charclass) else: - ans.append('(not %s:~^%s )'%(key, tag_item.py_name)) + expr = r'%s:"~^[%s]"'%(k, charclass) + if node_searches[tag_item.tag.state] == 'true': + ans.append(expr) + else: + ans.append('(not ' + expr + ')') continue tag = tag_item.tag if tag.state != TAG_SEARCH_STATES['clear']: From 1341f26acd1a892a9b0e2e711bc392f9a943ee16 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 25 Jun 2011 09:47:33 +0100 Subject: [PATCH 2/5] Correct fix for tag browser rename exception --- src/calibre/gui2/tag_view.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 5d6b4cc597..d368f9c3d5 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -1493,6 +1493,7 @@ class TagsModel(QAbstractItemModel): # {{{ self.tags_view.tag_item_renamed.emit() item.tag.name = val self.rename_item_in_all_user_categories(name, key, val) + self.tags_view.refresh_required.emit() self.show_item_at_path(path) return True From c69fcc1d137ce4d15b592cd52426b99132dae496 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 25 Jun 2011 10:59:46 +0100 Subject: [PATCH 3/5] Make new days_between function return a float instead of an int. --- src/calibre/utils/formatter_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index 63264e6379..55bad6c7e8 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -785,7 +785,7 @@ class BuiltinDaysBetween(BuiltinFormatterFunction): except: return '' i = d1 - d2 - return str(i.days) + return str('%d.%d'%(i.days, i.seconds/8640)) builtin_add = BuiltinAdd() From bd6a14069d205258920b6d0f85e7ba9be42b0e82 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 25 Jun 2011 12:03:30 +0100 Subject: [PATCH 4/5] Improve positioning of tag browser after a refresh --- src/calibre/gui2/tag_view.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index d368f9c3d5..21029da68c 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -1831,6 +1831,7 @@ class TagsModel(QAbstractItemModel): # {{{ if idx.isValid(): self.tags_view.setCurrentIndex(idx) self.tags_view.scrollTo(idx, position) + self.tags_view.setCurrentIndex(idx) if box: tag_item = idx.internalPointer() tag_item.boxed = True From 81283ff687ec18a078011944ff658631360282b2 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 25 Jun 2011 12:03:58 +0100 Subject: [PATCH 5/5] Make db2.set_metadata not issue notifies when calling set_custom --- src/calibre/library/database2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index a3211b3817..8b4ad47284 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -2012,7 +2012,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): val = mi.get(key, None) if force_changes or val is not None: doit(self.set_custom, id, val=val, extra=mi.get_extra(key), - label=user_mi[key]['label'], commit=False) + label=user_mi[key]['label'], commit=False, notify=False) if commit: self.conn.commit() if notify: