Skip to content

Commit a4f3fa7

Browse files
committed
refactor: selection change by folder will never show the diff results (#2661)
Signed-off-by: leo <longshuang@msn.cn>
1 parent b9ce510 commit a4f3fa7

21 files changed

Lines changed: 732 additions & 612 deletions

src/ViewModels/ChangeSelection.cs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
4+
namespace SourceGit.ViewModels
5+
{
6+
public class ChangeSelection
7+
{
8+
public List<Models.Change> Changes { get; }
9+
public bool IsSingleFolder { get; }
10+
public string SingleFolderPath { get; }
11+
12+
public int Count => Changes.Count;
13+
14+
public ChangeSelection(IList selected)
15+
{
16+
var changes = new List<Models.Change>();
17+
18+
IsSingleFolder = false;
19+
SingleFolderPath = null;
20+
21+
if (selected is { Count: > 0 })
22+
{
23+
foreach (var item in selected)
24+
{
25+
if (item is Models.Change c)
26+
changes.Add(c);
27+
else if (item is ChangeTreeNode node)
28+
CollectChangesInNode(changes, node);
29+
}
30+
31+
if (selected.Count == 1 && selected[0] is ChangeTreeNode { IsFolder: true } folder)
32+
{
33+
IsSingleFolder = true;
34+
SingleFolderPath = folder.FullPath;
35+
}
36+
}
37+
38+
Changes = changes;
39+
}
40+
41+
public bool IsChanged(ChangeSelection other)
42+
{
43+
if (other == null ||
44+
IsSingleFolder != other.IsSingleFolder ||
45+
SingleFolderPath != other.SingleFolderPath ||
46+
Changes.Count != other.Changes.Count)
47+
return true;
48+
49+
foreach (var c in other.Changes)
50+
{
51+
if (!Changes.Contains(c))
52+
return true;
53+
}
54+
55+
return false;
56+
}
57+
58+
private static void CollectChangesInNode(List<Models.Change> outs, ChangeTreeNode node)
59+
{
60+
if (node.IsFolder)
61+
{
62+
foreach (var child in node.Children)
63+
CollectChangesInNode(outs, child);
64+
}
65+
else
66+
{
67+
if (!outs.Contains(node.Change))
68+
outs.Add(node.Change);
69+
}
70+
}
71+
}
72+
}

src/ViewModels/CommitDetail.cs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ public int ActiveTabIndex
4242
_sharedData.ActiveTabIndex = value;
4343
OnPropertyChanged(nameof(ActiveTabIndex));
4444

45-
if (value == 1 && DiffContext == null && _selectedChanges is { Count: 1 })
46-
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_commit, _selectedChanges[0]));
45+
if (DiffContext == null)
46+
UpdateDetails();
4747
}
4848
}
4949
}
@@ -91,18 +91,13 @@ public List<Models.Change> VisibleChanges
9191
set => SetProperty(ref _visibleChanges, value);
9292
}
9393

94-
public List<Models.Change> SelectedChanges
94+
public ChangeSelection ChangeSelection
9595
{
96-
get => _selectedChanges;
96+
get => _changeSelection;
9797
set
9898
{
99-
if (SetProperty(ref _selectedChanges, value))
100-
{
101-
if (ActiveTabIndex != 1 || value is not { Count: 1 })
102-
DiffContext = null;
103-
else
104-
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_commit, value[0]), _diffContext);
105-
}
99+
if (SetProperty(ref _changeSelection, value))
100+
UpdateDetails();
106101
}
107102
}
108103

@@ -473,7 +468,7 @@ private void Refresh()
473468
{
474469
Changes = [];
475470
VisibleChanges = [];
476-
SelectedChanges = null;
471+
ChangeSelection = new(null);
477472
return;
478473
}
479474

@@ -536,14 +531,22 @@ private void Refresh()
536531
VisibleChanges = visible;
537532

538533
if (visible.Count == 0)
539-
SelectedChanges = null;
534+
ChangeSelection = new(null);
540535
else
541-
SelectedChanges = [VisibleChanges[0]];
536+
ChangeSelection = new(VisibleChanges.GetRange(0, 1));
542537
});
543538
}
544539
}, token);
545540
}
546541

542+
private void UpdateDetails()
543+
{
544+
if (ActiveTabIndex == 1 && _changeSelection is { Count: 1, IsSingleFolder: false })
545+
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_commit, _changeSelection.Changes[0]), _diffContext);
546+
else
547+
DiffContext = null;
548+
}
549+
547550
private async Task<Models.InlineElementCollector> ParseInlinesInMessageAsync(string message)
548551
{
549552
var inlines = new Models.InlineElementCollector();
@@ -737,7 +740,7 @@ private async Task SetViewingCommitAsync(Models.Object file)
737740
private Models.CommitSignInfo _signInfo = null;
738741
private List<Models.Change> _changes = [];
739742
private List<Models.Change> _visibleChanges = [];
740-
private List<Models.Change> _selectedChanges = null;
743+
private ChangeSelection _changeSelection = new(null);
741744
private string _searchChangeFilter = string.Empty;
742745
private DiffContext _diffContext = null;
743746
private string _viewRevisionFilePath = string.Empty;

src/ViewModels/Compare.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,15 @@ public List<Models.Change> VisibleChanges
6868
private set => SetProperty(ref _visibleChanges, value);
6969
}
7070

71-
public List<Models.Change> SelectedChanges
71+
public ChangeSelection ChangeSelection
7272
{
73-
get => _selectedChanges;
73+
get => _changeSelection;
7474
set
7575
{
76-
if (SetProperty(ref _selectedChanges, value))
76+
if (SetProperty(ref _changeSelection, value))
7777
{
78-
if (value is { Count: 1 })
79-
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_based, _to, value[0]), _diffContext);
78+
if (value is { Count: 1, IsSingleFolder: false })
79+
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_based, _to, value.Changes[0]), _diffContext);
8080
else
8181
DiffContext = null;
8282
}
@@ -309,7 +309,7 @@ private void UpdateChanges()
309309
{
310310
IsLoadingChanges = true;
311311
VisibleChanges = [];
312-
SelectedChanges = [];
312+
ChangeSelection = new(null);
313313

314314
Task.Run(async () =>
315315
{
@@ -335,9 +335,7 @@ private void UpdateChanges()
335335
IsLoadingChanges = false;
336336

337337
if (VisibleChanges.Count > 0)
338-
SelectedChanges = [VisibleChanges[0]];
339-
else
340-
SelectedChanges = [];
338+
ChangeSelection = new(VisibleChanges.GetRange(0, 1));
341339
});
342340
});
343341
}
@@ -400,7 +398,7 @@ private string GetSHA(object obj)
400398
private int _totalChanges = 0;
401399
private List<Models.Change> _changes = null;
402400
private List<Models.Change> _visibleChanges = null;
403-
private List<Models.Change> _selectedChanges = null;
401+
private ChangeSelection _changeSelection = new(null);
404402
private List<Models.Commit> _leftOnlyCommits = [];
405403
private List<Models.Commit> _rightOnlyCommits = [];
406404
private string _searchFilter = string.Empty;

src/ViewModels/RevisionCompare.cs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,17 @@ public List<Models.Change> VisibleChanges
6565
private set => SetProperty(ref _visibleChanges, value);
6666
}
6767

68-
public List<Models.Change> SelectedChanges
68+
public ChangeSelection ChangeSelection
6969
{
70-
get => _selectedChanges;
70+
get => _changeSelection;
7171
set
7272
{
73-
if (SetProperty(ref _selectedChanges, value))
73+
if (SetProperty(ref _changeSelection, value))
7474
{
75-
if (value is { Count: 1 })
76-
{
77-
var option = new Models.DiffOption(GetSHA(_startPoint), GetSHA(_endPoint), value[0]);
78-
DiffContext = new DiffContext(_repo.FullPath, option, _diffContext);
79-
}
75+
if (value is { Count: 1, IsSingleFolder: false })
76+
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(GetSHA(_startPoint), GetSHA(_endPoint), value.Changes[0]), _diffContext);
8077
else
81-
{
8278
DiffContext = null;
83-
}
8479
}
8580
}
8681
}
@@ -146,7 +141,7 @@ public void Swap()
146141
{
147142
(StartPoint, EndPoint) = (_endPoint, _startPoint);
148143
VisibleChanges = [];
149-
SelectedChanges = [];
144+
ChangeSelection = new(null);
150145
IsLoading = true;
151146
Refresh();
152147
}
@@ -372,9 +367,9 @@ private void Refresh()
372367
IsLoading = false;
373368

374369
if (VisibleChanges.Count > 0)
375-
SelectedChanges = [VisibleChanges[0]];
370+
ChangeSelection = new(VisibleChanges.GetRange(0, 1));
376371
else
377-
SelectedChanges = [];
372+
ChangeSelection = new(null);
378373
});
379374
});
380375
}
@@ -396,7 +391,7 @@ private string GetDesc(object obj)
396391
private int _totalChanges = 0;
397392
private List<Models.Change> _changes = null;
398393
private List<Models.Change> _visibleChanges = null;
399-
private List<Models.Change> _selectedChanges = null;
394+
private ChangeSelection _changeSelection = new(null);
400395
private string _searchFilter = string.Empty;
401396
private DiffContext _diffContext = null;
402397
}

src/ViewModels/StashesPage.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,23 @@ public List<Models.Change> Changes
9393
private set
9494
{
9595
if (SetProperty(ref _changes, value))
96-
SelectedChanges = value is { Count: > 0 } ? [value[0]] : [];
96+
ChangeSelection = new(value is { Count: > 0 } ? value.GetRange(0, 1) : null);
9797
}
9898
}
9999

100-
public List<Models.Change> SelectedChanges
100+
public ChangeSelection ChangeSelection
101101
{
102-
get => _selectedChanges;
102+
get => _changeSelection;
103103
set
104104
{
105-
if (SetProperty(ref _selectedChanges, value))
105+
if (SetProperty(ref _changeSelection, value))
106106
{
107-
if (value is not { Count: 1 })
107+
if (value is not { Count: 1, IsSingleFolder: false })
108108
DiffContext = null;
109-
else if (_untracked.Contains(value[0]))
110-
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_selectedStash.UntrackedParent, _selectedStash.Parents[2], value[0]), _diffContext);
109+
else if (_untracked.Contains(value.Changes[0]))
110+
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_selectedStash.UntrackedParent, _selectedStash.Parents[2], value.Changes[0]), _diffContext);
111111
else
112-
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_selectedStash.Parents[0], _selectedStash.SHA, value[0]), _diffContext);
112+
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_selectedStash.Parents[0], _selectedStash.SHA, value.Changes[0]), _diffContext);
113113
}
114114
}
115115
}
@@ -281,7 +281,7 @@ private void RefreshVisible()
281281
private Models.Stash _selectedStash = null;
282282
private List<Models.Change> _changes = null;
283283
private List<Models.Change> _untracked = [];
284-
private List<Models.Change> _selectedChanges = [];
284+
private ChangeSelection _changeSelection = new(null);
285285
private DiffContext _diffContext = null;
286286
}
287287
}

src/ViewModels/SubmoduleRevisionCompare.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ public List<Models.Change> VisibleChanges
3838
private set => SetProperty(ref _visibleChanges, value);
3939
}
4040

41-
public List<Models.Change> SelectedChanges
41+
public ChangeSelection ChangeSelection
4242
{
43-
get => _selectedChanges;
43+
get => _changeSelection;
4444
set
4545
{
46-
if (SetProperty(ref _selectedChanges, value))
46+
if (SetProperty(ref _changeSelection, value))
4747
{
48-
if (value is { Count: 1 })
49-
DiffContext = new DiffContext(_repo, new Models.DiffOption(_base.SHA, _to.SHA, value[0]), _diffContext);
48+
if (value is { Count: 1, IsSingleFolder: false })
49+
DiffContext = new DiffContext(_repo, new Models.DiffOption(_base.SHA, _to.SHA, value.Changes[0]), _diffContext);
5050
else
5151
DiffContext = null;
5252
}
@@ -108,7 +108,7 @@ private void Refresh()
108108
{
109109
IsLoading = true;
110110
VisibleChanges = [];
111-
SelectedChanges = [];
111+
ChangeSelection = new(null);
112112

113113
Task.Run(async () =>
114114
{
@@ -134,9 +134,7 @@ private void Refresh()
134134
IsLoading = false;
135135

136136
if (VisibleChanges.Count > 0)
137-
SelectedChanges = [VisibleChanges[0]];
138-
else
139-
SelectedChanges = [];
137+
ChangeSelection = new(VisibleChanges.GetRange(0, 1));
140138
});
141139
});
142140
}
@@ -170,7 +168,7 @@ private void RefreshVisible()
170168
private int _totalChanges = 0;
171169
private List<Models.Change> _changes = null;
172170
private List<Models.Change> _visibleChanges = null;
173-
private List<Models.Change> _selectedChanges = null;
171+
private ChangeSelection _changeSelection = new(null);
174172
private string _searchFilter = string.Empty;
175173
private DiffContext _diffContext = null;
176174
}

0 commit comments

Comments
 (0)