neft
Version:
JavaScript. Everywhere.
106 lines (84 loc) • 3.07 kB
text/coffeescript
'use strict'
module.exports = (impl) ->
DATA =
contentItem: null
scrollElem: null
yScrollbar: false
DATA: DATA
createData: impl.utils.createDataCloner 'Item', DATA
create: (data) ->
self = @
impl.Types.Item.create.call @, data
scrollElem = data.scrollElem = document.createElement 'div'
scrollElem.style.overflow = 'hidden'
scrollElem.style.width = '100%'
scrollElem.style.height = '100%'
data.elem.appendChild scrollElem
->
scrollElem.scrollLeft = self._contentX
scrollElem.scrollTop = self._contentY
return
setContentX = (val) ->
max = self._impl.contentItem?._width - self._width or 0
if val > max
val = max
if val < 0
val = 0
oldVal = self.contentX
if val isnt oldVal
self._contentX = val
self.onContentXChange.emit oldVal
setContentY = (val) ->
max = self._impl.contentItem?._height - self._height or 0
if val > max
val = max
if val < 0
val = 0
oldVal = self.contentY
if val isnt oldVal
self._contentY = val
self.onContentYChange.emit oldVal
syncScroll = ->
setContentX
setContentY
return
# safari scroll event throttling fix
scrollElem.addEventListener impl.utils.pointerWheelEventName, (e) ->
if e.deltaX?
setContentX + e.deltaX
setContentY + e.deltaY
scrollElem.addEventListener 'scroll', syncScroll
return
setScrollableContentItem: do ->
onHeightChange = ->
data =
contentItem =
if contentItem._height <=
if data.yScrollbar
data.scrollElem.style.overflowY = 'hidden'
data.yScrollbar = false
else
if not data.yScrollbar
data.scrollElem.style.overflowY = 'scroll'
data.yScrollbar = true
return
(val) ->
if oldVal = .contentItem
if oldVal._impl.elem.parentElement is .scrollElem
.scrollElem.removeChild oldVal._impl.elem
oldVal.onHeightChange.disconnect onHeightChange, @
if val
val.onHeightChange onHeightChange, @
.contentItem = val
.scrollElem.appendChild val._impl.elem
return
setScrollableContentX: (val) ->
.scrollElem.scrollLeft = val
return
setScrollableContentY: (val) ->
.scrollElem.scrollTop = val
return
setScrollableSnap: (val) ->
return
setScrollableSnapItem: (val) ->
return