resizer.coffee 1.6 KB

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