move pdf page visibility calculation up into pdfViewer directive

removes per-page watch for visibility
This commit is contained in:
Brian Gough 2015-01-19 16:55:44 +00:00
parent 2e021b64d8
commit 776535f9f3
3 changed files with 53 additions and 74 deletions

View file

@ -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

View file

@ -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 = {

View file

@ -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