From eca106fc4897460eda0c448a2a4ad0e68e2b8970 Mon Sep 17 00:00:00 2001 From: Michael Feingold Date: Fri, 14 Aug 2015 11:16:08 -0500 Subject: [PATCH 1/2] clipTop/clipBottom math reworked to support inline --- src/ui-scroll.coffee | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/ui-scroll.coffee b/src/ui-scroll.coffee index 09dc9a25..5a064a94 100644 --- a/src/ui-scroll.coffee +++ b/src/ui-scroll.coffee @@ -208,53 +208,45 @@ angular.module('ui.scroll', []) clipBottom = -> # clip the invisible items off the bottom - bottomHeight = 0 #builder.bottomPadding() overage = 0 - for i in [buffer.length-1..0] item = buffer[i] itemTop = item.element.offset().top - newRow = rowTop isnt itemTop - rowTop = itemTop - itemHeight = item.element.outerHeight(true) if newRow - if (builder.bottomDataPos() - bottomHeight - itemHeight > bottomVisiblePos() + bufferPadding()) - bottomHeight += itemHeight if newRow + itemBottom = itemTop + item.element.outerHeight(true) + lastItemBottom = itemBottom unless lastItemBottom + if (itemTop > bottomVisiblePos() + bufferPadding()) overage++ eof = false else - break if newRow - overage++ + paddingIncrement = itemBottom - lastItemBottom + break if overage > 0 - builder.bottomPadding(builder.bottomPadding() + bottomHeight) + builder.bottomPadding(builder.bottomPadding() + paddingIncrement) removeFromBuffer(buffer.length - overage, buffer.length) next -= overage - #log 'clipped off bottom ' + overage + ' bottom padding ' + builder.bottomPadding() + log 'clipped off bottom ' + overage + ' bottom padding ' + builder.bottomPadding() shouldLoadTop = -> !bof && (builder.topDataPos() > topVisiblePos() - bufferPadding()) clipTop = -> # clip the invisible items off the top - topHeight = 0 overage = 0 for item in buffer itemTop = item.element.offset().top - newRow = rowTop isnt itemTop - rowTop = itemTop - itemHeight = item.element.outerHeight(true) if newRow - if (builder.topDataPos() + topHeight + itemHeight < topVisiblePos() - bufferPadding()) - topHeight += itemHeight if newRow + itemHeight = item.element.outerHeight(true) + if (itemTop + itemHeight < topVisiblePos() - bufferPadding()) overage++ bof = false else - break if newRow - overage++ + paddingIncrement = itemTop - buffer[0].element.offset().top + break if overage > 0 - builder.topPadding(builder.topPadding() + topHeight) + builder.topPadding(builder.topPadding() + paddingIncrement) removeFromBuffer(0, overage) first += overage - #log 'clipped off top ' + overage + ' top padding ' + builder.topPadding() + log 'clipped off top ' + overage + ' top padding ' + builder.topPadding() enqueueFetch = (rid, direction)-> if (!adapter.isLoading) @@ -383,7 +375,7 @@ angular.module('ui.scroll', []) for item in result ++next insertItem 'append', item - #log 'appended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next + log 'appended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next finalize rid else if buffer.length && !shouldLoadTop() @@ -402,7 +394,7 @@ angular.module('ui.scroll', []) for i in [result.length-1..0] --first insertItem 'prepend', result[i] - #log 'prepended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next + log 'prepended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next finalize rid From f2c39fd9d381f06088da205c4ee3ff13d1f9b79b Mon Sep 17 00:00:00 2001 From: Michael Feingold Date: Fri, 14 Aug 2015 17:11:07 -0500 Subject: [PATCH 2/2] clipTop padding increment calculation --- src/ui-scroll.coffee | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ui-scroll.coffee b/src/ui-scroll.coffee index 5a064a94..71000768 100644 --- a/src/ui-scroll.coffee +++ b/src/ui-scroll.coffee @@ -212,15 +212,14 @@ angular.module('ui.scroll', []) for i in [buffer.length-1..0] item = buffer[i] itemTop = item.element.offset().top - itemBottom = itemTop + item.element.outerHeight(true) + itemBottom = itemTop + item.element.outerHeight(true) lastItemBottom = itemBottom unless lastItemBottom if (itemTop > bottomVisiblePos() + bufferPadding()) overage++ eof = false else - paddingIncrement = itemBottom - lastItemBottom + paddingIncrement = lastItemBottom - itemBottom break - if overage > 0 builder.bottomPadding(builder.bottomPadding() + paddingIncrement) removeFromBuffer(buffer.length - overage, buffer.length) @@ -305,6 +304,7 @@ angular.module('ui.scroll', []) # for anything other than prepend adjust the bottomPadding height builder.bottomPadding(Math.max(0,builder.bottomPadding() - (builder.bottomDataPos() - bottomPos))) + log "new bottomPadding #{builder.bottomPadding()}" if (builder.bottomDataPos() - bottomPos) if toBePrepended.length bottomPos = builder.bottomDataPos() @@ -318,7 +318,8 @@ angular.module('ui.scroll', []) builder.topPadding(builder.topPadding() - heightIncrement) else # if not, increment scrollTop - viewport.scrollTop(viewport.scrollTop() + heightIncrement) + viewport.scrollTop(viewport.scrollTop() + heightIncrement - builder.topPadding()) + builder.topPadding(0) # re-index the buffer item.scope.$index = first + i for item,i in buffer