diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index edabdabd2a..67eae34ed4 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -403,19 +403,22 @@ class EbookViewer(MainWindow): self.load_book_data() self.update_window_title() initial_cfi = self.initial_cfi_for_current_book() - initial_toc_node = initial_bookpos = None + initial_position = {'type': 'cfi', 'data': initial_cfi} if initial_cfi else None if open_at: if open_at.startswith('toc:'): initial_toc_node = self.toc_model.node_id_for_text(open_at[len('toc:'):]) + initial_position = {'type': 'toc', 'data': initial_toc_node} elif open_at.startswith('toc-href:'): initial_toc_node = self.toc_model.node_id_for_href(open_at[len('toc-href:'):], exact=True) + initial_position = {'type': 'toc', 'data': initial_toc_node} elif open_at.startswith('toc-href-contains:'): initial_toc_node = self.toc_model.node_id_for_href(open_at[len('toc-href-contains:'):], exact=False) + initial_position = {'type': 'toc', 'data': initial_toc_node} elif open_at.startswith('epubcfi(/'): - initial_cfi = open_at + initial_position = {'type': 'cfi', 'data': open_at} elif is_float(open_at): - initial_bookpos = float(open_at) - self.web_view.start_book_load(initial_cfi=initial_cfi, initial_toc_node=initial_toc_node, initial_bookpos=initial_bookpos) + initial_position = {'type': 'bookpos', 'data': float(open_at)} + self.web_view.start_book_load(initial_position=initial_position) def load_book_data(self): self.load_book_annotations() diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index 832251772d..acf0a137c8 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -544,9 +544,9 @@ class WebView(RestartingWebEngineView): for func, args in iteritems(self.pending_bridge_ready_actions): getattr(self.bridge, func)(*args) - def start_book_load(self, initial_cfi=None, initial_toc_node=None, initial_bookpos=None): + def start_book_load(self, initial_position=None): key = (set_book_path.path,) - self.execute_when_ready('start_book_load', key, initial_cfi, initial_toc_node, initial_bookpos, set_book_path.pathtoebook) + self.execute_when_ready('start_book_load', key, initial_position, set_book_path.pathtoebook) def execute_when_ready(self, action, *args): if self.bridge.ready: diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index e11bc66d33..096c65bb05 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -616,7 +616,7 @@ class View: cfi = '/' + rest return name, cfi - def display_book(self, book, initial_cfi, initial_toc_node, initial_bookpos): + def display_book(self, book, initial_position): self.hide_overlays() self.iframe.focus() is_current_book = self.book and self.book.key == book.key @@ -636,8 +636,8 @@ class View: unkey = username_key(get_interface_data().username) name = book.manifest.spine[0] cfi = None - if initial_cfi and initial_cfi.startswith('epubcfi(/'): - cfi = initial_cfi + if initial_position and initial_position.type is 'cfi' and initial_position.data.startswith('epubcfi(/'): + cfi = initial_position.data else: q = parse_url_params() if q.bookpos and q.bookpos.startswith('epubcfi(/'): @@ -649,11 +649,12 @@ class View: name = cfiname pos.type, pos.cfi = 'cfi', internal_cfi navigated = False - if jstype(initial_toc_node) is 'number': - navigated = self.goto_toc_node(initial_toc_node) - if not navigated and jstype(initial_bookpos) is 'number': - navigated = True - self.goto_book_position(initial_bookpos) + if initial_position: + if initial_position.type is 'toc': + navigated = self.goto_toc_node(initial_position.data) + elif initial_position.type is 'bookpos': + navigated = True + self.goto_book_position(initial_position.data) if navigated: self.hide_loading() else: diff --git a/src/pyj/viewer-main.pyj b/src/pyj/viewer-main.pyj index 0af0db74f6..86ab98f67c 100644 --- a/src/pyj/viewer-main.pyj +++ b/src/pyj/viewer-main.pyj @@ -138,7 +138,7 @@ def show_error(title, msg, details): to_python.show_error(title, msg, details) -def manifest_received(key, initial_cfi, initial_toc_node, initial_bookpos, pathtoebook, end_type, xhr, ev): +def manifest_received(key, initial_position, pathtoebook, end_type, xhr, ev): nonlocal book end_type = workaround_qt_bug(xhr, end_type) if end_type is 'load': @@ -151,7 +151,7 @@ def manifest_received(key, initial_cfi, initial_toc_node, initial_bookpos, patht book.is_complete = True v'delete book.manifest["metadata"]' v'delete book.manifest["last_read_positions"]' - view.display_book(book, initial_cfi, initial_toc_node, initial_bookpos) + view.display_book(book, initial_position) else: show_error(_('Could not open book'), _( 'Failed to load book manifest, click "Show details" for more info'), @@ -241,8 +241,8 @@ def show_home_page(): @from_python -def start_book_load(key, initial_cfi, initial_toc_node, initial_bookpos, pathtoebook): - xhr = ajax('manifest', manifest_received.bind(None, key, initial_cfi, initial_toc_node, initial_bookpos, pathtoebook), ok_code=0) +def start_book_load(key, initial_position, pathtoebook): + xhr = ajax('manifest', manifest_received.bind(None, key, initial_position, pathtoebook), ok_code=0) xhr.responseType = 'json' xhr.send()