Skip to content

Commit 44557c0

Browse files
committed
enhance: clear histories filter if there's a filter that has different modes with the new one (#690)
Signed-off-by: leo <[email protected]>
1 parent a53787c commit 44557c0

File tree

4 files changed

+100
-69
lines changed

4 files changed

+100
-69
lines changed

src/Models/RepositorySettings.cs

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -169,35 +169,53 @@ public FilterMode GetHistoriesFilterMode(string pattern, FilterType type)
169169

170170
public bool UpdateHistoriesFilter(string pattern, FilterType type, FilterMode mode)
171171
{
172-
for (int i = 0; i < HistoriesFilters.Count; i++)
172+
// Clear all filters when there's a filter that has different mode.
173+
if (mode != FilterMode.None)
173174
{
174-
var filter = HistoriesFilters[i];
175-
if (filter.Type != type)
176-
continue;
177-
178-
if (filter.Pattern.Equals(pattern, StringComparison.Ordinal))
175+
var clear = false;
176+
foreach (var filter in HistoriesFilters)
179177
{
180-
if (mode == FilterMode.None)
178+
if (filter.Mode != mode)
181179
{
182-
HistoriesFilters.RemoveAt(i);
183-
return true;
180+
clear = true;
181+
break;
184182
}
183+
}
185184

186-
if (mode != filter.Mode)
185+
if (clear)
186+
{
187+
HistoriesFilters.Clear();
188+
HistoriesFilters.Add(new Filter(pattern, type, mode));
189+
return true;
190+
}
191+
}
192+
else
193+
{
194+
for (int i = 0; i < HistoriesFilters.Count; i++)
195+
{
196+
var filter = HistoriesFilters[i];
197+
if (filter.Type == type && filter.Pattern.Equals(pattern, StringComparison.Ordinal))
187198
{
188-
filter.Mode = mode;
199+
HistoriesFilters.RemoveAt(i);
189200
return true;
190201
}
191202
}
203+
204+
return false;
192205
}
193206

194-
if (mode != FilterMode.None)
207+
for (int i = 0; i < HistoriesFilters.Count; i++)
195208
{
196-
HistoriesFilters.Add(new Filter(pattern, type, mode));
197-
return true;
209+
var filter = HistoriesFilters[i];
210+
if (filter.Type != type)
211+
continue;
212+
213+
if (filter.Pattern.Equals(pattern, StringComparison.Ordinal))
214+
return false;
198215
}
199216

200-
return false;
217+
HistoriesFilters.Add(new Filter(pattern, type, mode));
218+
return true;
201219
}
202220

203221
public string BuildHistoriesFilter()

src/ViewModels/BranchTreeNode.cs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,6 @@ public class Builder
5959
public List<BranchTreeNode> Locals => _locals;
6060
public List<BranchTreeNode> Remotes => _remotes;
6161

62-
public Builder(Models.RepositorySettings settings)
63-
{
64-
_settings = settings;
65-
}
66-
6762
public void Run(List<Models.Branch> branches, List<Models.Remote> remotes, bool bForceExpanded)
6863
{
6964
var folders = new Dictionary<string, BranchTreeNode>();
@@ -77,7 +72,6 @@ public void Run(List<Models.Branch> branches, List<Models.Remote> remotes, bool
7772
Path = path,
7873
Backend = remote,
7974
IsExpanded = bForceExpanded || _expanded.Contains(path),
80-
FilterMode = _settings.GetHistoriesFilterMode(path, Models.FilterType.RemoteBranchFolder)
8175
};
8276

8377
folders.Add(path, node);
@@ -120,9 +114,6 @@ public void CollectExpandedNodes(List<BranchTreeNode> nodes)
120114
private void MakeBranchNode(Models.Branch branch, List<BranchTreeNode> roots, Dictionary<string, BranchTreeNode> folders, string prefix, bool bForceExpanded)
121115
{
122116
var fullpath = $"{prefix}/{branch.Name}";
123-
var branchFilterType = branch.IsLocal ? Models.FilterType.LocalBranch : Models.FilterType.RemoteBranch;
124-
var folderFilterType = branch.IsLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder;
125-
126117
var sepIdx = branch.Name.IndexOf('/', StringComparison.Ordinal);
127118
if (sepIdx == -1 || branch.IsDetachedHead)
128119
{
@@ -132,7 +123,6 @@ private void MakeBranchNode(Models.Branch branch, List<BranchTreeNode> roots, Di
132123
Path = fullpath,
133124
Backend = branch,
134125
IsExpanded = false,
135-
FilterMode = _settings.GetHistoriesFilterMode(fullpath, branchFilterType),
136126
});
137127
return;
138128
}
@@ -157,7 +147,6 @@ private void MakeBranchNode(Models.Branch branch, List<BranchTreeNode> roots, Di
157147
Name = name,
158148
Path = folder,
159149
IsExpanded = bForceExpanded || branch.IsCurrent || _expanded.Contains(folder),
160-
FilterMode = _settings.GetHistoriesFilterMode(folder, folderFilterType),
161150
};
162151
roots.Add(lastFolder);
163152
folders.Add(folder, lastFolder);
@@ -169,7 +158,6 @@ private void MakeBranchNode(Models.Branch branch, List<BranchTreeNode> roots, Di
169158
Name = name,
170159
Path = folder,
171160
IsExpanded = bForceExpanded || branch.IsCurrent || _expanded.Contains(folder),
172-
FilterMode = _settings.GetHistoriesFilterMode(folder, folderFilterType),
173161
};
174162
lastFolder.Children.Add(cur);
175163
folders.Add(folder, cur);
@@ -186,7 +174,6 @@ private void MakeBranchNode(Models.Branch branch, List<BranchTreeNode> roots, Di
186174
Path = fullpath,
187175
Backend = branch,
188176
IsExpanded = false,
189-
FilterMode = _settings.GetHistoriesFilterMode(fullpath, branchFilterType),
190177
});
191178
}
192179

@@ -207,7 +194,6 @@ private void SortNodes(List<BranchTreeNode> nodes)
207194
SortNodes(node.Children);
208195
}
209196

210-
private readonly Models.RepositorySettings _settings = null;
211197
private readonly List<BranchTreeNode> _locals = new List<BranchTreeNode>();
212198
private readonly List<BranchTreeNode> _remotes = new List<BranchTreeNode>();
213199
private readonly HashSet<string> _expanded = new HashSet<string>();

src/ViewModels/Repository.cs

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -670,13 +670,17 @@ public void NavigateToCurrentHead()
670670
public void ClearHistoriesFilter()
671671
{
672672
_settings.HistoriesFilters.Clear();
673+
ResetBranchTreeFilterMode(LocalBranchTrees);
674+
ResetBranchTreeFilterMode(RemoteBranchTrees);
675+
ResetTagFilterMode();
676+
Task.Run(RefreshCommits);
677+
}
673678

674-
var builder = BuildBranchTree(_branches, _remotes);
675-
LocalBranchTrees = builder.Locals;
676-
RemoteBranchTrees = builder.Remotes;
677-
foreach (var tag in VisibleTags)
678-
tag.FilterMode = Models.FilterMode.None;
679-
679+
public void MarkHistoriesFilterDirty()
680+
{
681+
UpdateBranchTreeFilterMode(LocalBranchTrees, true);
682+
UpdateBranchTreeFilterMode(RemoteBranchTrees, false);
683+
UpdateTagFilterMode();
680684
Task.Run(RefreshCommits);
681685
}
682686

@@ -1957,7 +1961,7 @@ private MenuItem CreateMenuItemToCompareBranches(Models.Branch branch)
19571961

19581962
private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, List<Models.Remote> remotes)
19591963
{
1960-
var builder = new BranchTreeNode.Builder(_settings);
1964+
var builder = new BranchTreeNode.Builder();
19611965
if (string.IsNullOrEmpty(_filter))
19621966
{
19631967
builder.CollectExpandedNodes(_localBranchTrees);
@@ -1976,6 +1980,8 @@ private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, Lis
19761980
builder.Run(visibles, remotes, true);
19771981
}
19781982

1983+
UpdateBranchTreeFilterMode(builder.Locals, true);
1984+
UpdateBranchTreeFilterMode(builder.Remotes, false);
19791985
return builder;
19801986
}
19811987

@@ -1995,6 +2001,7 @@ private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, Lis
19952001
}
19962002
}
19972003

2004+
UpdateTagFilterMode();
19982005
return visible;
19992006
}
20002007

@@ -2016,6 +2023,44 @@ private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, Lis
20162023
return visible;
20172024
}
20182025

2026+
private void UpdateBranchTreeFilterMode(List<BranchTreeNode> nodes, bool isLocal)
2027+
{
2028+
foreach (var node in nodes)
2029+
{
2030+
if (node.IsBranch)
2031+
{
2032+
node.FilterMode = _settings.GetHistoriesFilterMode(node.Path, isLocal ? Models.FilterType.LocalBranch : Models.FilterType.RemoteBranch);
2033+
}
2034+
else
2035+
{
2036+
node.FilterMode = _settings.GetHistoriesFilterMode(node.Path, isLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder);
2037+
UpdateBranchTreeFilterMode(node.Children, isLocal);
2038+
}
2039+
}
2040+
}
2041+
2042+
private void UpdateTagFilterMode()
2043+
{
2044+
foreach (var tag in _tags)
2045+
tag.FilterMode = _settings.GetHistoriesFilterMode(tag.Name, Models.FilterType.Tag);
2046+
}
2047+
2048+
private void ResetBranchTreeFilterMode(List<BranchTreeNode> nodes)
2049+
{
2050+
foreach (var node in nodes)
2051+
{
2052+
node.FilterMode = Models.FilterMode.None;
2053+
if (!node.IsBranch)
2054+
ResetBranchTreeFilterMode(node.Children);
2055+
}
2056+
}
2057+
2058+
private void ResetTagFilterMode()
2059+
{
2060+
foreach (var tag in _tags)
2061+
tag.FilterMode = Models.FilterMode.None;
2062+
}
2063+
20192064
private void UpdateCurrentRevisionFilesForSearchSuggestion()
20202065
{
20212066
_revisionFiles.Clear();

src/Views/FilterModeSwitchButton.axaml.cs

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,7 @@ private void OnChangeFilterModeButtonClicked(object sender, RoutedEventArgs e)
172172
private void UpdateTagFilterMode(ViewModels.Repository repo, Models.Tag tag, Models.FilterMode mode)
173173
{
174174
var changed = repo.Settings.UpdateHistoriesFilter(tag.Name, Models.FilterType.Tag, mode);
175-
if (changed)
176-
{
177-
tag.FilterMode = mode;
178-
Task.Run(repo.RefreshCommits);
179-
}
175+
repo.MarkHistoriesFilterDirty();
180176
}
181177

182178
private void UpdateBranchFilterMode(ViewModels.Repository repo, ViewModels.BranchTreeNode node, Models.FilterMode mode)
@@ -191,38 +187,28 @@ private void UpdateBranchFilterMode(ViewModels.Repository repo, ViewModels.Branc
191187
if (!changed)
192188
return;
193189

194-
node.FilterMode = mode;
195-
196190
// Try to update its upstream.
197191
if (isLocal && !string.IsNullOrEmpty(branch.Upstream) && mode != Models.FilterMode.Excluded)
198192
{
199193
var upstream = branch.Upstream;
200-
var upstreamNode = FindBranchNode(repo.RemoteBranchTrees, upstream);
201-
if (upstreamNode != null)
194+
var canUpdateUpstream = true;
195+
foreach (var filter in repo.Settings.HistoriesFilters)
202196
{
203-
var canUpdateUpstream = true;
204-
foreach (var filter in repo.Settings.HistoriesFilters)
205-
{
206-
bool matched = false;
207-
if (filter.Type == Models.FilterType.RemoteBranch)
208-
matched = filter.Pattern.Equals(upstream, StringComparison.Ordinal);
209-
else if (filter.Type == Models.FilterType.RemoteBranchFolder)
210-
matched = upstream.StartsWith(filter.Pattern, StringComparison.Ordinal);
211-
212-
if (matched && filter.Mode == Models.FilterMode.Excluded)
213-
{
214-
canUpdateUpstream = false;
215-
break;
216-
}
217-
}
197+
bool matched = false;
198+
if (filter.Type == Models.FilterType.RemoteBranch)
199+
matched = filter.Pattern.Equals(upstream, StringComparison.Ordinal);
200+
else if (filter.Type == Models.FilterType.RemoteBranchFolder)
201+
matched = upstream.StartsWith(filter.Pattern, StringComparison.Ordinal);
218202

219-
if (canUpdateUpstream)
203+
if (matched && filter.Mode == Models.FilterMode.Excluded)
220204
{
221-
changed = repo.Settings.UpdateHistoriesFilter(upstream, Models.FilterType.RemoteBranch, mode);
222-
if (changed)
223-
upstreamNode.FilterMode = mode;
205+
canUpdateUpstream = false;
206+
break;
224207
}
225208
}
209+
210+
if (canUpdateUpstream)
211+
repo.Settings.UpdateHistoriesFilter(upstream, Models.FilterType.RemoteBranch, mode);
226212
}
227213
}
228214
else
@@ -231,7 +217,6 @@ private void UpdateBranchFilterMode(ViewModels.Repository repo, ViewModels.Branc
231217
if (!changed)
232218
return;
233219

234-
node.FilterMode = mode;
235220
ResetChildrenBranchNodeFilterMode(repo, node, isLocal);
236221
}
237222

@@ -249,19 +234,16 @@ private void UpdateBranchFilterMode(ViewModels.Repository repo, ViewModels.Branc
249234
break;
250235

251236
repo.Settings.UpdateHistoriesFilter(parent.Path, parentType, Models.FilterMode.None);
252-
parent.FilterMode = Models.FilterMode.None;
253237
cur = parent;
254238
} while (true);
255239

256-
Task.Run(repo.RefreshCommits);
240+
repo.MarkHistoriesFilterDirty();
257241
}
258242

259243
private void ResetChildrenBranchNodeFilterMode(ViewModels.Repository repo, ViewModels.BranchTreeNode node, bool isLocal)
260244
{
261245
foreach (var child in node.Children)
262246
{
263-
child.FilterMode = Models.FilterMode.None;
264-
265247
if (child.IsBranch)
266248
{
267249
var type = isLocal ? Models.FilterType.LocalBranch : Models.FilterType.RemoteBranch;

0 commit comments

Comments
 (0)