ReviewPanelController.coffee 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. define [
  2. "base",
  3. "utils/EventEmitter"
  4. ], (App, EventEmitter) ->
  5. App.controller "ReviewPanelController", ($scope, $element, ide) ->
  6. $scope.reviewPanel =
  7. entries: {}
  8. trackNewChanges: false
  9. $scope.commentState =
  10. adding: false
  11. content: ""
  12. scroller = $element.find(".review-panel-scroller")
  13. list = $element.find(".review-entry-list")
  14. # Use these to avoid unnecessary updates. Scrolling one
  15. # panel causes us to scroll the other panel, but there's no
  16. # need to trigger the event back to the original panel.
  17. ignoreNextPanelEvent = false
  18. ignoreNextAceEvent = false
  19. $scope.scrollEvents = new EventEmitter()
  20. scrollPanel = (scrollTop, height) ->
  21. if ignoreNextAceEvent
  22. ignoreNextAceEvent = false
  23. else
  24. ignoreNextPanelEvent = true
  25. list.height(height)
  26. scroller.scrollTop(scrollTop)
  27. scrollAce = (e) ->
  28. if ignoreNextPanelEvent
  29. ignoreNextPanelEvent = false
  30. else
  31. ignoreNextAceEvent = true
  32. $scope.scrollEvents.emit "scroll", e.target.scrollTop
  33. $scope.$watch "ui.reviewPanelOpen", (reviewPanelOpen) ->
  34. return if !reviewPanelOpen?
  35. setTimeout () ->
  36. $scope.$broadcast "reviewPanel:toggle"
  37. if reviewPanelOpen
  38. scroller.on "scroll", scrollAce
  39. $scope.onScroll = scrollPanel # Passed into the editor directive for it to call
  40. else
  41. scroller.off "scroll"
  42. $scope.onScroll = null
  43. # If we listen for scroll events in the review panel natively, then with a Mac trackpad
  44. # the scroll is very smooth (natively done I'd guess), but we don't get polled regularly
  45. # enough to keep Ace in step, and it noticeably lags. If instead, we borrow the manual
  46. # mousewheel/trackpad scrolling behaviour from Ace, and turn mousewheel events into
  47. # scroll events ourselves, then it makes the review panel slightly less smooth (barely)
  48. # noticeable, but keeps it perfectly in step with Ace.
  49. ace.require("ace/lib/event").addMouseWheelListener scroller[0], (e) ->
  50. deltaY = e.wheelY
  51. # console.log "mousewheel", deltaY
  52. scroller.scrollTop(scroller.scrollTop() + deltaY * 4)
  53. e.preventDefault()
  54. $scope.startNewComment = () ->
  55. $scope.commentState.adding = true
  56. $scope.$broadcast "comment:select_line"
  57. $scope.submitNewComment = () ->
  58. $scope.commentState.adding = false
  59. $scope.$broadcast "comment:add", $scope.commentState.content
  60. $scope.commentState.content = ""
  61. $scope.startReply = (entry) ->
  62. console.log "Start new reply"
  63. entry.replying = true
  64. $scope.submitReply = (entry) ->
  65. entry.thread.push {
  66. content: entry.replyContent
  67. ts: new Date()
  68. user_id: window.user_id
  69. }
  70. entry.replyContent = ""
  71. entry.replying = false