Skip to content

Commit bd5febf

Browse files
committed
Introduces different colors for input1, input2 and result editor.
1 parent 07bdf34 commit bd5febf

File tree

5 files changed

+157
-30
lines changed

5 files changed

+157
-30
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { localize } from 'vs/nls';
7+
import { registerColor } from 'vs/platform/theme/common/colorRegistry';
8+
9+
export const modifiedBaseRangeInput1 = registerColor(
10+
'mergeEditor.modifiedBaseRange.input1',
11+
{
12+
dark: '#a44c9d53',
13+
light: '#a44c9d38',
14+
hcDark: '#a44c9d53',
15+
hcLight: '#a44c9d38',
16+
},
17+
localize(
18+
'mergeEditor.modifiedBaseRange.input1',
19+
'The foreground color for changes in input 1.'
20+
)
21+
);
22+
23+
export const modifiedBaseRangeInput2 = registerColor(
24+
'mergeEditor.modifiedBaseRange.input2',
25+
{
26+
dark: '#878feb53',
27+
light: '#878feb53',
28+
hcDark: '#878feb53',
29+
hcLight: '#878feb53',
30+
},
31+
localize(
32+
'mergeEditor.modifiedBaseRange.input2',
33+
'The foreground color for changes in input 2.'
34+
)
35+
);
36+
37+
export const modifiedBaseRangeCombination = registerColor(
38+
'mergeEditor.modifiedBaseRange.combination',
39+
{
40+
dark: '#8a4d249e',
41+
light: '#8a4d243e',
42+
hcDark: '#8a4d249e',
43+
hcLight: '#8a4d243e',
44+
},
45+
localize(
46+
'mergeEditor.modifiedBaseRange.combination',
47+
'The foreground color for combined changes in the result editor.'
48+
)
49+
);
50+
51+
export const diffInput1 = registerColor(
52+
'mergeEditor.diff.input1',
53+
{
54+
dark: '#e571db21',
55+
light: '#e571db21',
56+
hcDark: '#e571db21',
57+
hcLight: '#e571db21',
58+
},
59+
localize(
60+
'mergeEditor.diff.input1',
61+
'The foreground color for changed words in input 1.'
62+
)
63+
);
64+
65+
export const diffInput2 = registerColor(
66+
'mergeEditor.diff.input2',
67+
{
68+
dark: '#878feb53',
69+
light: '#878feb53',
70+
hcDark: '#878feb53',
71+
hcLight: '#878feb53',
72+
},
73+
localize(
74+
'mergeEditor.diff.input2',
75+
'The foreground color for changed words in input 2.'
76+
)
77+
);

src/vs/workbench/contrib/mergeEditor/browser/media/mergeEditor.css

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,25 @@
3333
cursor: pointer;
3434
}
3535

36-
.merge-base-range-projection {
37-
background-color: rgb(170 175 170 / 15%);
36+
37+
.merge-editor-modified-base-range-input1 {
38+
background-color: var(--vscode-mergeEditor-modifiedBaseRange-input1);
39+
}
40+
41+
.merge-editor-diff-input1 {
42+
background-color: var(--vscode-mergeEditor-diff-input1);
43+
}
44+
45+
.merge-editor-modified-base-range-input2 {
46+
background-color: var(--vscode-mergeEditor-modifiedBaseRange-input2);
47+
}
48+
49+
.merge-editor-diff-input2 {
50+
background-color: var(--vscode-mergeEditor-diff-input2);
51+
}
52+
53+
.merge-editor-modified-base-range-combination {
54+
background-color: var(--vscode-mergeEditor-modifiedBaseRange-combination);
3855
}
3956

4057
.gutter-item {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService
2424
import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput';
2525
import { INotificationService } from 'vs/platform/notification/common/notification';
2626
import { ITextModelService } from 'vs/editor/common/services/resolverService';
27+
import './colors';
2728

2829
Registry.as<IEditorPaneRegistry>(EditorExtensions.EditorPane).registerEditorPane(
2930
EditorPaneDescriptor.create(

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

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel';
99
import { Orientation, Sizing } from 'vs/base/browser/ui/splitview/splitview';
1010
import { Toggle } from 'vs/base/browser/ui/toggle/toggle';
1111
import { IAction } from 'vs/base/common/actions';
12-
import { findLast } from 'vs/base/common/arrays';
12+
import { CompareResult, findLast } from 'vs/base/common/arrays';
1313
import { CancellationToken } from 'vs/base/common/cancellation';
1414
import { Codicon } from 'vs/base/common/codicons';
1515
import { Color } from 'vs/base/common/color';
@@ -47,7 +47,7 @@ import { autorun, autorunWithStore, derivedObservable, IObservable, ITransaction
4747
import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput';
4848
import { MergeEditorModel } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorModel';
4949
import { LineRange, ModifiedBaseRange } from 'vs/workbench/contrib/mergeEditor/browser/model';
50-
import { applyObservableDecorations, n, ReentrancyBarrier, setStyle } from 'vs/workbench/contrib/mergeEditor/browser/utils';
50+
import { applyObservableDecorations, join, n, ReentrancyBarrier, setStyle } from 'vs/workbench/contrib/mergeEditor/browser/utils';
5151
import { settingsSashBorder } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry';
5252
import { EditorGutter, IGutterItemInfo, IGutterItemView } from './editorGutter';
5353

@@ -354,19 +354,6 @@ function synchronizeScrolling(scrollingEditor: CodeEditorWidget, targetEditor: C
354354

355355
const factor = Math.min((scrollingEditor.getScrollTop() - sourceStartTopPx) / (sourceEndPx - sourceStartTopPx), 1);
356356
const resultScrollPosition = resultStartTopPx + (resultEndPx - resultStartTopPx) * factor;
357-
/*
358-
console.log({
359-
topLineNumber,
360-
sourceRange: sourceRange.toString(),
361-
targetRange: targetRange.toString(),
362-
// resultStartTopPx,
363-
// resultEndPx,
364-
// sourceStartTopPx,
365-
// sourceEndPx,
366-
factor,
367-
resultScrollPosition,
368-
top: scrollingEditor.getScrollTop(),
369-
});*/
370357

371358
targetEditor.setScrollTop(resultScrollPosition, ScrollType.Immediate);
372359
}
@@ -463,7 +450,7 @@ class InputCodeEditorView extends CodeEditorView {
463450
range: new Range(range.startLineNumber, 1, range.endLineNumberExclusive - 1, 1),
464451
options: {
465452
isWholeLine: true,
466-
className: 'merge-base-range-projection',
453+
className: `merge-editor-modified-base-range-input${this.inputNumber}`,
467454
description: 'Base Range Projection'
468455
}
469456
});
@@ -589,18 +576,47 @@ class ResultCodeEditorView extends CodeEditorView {
589576
return [];
590577
}
591578
const result = new Array<IModelDeltaDecoration>();
592-
for (const m of model.resultDiffs.read(reader)) {
593-
const range = m.modifiedRange;
594-
if (!range.isEmpty) {
595-
result.push({
596-
range: new Range(range.startLineNumber, 1, range.endLineNumberExclusive - 1, 1),
597-
options: {
598-
isWholeLine: true,
599-
// TODO
600-
className: 'merge-base-range-projection',
601-
description: 'Result Diff'
602-
}
603-
});
579+
580+
const baseRangeWithStoreAndTouchingDiffs = join(
581+
model.modifiedBaseRanges.read(reader),
582+
model.resultDiffs.read(reader),
583+
(baseRange, diff) =>
584+
baseRange.baseRange.touches(diff.originalRange)
585+
? CompareResult.neitherLessOrGreaterThan
586+
: LineRange.compareByStart(
587+
baseRange.baseRange,
588+
diff.originalRange
589+
)
590+
);
591+
592+
for (const m of baseRangeWithStoreAndTouchingDiffs) {
593+
for (const r of m.rights) {
594+
const range = r.modifiedRange;
595+
596+
const state = m.left ? model.getState(m.left).read(reader) : undefined;
597+
598+
if (!range.isEmpty) {
599+
result.push({
600+
range: new Range(range.startLineNumber, 1, range.endLineNumberExclusive - 1, 1),
601+
options: {
602+
isWholeLine: true,
603+
// TODO
604+
605+
className: (() => {
606+
if (state) {
607+
if (state.input1 && !state.input2) {
608+
return 'merge-editor-modified-base-range-input1';
609+
}
610+
if (state.input2 && !state.input1) {
611+
return 'merge-editor-modified-base-range-input2';
612+
}
613+
}
614+
return 'merge-editor-modified-base-range-combination';
615+
})(),
616+
description: 'Result Diff'
617+
}
618+
});
619+
}
604620
}
605621
}
606622
return result;

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,19 @@ export function* leftJoin<TLeft, TRight>(
183183
yield { left: leftElement, rights: equals || [] };
184184
}
185185
}
186+
187+
export function* join<TLeft, TRight>(
188+
left: Iterable<TLeft>,
189+
right: readonly TRight[],
190+
compare: (left: TLeft, right: TRight) => CompareResult,
191+
): IterableIterator<{ left?: TLeft; rights: TRight[] }> {
192+
const rightQueue = new ArrayQueue(right);
193+
for (const leftElement of left) {
194+
const skipped = rightQueue.takeWhile(rightElement => CompareResult.isGreaterThan(compare(leftElement, rightElement)));
195+
if (skipped) {
196+
yield { rights: skipped };
197+
}
198+
const equals = rightQueue.takeWhile(rightElement => CompareResult.isNeitherLessOrGreaterThan(compare(leftElement, rightElement)));
199+
yield { left: leftElement, rights: equals || [] };
200+
}
201+
}

0 commit comments

Comments
 (0)