Skip to content

Commit 16fa2f0

Browse files
authored
Merge pull request microsoft#151952 from microsoft/3wm
Introduces different colors for input1, input2 and result editor.
2 parents a835b05 + bd5febf commit 16fa2f0

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';
@@ -48,7 +48,7 @@ import { autorun, autorunWithStore, derivedObservable, IObservable, ITransaction
4848
import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput';
4949
import { MergeEditorModel } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorModel';
5050
import { LineRange, ModifiedBaseRange } from 'vs/workbench/contrib/mergeEditor/browser/model';
51-
import { applyObservableDecorations, n, ReentrancyBarrier, setStyle } from 'vs/workbench/contrib/mergeEditor/browser/utils';
51+
import { applyObservableDecorations, join, n, ReentrancyBarrier, setStyle } from 'vs/workbench/contrib/mergeEditor/browser/utils';
5252
import { settingsSashBorder } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry';
5353
import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
5454
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
@@ -432,19 +432,6 @@ function synchronizeScrolling(scrollingEditor: CodeEditorWidget, targetEditor: C
432432

433433
const factor = Math.min((scrollingEditor.getScrollTop() - sourceStartTopPx) / (sourceEndPx - sourceStartTopPx), 1);
434434
const resultScrollPosition = resultStartTopPx + (resultEndPx - resultStartTopPx) * factor;
435-
/*
436-
console.log({
437-
topLineNumber,
438-
sourceRange: sourceRange.toString(),
439-
targetRange: targetRange.toString(),
440-
// resultStartTopPx,
441-
// resultEndPx,
442-
// sourceStartTopPx,
443-
// sourceEndPx,
444-
factor,
445-
resultScrollPosition,
446-
top: scrollingEditor.getScrollTop(),
447-
});*/
448435

449436
targetEditor.setScrollTop(resultScrollPosition, ScrollType.Immediate);
450437
}
@@ -541,7 +528,7 @@ class InputCodeEditorView extends CodeEditorView {
541528
range: new Range(range.startLineNumber, 1, range.endLineNumberExclusive - 1, 1),
542529
options: {
543530
isWholeLine: true,
544-
className: 'merge-base-range-projection',
531+
className: `merge-editor-modified-base-range-input${this.inputNumber}`,
545532
description: 'Base Range Projection'
546533
}
547534
});
@@ -666,18 +653,47 @@ class ResultCodeEditorView extends CodeEditorView {
666653
return [];
667654
}
668655
const result = new Array<IModelDeltaDecoration>();
669-
for (const m of model.resultDiffs.read(reader)) {
670-
const range = m.modifiedRange;
671-
if (!range.isEmpty) {
672-
result.push({
673-
range: new Range(range.startLineNumber, 1, range.endLineNumberExclusive - 1, 1),
674-
options: {
675-
isWholeLine: true,
676-
// TODO
677-
className: 'merge-base-range-projection',
678-
description: 'Result Diff'
679-
}
680-
});
656+
657+
const baseRangeWithStoreAndTouchingDiffs = join(
658+
model.modifiedBaseRanges.read(reader),
659+
model.resultDiffs.read(reader),
660+
(baseRange, diff) =>
661+
baseRange.baseRange.touches(diff.originalRange)
662+
? CompareResult.neitherLessOrGreaterThan
663+
: LineRange.compareByStart(
664+
baseRange.baseRange,
665+
diff.originalRange
666+
)
667+
);
668+
669+
for (const m of baseRangeWithStoreAndTouchingDiffs) {
670+
for (const r of m.rights) {
671+
const range = r.modifiedRange;
672+
673+
const state = m.left ? model.getState(m.left).read(reader) : undefined;
674+
675+
if (!range.isEmpty) {
676+
result.push({
677+
range: new Range(range.startLineNumber, 1, range.endLineNumberExclusive - 1, 1),
678+
options: {
679+
isWholeLine: true,
680+
// TODO
681+
682+
className: (() => {
683+
if (state) {
684+
if (state.input1 && !state.input2) {
685+
return 'merge-editor-modified-base-range-input1';
686+
}
687+
if (state.input2 && !state.input1) {
688+
return 'merge-editor-modified-base-range-input2';
689+
}
690+
}
691+
return 'merge-editor-modified-base-range-combination';
692+
})(),
693+
description: 'Result Diff'
694+
}
695+
});
696+
}
681697
}
682698
}
683699
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)