From da412e92f8832d6397c0210fd91a0192857a0857 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 18 Dec 2015 11:54:10 +0100 Subject: [PATCH] :fire: Remove BlockDecorationsPresenter --- src/block-decorations-presenter.js | 107 ----------------------------- src/text-editor-presenter.coffee | 88 +++++++++++++++++------- 2 files changed, 65 insertions(+), 130 deletions(-) delete mode 100644 src/block-decorations-presenter.js diff --git a/src/block-decorations-presenter.js b/src/block-decorations-presenter.js deleted file mode 100644 index 870d49dcd..000000000 --- a/src/block-decorations-presenter.js +++ /dev/null @@ -1,107 +0,0 @@ -'use strict' - -const EventKit = require('event-kit') - -module.exports = -class BlockDecorationsPresenter { - constructor (model, lineTopIndex) { - this.model = model - this.disposables = new EventKit.CompositeDisposable() - this.emitter = new EventKit.Emitter() - this.lineTopIndex = lineTopIndex - this.observedDecorations = new Set() - this.measuredDecorations = new Set() - - this.observeModel() - } - - destroy () { - this.disposables.dispose() - } - - onDidUpdateState (callback) { - return this.emitter.on('did-update-state', callback) - } - - setLineHeight (lineHeight) { - this.lineTopIndex.setDefaultLineHeight(lineHeight) - } - - observeModel () { - this.disposables.add(this.model.onDidAddDecoration(this.didAddDecoration.bind(this))) - this.disposables.add(this.model.buffer.onDidChange((changeEvent) => { - let oldExtent = changeEvent.oldRange.getExtent() - let newExtent = changeEvent.newRange.getExtent() - this.lineTopIndex.splice(changeEvent.oldRange.start, oldExtent, newExtent) - })) - - for (let decoration of this.model.getDecorations({type: 'block'})) { - this.didAddDecoration(decoration) - } - } - - setDimensionsForDecoration (decoration, width, height) { - if (this.observedDecorations.has(decoration)) { - this.lineTopIndex.resizeBlock(decoration.getId(), height) - } else { - this.didAddDecoration(decoration) - this.lineTopIndex.resizeBlock(decoration.getId(), height) - } - - this.measuredDecorations.add(decoration) - this.emitter.emit('did-update-state') - } - - invalidateDimensionsForDecoration (decoration) { - this.measuredDecorations.delete(decoration) - this.emitter.emit('did-update-state') - } - - measurementsChanged () { - this.measuredDecorations.clear() - this.emitter.emit('did-update-state') - } - - didAddDecoration (decoration) { - if (!decoration.isType('block') || this.observedDecorations.has(decoration)) { - return - } - - let didMoveDisposable = decoration.getMarker().bufferMarker.onDidChange((markerEvent) => { - this.didMoveDecoration(decoration, markerEvent) - }) - - let didDestroyDisposable = decoration.onDidDestroy(() => { - this.disposables.remove(didMoveDisposable) - this.disposables.remove(didDestroyDisposable) - didMoveDisposable.dispose() - didDestroyDisposable.dispose() - this.didDestroyDecoration(decoration) - }) - - this.lineTopIndex.insertBlock(decoration.getId(), decoration.getMarker().getHeadBufferPosition(), true, 0) - - this.observedDecorations.add(decoration) - this.disposables.add(didMoveDisposable) - this.disposables.add(didDestroyDisposable) - this.emitter.emit('did-update-state') - } - - didMoveDecoration (decoration, markerEvent) { - if (markerEvent.textChanged) { - // No need to move blocks because of a text change, because we already splice on buffer change. - return - } - - this.lineTopIndex.moveBlock(decoration.getId(), decoration.getMarker().getHeadBufferPosition()) - this.emitter.emit('did-update-state') - } - - didDestroyDecoration (decoration) { - if (this.observedDecorations.has(decoration)) { - this.lineTopIndex.removeBlock(decoration.getId()) - this.observedDecorations.delete(decoration) - this.emitter.emit('did-update-state') - } - } -} diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 0b8bfbbc9..f7804f910 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -2,7 +2,6 @@ {Point, Range} = require 'text-buffer' _ = require 'underscore-plus' Decoration = require './decoration' -BlockDecorationsPresenter = require './block-decorations-presenter' module.exports = class TextEditorPresenter @@ -29,7 +28,8 @@ class TextEditorPresenter @lineDecorationsByScreenRow = {} @lineNumberDecorationsByScreenRow = {} @customGutterDecorationsByGutterName = {} - @blockDecorationsPresenter = new BlockDecorationsPresenter(@model, @lineTopIndex) + @observedBlockDecorations = new Set() + @measuredBlockDecorations = new Set() @screenRowsToMeasure = [] @transferMeasurementsToModel() @transferMeasurementsFromModel() @@ -46,7 +46,6 @@ class TextEditorPresenter getLinesYardstick: -> @linesYardstick destroy: -> - @blockDecorationsPresenter.destroy() @disposables.dispose() clearTimeout(@stoppedScrollingTimeoutId) if @stoppedScrollingTimeoutId? clearInterval(@reflowingInterval) if @reflowingInterval? @@ -138,20 +137,14 @@ class TextEditorPresenter @shouldUpdateDecorations = true @emitDidUpdateState() - @disposables.add @blockDecorationsPresenter.onDidUpdateState => - @shouldUpdateHeightState = true - @shouldUpdateVerticalScrollState = true - @shouldUpdateHorizontalScrollState = true - @shouldUpdateScrollbarsState = true - @shouldUpdateContentState = true - @shouldUpdateDecorations = true - @shouldUpdateCursorsState = true - @shouldUpdateLinesState = true - @shouldUpdateLineNumberGutterState = true - @shouldUpdateLineNumbersState = true - @shouldUpdateGutterOrderState = true - @shouldUpdateCustomGutterDecorationState = true - @emitDidUpdateState() + @disposables.add @model.onDidAddDecoration(@didAddBlockDecoration.bind(this)) + @disposables.add @model.buffer.onDidChange ({oldRange, newRange}) => + oldExtent = oldRange.getExtent() + newExtent = newRange.getExtent() + @lineTopIndex.splice(oldRange.start, oldExtent, newExtent) + + for decoration in @model.getDecorations({type: 'block'}) + this.didAddBlockDecoration(decoration) @disposables.add @model.onDidChangeGrammar(@didChangeGrammar.bind(this)) @disposables.add @model.onDidChangePlaceholderText(@emitDidUpdateState.bind(this)) @@ -995,7 +988,7 @@ class TextEditorPresenter @measurementsChanged() measurementsChanged: -> - @blockDecorationsPresenter.measurementsChanged() + @measuredBlockDecorations.clear() @shouldUpdateDecorations = true @emitDidUpdateState() @@ -1061,7 +1054,7 @@ class TextEditorPresenter updateBlockDecorationState: (decoration, screenRow) -> startRow = @getStartTileRow() endRow = @getEndTileRow() + @tileSize - hasntMeasuredDecoration = !@blockDecorationsPresenter.measuredDecorations.has(decoration) + hasntMeasuredDecoration = !@measuredBlockDecorations.has(decoration) isVisible = startRow <= screenRow < endRow || screenRow is @mouseWheelScreenRow if isVisible or hasntMeasuredDecoration @state.content.blockDecorations[decoration.id] = {decoration, screenRow, isVisible} @@ -1258,11 +1251,60 @@ class TextEditorPresenter @emitDidUpdateState() - setBlockDecorationDimensions: -> - @blockDecorationsPresenter.setDimensionsForDecoration(arguments...) + setBlockDecorationDimensions: (decoration, width, height) -> + @lineTopIndex.resizeBlock(decoration.getId(), height) - invalidateBlockDecorationDimensions: -> - @blockDecorationsPresenter.invalidateDimensionsForDecoration(arguments...) + @measuredBlockDecorations.add(decoration) + @shouldUpdateDecorations = true + @emitDidUpdateState() + + invalidateBlockDecorationDimensions: (decoration) -> + @measuredBlockDecorations.delete(decoration) + @shouldUpdateDecorations = true + @emitDidUpdateState() + + didAddBlockDecoration: (decoration) -> + return if not decoration.isType('block') or @observedBlockDecorations.has(decoration) + + didMoveDisposable = decoration.getMarker().bufferMarker.onDidChange (markerEvent) => + @didMoveBlockDecoration(decoration, markerEvent) + + didDestroyDisposable = decoration.onDidDestroy => + @disposables.remove(didMoveDisposable) + @disposables.remove(didDestroyDisposable) + didMoveDisposable.dispose() + didDestroyDisposable.dispose() + @didDestroyBlockDecoration(decoration) + + @lineTopIndex.insertBlock( + decoration.getId(), + decoration.getMarker().getHeadBufferPosition(), + true, + 0 + ) + + @observedBlockDecorations.add(decoration) + @disposables.add(didMoveDisposable) + @disposables.add(didDestroyDisposable) + @shouldUpdateDecorations = true + @emitDidUpdateState() + + didMoveBlockDecoration: (decoration, markerEvent) -> + # Don't move blocks after a text change, because we already splice on buffer + # change. + return if markerEvent.textChanged + + @lineTopIndex.moveBlock(decoration.getId(), decoration.getMarker().getHeadBufferPosition()) + @shouldUpdateDecorations = true + @emitDidUpdateState() + + didDestroyBlockDecoration: (decoration) -> + return unless @observedBlockDecorations.has(decoration) + + @lineTopIndex.removeBlock(decoration.getId()) + @observedBlockDecorations.delete(decoration) + @shouldUpdateDecorations = true + @emitDidUpdateState() observeCursor: (cursor) -> didChangePositionDisposable = cursor.onDidChangePosition =>