Skip to content

Commit d1c1592

Browse files
committed
Scrolls to first conflict.
1 parent 3530a76 commit d1c1592

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

src/vs/workbench/contrib/mergeEditor/browser/utils.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { CompareResult, ArrayQueue } from 'vs/base/common/arrays';
77
import { BugIndicatingError } from 'vs/base/common/errors';
8-
import { DisposableStore } from 'vs/base/common/lifecycle';
8+
import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
99
import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget';
1010
import { IModelDeltaDecoration } from 'vs/editor/common/model';
1111
import { IObservable, autorun } from 'vs/workbench/contrib/audioCues/browser/observable';
@@ -207,3 +207,16 @@ export function concatArrays<TArr extends any[]>(...arrays: TArr): TArr[number][
207207
export function elementAtOrUndefined<T>(arr: T[], index: number): T | undefined {
208208
return arr[index];
209209
}
210+
211+
export function thenIfNotDisposed<T>(promise: Promise<T>, then: () => void): IDisposable {
212+
let disposed = false;
213+
promise.then(() => {
214+
if (disposed) {
215+
return;
216+
}
217+
then();
218+
});
219+
return toDisposable(() => {
220+
disposed = true;
221+
});
222+
}

src/vs/workbench/contrib/mergeEditor/browser/view/mergeEditor.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import 'vs/css!./media/mergeEditor';
7-
import './colors';
86
import { $, Dimension, reset } from 'vs/base/browser/dom';
97
import { Direction, Grid, IView, SerializableGrid } from 'vs/base/browser/ui/grid/grid';
108
import { Orientation, Sizing } from 'vs/base/browser/ui/splitview/splitview';
@@ -14,6 +12,7 @@ import { Color } from 'vs/base/common/color';
1412
import { BugIndicatingError } from 'vs/base/common/errors';
1513
import { DisposableStore } from 'vs/base/common/lifecycle';
1614
import { URI } from 'vs/base/common/uri';
15+
import 'vs/css!./media/mergeEditor';
1716
import { ICodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser';
1817
import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget';
1918
import { IEditorOptions as ICodeEditorOptions } from 'vs/editor/common/config/editorOptions';
@@ -38,15 +37,16 @@ import { EditorInput } from 'vs/workbench/common/editor/editorInput';
3837
import { applyTextEditorOptions } from 'vs/workbench/common/editor/editorOptions';
3938
import { autorunWithStore } from 'vs/workbench/contrib/audioCues/browser/observable';
4039
import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput';
41-
import { MergeEditorModel } from 'vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel';
4240
import { DocumentMapping, getOppositeDirection, MappingDirection } from 'vs/workbench/contrib/mergeEditor/browser/model/mapping';
43-
import { ReentrancyBarrier } from 'vs/workbench/contrib/mergeEditor/browser/utils';
41+
import { MergeEditorModel } from 'vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel';
42+
import { ReentrancyBarrier, thenIfNotDisposed } from 'vs/workbench/contrib/mergeEditor/browser/utils';
43+
import { MergeEditorViewModel } from 'vs/workbench/contrib/mergeEditor/browser/view/viewModel';
4444
import { settingsSashBorder } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry';
4545
import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
4646
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
47+
import './colors';
4748
import { InputCodeEditorView } from './editors/inputCodeEditorView';
4849
import { ResultCodeEditorView } from './editors/resultCodeEditorView';
49-
import { MergeEditorViewModel } from 'vs/workbench/contrib/mergeEditor/browser/view/viewModel';
5050

5151
export const ctxIsMergeEditor = new RawContextKey<boolean>('isMergeEditor', false);
5252
export const ctxUsesColumnLayout = new RawContextKey<boolean>('mergeEditorUsesColumnLayout', false);
@@ -235,6 +235,16 @@ export class MergeEditor extends AbstractTextEditor<any> {
235235
this.inputResultView.setModel(viewModel, model.result, localize('result', 'Result',), this._labelService.getUriLabel(model.result.uri, { relative: true }), undefined);
236236
this._ctxBaseResourceScheme.set(model.base.uri.scheme);
237237

238+
this._sessionDisposables.add(thenIfNotDisposed(model.onInitialized, () => {
239+
const firstConflict = model.modifiedBaseRanges.get().find(r => r.isConflicting);
240+
if (!firstConflict) {
241+
return;
242+
}
243+
244+
this.input1View.editor.revealLineInCenter(firstConflict.input1Range.startLineNumber);
245+
}));
246+
247+
238248
this._sessionDisposables.add(autorunWithStore((reader, store) => {
239249
const input1ViewZoneIds: string[] = [];
240250
const input2ViewZoneIds: string[] = [];

0 commit comments

Comments
 (0)