Skip to content

Commit 0b0882b

Browse files
committed
code_review: PR #2070
- Remove duplicated attributes in `Models.ConflictRegion` - Add `ViewModels.MergeConflictEditor.Resolve(object resolution)` to replace `AcceptOurs/AcceptTheirs/AcceptBothMineFirst/AcceptBothTheirsFirst/Undo` - Use command-binding instead of listening `Click` event for command buttons - Remove `IsOldSide` and `IsResult` properties since `PanelType` is enough - Rewrite the way to calculate current hovered conflict chunk Signed-off-by: leo <longshuang@msn.cn>
1 parent 4f97983 commit 0b0882b

File tree

4 files changed

+175
-415
lines changed

4 files changed

+175
-415
lines changed

src/Models/Conflict.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,15 @@ public class ConflictRegion
5757
{
5858
public int StartLineInOriginal { get; set; }
5959
public int EndLineInOriginal { get; set; }
60-
public List<string> OursContent { get; set; } = new();
61-
public List<string> TheirsContent { get; set; } = new();
62-
public bool IsResolved { get; set; } = false;
63-
64-
// Line indices in the built static panels (0-based)
65-
public int PanelStartLine { get; set; } = -1;
66-
public int PanelEndLine { get; set; } = -1;
67-
68-
// Content chosen when resolved (null = unresolved, empty list = deleted)
69-
public List<string> ResolvedContent { get; set; } = null;
7060

71-
// Real markers from the file
7261
public string StartMarker { get; set; } = "<<<<<<<";
7362
public string SeparatorMarker { get; set; } = "=======";
7463
public string EndMarker { get; set; } = ">>>>>>>";
7564

76-
// Track the type of resolution
65+
public List<string> OursContent { get; set; } = new();
66+
public List<string> TheirsContent { get; set; } = new();
67+
68+
public bool IsResolved { get; set; } = false;
7769
public ConflictResolution ResolutionType { get; set; } = ConflictResolution.None;
7870
}
7971
}

src/ViewModels/MergeConflictEditor.cs

Lines changed: 79 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -124,82 +124,25 @@ public Models.ConflictLineState GetLineState(int line)
124124
return Models.ConflictLineState.Normal;
125125
}
126126

127-
public void AcceptOurs()
127+
public void Resolve(object param)
128128
{
129129
if (_selectedChunk == null)
130130
return;
131131

132132
var region = _conflictRegions[_selectedChunk.ConflictIndex];
133-
if (region.IsResolved)
133+
if (param is not Models.ConflictResolution resolution)
134134
return;
135135

136-
region.ResolvedContent = new List<string>(region.OursContent);
137-
region.IsResolved = true;
138-
region.ResolutionType = Models.ConflictResolution.UseOurs;
139-
RefreshDisplayData();
140-
}
141-
142-
public void AcceptTheirs()
143-
{
144-
if (_selectedChunk == null)
145-
return;
146-
147-
var region = _conflictRegions[_selectedChunk.ConflictIndex];
148-
if (region.IsResolved)
149-
return;
150-
151-
region.ResolvedContent = new List<string>(region.TheirsContent);
152-
region.IsResolved = true;
153-
region.ResolutionType = Models.ConflictResolution.UseTheirs;
154-
RefreshDisplayData();
155-
}
156-
157-
public void AcceptBothMineFirst()
158-
{
159-
if (_selectedChunk == null)
160-
return;
161-
162-
var region = _conflictRegions[_selectedChunk.ConflictIndex];
163-
if (region.IsResolved)
136+
// Try to resolve a resolved region.
137+
if (resolution != Models.ConflictResolution.None && region.IsResolved)
164138
return;
165139

166-
var combined = new List<string>(region.OursContent);
167-
combined.AddRange(region.TheirsContent);
168-
region.ResolvedContent = combined;
169-
region.IsResolved = true;
170-
region.ResolutionType = Models.ConflictResolution.UseBothMineFirst;
171-
RefreshDisplayData();
172-
}
173-
174-
public void AcceptBothTheirsFirst()
175-
{
176-
if (_selectedChunk == null)
177-
return;
178-
179-
var region = _conflictRegions[_selectedChunk.ConflictIndex];
180-
if (region.IsResolved)
140+
// Try to undo an unresolved region.
141+
if (resolution == Models.ConflictResolution.None && !region.IsResolved)
181142
return;
182143

183-
var combined = new List<string>(region.TheirsContent);
184-
combined.AddRange(region.OursContent);
185-
region.ResolvedContent = combined;
186-
region.IsResolved = true;
187-
region.ResolutionType = Models.ConflictResolution.UseBothTheirsFirst;
188-
RefreshDisplayData();
189-
}
190-
191-
public void Undo()
192-
{
193-
if (_selectedChunk == null)
194-
return;
195-
196-
var region = _conflictRegions[_selectedChunk.ConflictIndex];
197-
if (!region.IsResolved)
198-
return;
199-
200-
region.ResolvedContent = null;
201-
region.IsResolved = false;
202-
region.ResolutionType = Models.ConflictResolution.None;
144+
region.IsResolved = resolution != Models.ConflictResolution.None;
145+
region.ResolutionType = resolution;
203146
RefreshDisplayData();
204147
}
205148

@@ -223,8 +166,32 @@ public async Task<bool> SaveAndStageAsync()
223166
for (var i = lastLineIdx; i < r.StartLineInOriginal; i++)
224167
builder.Append(lines[i]).Append('\n');
225168

226-
foreach (var l in r.ResolvedContent)
227-
builder.Append(l).Append('\n');
169+
if (r.ResolutionType == Models.ConflictResolution.UseOurs)
170+
{
171+
foreach (var l in r.OursContent)
172+
builder.Append(l).Append('\n');
173+
}
174+
else if (r.ResolutionType == Models.ConflictResolution.UseTheirs)
175+
{
176+
foreach (var l in r.TheirsContent)
177+
builder.Append(l).Append('\n');
178+
}
179+
else if (r.ResolutionType == Models.ConflictResolution.UseBothMineFirst)
180+
{
181+
foreach (var l in r.OursContent)
182+
builder.Append(l).Append('\n');
183+
184+
foreach (var l in r.TheirsContent)
185+
builder.Append(l).Append('\n');
186+
}
187+
else if (r.ResolutionType == Models.ConflictResolution.UseBothTheirsFirst)
188+
{
189+
foreach (var l in r.TheirsContent)
190+
builder.Append(l).Append('\n');
191+
192+
foreach (var l in r.OursContent)
193+
builder.Append(l).Append('\n');
194+
}
228195

229196
lastLineIdx = r.EndLineInOriginal + 1;
230197
}
@@ -278,7 +245,6 @@ private void ParseOriginalContent(string content)
278245
var region = new Models.ConflictRegion
279246
{
280247
StartLineInOriginal = i,
281-
PanelStartLine = oursLines.Count,
282248
StartMarker = line,
283249
};
284250

@@ -339,7 +305,6 @@ private void ParseOriginalContent(string content)
339305

340306
region.EndMarker = lines[i];
341307
region.EndLineInOriginal = i;
342-
region.PanelEndLine = oursLines.Count - 1;
343308
i++;
344309
}
345310

@@ -383,71 +348,79 @@ private void RefreshDisplayData()
383348
if (conflictIdx < _conflictRegions.Count)
384349
{
385350
var region = _conflictRegions[conflictIdx];
386-
if (region.PanelStartLine == currentLine)
351+
if (region.StartLineInOriginal == currentLine)
387352
currentRegion = region;
388353
}
389354

390355
if (currentRegion != null)
391356
{
392-
int regionLines = currentRegion.PanelEndLine - currentRegion.PanelStartLine + 1;
393-
394-
if (currentRegion.ResolvedContent != null)
357+
int regionLines = currentRegion.EndLineInOriginal - currentRegion.StartLineInOriginal + 1;
358+
if (currentRegion.IsResolved)
395359
{
396360
var oldLineCount = resultLines.Count;
361+
var resolveType = currentRegion.ResolutionType;
397362

398363
// Resolved - show resolved content with color based on resolution type
399-
if (currentRegion.ResolutionType == Models.ConflictResolution.UseBothMineFirst)
364+
if (resolveType == Models.ConflictResolution.UseBothMineFirst)
400365
{
401-
// First portion is Mine (Deleted color), second is Theirs (Added color)
402366
int mineCount = currentRegion.OursContent.Count;
403-
for (int i = 0; i < currentRegion.ResolvedContent.Count; i++)
367+
for (int i = 0; i < mineCount; i++)
404368
{
405-
var lineType = i < mineCount
406-
? Models.TextDiffLineType.Deleted
407-
: Models.TextDiffLineType.Added;
408-
resultLines.Add(new Models.TextDiffLine(
409-
lineType, currentRegion.ResolvedContent[i], resultLineNumber, resultLineNumber));
369+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, currentRegion.OursContent[i], resultLineNumber, resultLineNumber));
370+
resultLineNumber++;
371+
}
372+
373+
int theirsCount = currentRegion.TheirsContent.Count;
374+
for (int i = 0; i < theirsCount; i++)
375+
{
376+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, currentRegion.TheirsContent[i], resultLineNumber, resultLineNumber));
410377
resultLineNumber++;
411378
}
412379
}
413-
else if (currentRegion.ResolutionType == Models.ConflictResolution.UseBothTheirsFirst)
380+
else if (resolveType == Models.ConflictResolution.UseBothTheirsFirst)
414381
{
415-
// First portion is Theirs (Added color), second is Mine (Deleted color)
416382
int theirsCount = currentRegion.TheirsContent.Count;
417-
for (int i = 0; i < currentRegion.ResolvedContent.Count; i++)
383+
for (int i = 0; i < theirsCount; i++)
384+
{
385+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, currentRegion.TheirsContent[i], resultLineNumber, resultLineNumber));
386+
resultLineNumber++;
387+
}
388+
389+
int mineCount = currentRegion.OursContent.Count;
390+
for (int i = 0; i < mineCount; i++)
418391
{
419-
var lineType = i < theirsCount
420-
? Models.TextDiffLineType.Added
421-
: Models.TextDiffLineType.Deleted;
422-
resultLines.Add(new Models.TextDiffLine(
423-
lineType, currentRegion.ResolvedContent[i], resultLineNumber, resultLineNumber));
392+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, currentRegion.OursContent[i], resultLineNumber, resultLineNumber));
424393
resultLineNumber++;
425394
}
426395
}
427-
else
396+
else if (resolveType == Models.ConflictResolution.UseOurs)
428397
{
429-
var lineType = currentRegion.ResolutionType switch
398+
int mineCount = currentRegion.OursContent.Count;
399+
for (int i = 0; i < mineCount; i++)
430400
{
431-
Models.ConflictResolution.UseOurs => Models.TextDiffLineType.Deleted, // Mine color
432-
Models.ConflictResolution.UseTheirs => Models.TextDiffLineType.Added, // Theirs color
433-
_ => Models.TextDiffLineType.Normal
434-
};
435-
436-
foreach (var line in currentRegion.ResolvedContent)
401+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, currentRegion.OursContent[i], resultLineNumber, resultLineNumber));
402+
resultLineNumber++;
403+
}
404+
}
405+
else if (resolveType == Models.ConflictResolution.UseTheirs)
406+
{
407+
int theirsCount = currentRegion.TheirsContent.Count;
408+
for (int i = 0; i < theirsCount; i++)
437409
{
438-
resultLines.Add(new Models.TextDiffLine(
439-
lineType, line, resultLineNumber, resultLineNumber));
410+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, currentRegion.TheirsContent[i], resultLineNumber, resultLineNumber));
440411
resultLineNumber++;
441412
}
442413
}
414+
443415
// Pad with empty lines to match Mine/Theirs panel height
444-
int padding = regionLines - currentRegion.ResolvedContent.Count;
416+
int added = resultLines.Count - oldLineCount;
417+
int padding = regionLines - added;
445418
for (int p = 0; p < padding; p++)
446419
resultLines.Add(new Models.TextDiffLine());
447420

448-
int added = resultLines.Count - oldLineCount;
421+
int blockSize = resultLines.Count - oldLineCount - 2;
449422
_lineStates.Add(Models.ConflictLineState.ResolvedBlockStart);
450-
for (var i = 0; i < added - 2; i++)
423+
for (var i = 0; i < blockSize; i++)
451424
_lineStates.Add(Models.ConflictLineState.ResolvedBlock);
452425
_lineStates.Add(Models.ConflictLineState.ResolvedBlockEnd);
453426
}
@@ -461,8 +434,7 @@ private void RefreshDisplayData()
461434
// Mine content lines (matches the deleted lines in Ours panel)
462435
foreach (var line in currentRegion.OursContent)
463436
{
464-
resultLines.Add(new Models.TextDiffLine(
465-
Models.TextDiffLineType.Deleted, line, 0, resultLineNumber++));
437+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, line, 0, resultLineNumber++));
466438
_lineStates.Add(Models.ConflictLineState.ConflictBlock);
467439
}
468440

@@ -473,8 +445,7 @@ private void RefreshDisplayData()
473445
// Theirs content lines (matches the added lines in Theirs panel)
474446
foreach (var line in currentRegion.TheirsContent)
475447
{
476-
resultLines.Add(new Models.TextDiffLine(
477-
Models.TextDiffLineType.Added, line, 0, resultLineNumber++));
448+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, line, 0, resultLineNumber++));
478449
_lineStates.Add(Models.ConflictLineState.ConflictBlock);
479450
}
480451

@@ -483,7 +454,7 @@ private void RefreshDisplayData()
483454
_lineStates.Add(Models.ConflictLineState.ConflictBlockEnd);
484455
}
485456

486-
currentLine = currentRegion.PanelEndLine + 1;
457+
currentLine = currentRegion.EndLineInOriginal + 1;
487458
conflictIdx++;
488459
}
489460
else
@@ -492,9 +463,7 @@ private void RefreshDisplayData()
492463
var oursLine = _oursDiffLines[currentLine];
493464
if (oursLine.Type == Models.TextDiffLineType.Normal)
494465
{
495-
resultLines.Add(new Models.TextDiffLine(
496-
Models.TextDiffLineType.Normal, oursLine.Content,
497-
resultLineNumber, resultLineNumber));
466+
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Normal, oursLine.Content, resultLineNumber, resultLineNumber));
498467
resultLineNumber++;
499468
}
500469
else

0 commit comments

Comments
 (0)