diff --git a/spec/text-editor-component-spec.js b/spec/text-editor-component-spec.js index 67fb7c710..4ced8c912 100644 --- a/spec/text-editor-component-spec.js +++ b/spec/text-editor-component-spec.js @@ -972,7 +972,7 @@ describe('TextEditorComponent', function () { await nextViewUpdatePromise() expect(componentNode.querySelector('.gutter').style.display).toBe('none') - atom.config.set('editor.showLineNumbers', false) + editor.setShowLineNumbers(false) await nextViewUpdatePromise() expect(componentNode.querySelector('.gutter').style.display).toBe('none') @@ -980,7 +980,7 @@ describe('TextEditorComponent', function () { await nextViewUpdatePromise() expect(componentNode.querySelector('.gutter').style.display).toBe('none') - atom.config.set('editor.showLineNumbers', true) + editor.setShowLineNumbers(true) await nextViewUpdatePromise() expect(componentNode.querySelector('.gutter').style.display).toBe('') diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index eadc6122b..7bae23bb3 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -48,7 +48,6 @@ describe "TextEditorPresenter", -> }) _.defaults params, model: editor - config: atom.config contentFrameWidth: 500 lineTopIndex: lineTopIndex presenter = new TextEditorPresenter(params) @@ -636,26 +635,15 @@ describe "TextEditorPresenter", -> expect(getState(presenter).verticalScrollbar.scrollHeight).toBe 500 describe "scrollPastEnd", -> - it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> + it "adds the computed clientHeight to the computed scrollHeight if scrollPastEnd is enabled", -> presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getState(presenter).verticalScrollbar.scrollHeight).toBe presenter.contentHeight - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", true) + expectStateUpdate presenter, -> editor.setScrollPastEnd(true) expect(getState(presenter).verticalScrollbar.scrollHeight).toBe presenter.contentHeight + presenter.clientHeight - (presenter.lineHeight * 3) - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) - expect(getState(presenter).verticalScrollbar.scrollHeight).toBe presenter.contentHeight - - it "doesn't add the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true but the presenter is created with scrollPastEnd as false", -> - presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10, scrollPastEnd: false) - expectStateUpdate presenter, -> presenter.setScrollTop(300) - expect(getState(presenter).verticalScrollbar.scrollHeight).toBe presenter.contentHeight - - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", true) - expect(getState(presenter).verticalScrollbar.scrollHeight).toBe presenter.contentHeight - - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) + expectStateUpdate presenter, -> editor.setScrollPastEnd(false) expect(getState(presenter).verticalScrollbar.scrollHeight).toBe presenter.contentHeight describe ".scrollTop", -> @@ -689,16 +677,16 @@ describe "TextEditorPresenter", -> expectStateUpdate presenter, -> presenter.setScrollTop(-100) expect(getState(presenter).verticalScrollbar.scrollTop).toBe 0 - it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> + it "adds the computed clientHeight to the computed scrollHeight if scrollPastEnd is enabled", -> presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getState(presenter).verticalScrollbar.scrollTop).toBe presenter.contentHeight - presenter.clientHeight - atom.config.set("editor.scrollPastEnd", true) + editor.setScrollPastEnd(true) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getState(presenter).verticalScrollbar.scrollTop).toBe presenter.contentHeight - (presenter.lineHeight * 3) - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) + expectStateUpdate presenter, -> editor.setScrollPastEnd(false) expect(getState(presenter).verticalScrollbar.scrollTop).toBe presenter.contentHeight - presenter.clientHeight describe ".hiddenInput", -> @@ -828,15 +816,15 @@ describe "TextEditorPresenter", -> expectStateUpdate presenter, -> presenter.setExplicitHeight(500) expect(getState(presenter).content.scrollHeight).toBe 500 - it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> + it "adds the computed clientHeight to the computed scrollHeight if scrollPastEnd is enabled", -> presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getState(presenter).content.scrollHeight).toBe presenter.contentHeight - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", true) + expectStateUpdate presenter, -> editor.setScrollPastEnd(true) expect(getState(presenter).content.scrollHeight).toBe presenter.contentHeight + presenter.clientHeight - (presenter.lineHeight * 3) - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) + expectStateUpdate presenter, -> editor.setScrollPastEnd(false) expect(getState(presenter).content.scrollHeight).toBe presenter.contentHeight describe ".scrollWidth", -> @@ -1031,16 +1019,16 @@ describe "TextEditorPresenter", -> expectStateUpdate presenter, -> presenter.setScrollTop(-100) expect(getState(presenter).content.scrollTop).toBe 0 - it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> + it "adds the computed clientHeight to the computed scrollHeight if scrollPastEnd is enabled", -> presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getState(presenter).content.scrollTop).toBe presenter.contentHeight - presenter.clientHeight - atom.config.set("editor.scrollPastEnd", true) + editor.setScrollPastEnd(true) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getState(presenter).content.scrollTop).toBe presenter.contentHeight - (presenter.lineHeight * 3) - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) + expectStateUpdate presenter, -> editor.setScrollPastEnd(false) expect(getState(presenter).content.scrollTop).toBe presenter.contentHeight - presenter.clientHeight describe ".scrollLeft", -> @@ -2762,7 +2750,7 @@ describe "TextEditorPresenter", -> return description if gutter.name is 'line-number' describe ".visible", -> - it "is true iff the editor isn't mini, ::isLineNumberGutterVisible is true on the editor, and the 'editor.showLineNumbers' config is enabled", -> + it "is true iff the editor isn't mini and has ::isLineNumberGutterVisible and ::doesShowLineNumbers set to true", -> presenter = buildPresenter() expect(editor.isLineNumberGutterVisible()).toBe true @@ -2780,23 +2768,9 @@ describe "TextEditorPresenter", -> expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(true) expect(getLineNumberGutterState(presenter).visible).toBe true - expectStateUpdate presenter, -> atom.config.set('editor.showLineNumbers', false) + expectStateUpdate presenter, -> editor.setShowLineNumbers(false) expect(getLineNumberGutterState(presenter).visible).toBe false - it "gets updated when the editor's grammar changes", -> - presenter = buildPresenter() - - atom.config.set('editor.showLineNumbers', false, scopeSelector: '.source.js') - expect(getLineNumberGutterState(presenter).visible).toBe true - stateUpdated = false - presenter.onDidUpdateState -> stateUpdated = true - - waitsForPromise -> atom.packages.activatePackage('language-javascript') - - runs -> - expect(stateUpdated).toBe true - expect(getLineNumberGutterState(presenter).visible).toBe false - describe ".content.maxLineNumberDigits", -> it "is set to the number of digits used by the greatest line number", -> presenter = buildPresenter() @@ -3513,17 +3487,17 @@ describe "TextEditorPresenter", -> expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe 500 expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe 500 - it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> + it "adds the computed clientHeight to the computed scrollHeight if scrollPastEnd is enabled", -> presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe presenter.contentHeight expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe presenter.contentHeight - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", true) + expectStateUpdate presenter, -> editor.setScrollPastEnd(true) expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe presenter.contentHeight + presenter.clientHeight - (presenter.lineHeight * 3) expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe presenter.contentHeight + presenter.clientHeight - (presenter.lineHeight * 3) - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) + expectStateUpdate presenter, -> editor.setScrollPastEnd(false) expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe presenter.contentHeight expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe presenter.contentHeight @@ -3566,18 +3540,18 @@ describe "TextEditorPresenter", -> expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe 0 expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe 0 - it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> + it "adds the computed clientHeight to the computed scrollHeight if scrollPastEnd is enabled", -> presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.contentHeight - presenter.clientHeight expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.contentHeight - presenter.clientHeight - atom.config.set("editor.scrollPastEnd", true) + editor.setScrollPastEnd(true) expectStateUpdate presenter, -> presenter.setScrollTop(300) expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.contentHeight - (presenter.lineHeight * 3) expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.contentHeight - (presenter.lineHeight * 3) - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) + expectStateUpdate presenter, -> editor.setScrollPastEnd(false) expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.contentHeight - presenter.clientHeight expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.contentHeight - presenter.clientHeight diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 5ce25f81a..cb2d70a67 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -13,7 +13,8 @@ class TextEditorPresenter minimumReflowInterval: 200 constructor: (params) -> - {@model, @config, @lineTopIndex, scrollPastEnd} = params + {@model, @lineTopIndex} = params + @model.presenter = this {@cursorBlinkPeriod, @cursorBlinkResumeDelay, @stoppedScrollingDelay, @tileSize} = params {@contentFrameWidth} = params {@displayLayer} = @model @@ -37,15 +38,12 @@ class TextEditorPresenter @transferMeasurementsToModel() @transferMeasurementsFromModel() @observeModel() - @observeConfig() @buildState() @invalidateState() @startBlinkingCursors() if @focused @startReflowing() if @continuousReflow @updating = false - @scrollPastEndOverride = scrollPastEnd ? true - setLinesYardstick: (@linesYardstick) -> getLinesYardstick: -> @linesYardstick @@ -170,30 +168,14 @@ class TextEditorPresenter @disposables.add @model.onDidAddGutter(@didAddGutter.bind(this)) return - observeConfig: -> - configParams = {scope: @model.getRootScopeDescriptor()} + didChangeScrollPastEnd: -> + @updateScrollHeight() + @emitDidUpdateState() - @scrollPastEnd = @config.get('editor.scrollPastEnd', configParams) - @showLineNumbers = @config.get('editor.showLineNumbers', configParams) - - if @configDisposables? - @configDisposables?.dispose() - @disposables.remove(@configDisposables) - - @configDisposables = new CompositeDisposable - @disposables.add(@configDisposables) - - @configDisposables.add @config.onDidChange 'editor.scrollPastEnd', configParams, ({newValue}) => - @scrollPastEnd = newValue - @updateScrollHeight() - - @emitDidUpdateState() - @configDisposables.add @config.onDidChange 'editor.showLineNumbers', configParams, ({newValue}) => - @showLineNumbers = newValue - @emitDidUpdateState() + didChangeShowLineNumbers: -> + @emitDidUpdateState() didChangeGrammar: -> - @observeConfig() @emitDidUpdateState() buildState: -> @@ -594,7 +576,7 @@ class TextEditorPresenter gutterIsVisible: (gutterModel) -> isVisible = gutterModel.isVisible() if gutterModel.name is 'line-number' - isVisible = isVisible and @showLineNumbers + isVisible = isVisible and @model.doesShowLineNumbers() isVisible updateLineNumbersState: (tileState, screenRows) -> @@ -651,7 +633,7 @@ class TextEditorPresenter return unless @contentHeight? and @clientHeight? contentHeight = @contentHeight - if @scrollPastEnd and @scrollPastEndOverride + if @model.getScrollPastEnd() extraScrollHeight = @clientHeight - (@lineHeight * 3) contentHeight += extraScrollHeight if extraScrollHeight > 0 scrollHeight = Math.max(contentHeight, @height) diff --git a/src/text-editor.coffee b/src/text-editor.coffee index 1330fdf2e..dcd988a81 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -79,6 +79,7 @@ class TextEditor extends Model registered: false atomicSoftTabs: true invisibles: null + showLineNumbers: true Object.defineProperty @prototype, "element", get: -> @getElement() @@ -3351,10 +3352,20 @@ class TextEditor extends Model shouldAutoIndentOnPaste: -> @autoIndentOnPaste - setScrollPastEnd: (@scrollPastEnd) -> + setScrollPastEnd: (scrollPastEnd) -> + if scrollPastEnd isnt @scrollPastEnd + @scrollPastEnd = scrollPastEnd + @presenter?.didChangeScrollPastEnd() getScrollPastEnd: -> @scrollPastEnd + setShowLineNumbers: (showLineNumbers) -> + if showLineNumbers isnt @showLineNumbers + @showLineNumbers = showLineNumbers + @presenter?.didChangeShowLineNumbers() + + doesShowLineNumbers: -> @showLineNumbers + setUndoGroupingInterval: (@undoGroupingInterval) -> getUndoGroupingInterval: -> @undoGroupingInterval