From 3bca09bf272ee9d77da972cd85a2615063e0ae09 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 20 Apr 2017 19:47:03 +0200 Subject: [PATCH] Schedule update when setting scroll top row or scroll left column --- spec/text-editor-component-spec.js | 16 ++++++++++++++-- src/text-editor-component.js | 24 ++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/spec/text-editor-component-spec.js b/spec/text-editor-component-spec.js index bf9c20c6e..2d5c88edc 100644 --- a/spec/text-editor-component-spec.js +++ b/spec/text-editor-component-spec.js @@ -2837,28 +2837,40 @@ describe('TextEditorComponent', () => { await component.getNextUpdatePromise() expect(component.getMaxScrollTop() / component.getLineHeight()).toBe(9) + expect(component.refs.verticalScrollbar.element.scrollTop).toBe(0 * component.getLineHeight()) editor.setFirstVisibleScreenRow(1) expect(component.getFirstVisibleRow()).toBe(1) + await component.getNextUpdatePromise() + expect(component.refs.verticalScrollbar.element.scrollTop).toBe(1 * component.getLineHeight()) editor.setFirstVisibleScreenRow(5) expect(component.getFirstVisibleRow()).toBe(5) + await component.getNextUpdatePromise() + expect(component.refs.verticalScrollbar.element.scrollTop).toBe(5 * component.getLineHeight()) editor.setFirstVisibleScreenRow(11) expect(component.getFirstVisibleRow()).toBe(9) + await component.getNextUpdatePromise() + expect(component.refs.verticalScrollbar.element.scrollTop).toBe(9 * component.getLineHeight()) }) it('delegates setFirstVisibleScreenColumn and getFirstVisibleScreenColumn to the component', async () => { const {component, element, editor} = buildComponent({rowsPerTile: 3, autoHeight: false}) element.style.width = 30 * component.getBaseCharacterWidth() + 'px' await component.getNextUpdatePromise() - expect(editor.getFirstVisibleScreenColumn()).toBe(0) - component.setScrollLeft(5.5 * component.getBaseCharacterWidth()) + expect(component.refs.horizontalScrollbar.element.scrollLeft).toBe(0 * component.getBaseCharacterWidth()) + + setScrollLeft(component, 5.5 * component.getBaseCharacterWidth()) expect(editor.getFirstVisibleScreenColumn()).toBe(5) + await component.getNextUpdatePromise() + expect(component.refs.horizontalScrollbar.element.scrollLeft).toBe(Math.round(5.5 * component.getBaseCharacterWidth())) editor.setFirstVisibleScreenColumn(12) expect(component.getScrollLeft()).toBe(Math.round(12 * component.getBaseCharacterWidth())) + await component.getNextUpdatePromise() + expect(component.refs.horizontalScrollbar.element.scrollLeft).toBe(Math.round(12 * component.getBaseCharacterWidth())) }) }) }) diff --git a/src/text-editor-component.js b/src/text-editor-component.js index 0990d4c20..88b52ddcc 100644 --- a/src/text-editor-component.js +++ b/src/text-editor-component.js @@ -1728,13 +1728,13 @@ class TextEditorComponent { flushPendingLogicalScrollPosition () { let changedScrollTop = false if (this.pendingScrollTopRow > 0) { - changedScrollTop = this.setScrollTopRow(this.pendingScrollTopRow) + changedScrollTop = this.setScrollTopRow(this.pendingScrollTopRow, false) this.pendingScrollTopRow = null } let changedScrollLeft = false if (this.pendingScrollLeftColumn > 0) { - changedScrollLeft = this.setScrollLeftColumn(this.pendingScrollLeftColumn) + changedScrollLeft = this.setScrollLeftColumn(this.pendingScrollLeftColumn, false) this.pendingScrollLeftColumn = null } @@ -2466,13 +2466,17 @@ class TextEditorComponent { return this.setScrollLeft(scrollRight - this.getScrollContainerClientWidth()) } - setScrollTopRow (scrollTopRow) { + setScrollTopRow (scrollTopRow, scheduleUpdate = true) { if (this.measurements) { - return this.setScrollTop(this.pixelPositionBeforeBlocksForRow(scrollTopRow)) + const didScroll = this.setScrollTop(this.pixelPositionBeforeBlocksForRow(scrollTopRow)) + if (didScroll && scheduleUpdate) { + this.scheduleUpdate() + } + return didScroll } else { this.pendingScrollTopRow = scrollTopRow + return false } - return false } getScrollTopRow () { @@ -2483,13 +2487,17 @@ class TextEditorComponent { } } - setScrollLeftColumn (scrollLeftColumn) { + setScrollLeftColumn (scrollLeftColumn, scheduleUpdate = true) { if (this.measurements && this.getLongestLineWidth() != null) { - return this.setScrollLeft(scrollLeftColumn * this.getBaseCharacterWidth()) + const didScroll = this.setScrollLeft(scrollLeftColumn * this.getBaseCharacterWidth()) + if (didScroll && scheduleUpdate) { + this.scheduleUpdate() + } + return didScroll } else { this.pendingScrollLeftColumn = scrollLeftColumn + return false } - return false } getScrollLeftColumn () {