diff --git a/src/calibre/gui2/viewer/toc.py b/src/calibre/gui2/viewer/toc.py index 991e6563f2..9289d6362b 100644 --- a/src/calibre/gui2/viewer/toc.py +++ b/src/calibre/gui2/viewer/toc.py @@ -113,8 +113,8 @@ class TOCView(QTreeView): m = self.model() QApplication.clipboard().setText(getattr(m, 'as_plain_text', '')) - def update_current_toc_nodes(self, current_node_id, toplevel_node_id): - self.model().update_current_toc_nodes(current_node_id, toplevel_node_id) + def update_current_toc_nodes(self, families): + self.model().update_current_toc_nodes(families) class TOCSearch(QWidget): @@ -248,13 +248,19 @@ class TOC(QStandardItemModel): return index return QModelIndex() - def update_current_toc_nodes(self, current_node_id, top_level_node_id): - node = self.node_id_map.get(current_node_id) + def update_current_toc_nodes(self, current_toc_leaves): viewed_nodes = set() - if node is not None: - viewed_nodes |= {x.node_id for x in node.ancestors} - viewed_nodes.add(node.node_id) - self.auto_expand_nodes.emit([n.index() for n in node.ancestors]) + ancestors = {} + for node_id in current_toc_leaves: + node = self.node_id_map.get(node_id) + if node is not None: + viewed_nodes.add(node_id) + ansc = tuple(node.ancestors) + viewed_nodes |= {x.node_id for x in ansc} + for x in ansc: + ancestors[x.node_id] = x.index() + if ancestors: + self.auto_expand_nodes.emit(tuple(ancestors.values())) for node in self.all_items: is_being_viewed = node.node_id in viewed_nodes if is_being_viewed != node.is_being_viewed: diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index c373340d9d..9b54b7679c 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -250,7 +250,7 @@ class ViewerBridge(Bridge): search_result_not_found = from_js(object) find_next = from_js(object) quit = from_js() - update_current_toc_nodes = from_js(object, object) + update_current_toc_nodes = from_js(object) toggle_full_screen = from_js() report_cfi = from_js(object, object) ask_for_open = from_js(object) @@ -456,7 +456,7 @@ class WebView(RestartingWebEngineView): toggle_inspector = pyqtSignal() toggle_lookup = pyqtSignal(object) quit = pyqtSignal() - update_current_toc_nodes = pyqtSignal(object, object) + update_current_toc_nodes = pyqtSignal(object) toggle_full_screen = pyqtSignal() ask_for_open = pyqtSignal(object) selection_changed = pyqtSignal(object, object) diff --git a/src/pyj/read_book/toc.pyj b/src/pyj/read_book/toc.pyj index 35fe63d93f..451ba4364d 100644 --- a/src/pyj/read_book/toc.pyj +++ b/src/pyj/read_book/toc.pyj @@ -100,10 +100,12 @@ def get_current_toc_nodes(): before = get_border_nodes(toc, id_map)[0] if before: ans[before.id] = True - ans = Object.keys(ans) - if ans.length: - return family_for_toc_node(ans[0], parent_map, id_map) - return v'[]' + r = v'[]' + for x in Object.keys(ans): + fam = family_for_toc_node(x, parent_map, id_map) + if fam?.length: + r.push(fam) + return r def get_highlighted_toc_nodes(toc, parent_map, id_map): diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index 89534eca3d..c5951c28d7 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -210,7 +210,7 @@ class View: self.current_progress_frac = self.current_file_progress_frac = 0 self.current_page_counts = {'current': 0, 'total': 0, 'pages_per_screen': 1} self.current_toc_node = self.current_toc_toplevel_node = None - self.current_toc_family = v'[]' + self.current_toc_families = v'[]' self.report_cfi_callbacks = {} self.get_cfi_counter = 0 self.show_loading_callback_timer = None @@ -1293,14 +1293,19 @@ class View: def on_update_toc_position(self, data): update_visible_toc_nodes(data.visible_anchors) - self.current_toc_family = get_current_toc_nodes() - if self.current_toc_family.length: - self.current_toc_node = self.current_toc_family[-1] - self.current_toc_toplevel_node = self.current_toc_family[0] + self.current_toc_families = get_current_toc_nodes() + if self.current_toc_families.length: + first = self.current_toc_families[0] + self.current_toc_node = first[-1] + self.current_toc_toplevel_node = first[0] else: self.current_toc_node = self.current_toc_toplevel_node = None if runtime.is_standalone_viewer: - ui_operations.update_current_toc_nodes(self.current_toc_node?.id, self.current_toc_toplevel_node?.id) + r = v'[]' + for fam in self.current_toc_families: + if fam.length: + r.push(fam[-1].id) + ui_operations.update_current_toc_nodes(r) self.update_header_footer() def show_spine_item(self, resource_data): diff --git a/src/pyj/viewer-main.pyj b/src/pyj/viewer-main.pyj index 5c59dc24a9..0b76e4b711 100644 --- a/src/pyj/viewer-main.pyj +++ b/src/pyj/viewer-main.pyj @@ -365,8 +365,8 @@ if window is window.top: to_python.toggle_lookup(v'!!force_show') ui_operations.selection_changed = def(selected_text, annot_id): to_python.selection_changed(selected_text, annot_id or None) - ui_operations.update_current_toc_nodes = def(current_node_id, top_level_node_id): - to_python.update_current_toc_nodes(current_node_id, top_level_node_id) + ui_operations.update_current_toc_nodes = def(families): + to_python.update_current_toc_nodes(families) ui_operations.toggle_full_screen = def(): to_python.toggle_full_screen() ui_operations.report_cfi = def(request_id, data):