mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-08 17:19:48 +01:00
Coordinate writing to the textarea, do it after rendering the lines text
This commit is contained in:
@@ -312,8 +312,9 @@ export class KeyboardHandler extends ViewEventHandler implements IDisposable {
|
||||
return false;
|
||||
}
|
||||
|
||||
private _lastCursorSelectionChanged:editorCommon.IViewCursorSelectionChangedEvent = null;
|
||||
public onCursorSelectionChanged(e:editorCommon.IViewCursorSelectionChangedEvent): boolean {
|
||||
this.textAreaHandler.setCursorSelections(e.selection, e.secondarySelections);
|
||||
this._lastCursorSelectionChanged = e;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -328,4 +329,12 @@ export class KeyboardHandler extends ViewEventHandler implements IDisposable {
|
||||
return false;
|
||||
}
|
||||
|
||||
public writeToTextArea(): void {
|
||||
if (this._lastCursorSelectionChanged) {
|
||||
let e = this._lastCursorSelectionChanged;
|
||||
this._lastCursorSelectionChanged = null;
|
||||
this.textAreaHandler.setCursorSelections(e.selection, e.secondarySelections);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -889,6 +889,7 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp
|
||||
|
||||
if (!this.viewLines.shouldRender() && viewPartsToRender.length === 0) {
|
||||
// Nothing to render
|
||||
this.keyboardHandler.writeToTextArea();
|
||||
t.stop();
|
||||
return;
|
||||
}
|
||||
@@ -896,11 +897,15 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp
|
||||
let linesViewportData = this.layoutProvider.getLinesViewportData();
|
||||
|
||||
if (this.viewLines.shouldRender()) {
|
||||
this.viewLines.renderText(linesViewportData);
|
||||
this.viewLines.renderText(linesViewportData, () => {
|
||||
this.keyboardHandler.writeToTextArea();
|
||||
});
|
||||
this.viewLines.onDidRender();
|
||||
|
||||
// Rendering of viewLines might cause scroll events to occur, so collect view parts to render again
|
||||
viewPartsToRender = this._getViewPartsToRender();
|
||||
} else {
|
||||
this.keyboardHandler.writeToTextArea();
|
||||
}
|
||||
|
||||
let renderingContext = this.createRenderingContext(linesViewportData);
|
||||
|
||||
@@ -375,7 +375,7 @@ export class ViewLines extends ViewLayer {
|
||||
throw new Error('Not supported');
|
||||
}
|
||||
|
||||
public renderText(linesViewportData:editorCommon.ViewLinesViewportData): void {
|
||||
public renderText(linesViewportData:editorCommon.ViewLinesViewportData, onAfterLinesRendered:()=>void): void {
|
||||
if (!this.shouldRender()) {
|
||||
throw new Error('I did not ask to render!');
|
||||
}
|
||||
@@ -387,7 +387,10 @@ export class ViewLines extends ViewLayer {
|
||||
this.domNode.setWidth(this._layoutProvider.getScrollWidth());
|
||||
this.domNode.setHeight(Math.min(this._layoutProvider.getTotalHeight(), 1000000));
|
||||
|
||||
// (2) compute horizontal scroll position:
|
||||
// (2) execute DOM writing that forces sync layout (e.g. textArea manipulation)
|
||||
onAfterLinesRendered();
|
||||
|
||||
// (3) compute horizontal scroll position:
|
||||
// - this must happen after the lines are in the DOM since it might need a line that rendered just now
|
||||
// - it might change `scrollWidth` and `scrollLeft`
|
||||
if (this._lastCursorRevealRangeHorizontallyEvent) {
|
||||
@@ -410,6 +413,7 @@ export class ViewLines extends ViewLayer {
|
||||
this._layoutProvider.setScrollLeft(newScrollLeft.scrollLeft);
|
||||
}
|
||||
|
||||
// (4) handle scrolling
|
||||
let somethingChanged = false;
|
||||
if (browser.canUseTranslate3d) {
|
||||
var transform = 'translate3d(' + -this._layoutProvider.getScrollLeft() + 'px, ' + linesViewportData.visibleRangesDeltaTop + 'px, 0px)';
|
||||
@@ -418,6 +422,8 @@ export class ViewLines extends ViewLayer {
|
||||
somethingChanged = StyleMutator.setTop(<HTMLElement>this.domNode.domNode.parentNode, linesViewportData.visibleRangesDeltaTop) || somethingChanged; // TODO@Alex
|
||||
somethingChanged = StyleMutator.setLeft(<HTMLElement>this.domNode.domNode.parentNode, -this._layoutProvider.getScrollLeft()) || somethingChanged; // TODO@Alex
|
||||
}
|
||||
|
||||
// (5) reset cached client rect left if scrolling changed something
|
||||
if (somethingChanged) {
|
||||
this._lastRenderedData.resetDomNodeClientRectLeft();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user