resizer.coffee 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. class app.views.Resizer extends app.View
  2. @className: '_resizer'
  3. @events:
  4. dragstart: 'onDragStart'
  5. dragend: 'onDragEnd'
  6. @isSupported: ->
  7. 'ondragstart' of document.createElement('div') and !app.isMobile()
  8. init: ->
  9. @el.setAttribute('draggable', 'true')
  10. @appendTo $('._app')
  11. @style = $('style[data-resizer]')
  12. @size = @style.getAttribute('data-size')
  13. return
  14. MIN = 260
  15. MAX = 600
  16. resize: (value, save) ->
  17. value -= app.el.offsetLeft
  18. return unless value > 0
  19. value = Math.min(Math.max(Math.round(value), MIN), MAX)
  20. newSize = "#{value}px"
  21. @style.innerHTML = @style.innerHTML.replace(new RegExp(@size, 'g'), newSize)
  22. @size = newSize
  23. if save
  24. app.settings.setSize(value)
  25. app.appCache?.updateInBackground()
  26. return
  27. onDragStart: (event) =>
  28. @style.removeAttribute('disabled')
  29. event.dataTransfer.effectAllowed = 'link'
  30. event.dataTransfer.setData('Text', '')
  31. $.on(window, 'dragover', @onDrag)
  32. return
  33. onDrag: (event) =>
  34. value = event.pageX
  35. return unless value > 0
  36. @lastDragValue = value
  37. return if @lastDrag and @lastDrag > Date.now() - 50
  38. @lastDrag = Date.now()
  39. @resize(value, false)
  40. return
  41. onDragEnd: (event) =>
  42. $.off(window, 'dragover', @onDrag)
  43. value = event.pageX or (event.screenX - window.screenX)
  44. if @lastDragValue and not (@lastDragValue - 5 < value < @lastDragValue + 5) # https://github.com/freeCodeCamp/devdocs/issues/265
  45. value = @lastDragValue
  46. @resize(value, true)
  47. return