From 09c43ac86d8c528af624697936b784e181aa0964 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sat, 21 Nov 2015 15:10:24 +0100 Subject: [PATCH] Reuse the node information (not the nodes themselves) for generated hierarchical nodes so that search indications show everywhere the node appears. --- src/calibre/gui2/tag_browser/model.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/tag_browser/model.py b/src/calibre/gui2/tag_browser/model.py index 71c8f8139c..f3d3bb178f 100644 --- a/src/calibre/gui2/tag_browser/model.py +++ b/src/calibre/gui2/tag_browser/model.py @@ -560,19 +560,24 @@ class TagsModel(QAbstractItemModel): # {{{ '5state' if tag.category != 'search' else '3state' else: if i < len(components)-1: - t = copy.copy(tag) - t.original_name = '.'.join(components[:i+1]) - t.count = 0 - if key != 'search': - # This 'manufactured' intermediate node can - # be searched, but cannot be edited. - t.is_editable = False - else: - t.is_searchable = t.is_editable = False + original_name = '.'.join(components[:i+1]) + t = self.intermediate_nodes.get((original_name, tag.category), None) + if t is None: + t = copy.copy(tag) + t.original_name = original_name + t.count = 0 + if key != 'search': + # This 'manufactured' intermediate node can + # be searched, but cannot be edited. + t.is_editable = False + else: + t.is_searchable = t.is_editable = False + self.intermediate_nodes[(original_name, tag.category)] = t else: t = tag if not in_uc: t.original_name = t.name + self.intermediate_nodes[(t.original_name, tag.category)] = t t.is_hierarchical = \ '5state' if t.category != 'search' else '3state' t.name = comp @@ -587,6 +592,7 @@ class TagsModel(QAbstractItemModel): # {{{ # Build the entire node tree. Note that category_nodes is in field # metadata order so the user categories will be at the end + self.intermediate_nodes = {} for category in self.category_nodes: process_one_node(category, collapse_model, state_map.get(category.category_key, {}))