Skip to content

Commit 7f757e1

Browse files
committed
refactor: use a new class Models.ConflictLine for conflict editor instead of Models.TextDiffLine
Signed-off-by: leo <longshuang@msn.cn>
1 parent 2006fa8 commit 7f757e1

File tree

7 files changed

+326
-372
lines changed

7 files changed

+326
-372
lines changed

src/Models/Conflict.cs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
namespace SourceGit.Models
44
{
5+
public enum ConflictPanelType
6+
{
7+
Ours,
8+
Theirs,
9+
Result
10+
}
11+
512
public enum ConflictResolution
613
{
714
None,
@@ -11,19 +18,13 @@ public enum ConflictResolution
1118
UseBothTheirsFirst,
1219
}
1320

14-
public enum ConflictMarkerType
15-
{
16-
Start, // <<<<<<<
17-
Base, // ||||||| (diff3 style)
18-
Separator, // =======
19-
End, // >>>>>>>
20-
}
21-
22-
public enum ConflictPanelType
21+
public enum ConflictLineType
2322
{
24-
Mine,
23+
None,
24+
Common,
25+
Marker,
26+
Ours,
2527
Theirs,
26-
Result
2728
}
2829

2930
public enum ConflictLineState
@@ -37,6 +38,28 @@ public enum ConflictLineState
3738
ResolvedBlockEnd,
3839
}
3940

41+
public class ConflictLine
42+
{
43+
public ConflictLineType Type { get; set; } = ConflictLineType.None;
44+
public string Content { get; set; } = string.Empty;
45+
public string LineNumber { get; set; } = string.Empty;
46+
47+
public ConflictLine()
48+
{
49+
}
50+
public ConflictLine(ConflictLineType type, string content)
51+
{
52+
Type = type;
53+
Content = content;
54+
}
55+
public ConflictLine(ConflictLineType type, string content, int lineNumber)
56+
{
57+
Type = type;
58+
Content = content;
59+
LineNumber = lineNumber.ToString();
60+
}
61+
}
62+
4063
public record ConflictSelectedChunk(
4164
double Y,
4265
double Height,
@@ -45,14 +68,6 @@ public record ConflictSelectedChunk(
4568
bool IsResolved
4669
);
4770

48-
public class ConflictMarkerInfo
49-
{
50-
public int LineNumber { get; set; }
51-
public int StartOffset { get; set; }
52-
public int EndOffset { get; set; }
53-
public ConflictMarkerType Type { get; set; }
54-
}
55-
5671
public class ConflictRegion
5772
{
5873
public int StartLineInOriginal { get; set; }

src/ViewModels/MergeConflictEditor.cs

Lines changed: 39 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,19 @@ public string Error
2222
private set => SetProperty(ref _error, value);
2323
}
2424

25-
public List<Models.TextDiffLine> OursDiffLines
25+
public List<Models.ConflictLine> OursDiffLines
2626
{
2727
get => _oursDiffLines;
2828
private set => SetProperty(ref _oursDiffLines, value);
2929
}
3030

31-
public List<Models.TextDiffLine> TheirsDiffLines
31+
public List<Models.ConflictLine> TheirsDiffLines
3232
{
3333
get => _theirsDiffLines;
3434
private set => SetProperty(ref _theirsDiffLines, value);
3535
}
3636

37-
public List<Models.TextDiffLine> ResultDiffLines
37+
public List<Models.ConflictLine> ResultDiffLines
3838
{
3939
get => _resultDiffLines;
4040
private set => SetProperty(ref _resultDiffLines, value);
@@ -207,8 +207,8 @@ private void ParseOriginalContent(string content)
207207
return;
208208

209209
var lines = content.Split('\n', StringSplitOptions.None);
210-
var oursLines = new List<Models.TextDiffLine>();
211-
var theirsLines = new List<Models.TextDiffLine>();
210+
var oursLines = new List<Models.ConflictLine>();
211+
var theirsLines = new List<Models.ConflictLine>();
212212
int oursLineNumber = 1;
213213
int theirsLineNumber = 1;
214214
int i = 0;
@@ -225,16 +225,19 @@ private void ParseOriginalContent(string content)
225225
StartMarker = line,
226226
};
227227

228-
oursLines.Add(new Models.TextDiffLine());
229-
theirsLines.Add(new Models.TextDiffLine());
228+
oursLines.Add(new());
229+
theirsLines.Add(new());
230230
i++;
231231

232232
// Collect ours content
233233
while (i < lines.Length &&
234234
!lines[i].StartsWith("|||||||", StringComparison.Ordinal) &&
235235
!lines[i].StartsWith("=======", StringComparison.Ordinal))
236236
{
237-
region.OursContent.Add(lines[i]);
237+
line = lines[i];
238+
region.OursContent.Add(line);
239+
oursLines.Add(new(Models.ConflictLineType.Ours, line, oursLineNumber++));
240+
theirsLines.Add(new());
238241
i++;
239242
}
240243

@@ -249,36 +252,27 @@ private void ParseOriginalContent(string content)
249252
// Capture separator marker
250253
if (i < lines.Length && lines[i].StartsWith("=======", StringComparison.Ordinal))
251254
{
252-
oursLines.Add(new Models.TextDiffLine());
253-
theirsLines.Add(new Models.TextDiffLine());
255+
oursLines.Add(new());
256+
theirsLines.Add(new());
254257
region.SeparatorMarker = lines[i];
255258
i++;
256259
}
257260

258261
// Collect theirs content
259262
while (i < lines.Length && !lines[i].StartsWith(">>>>>>>", StringComparison.Ordinal))
260263
{
261-
region.TheirsContent.Add(lines[i]);
264+
line = lines[i];
265+
region.TheirsContent.Add(line);
266+
oursLines.Add(new());
267+
theirsLines.Add(new(Models.ConflictLineType.Theirs, line, theirsLineNumber++));
262268
i++;
263269
}
264270

265-
foreach (var mine in region.OursContent)
266-
{
267-
oursLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, mine, oursLineNumber++, 0));
268-
theirsLines.Add(new Models.TextDiffLine());
269-
}
270-
271-
foreach (var theirs in region.TheirsContent)
272-
{
273-
oursLines.Add(new Models.TextDiffLine());
274-
theirsLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, theirs, 0, theirsLineNumber++));
275-
}
276-
277271
// Capture end marker (e.g., ">>>>>>> feature-branch")
278272
if (i < lines.Length && lines[i].StartsWith(">>>>>>>", StringComparison.Ordinal))
279273
{
280-
oursLines.Add(new Models.TextDiffLine());
281-
theirsLines.Add(new Models.TextDiffLine());
274+
oursLines.Add(new());
275+
theirsLines.Add(new());
282276

283277
region.EndMarker = lines[i];
284278
region.EndLineInOriginal = i;
@@ -289,8 +283,8 @@ private void ParseOriginalContent(string content)
289283
}
290284
else
291285
{
292-
oursLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Normal, line, oursLineNumber, oursLineNumber));
293-
theirsLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Normal, line, theirsLineNumber, theirsLineNumber));
286+
oursLines.Add(new(Models.ConflictLineType.Common, line, oursLineNumber));
287+
theirsLines.Add(new(Models.ConflictLineType.Common, line, theirsLineNumber));
294288
i++;
295289
oursLineNumber++;
296290
theirsLineNumber++;
@@ -305,7 +299,7 @@ private void ParseOriginalContent(string content)
305299

306300
private void RefreshDisplayData()
307301
{
308-
var resultLines = new List<Models.TextDiffLine>();
302+
var resultLines = new List<Models.ConflictLine>();
309303
_lineStates.Clear();
310304

311305
if (_oursDiffLines == null || _oursDiffLines.Count == 0)
@@ -343,14 +337,14 @@ private void RefreshDisplayData()
343337
int mineCount = currentRegion.OursContent.Count;
344338
for (int i = 0; i < mineCount; i++)
345339
{
346-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, currentRegion.OursContent[i], resultLineNumber, resultLineNumber));
340+
resultLines.Add(new(Models.ConflictLineType.Ours, currentRegion.OursContent[i], resultLineNumber));
347341
resultLineNumber++;
348342
}
349343

350344
int theirsCount = currentRegion.TheirsContent.Count;
351345
for (int i = 0; i < theirsCount; i++)
352346
{
353-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, currentRegion.TheirsContent[i], resultLineNumber, resultLineNumber));
347+
resultLines.Add(new(Models.ConflictLineType.Theirs, currentRegion.TheirsContent[i], resultLineNumber));
354348
resultLineNumber++;
355349
}
356350
}
@@ -359,14 +353,14 @@ private void RefreshDisplayData()
359353
int theirsCount = currentRegion.TheirsContent.Count;
360354
for (int i = 0; i < theirsCount; i++)
361355
{
362-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, currentRegion.TheirsContent[i], resultLineNumber, resultLineNumber));
356+
resultLines.Add(new(Models.ConflictLineType.Theirs, currentRegion.TheirsContent[i], resultLineNumber));
363357
resultLineNumber++;
364358
}
365359

366360
int mineCount = currentRegion.OursContent.Count;
367361
for (int i = 0; i < mineCount; i++)
368362
{
369-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, currentRegion.OursContent[i], resultLineNumber, resultLineNumber));
363+
resultLines.Add(new(Models.ConflictLineType.Ours, currentRegion.OursContent[i], resultLineNumber));
370364
resultLineNumber++;
371365
}
372366
}
@@ -375,7 +369,7 @@ private void RefreshDisplayData()
375369
int mineCount = currentRegion.OursContent.Count;
376370
for (int i = 0; i < mineCount; i++)
377371
{
378-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, currentRegion.OursContent[i], resultLineNumber, resultLineNumber));
372+
resultLines.Add(new(Models.ConflictLineType.Ours, currentRegion.OursContent[i], resultLineNumber));
379373
resultLineNumber++;
380374
}
381375
}
@@ -384,7 +378,7 @@ private void RefreshDisplayData()
384378
int theirsCount = currentRegion.TheirsContent.Count;
385379
for (int i = 0; i < theirsCount; i++)
386380
{
387-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, currentRegion.TheirsContent[i], resultLineNumber, resultLineNumber));
381+
resultLines.Add(new(Models.ConflictLineType.Theirs, currentRegion.TheirsContent[i], resultLineNumber));
388382
resultLineNumber++;
389383
}
390384
}
@@ -393,7 +387,7 @@ private void RefreshDisplayData()
393387
int added = resultLines.Count - oldLineCount;
394388
int padding = regionLines - added;
395389
for (int p = 0; p < padding; p++)
396-
resultLines.Add(new Models.TextDiffLine());
390+
resultLines.Add(new());
397391

398392
int blockSize = resultLines.Count - oldLineCount - 2;
399393
_lineStates.Add(Models.ConflictLineState.ResolvedBlockStart);
@@ -403,31 +397,25 @@ private void RefreshDisplayData()
403397
}
404398
else
405399
{
406-
// Unresolved - show conflict markers with content, aligned with Mine/Theirs
407-
// First line: start marker (use real marker from file)
408-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Indicator, currentRegion.StartMarker, 0, 0));
400+
resultLines.Add(new(Models.ConflictLineType.Marker, currentRegion.StartMarker));
409401
_lineStates.Add(Models.ConflictLineState.ConflictBlockStart);
410402

411-
// Mine content lines (matches the deleted lines in Ours panel)
412403
foreach (var line in currentRegion.OursContent)
413404
{
414-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, line, 0, resultLineNumber++));
405+
resultLines.Add(new(Models.ConflictLineType.Ours, line, resultLineNumber++));
415406
_lineStates.Add(Models.ConflictLineState.ConflictBlock);
416407
}
417408

418-
// Separator marker between Mine and Theirs
419-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Indicator, currentRegion.SeparatorMarker, 0, 0));
409+
resultLines.Add(new(Models.ConflictLineType.Marker, currentRegion.SeparatorMarker));
420410
_lineStates.Add(Models.ConflictLineState.ConflictBlock);
421411

422-
// Theirs content lines (matches the added lines in Theirs panel)
423412
foreach (var line in currentRegion.TheirsContent)
424413
{
425-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, line, 0, resultLineNumber++));
414+
resultLines.Add(new(Models.ConflictLineType.Theirs, line, resultLineNumber++));
426415
_lineStates.Add(Models.ConflictLineState.ConflictBlock);
427416
}
428417

429-
// End marker (use real marker from file)
430-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Indicator, currentRegion.EndMarker, 0, 0));
418+
resultLines.Add(new(Models.ConflictLineType.Marker, currentRegion.EndMarker));
431419
_lineStates.Add(Models.ConflictLineState.ConflictBlockEnd);
432420
}
433421

@@ -436,20 +424,10 @@ private void RefreshDisplayData()
436424
}
437425
else
438426
{
439-
// Normal line - copy from ours panel
440427
var oursLine = _oursDiffLines[currentLine];
441-
if (oursLine.Type == Models.TextDiffLineType.Normal)
442-
{
443-
resultLines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Normal, oursLine.Content, resultLineNumber, resultLineNumber));
444-
resultLineNumber++;
445-
}
446-
else
447-
{
448-
// Empty placeholder line (shouldn't happen outside conflicts, but handle it)
449-
resultLines.Add(new Models.TextDiffLine());
450-
}
451-
428+
resultLines.Add(new(oursLine.Type, oursLine.Content, resultLineNumber));
452429
_lineStates.Add(Models.ConflictLineState.Normal);
430+
resultLineNumber++;
453431
currentLine++;
454432
}
455433
}
@@ -473,9 +451,9 @@ private void RefreshDisplayData()
473451
private string _originalContent = string.Empty;
474452
private int _unsolvedCount = 0;
475453
private int _diffMaxLineNumber = 0;
476-
private List<Models.TextDiffLine> _oursDiffLines = [];
477-
private List<Models.TextDiffLine> _theirsDiffLines = [];
478-
private List<Models.TextDiffLine> _resultDiffLines = [];
454+
private List<Models.ConflictLine> _oursDiffLines = [];
455+
private List<Models.ConflictLine> _theirsDiffLines = [];
456+
private List<Models.ConflictLine> _resultDiffLines = [];
479457
private List<Models.ConflictRegion> _conflictRegions = [];
480458
private List<Models.ConflictLineState> _lineStates = [];
481459
private Vector _scrollOffset = Vector.Zero;

src/ViewModels/TextDiffContext.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
namespace SourceGit.ViewModels
77
{
8-
public record TextDiffDisplayRange(int Start, int End);
9-
108
public record TextDiffSelectedChunk(double Y, double Height, int StartIdx, int EndIdx, bool Combined, bool IsOldSide)
119
{
1210
public static bool IsChanged(TextDiffSelectedChunk oldValue, TextDiffSelectedChunk newValue)
@@ -43,7 +41,7 @@ public BlockNavigation BlockNavigation
4341
set => SetProperty(ref _blockNavigation, value);
4442
}
4543

46-
public TextDiffDisplayRange DisplayRange
44+
public TextLineRange DisplayRange
4745
{
4846
get => _displayRange;
4947
set => SetProperty(ref _displayRange, value);
@@ -161,7 +159,7 @@ protected void TryKeepPrevState(TextDiffContext prev, List<Models.TextDiffLine>
161159
protected Vector _scrollOffset = Vector.Zero;
162160
protected BlockNavigation _blockNavigation = null;
163161

164-
private TextDiffDisplayRange _displayRange = null;
162+
private TextLineRange _displayRange = null;
165163
private TextDiffSelectedChunk _selectedChunk = null;
166164
}
167165

src/ViewModels/TextLineRange.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
namespace SourceGit.ViewModels
2+
{
3+
public record TextLineRange(int Start, int End);
4+
}

0 commit comments

Comments
 (0)