mirror of
https://github.com/overleaf/overleaf.git
synced 2025-03-15 08:23:08 +00:00
move pdf page visibility calculation up into pdfViewer directive
removes per-page watch for visibility
This commit is contained in:
parent
2e021b64d8
commit
776535f9f3
3 changed files with 53 additions and 74 deletions
|
@ -29,32 +29,16 @@ define [
|
||||||
canvasElement.width(w)
|
canvasElement.width(w)
|
||||||
scope.page.sized = true
|
scope.page.sized = true
|
||||||
|
|
||||||
isVisible = (containerSize) ->
|
|
||||||
elemTop = element.offset().top - containerSize[2]
|
|
||||||
elemBottom = elemTop + element.innerHeight()
|
|
||||||
visible = (elemTop < containerSize[1] and elemBottom > 0)
|
|
||||||
scope.page.visible = visible
|
|
||||||
scope.page.elemTop = elemTop
|
|
||||||
scope.page.elemBottom = elemBottom
|
|
||||||
return visible
|
|
||||||
|
|
||||||
renderPage = () ->
|
|
||||||
scope.document.renderPage {
|
|
||||||
canvas: canvasElement,
|
|
||||||
text: textElement
|
|
||||||
annotations: annotationsElement
|
|
||||||
highlights: highlightsElement
|
|
||||||
}, scope.page.pageNum
|
|
||||||
|
|
||||||
pausePage = () ->
|
|
||||||
scope.document.pause {
|
|
||||||
canvas: canvasElement,
|
|
||||||
text: textElement
|
|
||||||
}, scope.page.pageNum
|
|
||||||
|
|
||||||
# keep track of our page element, so we can access it in the
|
# keep track of our page element, so we can access it in the
|
||||||
# parent with scope.pages[i].element
|
# parent with scope.pages[i].element, and the contained
|
||||||
|
# elements for each part
|
||||||
scope.page.element = element
|
scope.page.element = element
|
||||||
|
scope.page.elementChildren = {
|
||||||
|
canvas: canvasElement,
|
||||||
|
text: textElement
|
||||||
|
annotations: annotationsElement
|
||||||
|
highlights: highlightsElement
|
||||||
|
}
|
||||||
|
|
||||||
if !scope.page.sized
|
if !scope.page.sized
|
||||||
if scope.defaultPageSize?
|
if scope.defaultPageSize?
|
||||||
|
@ -69,23 +53,10 @@ define [
|
||||||
|
|
||||||
if scope.page.current
|
if scope.page.current
|
||||||
# console.log 'we must scroll to this page', scope.page.pageNum, 'at position', scope.page.position
|
# console.log 'we must scroll to this page', scope.page.pageNum, 'at position', scope.page.position
|
||||||
renderPage()
|
|
||||||
# this is the current page, we want to scroll it into view
|
# this is the current page, we want to scroll it into view
|
||||||
|
# FIXME: do we need to ensure render fires before moving to this position???
|
||||||
ctrl.setPdfPosition(scope.page, scope.page.position)
|
ctrl.setPdfPosition(scope.page, scope.page.position)
|
||||||
|
|
||||||
watchHandle = scope.$watch 'containerSize', (containerSize, oldVal) ->
|
|
||||||
return unless containerSize?
|
|
||||||
return unless scope.page.sized
|
|
||||||
oldVisible = scope.page.visible
|
|
||||||
newVisible = isVisible containerSize
|
|
||||||
scope.page.visible = newVisible
|
|
||||||
if newVisible && !oldVisible
|
|
||||||
renderPage()
|
|
||||||
# TODO deregister this listener after the page is rendered
|
|
||||||
#watchHandle()
|
|
||||||
else if !newVisible && oldVisible
|
|
||||||
pausePage()
|
|
||||||
|
|
||||||
element.on 'dblclick', (e) ->
|
element.on 'dblclick', (e) ->
|
||||||
offset = $(element).find('.pdf-canvas').offset()
|
offset = $(element).find('.pdf-canvas').offset()
|
||||||
dx = e.pageX - offset.left
|
dx = e.pageX - offset.left
|
||||||
|
|
|
@ -107,6 +107,15 @@ define [
|
||||||
@jobs = @jobs - 1
|
@jobs = @jobs - 1
|
||||||
@triggerRenderQueue(0)
|
@triggerRenderQueue(0)
|
||||||
|
|
||||||
|
renderPages: (pages) ->
|
||||||
|
return if @shuttingDown
|
||||||
|
@renderQueue = for page in pages
|
||||||
|
{
|
||||||
|
'element': page.elementChildren
|
||||||
|
'pagenum': page.pageNum
|
||||||
|
}
|
||||||
|
@triggerRenderQueue()
|
||||||
|
|
||||||
renderPage: (element, pagenum) ->
|
renderPage: (element, pagenum) ->
|
||||||
return if @shuttingDown
|
return if @shuttingDown
|
||||||
current = {
|
current = {
|
||||||
|
|
|
@ -245,6 +245,33 @@ define [
|
||||||
element.offset().top
|
element.offset().top
|
||||||
]
|
]
|
||||||
|
|
||||||
|
getVisiblePages = () ->
|
||||||
|
top = element.offset().top
|
||||||
|
bottom = top + element.innerHeight();
|
||||||
|
isVisible = (pageElement) ->
|
||||||
|
pageTop = pageElement.offset().top
|
||||||
|
pageBottom = pageTop + pageElement.innerHeight()
|
||||||
|
return pageTop < bottom and pageBottom > top
|
||||||
|
return (page for page in scope.pages when isVisible(page.element))
|
||||||
|
|
||||||
|
getExtraPages = (visiblePages) ->
|
||||||
|
extra = []
|
||||||
|
firstVisiblePage = visiblePages[0].pageNum
|
||||||
|
firstVisiblePageIdx = firstVisiblePage - 1
|
||||||
|
len = visiblePages.length
|
||||||
|
lastVisiblePage = visiblePages[len-1].pageNum
|
||||||
|
lastVisiblePageIdx = lastVisiblePage - 1
|
||||||
|
# first page after
|
||||||
|
if lastVisiblePageIdx + 1 < len
|
||||||
|
extra.push scope.pages[lastVisiblePageIdx + 1]
|
||||||
|
# page before
|
||||||
|
if firstVisiblePageIdx > 0
|
||||||
|
extra.push scope.pages[firstVisiblePageIdx - 1]
|
||||||
|
# second page after
|
||||||
|
if lastVisiblePageIdx + 2 < len
|
||||||
|
extra.push scope.pages[lastVisiblePageIdx + 2]
|
||||||
|
return visiblePages.concat extra
|
||||||
|
|
||||||
doRescale = (scale) ->
|
doRescale = (scale) ->
|
||||||
# console.log 'doRescale', scale
|
# console.log 'doRescale', scale
|
||||||
origposition = angular.copy scope.position
|
origposition = angular.copy scope.position
|
||||||
|
@ -307,14 +334,6 @@ define [
|
||||||
# trigger a redraw
|
# trigger a redraw
|
||||||
scope.scale = angular.copy (scope.scale)
|
scope.scale = angular.copy (scope.scale)
|
||||||
|
|
||||||
// shim layer with setTimeout fallback
|
|
||||||
requestAnimationFrame = do () ->
|
|
||||||
window.requestAnimationFrame ||
|
|
||||||
window.webkitRequestAnimationFrame ||
|
|
||||||
window.mozRequestAnimationFrame ||
|
|
||||||
(callback) -> window.setTimeout(callback, 1000 / 60)
|
|
||||||
|
|
||||||
rafActive = null
|
|
||||||
element.on 'scroll', () ->
|
element.on 'scroll', () ->
|
||||||
#console.log 'scroll event', element.scrollTop(), 'adjusting?', scope.adjustingScroll
|
#console.log 'scroll event', element.scrollTop(), 'adjusting?', scope.adjustingScroll
|
||||||
scope.scrollPosition = element.scrollTop()
|
scope.scrollPosition = element.scrollTop()
|
||||||
|
@ -323,41 +342,21 @@ define [
|
||||||
scope.$apply()
|
scope.$apply()
|
||||||
scope.adjustingScroll = false
|
scope.adjustingScroll = false
|
||||||
return
|
return
|
||||||
# scope.scrolled = true
|
scope.scrolled = true
|
||||||
# if scope.scrollHandlerTimeout
|
if scope.scrollHandlerTimeout
|
||||||
# $timeout.cancel(scope.scrollHandlerTimeout)
|
$timeout.cancel(scope.scrollHandlerTimeout)
|
||||||
# scope.scrollHandlerTimeout = $timeout scrollHandler, 100
|
scope.scrollHandlerTimeout = $timeout scrollHandler, 25
|
||||||
if not rafActive?
|
|
||||||
rafActive = requestAnimationFrame(scrollCheck)
|
|
||||||
|
|
||||||
prev = null
|
|
||||||
scope.scrollPosition = element.scrollTop()
|
|
||||||
scrollCheck = (timestamp) ->
|
|
||||||
prev = timestamp if not prev?
|
|
||||||
dt = timestamp - prev
|
|
||||||
if (dt > 100)
|
|
||||||
scope.lastScrollPosition = scope.scrollPosition if not scope.lastScrollPosition?
|
|
||||||
dy = scope.scrollPosition - scope.lastScrollPosition
|
|
||||||
scope.lastScrollPosition = scope.scrollPosition
|
|
||||||
console.log 'handle scroll dy', dy if dy != 0
|
|
||||||
scope.scrolled = true if dy != 0
|
|
||||||
if scope.scrolled && dy == 0
|
|
||||||
scrollHandler()
|
|
||||||
scope.scrolled = false
|
|
||||||
rafActive = null
|
|
||||||
return
|
|
||||||
requestAnimationFrame(scrollCheck)
|
|
||||||
|
|
||||||
requestAnimationFrame(scrollCheck)
|
|
||||||
|
|
||||||
scrollHandler = () ->
|
scrollHandler = () ->
|
||||||
updateContainer()
|
visiblePages = getVisiblePages()
|
||||||
|
pages = getExtraPages visiblePages
|
||||||
|
scope.document.renderPages(pages)
|
||||||
scope.$apply()
|
scope.$apply()
|
||||||
newPosition = ctrl.getPdfPosition()
|
newPosition = ctrl.getPdfPosition()
|
||||||
if newPosition?
|
if newPosition?
|
||||||
scope.position = newPosition
|
scope.position = newPosition
|
||||||
scope.$apply()
|
scope.$apply()
|
||||||
# scope.scrollHandlerTimeout = null
|
scope.scrollHandlerTimeout = null
|
||||||
|
|
||||||
scope.$watch 'pdfSrc', (newVal, oldVal) ->
|
scope.$watch 'pdfSrc', (newVal, oldVal) ->
|
||||||
# console.log 'loading pdf', newVal, oldVal
|
# console.log 'loading pdf', newVal, oldVal
|
||||||
|
|
Loading…
Reference in a new issue