Skip to content

Commit dbc95e7

Browse files
committed
refactor: move some method from view to its data source class
1 parent e64026d commit dbc95e7

File tree

3 files changed

+126
-127
lines changed

3 files changed

+126
-127
lines changed

src/Models/DiffResult.cs

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,80 @@ public partial class TextDiff
6969
public string Repo { get; set; } = null;
7070
public DiffOption Option { get; set; } = null;
7171

72+
public TextDiffSelection MakeSelection(int startLine, int endLine, bool isSideBySide, bool isOldSide)
73+
{
74+
var rs = new TextDiffSelection();
75+
rs.StartLine = startLine;
76+
rs.EndLine = endLine;
77+
78+
for (int i = 0; i < startLine - 1; i++)
79+
{
80+
var line = Lines[i];
81+
if (line.Type == TextDiffLineType.Added)
82+
{
83+
rs.HasLeftChanges = true;
84+
rs.IgnoredAdds++;
85+
}
86+
else if (line.Type == TextDiffLineType.Deleted)
87+
{
88+
rs.HasLeftChanges = true;
89+
rs.IgnoredDeletes++;
90+
}
91+
}
92+
93+
for (int i = startLine - 1; i < endLine; i++)
94+
{
95+
var line = Lines[i];
96+
if (line.Type == TextDiffLineType.Added)
97+
{
98+
if (!isSideBySide)
99+
{
100+
rs.HasChanges = true;
101+
break;
102+
}
103+
else if (isOldSide)
104+
{
105+
rs.HasLeftChanges = true;
106+
}
107+
else
108+
{
109+
rs.HasChanges = true;
110+
}
111+
}
112+
else if (line.Type == TextDiffLineType.Deleted)
113+
{
114+
if (!isSideBySide)
115+
{
116+
rs.HasChanges = true;
117+
break;
118+
}
119+
else if (isOldSide)
120+
{
121+
rs.HasChanges = true;
122+
}
123+
else
124+
{
125+
rs.HasLeftChanges = true;
126+
}
127+
}
128+
}
129+
130+
if (!rs.HasLeftChanges)
131+
{
132+
for (int i = endLine; i < Lines.Count; i++)
133+
{
134+
var line = Lines[i];
135+
if (line.Type == TextDiffLineType.Added || line.Type == TextDiffLineType.Deleted)
136+
{
137+
rs.HasLeftChanges = true;
138+
break;
139+
}
140+
}
141+
}
142+
143+
return rs;
144+
}
145+
72146
public void GenerateNewPatchFromSelection(Change change, string fileBlobGuid, TextDiffSelection selection, bool revert, string output)
73147
{
74148
var isTracked = !string.IsNullOrEmpty(fileBlobGuid);
@@ -392,9 +466,6 @@ public void GeneratePatchFromSelectionSingleSide(Change change, string fileTreeG
392466
System.IO.File.WriteAllText(output, builder.ToString());
393467
}
394468

395-
[GeneratedRegex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@")]
396-
private static partial Regex REG_INDICATOR();
397-
398469
private bool ProcessIndicatorForPatch(StringBuilder builder, TextDiffLine indicator, int idx, int start, int end, int ignoreRemoves, int ignoreAdds, bool revert, bool tailed)
399470
{
400471
var match = REG_INDICATOR().Match(indicator.Content);
@@ -554,6 +625,9 @@ private bool ProcessIndicatorForPatchSingleSide(StringBuilder builder, TextDiffL
554625
builder.Append($"\n@@ -{oldStart},{oldCount} +{newStart},{newCount} @@");
555626
return true;
556627
}
628+
629+
[GeneratedRegex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@")]
630+
private static partial Regex REG_INDICATOR();
557631
}
558632

559633
public class LFSDiff

src/ViewModels/TwoSideTextDiff.cs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
3+
24
using Avalonia;
5+
36
using CommunityToolkit.Mvvm.ComponentModel;
47

58
namespace SourceGit.ViewModels
@@ -53,6 +56,45 @@ public TwoSideTextDiff(Models.TextDiff diff, TwoSideTextDiff previous = null)
5356
_syncScrollOffset = previous._syncScrollOffset;
5457
}
5558

59+
public void ConvertsToCombinedRange(Models.TextDiff combined, ref int startLine, ref int endLine, bool isOldSide)
60+
{
61+
endLine = Math.Min(endLine, combined.Lines.Count);
62+
63+
var oneSide = isOldSide ? Old : New;
64+
var firstContentLine = -1;
65+
for (int i = startLine - 1; i < endLine; i++)
66+
{
67+
var line = oneSide[i];
68+
if (line.Type != Models.TextDiffLineType.None)
69+
{
70+
firstContentLine = i;
71+
break;
72+
}
73+
}
74+
75+
if (firstContentLine < 0)
76+
return;
77+
78+
var endContentLine = -1;
79+
for (int i = Math.Min(endLine - 1, oneSide.Count - 1); i >= startLine - 1; i--)
80+
{
81+
var line = oneSide[i];
82+
if (line.Type != Models.TextDiffLineType.None)
83+
{
84+
endContentLine = i;
85+
break;
86+
}
87+
}
88+
89+
if (endContentLine < 0)
90+
return;
91+
92+
var firstContent = oneSide[firstContentLine];
93+
var endContent = oneSide[endContentLine];
94+
startLine = combined.Lines.IndexOf(firstContent) + 1;
95+
endLine = combined.Lines.IndexOf(endContent) + 1;
96+
}
97+
5698
private void FillEmptyLines()
5799
{
58100
if (Old.Count < New.Count)

src/Views/TextDiffView.axaml.cs

Lines changed: 6 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,10 +1159,10 @@ public void FillContextMenuForWorkingCopyChange(ContextMenu menu, int startLine,
11591159
if (startLine > endLine)
11601160
(startLine, endLine) = (endLine, startLine);
11611161

1162-
if (UseSideBySideDiff)
1163-
(startLine, endLine) = GetUnifiedRange(diff, startLine, endLine, isOldSide);
1162+
if (Editor.Content is ViewModels.TwoSideTextDiff twoSides)
1163+
twoSides.ConvertsToCombinedRange(diff, ref startLine, ref endLine, isOldSide);
11641164

1165-
var selection = MakeSelection(diff, startLine, endLine, !UseSideBySideDiff, isOldSide);
1165+
var selection = diff.MakeSelection(startLine, endLine, UseSideBySideDiff, isOldSide);
11661166
if (!selection.HasChanges)
11671167
return;
11681168

@@ -1429,7 +1429,7 @@ private void OnStageChunk(object sender, RoutedEventArgs e)
14291429
if (change == null)
14301430
return;
14311431

1432-
var selection = MakeSelection(diff, chunk.StartIdx + 1, chunk.EndIdx + 1, true, false);
1432+
var selection = diff.MakeSelection(chunk.StartIdx + 1, chunk.EndIdx + 1, false, false);
14331433
if (!selection.HasChanges)
14341434
return;
14351435

@@ -1487,7 +1487,7 @@ private void OnUnstageChunk(object sender, RoutedEventArgs e)
14871487
if (change == null)
14881488
return;
14891489

1490-
var selection = MakeSelection(diff, chunk.StartIdx + 1, chunk.EndIdx + 1, true, false);
1490+
var selection = diff.MakeSelection(chunk.StartIdx + 1, chunk.EndIdx + 1, false, false);
14911491
if (!selection.HasChanges)
14921492
return;
14931493

@@ -1543,7 +1543,7 @@ private void OnDiscardChunk(object sender, RoutedEventArgs e)
15431543
if (change == null)
15441544
return;
15451545

1546-
var selection = MakeSelection(diff, chunk.StartIdx + 1, chunk.EndIdx + 1, true, false);
1546+
var selection = diff.MakeSelection(chunk.StartIdx + 1, chunk.EndIdx + 1, false, false);
15471547
if (!selection.HasChanges)
15481548
return;
15491549

@@ -1588,122 +1588,5 @@ private void OnDiscardChunk(object sender, RoutedEventArgs e)
15881588
repo.SetWatcherEnabled(true);
15891589
}
15901590
}
1591-
1592-
private (int, int) GetUnifiedRange(Models.TextDiff diff, int startLine, int endLine, bool isOldSide)
1593-
{
1594-
endLine = Math.Min(endLine, diff.Lines.Count);
1595-
if (Editor.Content is ViewModels.TwoSideTextDiff twoSides)
1596-
{
1597-
var target = isOldSide ? twoSides.Old : twoSides.New;
1598-
var firstContentLine = -1;
1599-
for (int i = startLine - 1; i < endLine; i++)
1600-
{
1601-
var line = target[i];
1602-
if (line.Type != Models.TextDiffLineType.None)
1603-
{
1604-
firstContentLine = i;
1605-
break;
1606-
}
1607-
}
1608-
1609-
if (firstContentLine < 0)
1610-
return (-1, -1);
1611-
1612-
var endContentLine = -1;
1613-
for (int i = Math.Min(endLine - 1, target.Count - 1); i >= startLine - 1; i--)
1614-
{
1615-
var line = target[i];
1616-
if (line.Type != Models.TextDiffLineType.None)
1617-
{
1618-
endContentLine = i;
1619-
break;
1620-
}
1621-
}
1622-
1623-
if (endContentLine < 0)
1624-
return (-1, -1);
1625-
1626-
var firstContent = target[firstContentLine];
1627-
var endContent = target[endContentLine];
1628-
startLine = diff.Lines.IndexOf(firstContent) + 1;
1629-
endLine = diff.Lines.IndexOf(endContent) + 1;
1630-
}
1631-
1632-
return (startLine, endLine);
1633-
}
1634-
1635-
private Models.TextDiffSelection MakeSelection(Models.TextDiff diff, int startLine, int endLine, bool combined, bool isOldSide)
1636-
{
1637-
var rs = new Models.TextDiffSelection();
1638-
rs.StartLine = startLine;
1639-
rs.EndLine = endLine;
1640-
1641-
for (int i = 0; i < startLine - 1; i++)
1642-
{
1643-
var line = diff.Lines[i];
1644-
if (line.Type == Models.TextDiffLineType.Added)
1645-
{
1646-
rs.HasLeftChanges = true;
1647-
rs.IgnoredAdds++;
1648-
}
1649-
else if (line.Type == Models.TextDiffLineType.Deleted)
1650-
{
1651-
rs.HasLeftChanges = true;
1652-
rs.IgnoredDeletes++;
1653-
}
1654-
}
1655-
1656-
for (int i = startLine - 1; i < endLine; i++)
1657-
{
1658-
var line = diff.Lines[i];
1659-
if (line.Type == Models.TextDiffLineType.Added)
1660-
{
1661-
if (combined)
1662-
{
1663-
rs.HasChanges = true;
1664-
break;
1665-
}
1666-
else if (isOldSide)
1667-
{
1668-
rs.HasLeftChanges = true;
1669-
}
1670-
else
1671-
{
1672-
rs.HasChanges = true;
1673-
}
1674-
}
1675-
else if (line.Type == Models.TextDiffLineType.Deleted)
1676-
{
1677-
if (combined)
1678-
{
1679-
rs.HasChanges = true;
1680-
break;
1681-
}
1682-
else if (isOldSide)
1683-
{
1684-
rs.HasChanges = true;
1685-
}
1686-
else
1687-
{
1688-
rs.HasLeftChanges = true;
1689-
}
1690-
}
1691-
}
1692-
1693-
if (!rs.HasLeftChanges)
1694-
{
1695-
for (int i = endLine; i < diff.Lines.Count; i++)
1696-
{
1697-
var line = diff.Lines[i];
1698-
if (line.Type == Models.TextDiffLineType.Added || line.Type == Models.TextDiffLineType.Deleted)
1699-
{
1700-
rs.HasLeftChanges = true;
1701-
break;
1702-
}
1703-
}
1704-
}
1705-
1706-
return rs;
1707-
}
17081591
}
17091592
}

0 commit comments

Comments
 (0)