E-book viewer: Highlight all currently visible ToC nodes, not just the first. See #1912003 (E-book viewer: at some circumstances incorrect ToC entries get highlighted)

This commit is contained in:
Kovid Goyal 2021-01-21 11:05:10 +05:30
parent 4b346c5e08
commit 4b3ac510bf
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
5 changed files with 35 additions and 22 deletions

View File

@ -113,8 +113,8 @@ class TOCView(QTreeView):
m = self.model() m = self.model()
QApplication.clipboard().setText(getattr(m, 'as_plain_text', '')) QApplication.clipboard().setText(getattr(m, 'as_plain_text', ''))
def update_current_toc_nodes(self, current_node_id, toplevel_node_id): def update_current_toc_nodes(self, families):
self.model().update_current_toc_nodes(current_node_id, toplevel_node_id) self.model().update_current_toc_nodes(families)
class TOCSearch(QWidget): class TOCSearch(QWidget):
@ -248,13 +248,19 @@ class TOC(QStandardItemModel):
return index return index
return QModelIndex() return QModelIndex()
def update_current_toc_nodes(self, current_node_id, top_level_node_id): def update_current_toc_nodes(self, current_toc_leaves):
node = self.node_id_map.get(current_node_id)
viewed_nodes = set() viewed_nodes = set()
if node is not None: ancestors = {}
viewed_nodes |= {x.node_id for x in node.ancestors} for node_id in current_toc_leaves:
viewed_nodes.add(node.node_id) node = self.node_id_map.get(node_id)
self.auto_expand_nodes.emit([n.index() for n in node.ancestors]) 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: for node in self.all_items:
is_being_viewed = node.node_id in viewed_nodes is_being_viewed = node.node_id in viewed_nodes
if is_being_viewed != node.is_being_viewed: if is_being_viewed != node.is_being_viewed:

View File

@ -250,7 +250,7 @@ class ViewerBridge(Bridge):
search_result_not_found = from_js(object) search_result_not_found = from_js(object)
find_next = from_js(object) find_next = from_js(object)
quit = from_js() quit = from_js()
update_current_toc_nodes = from_js(object, object) update_current_toc_nodes = from_js(object)
toggle_full_screen = from_js() toggle_full_screen = from_js()
report_cfi = from_js(object, object) report_cfi = from_js(object, object)
ask_for_open = from_js(object) ask_for_open = from_js(object)
@ -456,7 +456,7 @@ class WebView(RestartingWebEngineView):
toggle_inspector = pyqtSignal() toggle_inspector = pyqtSignal()
toggle_lookup = pyqtSignal(object) toggle_lookup = pyqtSignal(object)
quit = pyqtSignal() quit = pyqtSignal()
update_current_toc_nodes = pyqtSignal(object, object) update_current_toc_nodes = pyqtSignal(object)
toggle_full_screen = pyqtSignal() toggle_full_screen = pyqtSignal()
ask_for_open = pyqtSignal(object) ask_for_open = pyqtSignal(object)
selection_changed = pyqtSignal(object, object) selection_changed = pyqtSignal(object, object)

View File

@ -100,10 +100,12 @@ def get_current_toc_nodes():
before = get_border_nodes(toc, id_map)[0] before = get_border_nodes(toc, id_map)[0]
if before: if before:
ans[before.id] = True ans[before.id] = True
ans = Object.keys(ans) r = v'[]'
if ans.length: for x in Object.keys(ans):
return family_for_toc_node(ans[0], parent_map, id_map) fam = family_for_toc_node(x, parent_map, id_map)
return v'[]' if fam?.length:
r.push(fam)
return r
def get_highlighted_toc_nodes(toc, parent_map, id_map): def get_highlighted_toc_nodes(toc, parent_map, id_map):

View File

@ -210,7 +210,7 @@ class View:
self.current_progress_frac = self.current_file_progress_frac = 0 self.current_progress_frac = self.current_file_progress_frac = 0
self.current_page_counts = {'current': 0, 'total': 0, 'pages_per_screen': 1} 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_node = self.current_toc_toplevel_node = None
self.current_toc_family = v'[]' self.current_toc_families = v'[]'
self.report_cfi_callbacks = {} self.report_cfi_callbacks = {}
self.get_cfi_counter = 0 self.get_cfi_counter = 0
self.show_loading_callback_timer = None self.show_loading_callback_timer = None
@ -1293,14 +1293,19 @@ class View:
def on_update_toc_position(self, data): def on_update_toc_position(self, data):
update_visible_toc_nodes(data.visible_anchors) update_visible_toc_nodes(data.visible_anchors)
self.current_toc_family = get_current_toc_nodes() self.current_toc_families = get_current_toc_nodes()
if self.current_toc_family.length: if self.current_toc_families.length:
self.current_toc_node = self.current_toc_family[-1] first = self.current_toc_families[0]
self.current_toc_toplevel_node = self.current_toc_family[0] self.current_toc_node = first[-1]
self.current_toc_toplevel_node = first[0]
else: else:
self.current_toc_node = self.current_toc_toplevel_node = None self.current_toc_node = self.current_toc_toplevel_node = None
if runtime.is_standalone_viewer: 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() self.update_header_footer()
def show_spine_item(self, resource_data): def show_spine_item(self, resource_data):

View File

@ -365,8 +365,8 @@ if window is window.top:
to_python.toggle_lookup(v'!!force_show') to_python.toggle_lookup(v'!!force_show')
ui_operations.selection_changed = def(selected_text, annot_id): ui_operations.selection_changed = def(selected_text, annot_id):
to_python.selection_changed(selected_text, annot_id or None) to_python.selection_changed(selected_text, annot_id or None)
ui_operations.update_current_toc_nodes = def(current_node_id, top_level_node_id): ui_operations.update_current_toc_nodes = def(families):
to_python.update_current_toc_nodes(current_node_id, top_level_node_id) to_python.update_current_toc_nodes(families)
ui_operations.toggle_full_screen = def(): ui_operations.toggle_full_screen = def():
to_python.toggle_full_screen() to_python.toggle_full_screen()
ui_operations.report_cfi = def(request_id, data): ui_operations.report_cfi = def(request_id, data):