Skip to content

Commit 7b0a54b

Browse files
committed
clipTop/Bottom moved to the Viewport class
1 parent b1cae5e commit 7b0a54b

File tree

1 file changed

+55
-6
lines changed

1 file changed

+55
-6
lines changed

src/ui-scroll.coffee

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ angular.module('ui.scroll', [])
129129
result
130130

131131

132-
133-
Viewport = (element, controllers) ->
132+
Viewport = (buffer, element, controllers) ->
134133

135134
viewport = if controllers[0] and controllers[0].viewport then controllers[0].viewport else angular.element(window)
136135
viewport.css({'overflow-y': 'auto', 'display': 'block'})
@@ -164,6 +163,59 @@ angular.module('ui.scroll', [])
164163

165164
viewport.insertElementAnimated = (e, sibling) -> insertElementAnimated(e, sibling || topPadding)
166165

166+
viewport.shouldLoadBottom = ->
167+
!buffer.eof && viewport.bottomDataPos() < viewport.bottomVisiblePos() + bufferPadding()
168+
169+
viewport.clipBottom = ->
170+
# clip the invisible items off the bottom
171+
bottomHeight = 0
172+
overage = 0
173+
174+
for i in [buffer.length-1..0]
175+
item = buffer[i]
176+
itemTop = item.element.offset().top
177+
newRow = rowTop isnt itemTop
178+
rowTop = itemTop
179+
itemHeight = item.element.outerHeight(true) if newRow
180+
if (viewport.bottomDataPos() - bottomHeight - itemHeight > viewport.bottomVisiblePos() + bufferPadding())
181+
bottomHeight += itemHeight if newRow
182+
overage++
183+
buffer.eof = false
184+
else
185+
break if newRow
186+
overage++
187+
188+
if overage > 0
189+
viewport.bottomPadding(viewport.bottomPadding() + bottomHeight)
190+
buffer.remove(buffer.length - overage, buffer.length)
191+
next -= overage
192+
193+
viewport.shouldLoadTop = ->
194+
!buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding())
195+
196+
viewport.clipTop = ->
197+
# clip the invisible items off the top
198+
topHeight = 0
199+
overage = 0
200+
for item in buffer
201+
itemTop = item.element.offset().top
202+
newRow = rowTop isnt itemTop
203+
rowTop = itemTop
204+
itemHeight = item.element.outerHeight(true) if newRow
205+
if (viewport.topDataPos() + topHeight + itemHeight < viewport.topVisiblePos() - bufferPadding())
206+
topHeight += itemHeight if newRow
207+
overage++
208+
buffer.bof = false
209+
else
210+
break if newRow
211+
overage++
212+
if overage > 0
213+
viewport.topPadding(viewport.topPadding() + topHeight)
214+
buffer.remove(0, overage)
215+
first += overage
216+
217+
218+
167219
viewport
168220

169221

@@ -198,7 +250,6 @@ angular.module('ui.scroll', [])
198250

199251
# initial settings
200252

201-
builder = null
202253
ridActual = 0 # current data revision id
203254
first = 1
204255
next = 1
@@ -207,7 +258,7 @@ angular.module('ui.scroll', [])
207258
eof = false
208259
bof = false
209260

210-
viewport = new Viewport element, controllers
261+
viewport = new Viewport(buffer, element, controllers)
211262

212263
# Padding element builder
213264
#
@@ -225,8 +276,6 @@ angular.module('ui.scroll', [])
225276

226277
viewportScope = viewport.scope() || $rootScope
227278

228-
#v = new Viewport element, controllers
229-
230279
topVisible = (item) ->
231280
adapter.topVisible = item.scope[itemName]
232281
adapter.topVisibleElement = item.element

0 commit comments

Comments
 (0)