Просмотр исходного кода

Merge pull request #434 from sharelatex/ja-scroll-review-panel-past-ace

Ja scroll review panel past ace
James Allen 9 лет назад
Родитель
Сommit
5a62fec179

+ 1 - 0
services/web/app/views/project/editor/review-panel.pug

@@ -47,6 +47,7 @@
 		.rp-entry-list-inner
 		.rp-entry-list-inner
 			.rp-entry-wrapper(
 			.rp-entry-wrapper(
 				ng-repeat="(entry_id, entry) in reviewPanel.entries[editor.open_doc_id]"
 				ng-repeat="(entry_id, entry) in reviewPanel.entries[editor.open_doc_id]"
+				ng-if="entry.visible"
 			)
 			)
 				div(ng-if="entry.type === 'insert' || entry.type === 'delete'")
 				div(ng-if="entry.type === 'insert' || entry.type === 'delete'")
 					change-entry(
 					change-entry(

+ 30 - 2
services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee

@@ -60,6 +60,18 @@ define [
 			onChangeSession = (e) =>
 			onChangeSession = (e) =>
 				@clearAnnotations()
 				@clearAnnotations()
 				@redrawAnnotations()
 				@redrawAnnotations()
+				@editor.session.on "changeScrollTop", onChangeScroll
+
+			_scrollTimeout = null
+			onChangeScroll = () =>
+				if _scrollTimeout?
+					return
+				else
+					_scrollTimeout = setTimeout () =>
+						@recalculateVisibleEntries()
+						@$scope.$apply()
+						_scrollTimeout = null
+					, 200
 
 
 			bindToAce = () =>
 			bindToAce = () =>
 				@editor.on "changeSelection", onChangeSelection
 				@editor.on "changeSelection", onChangeSelection
@@ -282,6 +294,7 @@ define [
 		recalculateReviewEntriesScreenPositions: () ->
 		recalculateReviewEntriesScreenPositions: () ->
 			session = @editor.getSession()
 			session = @editor.getSession()
 			renderer = @editor.renderer
 			renderer = @editor.renderer
+			{firstRow, lastRow} = renderer.layerConfig
 			entries = @_getCurrentDocEntries()
 			entries = @_getCurrentDocEntries()
 			for entry_id, entry of entries or {}
 			for entry_id, entry of entries or {}
 				doc_position = @_shareJsOffsetToAcePosition(entry.offset)
 				doc_position = @_shareJsOffsetToAcePosition(entry.offset)
@@ -290,9 +303,24 @@ define [
 				entry.screenPos ?= {}
 				entry.screenPos ?= {}
 				entry.screenPos.y = y
 				entry.screenPos.y = y
 				entry.docPos = doc_position
 				entry.docPos = doc_position
-
+			@recalculateVisibleEntries()
 			@$scope.$apply()
 			@$scope.$apply()
-	
+
+		recalculateVisibleEntries: () ->
+			OFFSCREEN_ROWS = 20
+			CULL_AFTER = 100 # With less than this number of entries, don't bother culling to avoid little UI jumps when scrolling.
+			{firstRow, lastRow} = @editor.renderer.layerConfig
+			entries = @_getCurrentDocEntries() or {}
+			entriesLength = Object.keys(entries).length
+			changed = false
+			for entry_id, entry of entries
+				old = entry.visible
+				entry.visible = (entriesLength < CULL_AFTER) or (firstRow - OFFSCREEN_ROWS <= entry.docPos.row <= lastRow + OFFSCREEN_ROWS)
+				if (entry.visible != old)
+					changed = true
+			if changed
+				@$scope.$emit "editor:track-changes:visibility_changed"
+
 		_getCurrentDocEntries: () ->
 		_getCurrentDocEntries: () ->
 			doc_id = @$scope.docId
 			doc_id = @$scope.docId
 			entries = @$scope.reviewPanel.entries[doc_id] ?= {}
 			entries = @$scope.reviewPanel.entries[doc_id] ?= {}

+ 5 - 1
services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee

@@ -266,7 +266,11 @@ define [
 			updateEntries(doc_id)
 			updateEntries(doc_id)
 			$scope.$broadcast "review-panel:recalculate-screen-positions"
 			$scope.$broadcast "review-panel:recalculate-screen-positions"
 			$scope.$broadcast "review-panel:layout"
 			$scope.$broadcast "review-panel:layout"
-		
+
+		$scope.$on "editor:track-changes:visibility_changed", () ->
+			$timeout () ->
+				$scope.$broadcast "review-panel:layout", false
+
 		$scope.$on "editor:focus:changed", (e, selection_offset_start, selection_offset_end, selection) ->
 		$scope.$on "editor:focus:changed", (e, selection_offset_start, selection_offset_end, selection) ->
 			doc_id = $scope.editor.open_doc_id
 			doc_id = $scope.editor.open_doc_id
 			entries = getDocEntries(doc_id)
 			entries = getDocEntries(doc_id)