From 6f384dd00a1a027b06f02b1958abf3566ea69e26 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 27 May 2017 23:30:45 +0530 Subject: [PATCH] Start work on implementing scrollIntoView for Safari --- src/pyj/read_book/cfi.pyj | 4 ++-- src/pyj/read_book/globals.pyj | 28 ++++++++++++++++++++++++++++ src/pyj/read_book/paged_mode.pyj | 4 +++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/pyj/read_book/cfi.pyj b/src/pyj/read_book/cfi.pyj index dd61d28e8f..c70ed054aa 100644 --- a/src/pyj/read_book/cfi.pyj +++ b/src/pyj/read_book/cfi.pyj @@ -448,7 +448,7 @@ def scroll_to(cfi, callback, doc): # {{{ span = ndoc.createElement('span') span.setAttribute('style', 'border-width: 0; padding: 0; margin: 0') r.surroundContents(span) - span.scrollIntoView() + scroll_viewport.scroll_into_view(span) fn = def(): # Remove the span and get the new position now that scrolling # has (hopefully) completed @@ -482,7 +482,7 @@ def scroll_to(cfi, callback, doc): # {{{ callback(x, y) else: node = point_.node - node.scrollIntoView() + scroll_viewport.scroll_into_view(node) fn = def(): r = node.getBoundingClientRect() diff --git a/src/pyj/read_book/globals.pyj b/src/pyj/read_book/globals.pyj index dad4f011ed..c2ee261772 100644 --- a/src/pyj/read_book/globals.pyj +++ b/src/pyj/read_book/globals.pyj @@ -50,12 +50,20 @@ def flow_viewport_y(): def flow_viewport_scroll_to(x, y): window.scrollTo(x, y) +def flow_viewport_scroll_into_view(elem): + elem.scrollIntoView() + +def flow_reset_globals(): + pass + def paged_viewport_y(): return 0 scroll_viewport.x = flow_viewport_x scroll_viewport.y = flow_viewport_y scroll_viewport.scroll_to = flow_viewport_scroll_to +scroll_viewport.scroll_into_view = flow_viewport_scroll_into_view +scroll_viewport.reset_globals = flow_reset_globals if is_ios: window_width = def (): @@ -80,6 +88,20 @@ if is_ios: if isNaN(ans): return 0 return ans + paged_viewport_scroll_into_view = def(elem): + left = elem.offsetLeft + if left is None: + return # element has display: none + elem.scrollIntoView() + window.scrollTo(0, 0) + p = elem.offsetParent + while p: + left += p.offsetLeft + p = p.offsetParent + # left -= window_width() // 2 + paged_viewport_scroll_to(max(0, left), 0) + paged_reset_globals = def(): + document.documentElement.style.transform = 'none' else: window_width = def(): @@ -88,6 +110,8 @@ else: return window.innerHeight paged_viewport_scroll_to = flow_viewport_scroll_to paged_viewport_x = flow_viewport_x + paged_viewport_scroll_into_view = flow_viewport_scroll_into_view + paged_reset_globals = flow_reset_globals scroll_viewport.width = window_width scroll_viewport.height = window_height @@ -103,10 +127,14 @@ def set_layout_mode(val): scroll_viewport.x = flow_viewport_x scroll_viewport.y = flow_viewport_y scroll_viewport.scroll_to = flow_viewport_scroll_to + scroll_viewport.scroll_into_view = flow_viewport_scroll_into_view + scroll_viewport.reset_globals = flow_reset_globals else: scroll_viewport.x = paged_viewport_x scroll_viewport.y = paged_viewport_y scroll_viewport.scroll_to = paged_viewport_scroll_to + scroll_viewport.scroll_into_view = paged_viewport_scroll_into_view + scroll_viewport.reset_globals = paged_reset_globals def current_spine_item(): return current_spine_item.value diff --git a/src/pyj/read_book/paged_mode.pyj b/src/pyj/read_book/paged_mode.pyj index 77fdfaeb48..5daa438a5b 100644 --- a/src/pyj/read_book/paged_mode.pyj +++ b/src/pyj/read_book/paged_mode.pyj @@ -54,6 +54,7 @@ is_full_screen_layout = False def reset_paged_mode_globals(): nonlocal _in_paged_mode, col_width, col_and_gap, screen_height, gap, screen_width, is_full_screen_layout, cols_per_screen + scroll_viewport.reset_globals() col_width = screen_width = screen_height = cols_per_screen = gap = col_and_gap = 0 is_full_screen_layout = _in_paged_mode = False @@ -339,7 +340,8 @@ def jump_to_anchor(name): scroll_to_elem(elem) def scroll_to_elem(elem): - elem.scrollIntoView() + scroll_viewport.scroll_into_view(elem) + if in_paged_mode: # Ensure we are scrolled to the column containing elem