mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
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:
parent
4b346c5e08
commit
4b3ac510bf
@ -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:
|
||||||
|
@ -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)
|
||||||
|
@ -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):
|
||||||
|
@ -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):
|
||||||
|
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user