提交 18c10b15 编写于 作者: N nrayburn

Replace timeout interval with MutationObserver for monaco editor AutoLayout

上级 7fab6bf6
......@@ -9,18 +9,18 @@ import { IDimension } from 'vs/editor/common/editorCommon';
export class ElementSizeObserver extends Disposable {
private readonly referenceDomElement: HTMLElement | null;
private measureReferenceDomElementToken: any;
private readonly changeCallback: () => void;
private width: number;
private height: number;
private resizeObserver: any;
constructor(referenceDomElement: HTMLElement | null, dimension: IDimension | undefined, changeCallback: () => void) {
super();
this.referenceDomElement = referenceDomElement;
this.changeCallback = changeCallback;
this.measureReferenceDomElementToken = -1;
this.width = -1;
this.height = -1;
this.resizeObserver = null;
this.measureReferenceDomElement(false, dimension);
}
......@@ -38,15 +38,23 @@ export class ElementSizeObserver extends Disposable {
}
public startObserving(): void {
if (this.measureReferenceDomElementToken === -1) {
this.measureReferenceDomElementToken = setInterval(() => this.measureReferenceDomElement(true), 100);
if (this.resizeObserver === null) {
this.resizeObserver = new MutationObserver(this.mutationObserve.bind(this));
this.resizeObserver.observe(this.referenceDomElement, {
attributes: true,
childList: true,
characterData: true,
subtree: true
});
window.addEventListener('resize', this.windowObserve.bind(this));
}
}
public stopObserving(): void {
if (this.measureReferenceDomElementToken !== -1) {
clearInterval(this.measureReferenceDomElementToken);
this.measureReferenceDomElementToken = -1;
if (this.resizeObserver !== null) {
this.resizeObserver.disconnect();
this.resizeObserver = null;
window.removeEventListener('resize', this.windowObserve.bind(this));
}
}
......@@ -54,6 +62,14 @@ export class ElementSizeObserver extends Disposable {
this.measureReferenceDomElement(true, dimension);
}
private mutationObserve(mutations: MutationRecord[], observer: MutationObserver): void {
this.measureReferenceDomElement(true);
}
private windowObserve(): void {
this.measureReferenceDomElement(true);
}
private measureReferenceDomElement(callChangeCallback: boolean, dimension?: IDimension): void {
let observedWidth = 0;
let observedHeight = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册