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, {}))