Skip to content

Commit 813a36e

Browse files
committed
Implements "No Changes"
1 parent c22bb0e commit 813a36e

File tree

5 files changed

+57
-28
lines changed

5 files changed

+57
-28
lines changed

src/vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Copyright (c) Microsoft Corporation. All rights reserved.
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
5-
import { h } from 'vs/base/browser/dom';
5+
import { $, h } from 'vs/base/browser/dom';
66
import { IBoundarySashes } from 'vs/base/browser/ui/sash/sash';
77
import { findLast } from 'vs/base/common/arrays';
88
import { onUnexpectedError } from 'vs/base/common/errors';
@@ -25,7 +25,7 @@ import { ViewZoneManager } from 'vs/editor/browser/widget/diffEditorWidget2/line
2525
import { MovedBlocksLinesPart } from 'vs/editor/browser/widget/diffEditorWidget2/movedBlocksLines';
2626
import { OverviewRulerPart } from 'vs/editor/browser/widget/diffEditorWidget2/overviewRulerPart';
2727
import { UnchangedRangesFeature } from 'vs/editor/browser/widget/diffEditorWidget2/unchangedRanges';
28-
import { ObservableElementSizeObserver, applyObservableDecorations, deepMerge, readHotReloadableExport } from 'vs/editor/browser/widget/diffEditorWidget2/utils';
28+
import { ObservableElementSizeObserver, applyObservableDecorations, applyStyle, deepMerge, readHotReloadableExport } from 'vs/editor/browser/widget/diffEditorWidget2/utils';
2929
import { WorkerBasedDocumentDiffProvider } from 'vs/editor/browser/widget/workerBasedDocumentDiffProvider';
3030
import { EditorOptions, IDiffEditorOptions, IEditorOptions, ValidDiffEditorBaseOptions, clampedFloat, clampedInt, boolean as validateBooleanOption, stringSet as validateStringSetOption } from 'vs/editor/common/config/editorOptions';
3131
import { IDimension } from 'vs/editor/common/core/dimension';
@@ -68,6 +68,7 @@ const diffEditorDefaultOptions: ValidDiffEditorBaseOptions = {
6868

6969
export class DiffEditorWidget2 extends DelegatingEditor implements IDiffEditor {
7070
private readonly elements = h('div.monaco-diff-editor.side-by-side', { style: { position: 'relative', height: '100%' } }, [
71+
h('div.noModificationsOverlay@overlay', { style: { position: 'absolute', height: '100%', visibility: 'hidden', } }, [$('span', {}, 'No Changes')]),
7172
h('div.editor.original@original', { style: { position: 'absolute', height: '100%' } }),
7273
h('div.editor.modified@modified', { style: { position: 'absolute', height: '100%' } }),
7374
]);
@@ -190,6 +191,11 @@ export class DiffEditorWidget2 extends DelegatingEditor implements IDiffEditor {
190191
this._originalEditor,
191192
this._modifiedEditor,
192193
));
194+
195+
this._register(applyStyle(this.elements.overlay, {
196+
width: this._layoutInfo.map((i, r) => i.originalEditor.width + (this._options.read(r).renderSideBySide ? 0 : i.modifiedEditor.width)),
197+
visibility: this._diffModel.map((m, r) => (m && m.hideUnchangedRegions.read(r) && m.diff.read(r)?.mappings.length === 0) ? 'visible' : 'hidden'),
198+
}));
193199
}
194200

195201
private readonly _layoutInfo = derived('modifiedEditorLayoutInfo', (reader) => {

src/vs/editor/browser/widget/diffEditorWidget2/diffModel.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export class DiffModel extends Disposable implements IDiffEditorViewModel {
3232
{ regions: [], originalDecorationIds: [], modifiedDecorationIds: [] }
3333
);
3434
public readonly unchangedRegions: IObservable<UnchangedRegion[]> = derived('unchangedRegions', r => {
35-
if (this._hideUnchangedRegions.read(r)) {
35+
if (this.hideUnchangedRegions.read(r)) {
3636
return this._unchangedRegions.read(r).regions;
3737
} else {
3838
// Reset state
@@ -52,7 +52,7 @@ export class DiffModel extends Disposable implements IDiffEditorViewModel {
5252
public readonly model: IDiffEditorModel,
5353
ignoreTrimWhitespace: IObservable<boolean>,
5454
maxComputationTimeMs: IObservable<number>,
55-
private readonly _hideUnchangedRegions: IObservable<boolean>,
55+
public readonly hideUnchangedRegions: IObservable<boolean>,
5656
private readonly _showMoves: IObservable<boolean>,
5757
documentDiffProvider: IDocumentDiffProvider,
5858
) {
@@ -182,6 +182,9 @@ export class DiffModel extends Disposable implements IDiffEditorViewModel {
182182
}
183183

184184
public ensureModifiedLineIsVisible(lineNumber: number, tx: ITransaction): void {
185+
if (this.diff.get()?.mappings.length === 0) {
186+
return;
187+
}
185188
const unchangedRegions = this._unchangedRegions.get().regions;
186189
for (const r of unchangedRegions) {
187190
if (r.getHiddenModifiedRange(undefined).contains(lineNumber)) {
@@ -192,6 +195,9 @@ export class DiffModel extends Disposable implements IDiffEditorViewModel {
192195
}
193196

194197
public ensureOriginalLineIsVisible(lineNumber: number, tx: ITransaction): void {
198+
if (this.diff.get()?.mappings.length === 0) {
199+
return;
200+
}
195201
const unchangedRegions = this._unchangedRegions.get().regions;
196202
for (const r of unchangedRegions) {
197203
if (r.getHiddenOriginalRange(undefined).contains(lineNumber)) {

src/vs/editor/browser/widget/diffEditorWidget2/style.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@
4040
background: var(--vscode-diffEditor-unchangedCodeBackground);
4141
}
4242

43+
.noModificationsOverlay {
44+
z-index: 1;
45+
background: var(--vscode-editor-background);
46+
47+
display: flex;
48+
justify-content: center;
49+
align-items: center;
50+
}
51+
4352

4453
.diff-hidden-lines .center {
4554
background: var(--vscode-diffEditor-unchangedRegionBackground);

src/vs/editor/browser/widget/diffEditorWidget2/unchangedRanges.ts

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget';
1515
import { DiffModel, UnchangedRegion } from 'vs/editor/browser/widget/diffEditorWidget2/diffModel';
1616
import { PlaceholderViewZone, ViewZoneOverlayWidget, applyObservableDecorations, applyStyle, applyViewZones } from 'vs/editor/browser/widget/diffEditorWidget2/utils';
1717
import { EditorOption } from 'vs/editor/common/config/editorOptions';
18+
import { CursorChangeReason } from 'vs/editor/common/cursorEvents';
1819
import { IModelDecorationOptions, IModelDeltaDecoration } from 'vs/editor/common/model';
1920

2021
export class UnchangedRangesFeature extends Disposable {
@@ -30,32 +31,38 @@ export class UnchangedRangesFeature extends Disposable {
3031
super();
3132

3233
this._register(this._originalEditor.onDidChangeCursorPosition(e => {
33-
const m = this._diffModel.get();
34-
transaction(tx => {
35-
for (const s of this._originalEditor.getSelections() || []) {
36-
m?.ensureOriginalLineIsVisible(s.getStartPosition().lineNumber, tx);
37-
m?.ensureOriginalLineIsVisible(s.getEndPosition().lineNumber, tx);
38-
}
39-
});
34+
if (e.reason === CursorChangeReason.Explicit) {
35+
const m = this._diffModel.get();
36+
transaction(tx => {
37+
for (const s of this._originalEditor.getSelections() || []) {
38+
m?.ensureOriginalLineIsVisible(s.getStartPosition().lineNumber, tx);
39+
m?.ensureOriginalLineIsVisible(s.getEndPosition().lineNumber, tx);
40+
}
41+
});
42+
}
4043
}));
4144

4245
this._register(this._modifiedEditor.onDidChangeCursorPosition(e => {
43-
const m = this._diffModel.get();
44-
transaction(tx => {
45-
for (const s of this._modifiedEditor.getSelections() || []) {
46-
m?.ensureModifiedLineIsVisible(s.getStartPosition().lineNumber, tx);
47-
m?.ensureModifiedLineIsVisible(s.getEndPosition().lineNumber, tx);
48-
}
49-
});
46+
if (e.reason === CursorChangeReason.Explicit) {
47+
const m = this._diffModel.get();
48+
transaction(tx => {
49+
for (const s of this._modifiedEditor.getSelections() || []) {
50+
m?.ensureModifiedLineIsVisible(s.getStartPosition().lineNumber, tx);
51+
m?.ensureModifiedLineIsVisible(s.getEndPosition().lineNumber, tx);
52+
}
53+
});
54+
}
5055
}));
5156

57+
const unchangedRegions = this._diffModel.map((m, reader) => m?.diff.read(reader)?.mappings.length === 0 ? [] : m?.unchangedRegions.read(reader) ?? []);
58+
5259
const viewZones = derivedWithStore('view zones', (reader, store) => {
5360
const origViewZones: IViewZone[] = [];
5461
const modViewZones: IViewZone[] = [];
5562
const sideBySide = this._sideBySide.read(reader);
5663

57-
const unchangedRegions = this._diffModel.read(reader)?.unchangedRegions.read(reader) ?? [];
58-
for (const r of unchangedRegions) {
64+
const curUnchangedRegions = unchangedRegions.read(reader);
65+
for (const r of curUnchangedRegions) {
5966
if (r.shouldHideControls(reader)) {
6067
continue;
6168
}
@@ -85,16 +92,16 @@ export class UnchangedRangesFeature extends Disposable {
8592
};
8693

8794
this._register(applyObservableDecorations(this._originalEditor, derived('decorations', (reader) => {
88-
const unchangedRegions = this._diffModel.read(reader)?.unchangedRegions.read(reader) ?? [];
89-
return unchangedRegions.map<IModelDeltaDecoration>(r => ({
95+
const curUnchangedRegions = unchangedRegions.read(reader);
96+
return curUnchangedRegions.map<IModelDeltaDecoration>(r => ({
9097
range: r.originalRange.toInclusiveRange()!,
9198
options: unchangedLinesDecoration,
9299
}));
93100
})));
94101

95102
this._register(applyObservableDecorations(this._modifiedEditor, derived('decorations', (reader) => {
96-
const unchangedRegions = this._diffModel.read(reader)?.unchangedRegions.read(reader) ?? [];
97-
return unchangedRegions.map<IModelDeltaDecoration>(r => ({
103+
const curUnchangedRegions = unchangedRegions.read(reader);
104+
return curUnchangedRegions.map<IModelDeltaDecoration>(r => ({
98105
range: r.modifiedRange.toInclusiveRange()!,
99106
options: unchangedLinesDecoration,
100107
}));
@@ -104,10 +111,9 @@ export class UnchangedRangesFeature extends Disposable {
104111
this._register(applyViewZones(this._modifiedEditor, viewZones.map(v => v.modViewZones), v => this._isUpdatingViewZones = v));
105112

106113
this._register(autorunWithStore2('update folded unchanged regions', (reader, store) => {
107-
const unchangedRegions = this._diffModel.read(reader)?.unchangedRegions.read(reader) ?? [];
108-
109-
this._originalEditor.setHiddenAreas(unchangedRegions.map(r => r.getHiddenOriginalRange(reader).toInclusiveRange()).filter(isDefined));
110-
this._modifiedEditor.setHiddenAreas(unchangedRegions.map(r => r.getHiddenModifiedRange(reader).toInclusiveRange()).filter(isDefined));
114+
const curUnchangedRegions = unchangedRegions.read(reader);
115+
this._originalEditor.setHiddenAreas(curUnchangedRegions.map(r => r.getHiddenOriginalRange(reader).toInclusiveRange()).filter(isDefined));
116+
this._modifiedEditor.setHiddenAreas(curUnchangedRegions.map(r => r.getHiddenModifiedRange(reader).toInclusiveRange()).filter(isDefined));
111117
}));
112118
}
113119
}

src/vs/editor/browser/widget/diffEditorWidget2/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ export interface CSSStyle {
264264
height: number | string;
265265
width: number | string;
266266
top: number | string;
267+
visibility: 'visible' | 'hidden' | 'collapse';
268+
display: 'block' | 'inline' | 'inline-block' | 'flex' | 'none';
267269
}
268270

269271
export function applyStyle(domNode: HTMLElement, style: Partial<{ [TKey in keyof CSSStyle]: CSSStyle[TKey] | IObservable<CSSStyle[TKey] | undefined> | undefined }>) {

0 commit comments

Comments
 (0)