feature: when toggle a local branch filter, if it has a tracked upstream branch, do the same for the upstream branch (#513)

This commit is contained in:
leo 2024-09-25 20:30:48 +08:00
parent 85b83990a8
commit a8ce4e6d95
No known key found for this signature in database
5 changed files with 54 additions and 16 deletions

View file

@ -15,10 +15,15 @@ namespace SourceGit.ViewModels
public string Name { get; private set; } = string.Empty; public string Name { get; private set; } = string.Empty;
public object Backend { get; private set; } = null; public object Backend { get; private set; } = null;
public int Depth { get; set; } = 0; public int Depth { get; set; } = 0;
public bool IsFiltered { get; set; } = false;
public bool IsSelected { get; set; } = false; public bool IsSelected { get; set; } = false;
public List<BranchTreeNode> Children { get; private set; } = new List<BranchTreeNode>(); public List<BranchTreeNode> Children { get; private set; } = new List<BranchTreeNode>();
public bool IsFiltered
{
get => _isFiltered;
set => SetProperty(ref _isFiltered, value);
}
public bool IsExpanded public bool IsExpanded
{ {
get => _isExpanded; get => _isExpanded;
@ -46,6 +51,7 @@ namespace SourceGit.ViewModels
get => Backend is Models.Branch b ? b.FriendlyName : null; get => Backend is Models.Branch b ? b.FriendlyName : null;
} }
private bool _isFiltered = false;
private bool _isExpanded = false; private bool _isExpanded = false;
private CornerRadius _cornerRadius = new CornerRadius(4); private CornerRadius _cornerRadius = new CornerRadius(4);

View file

@ -643,20 +643,24 @@ namespace SourceGit.ViewModels
NavigateToCommit(_currentBranch.Head); NavigateToCommit(_currentBranch.Head);
} }
public void UpdateFilter(string filter, bool toggle) public void UpdateFilters(List<string> filters, bool toggle)
{ {
var changed = false; var changed = false;
if (toggle) if (toggle)
{ {
if (!_settings.Filters.Contains(filter)) foreach (var filter in filters)
{ {
_settings.Filters.Add(filter); if (!_settings.Filters.Contains(filter))
changed = true; {
_settings.Filters.Add(filter);
changed = true;
}
} }
} }
else else
{ {
changed = _settings.Filters.Remove(filter); foreach (var filter in filters)
changed |= _settings.Filters.Remove(filter);
} }
if (changed) if (changed)

View file

@ -54,10 +54,10 @@
<!-- Name --> <!-- Name -->
<TextBlock Grid.Column="1" <TextBlock Grid.Column="1"
Text="{Binding Name}" Text="{Binding Name}"
Classes="primary" Classes="primary"
FontWeight="{Binding NameFontWeight}" FontWeight="{Binding NameFontWeight}"
TextTrimming="CharacterEllipsis"/> TextTrimming="CharacterEllipsis"/>
<!-- Tracking status --> <!-- Tracking status -->
<v:BranchTreeNodeTrackStatusPresenter Grid.Column="2" <v:BranchTreeNodeTrackStatusPresenter Grid.Column="2"
@ -72,9 +72,9 @@
Classes="filter" Classes="filter"
Margin="0,0,8,0" Margin="0,0,8,0"
Background="Transparent" Background="Transparent"
IsCheckedChanged="OnToggleFilter"
IsVisible="{Binding IsBranch}" IsVisible="{Binding IsBranch}"
IsChecked="{Binding IsFiltered}" IsChecked="{Binding IsFiltered}"
Click="OnToggleFilterClicked"
ToolTip.Tip="{DynamicResource Text.Filter}"/> ToolTip.Tip="{DynamicResource Text.Filter}"/>
</Grid> </Grid>
</Grid> </Grid>

View file

@ -428,12 +428,23 @@ namespace SourceGit.Views
} }
} }
private void OnToggleFilter(object sender, RoutedEventArgs e) private void OnToggleFilterClicked(object sender, RoutedEventArgs e)
{ {
if (sender is ToggleButton toggle && DataContext is ViewModels.Repository repo) if (DataContext is ViewModels.Repository repo &&
sender is ToggleButton toggle &&
toggle.DataContext is ViewModels.BranchTreeNode { Backend: Models.Branch branch } node)
{ {
if (toggle.DataContext is ViewModels.BranchTreeNode { Backend: Models.Branch branch }) bool filtered = toggle.IsChecked == true;
repo.UpdateFilter(branch.FullName, toggle.IsChecked == true); List<string> filters = [branch.FullName];
if (branch.IsLocal && !string.IsNullOrEmpty(branch.Upstream))
{
filters.Add(branch.Upstream);
node.IsFiltered = filtered;
UpdateUpstreamFilterState(repo.RemoteBranchTrees, branch.Upstream, filtered);
}
repo.UpdateFilters(filters, filtered);
} }
e.Handled = true; e.Handled = true;
@ -466,6 +477,23 @@ namespace SourceGit.Views
CollectBranchesInNode(outs, sub); CollectBranchesInNode(outs, sub);
} }
private bool UpdateUpstreamFilterState(List<ViewModels.BranchTreeNode> collection, string upstream, bool isFiltered)
{
foreach (var node in collection)
{
if (node.Backend is Models.Branch b && b.FullName == upstream)
{
node.IsFiltered = isFiltered;
return true;
}
if (node.Backend is Models.Remote r && upstream.StartsWith($"refs/remotes/{r.Name}/", StringComparison.Ordinal))
return UpdateUpstreamFilterState(node.Children, upstream, isFiltered);
}
return false;
}
private bool _disableSelectionChangingEvent = false; private bool _disableSelectionChangingEvent = false;
} }
} }

View file

@ -258,7 +258,7 @@ namespace SourceGit.Views
target = tag; target = tag;
if (target != null) if (target != null)
repo.UpdateFilter(target.Name, toggle.IsChecked == true); repo.UpdateFilters([target.Name], toggle.IsChecked == true);
} }
e.Handled = true; e.Handled = true;