Skip to content

Commit 5d7bb39

Browse files
committed
bof/eof/first/next -> Buffer
1 parent 7b0a54b commit 5d7bb39

File tree

1 file changed

+39
-85
lines changed

1 file changed

+39
-85
lines changed

src/ui-scroll.coffee

Lines changed: 39 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,18 @@ angular.module('ui.scroll', [])
110110
#clears the buffer
111111
buffer.clear = ->
112112
buffer.remove(0, buffer.length)
113+
buffer.eof = false
114+
buffer.bof = false
115+
buffer.first = 1
116+
buffer.next = 1
117+
118+
buffer.eof = false
119+
120+
buffer.bof = false
121+
122+
buffer.first = 1
123+
124+
buffer.next = 1
113125

114126
buffer
115127

@@ -129,7 +141,7 @@ angular.module('ui.scroll', [])
129141
result
130142

131143

132-
Viewport = (buffer, element, controllers) ->
144+
Viewport = (buffer, element, controllers, padding) ->
133145

134146
viewport = if controllers[0] and controllers[0].viewport then controllers[0].viewport else angular.element(window)
135147
viewport.css({'overflow-y': 'auto', 'display': 'block'})
@@ -138,6 +150,8 @@ angular.module('ui.scroll', [])
138150

139151
bottomPadding = null
140152

153+
bufferPadding = -> viewport.outerHeight() * Math.max(0.1, +padding || 0.1) # some extra space to initiate preload
154+
141155
viewport.createPaddingElements = (template) ->
142156

143157
topPadding = new Padding template
@@ -188,7 +202,7 @@ angular.module('ui.scroll', [])
188202
if overage > 0
189203
viewport.bottomPadding(viewport.bottomPadding() + bottomHeight)
190204
buffer.remove(buffer.length - overage, buffer.length)
191-
next -= overage
205+
buffer.next -= overage
192206

193207
viewport.shouldLoadTop = ->
194208
!buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding())
@@ -212,7 +226,7 @@ angular.module('ui.scroll', [])
212226
if overage > 0
213227
viewport.topPadding(viewport.topPadding() + topHeight)
214228
buffer.remove(0, overage)
215-
first += overage
229+
buffer.first += overage
216230

217231

218232

@@ -251,14 +265,10 @@ angular.module('ui.scroll', [])
251265
# initial settings
252266

253267
ridActual = 0 # current data revision id
254-
first = 1
255-
next = 1
256-
buffer = new Buffer(itemName, $scope, linker)
257268
pending = []
258-
eof = false
259-
bof = false
269+
buffer = new Buffer(itemName, $scope, linker)
260270

261-
viewport = new Viewport(buffer, element, controllers)
271+
viewport = new Viewport(buffer, element, controllers, $attr.padding)
262272

263273
# Padding element builder
264274
#
@@ -296,67 +306,11 @@ angular.module('ui.scroll', [])
296306

297307
reloadImpl = ->
298308
dismissPendingRequests()
299-
first = 1
300-
next = 1
301309
buffer.clear()
302310
viewport.topPadding(0)
303311
viewport.bottomPadding(0)
304-
eof = false
305-
bof = false
306312
adjustBuffer ridActual
307313

308-
shouldLoadBottom = ->
309-
!eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding()
310-
311-
clipBottom = ->
312-
# clip the invisible items off the bottom
313-
bottomHeight = 0
314-
overage = 0
315-
316-
for i in [buffer.length-1..0]
317-
item = buffer[i]
318-
itemTop = item.element.offset().top
319-
newRow = rowTop isnt itemTop
320-
rowTop = itemTop
321-
itemHeight = item.element.outerHeight(true) if newRow
322-
if (viewport.bottomDataPos() - bottomHeight - itemHeight > viewport.bottomVisiblePos() + bufferPadding())
323-
bottomHeight += itemHeight if newRow
324-
overage++
325-
eof = false
326-
else
327-
break if newRow
328-
overage++
329-
330-
if overage > 0
331-
viewport.bottomPadding(viewport.bottomPadding() + bottomHeight)
332-
buffer.remove(buffer.length - overage, buffer.length)
333-
next -= overage
334-
#log 'clipped off bottom ' + overage + ' bottom padding ' + viewport.bottomPadding()
335-
336-
shouldLoadTop = ->
337-
!bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding())
338-
339-
clipTop = ->
340-
# clip the invisible items off the top
341-
topHeight = 0
342-
overage = 0
343-
for item in buffer
344-
itemTop = item.element.offset().top
345-
newRow = rowTop isnt itemTop
346-
rowTop = itemTop
347-
itemHeight = item.element.outerHeight(true) if newRow
348-
if (viewport.topDataPos() + topHeight + itemHeight < viewport.topVisiblePos() - bufferPadding())
349-
topHeight += itemHeight if newRow
350-
overage++
351-
bof = false
352-
else
353-
break if newRow
354-
overage++
355-
if overage > 0
356-
viewport.topPadding(viewport.topPadding() + topHeight)
357-
buffer.remove(0, overage)
358-
first += overage
359-
360314
enqueueFetch = (rid, direction)->
361315
if !adapter.isLoading
362316
loading(true)
@@ -425,7 +379,7 @@ angular.module('ui.scroll', [])
425379
viewport.scrollTop(viewport.scrollTop() + heightIncrement)
426380

427381
# re-index the buffer
428-
item.scope.$index = first + i for item,i in buffer
382+
item.scope.$index = buffer.first + i for item,i in buffer
429383

430384
# schedule another adjustBuffer after animation completion
431385
if (promises.length)
@@ -455,10 +409,10 @@ angular.module('ui.scroll', [])
455409

456410
processBufferedItems(rid)
457411

458-
if shouldLoadBottom()
412+
if viewport.shouldLoadBottom()
459413
enqueueFetch(rid, true)
460414
else
461-
if shouldLoadTop()
415+
if viewport.shouldLoadTop()
462416
enqueueFetch(rid, false)
463417

464418
if pending.length == 0
@@ -471,11 +425,11 @@ angular.module('ui.scroll', [])
471425

472426
keepFetching = processBufferedItems(rid)
473427

474-
if shouldLoadBottom()
428+
if viewport.shouldLoadBottom()
475429
# keepFetching = true means that at least one item app/prepended in the last batch had height > 0
476430
enqueueFetch(rid, true) if keepFetching
477431
else
478-
if shouldLoadTop()
432+
if viewport.shouldLoadTop()
479433
# pending[0] = true means that previous fetch was appending. We need to force at least one prepend
480434
# BTW there will always be at least 1 element in the pending array because bottom is fetched first
481435
enqueueFetch(rid, false) if keepFetching || pending[0]
@@ -490,40 +444,40 @@ angular.module('ui.scroll', [])
490444
fetch = (rid) ->
491445
#log "Running fetch... #{{true:'bottom', false: 'top'}[direction]} pending #{pending.length}"
492446
if pending[0] # scrolling down
493-
if buffer.length && !shouldLoadBottom()
447+
if buffer.length && !viewport.shouldLoadBottom()
494448
adjustBufferAfterFetch rid
495449
else
496450
#log "appending... requested #{bufferSize} records starting from #{next}"
497-
datasource.get next, bufferSize,
451+
datasource.get buffer.next, bufferSize,
498452
(result) ->
499453
return if (rid and rid isnt ridActual) or $scope.$$destroyed
500454
if result.length < bufferSize
501-
eof = true
455+
buffer.eof = true
502456
viewport.bottomPadding(0)
503457
#log 'eof is reached'
504458
if result.length > 0
505-
clipTop()
459+
viewport.clipTop()
506460
for item in result
507-
++next
461+
++buffer.next
508462
buffer.insert 'append', item
509463
#log 'appended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next
510464
adjustBufferAfterFetch rid
511465
else
512-
if buffer.length && !shouldLoadTop()
466+
if buffer.length && !viewport.shouldLoadTop()
513467
adjustBufferAfterFetch rid
514468
else
515469
#log "prepending... requested #{size} records starting from #{start}"
516-
datasource.get first-bufferSize, bufferSize,
470+
datasource.get buffer.first-bufferSize, bufferSize,
517471
(result) ->
518472
return if (rid and rid isnt ridActual) or $scope.$$destroyed
519473
if result.length < bufferSize
520-
bof = true
474+
buffer.bof = true
521475
viewport.topPadding(0)
522476
#log 'bof is reached'
523477
if result.length > 0
524-
clipBottom() if buffer.length
478+
viewport.clipBottom() if buffer.length
525479
for i in [result.length-1..0]
526-
--first
480+
--buffer.first
527481
buffer.insert 'prepend', result[i]
528482
#log 'prepended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next
529483
adjustBufferAfterFetch rid
@@ -539,7 +493,7 @@ angular.module('ui.scroll', [])
539493
wheelHandler = (event) ->
540494
scrollTop = viewport[0].scrollTop
541495
yMax = viewport[0].scrollHeight - viewport[0].clientHeight
542-
if (scrollTop is 0 and not bof) or (scrollTop is yMax and not eof)
496+
if (scrollTop is 0 and not buffer.bof) or (scrollTop is yMax and not buffer.eof)
543497
event.preventDefault()
544498

545499
viewport.bind 'resize', resizeAndScrollHandler
@@ -585,23 +539,23 @@ angular.module('ui.scroll', [])
585539
else
586540
# arg1 is item index, arg2 is the newItems array
587541
if arg1%1 == 0 # checking if it is an integer
588-
if 0 <= arg1-first < buffer.length
589-
applyUpdate buffer[arg1 - first], arg2
542+
if 0 <= arg1-buffer.first < buffer.length
543+
applyUpdate buffer[arg1 - buffer.first], arg2
590544
else
591545
throw new Error 'applyUpdates - ' + arg1 + ' is not a valid index'
592546
adjustBuffer ridActual
593547

594548
adapter.append = (newItems) ->
595549
dismissPendingRequests()
596550
for item in newItems
597-
++next
551+
++buffer.next
598552
buffer.insert 'append', item
599553
adjustBuffer ridActual
600554

601555
adapter.prepend = (newItems) ->
602556
dismissPendingRequests()
603557
for item in newItems.reverse()
604-
--first
558+
--buffer.first
605559
buffer.insert 'prepend', item
606560
adjustBuffer ridActual
607561

0 commit comments

Comments
 (0)