Skip to content

Commit 95cc4e3

Browse files
committed
Have the IModelDecorationsChangedEvent contain affectsMinimap and affectsOverviewRuler to avoid repainting if not necessary
1 parent 6598166 commit 95cc4e3

7 files changed

Lines changed: 59 additions & 17 deletions

File tree

src/vs/editor/browser/viewParts/minimap/minimap.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,10 @@ export class Minimap extends ViewPart implements IMinimapModel {
781781
return this._actual.onSelectionChanged();
782782
}
783783
public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean {
784-
return this._actual.onDecorationsChanged();
784+
if (e.affectsMinimap) {
785+
return this._actual.onDecorationsChanged();
786+
}
787+
return false;
785788
}
786789
public onFlushed(e: viewEvents.ViewFlushedEvent): boolean {
787790
return this._actual.onFlushed();

src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,10 @@ export class DecorationsOverviewRuler extends ViewPart {
276276
return true;
277277
}
278278
public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean {
279-
return true;
279+
if (e.affectsOverviewRuler) {
280+
return true;
281+
}
282+
return false;
280283
}
281284
public onFlushed(e: viewEvents.ViewFlushedEvent): boolean {
282285
return true;

src/vs/editor/common/model/textModel.ts

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,27 +1423,22 @@ export class TextModel extends Disposable implements model.ITextModel {
14231423
private _changeDecorations<T>(ownerId: number, callback: (changeAccessor: model.IModelDecorationsChangeAccessor) => T): T | null {
14241424
let changeAccessor: model.IModelDecorationsChangeAccessor = {
14251425
addDecoration: (range: IRange, options: model.IModelDecorationOptions): string => {
1426-
this._onDidChangeDecorations.fire();
14271426
return this._deltaDecorationsImpl(ownerId, [], [{ range: range, options: options }])[0];
14281427
},
14291428
changeDecoration: (id: string, newRange: IRange): void => {
1430-
this._onDidChangeDecorations.fire();
14311429
this._changeDecorationImpl(id, newRange);
14321430
},
14331431
changeDecorationOptions: (id: string, options: model.IModelDecorationOptions) => {
1434-
this._onDidChangeDecorations.fire();
14351432
this._changeDecorationOptionsImpl(id, _normalizeOptions(options));
14361433
},
14371434
removeDecoration: (id: string): void => {
1438-
this._onDidChangeDecorations.fire();
14391435
this._deltaDecorationsImpl(ownerId, [id], []);
14401436
},
14411437
deltaDecorations: (oldDecorations: string[], newDecorations: model.IModelDeltaDecoration[]): string[] => {
14421438
if (oldDecorations.length === 0 && newDecorations.length === 0) {
14431439
// nothing to do
14441440
return [];
14451441
}
1446-
this._onDidChangeDecorations.fire();
14471442
return this._deltaDecorationsImpl(ownerId, oldDecorations, newDecorations);
14481443
}
14491444
};
@@ -1474,7 +1469,6 @@ export class TextModel extends Disposable implements model.ITextModel {
14741469

14751470
try {
14761471
this._onDidChangeDecorations.beginDeferredEmit();
1477-
this._onDidChangeDecorations.fire();
14781472
return this._deltaDecorationsImpl(ownerId, oldDecorations, newDecorations);
14791473
} finally {
14801474
this._onDidChangeDecorations.endDeferredEmit();
@@ -1622,6 +1616,7 @@ export class TextModel extends Disposable implements model.ITextModel {
16221616
this._decorationsTree.delete(node);
16231617
node.reset(this.getVersionId(), startOffset, endOffset, range);
16241618
this._decorationsTree.insert(node);
1619+
this._onDidChangeDecorations.checkAffectedAndFire(node.options);
16251620
}
16261621

16271622
private _changeDecorationOptionsImpl(decorationId: string, options: ModelDecorationOptions): void {
@@ -1633,6 +1628,9 @@ export class TextModel extends Disposable implements model.ITextModel {
16331628
const nodeWasInOverviewRuler = (node.options.overviewRuler && node.options.overviewRuler.color ? true : false);
16341629
const nodeIsInOverviewRuler = (options.overviewRuler && options.overviewRuler.color ? true : false);
16351630

1631+
this._onDidChangeDecorations.checkAffectedAndFire(node.options);
1632+
this._onDidChangeDecorations.checkAffectedAndFire(options);
1633+
16361634
if (nodeWasInOverviewRuler !== nodeIsInOverviewRuler) {
16371635
// Delete + Insert due to an overview ruler status change
16381636
this._decorationsTree.delete(node);
@@ -1666,6 +1664,7 @@ export class TextModel extends Disposable implements model.ITextModel {
16661664
// (2) remove the node from the tree (if it exists)
16671665
if (node) {
16681666
this._decorationsTree.delete(node);
1667+
this._onDidChangeDecorations.checkAffectedAndFire(node.options);
16691668
}
16701669
}
16711670

@@ -1688,6 +1687,7 @@ export class TextModel extends Disposable implements model.ITextModel {
16881687
node.ownerId = ownerId;
16891688
node.reset(versionId, startOffset, endOffset, range);
16901689
node.setOptions(options);
1690+
this._onDidChangeDecorations.checkAffectedAndFire(options);
16911691

16921692
this._decorationsTree.insert(node);
16931693

@@ -3101,11 +3101,15 @@ export class DidChangeDecorationsEmitter extends Disposable {
31013101

31023102
private _deferredCnt: number;
31033103
private _shouldFire: boolean;
3104+
private _affectsMinimap: boolean;
3105+
private _affectsOverviewRuler: boolean;
31043106

31053107
constructor() {
31063108
super();
31073109
this._deferredCnt = 0;
31083110
this._shouldFire = false;
3111+
this._affectsMinimap = false;
3112+
this._affectsOverviewRuler = false;
31093113
}
31103114

31113115
public beginDeferredEmit(): void {
@@ -3116,13 +3120,31 @@ export class DidChangeDecorationsEmitter extends Disposable {
31163120
this._deferredCnt--;
31173121
if (this._deferredCnt === 0) {
31183122
if (this._shouldFire) {
3123+
const event: IModelDecorationsChangedEvent = {
3124+
affectsMinimap: this._affectsMinimap,
3125+
affectsOverviewRuler: this._affectsOverviewRuler,
3126+
};
31193127
this._shouldFire = false;
3120-
this._actual.fire({});
3128+
this._affectsMinimap = false;
3129+
this._affectsOverviewRuler = false;
3130+
this._actual.fire(event);
31213131
}
31223132
}
31233133
}
31243134

3135+
public checkAffectedAndFire(options: ModelDecorationOptions): void {
3136+
if (!this._affectsMinimap) {
3137+
this._affectsMinimap = options.minimap && options.minimap.position ? true : false;
3138+
}
3139+
if (!this._affectsOverviewRuler) {
3140+
this._affectsOverviewRuler = options.overviewRuler && options.overviewRuler.color ? true : false;
3141+
}
3142+
this._shouldFire = true;
3143+
}
3144+
31253145
public fire(): void {
3146+
this._affectsMinimap = true;
3147+
this._affectsOverviewRuler = true;
31263148
this._shouldFire = true;
31273149
}
31283150
}

src/vs/editor/common/model/textModelEvents.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ export interface IModelContentChangedEvent {
7676
* An event describing that model decorations have changed.
7777
*/
7878
export interface IModelDecorationsChangedEvent {
79+
readonly affectsMinimap: boolean;
80+
readonly affectsOverviewRuler: boolean;
7981
}
8082

8183
/**

src/vs/editor/common/view/viewEvents.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config
1010
import { Range } from 'vs/editor/common/core/range';
1111
import { Selection } from 'vs/editor/common/core/selection';
1212
import { ScrollType, IContentSizeChangedEvent } from 'vs/editor/common/editorCommon';
13+
import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents';
1314

1415
export const enum ViewEventType {
1516
ViewConfigurationChanged = 1,
@@ -82,8 +83,17 @@ export class ViewDecorationsChangedEvent {
8283

8384
public readonly type = ViewEventType.ViewDecorationsChanged;
8485

85-
constructor() {
86-
// Nothing to do
86+
readonly affectsMinimap: boolean;
87+
readonly affectsOverviewRuler: boolean;
88+
89+
constructor(source: IModelDecorationsChangedEvent | null) {
90+
if (source) {
91+
this.affectsMinimap = source.affectsMinimap;
92+
this.affectsOverviewRuler = source.affectsOverviewRuler;
93+
} else {
94+
this.affectsMinimap = true;
95+
this.affectsOverviewRuler = true;
96+
}
8797
}
8898
}
8999

src/vs/editor/common/viewModel/viewModelImpl.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
172172
if (this.lines.setWrappingSettings(fontInfo, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent)) {
173173
eventsCollector.emit(new viewEvents.ViewFlushedEvent());
174174
eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent());
175-
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent());
175+
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent(null));
176176
this.decorations.onLineMappingChanged();
177177
this.viewLayout.onFlushed(this.getLineCount());
178178

@@ -185,7 +185,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
185185
if (e.hasChanged(EditorOption.readOnly)) {
186186
// Must read again all decorations due to readOnly filtering
187187
this.decorations.reset();
188-
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent());
188+
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent(null));
189189
}
190190

191191
eventsCollector.emit(new viewEvents.ViewConfigurationChangedEvent(e));
@@ -291,7 +291,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
291291

292292
if (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) {
293293
eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent());
294-
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent());
294+
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent(null));
295295
this.decorations.onLineMappingChanged();
296296
}
297297
} finally {
@@ -354,7 +354,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
354354
const eventsCollector = this._beginEmit();
355355
eventsCollector.emit(new viewEvents.ViewFlushedEvent());
356356
eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent());
357-
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent());
357+
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent(null));
358358
} finally {
359359
this._endEmit();
360360
}
@@ -365,7 +365,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
365365
this.decorations.onModelDecorationsChanged();
366366
try {
367367
const eventsCollector = this._beginEmit();
368-
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent());
368+
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent(e));
369369
} finally {
370370
this._endEmit();
371371
}
@@ -379,7 +379,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
379379
if (lineMappingChanged) {
380380
eventsCollector.emit(new viewEvents.ViewFlushedEvent());
381381
eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent());
382-
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent());
382+
eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent(null));
383383
this.decorations.onLineMappingChanged();
384384
this.viewLayout.onFlushed(this.getLineCount());
385385
this.viewLayout.onHeightMaybeChanged();

src/vs/monaco.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2390,6 +2390,8 @@ declare namespace monaco.editor {
23902390
* An event describing that model decorations have changed.
23912391
*/
23922392
export interface IModelDecorationsChangedEvent {
2393+
readonly affectsMinimap: boolean;
2394+
readonly affectsOverviewRuler: boolean;
23932395
}
23942396

23952397
export interface IModelOptionsChangedEvent {

0 commit comments

Comments
 (0)