diff --git a/src/ViewModels/BranchTreeNode.cs b/src/ViewModels/BranchTreeNode.cs index e3e65da0..cf04784e 100644 --- a/src/ViewModels/BranchTreeNode.cs +++ b/src/ViewModels/BranchTreeNode.cs @@ -15,10 +15,15 @@ namespace SourceGit.ViewModels public string Name { get; private set; } = string.Empty; public object Backend { get; private set; } = null; public int Depth { get; set; } = 0; - public bool IsFiltered { get; set; } = false; public bool IsSelected { get; set; } = false; public List Children { get; private set; } = new List(); + public bool IsFiltered + { + get => _isFiltered; + set => SetProperty(ref _isFiltered, value); + } + public bool IsExpanded { get => _isExpanded; @@ -46,6 +51,7 @@ namespace SourceGit.ViewModels get => Backend is Models.Branch b ? b.FriendlyName : null; } + private bool _isFiltered = false; private bool _isExpanded = false; private CornerRadius _cornerRadius = new CornerRadius(4); diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index c5673a8b..e2dbef65 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -643,20 +643,24 @@ namespace SourceGit.ViewModels NavigateToCommit(_currentBranch.Head); } - public void UpdateFilter(string filter, bool toggle) + public void UpdateFilters(List filters, bool toggle) { var changed = false; if (toggle) { - if (!_settings.Filters.Contains(filter)) + foreach (var filter in filters) { - _settings.Filters.Add(filter); - changed = true; + if (!_settings.Filters.Contains(filter)) + { + _settings.Filters.Add(filter); + changed = true; + } } } else { - changed = _settings.Filters.Remove(filter); + foreach (var filter in filters) + changed |= _settings.Filters.Remove(filter); } if (changed) diff --git a/src/Views/BranchTree.axaml b/src/Views/BranchTree.axaml index 9525631c..6df2dbb8 100644 --- a/src/Views/BranchTree.axaml +++ b/src/Views/BranchTree.axaml @@ -54,10 +54,10 @@ + Text="{Binding Name}" + Classes="primary" + FontWeight="{Binding NameFontWeight}" + TextTrimming="CharacterEllipsis"/> diff --git a/src/Views/BranchTree.axaml.cs b/src/Views/BranchTree.axaml.cs index bba91274..2ff498b4 100644 --- a/src/Views/BranchTree.axaml.cs +++ b/src/Views/BranchTree.axaml.cs @@ -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 }) - repo.UpdateFilter(branch.FullName, toggle.IsChecked == true); + bool filtered = toggle.IsChecked == true; + List 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; @@ -466,6 +477,23 @@ namespace SourceGit.Views CollectBranchesInNode(outs, sub); } + private bool UpdateUpstreamFilterState(List 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; } } diff --git a/src/Views/TagsView.axaml.cs b/src/Views/TagsView.axaml.cs index 9bb20aca..ea47876e 100644 --- a/src/Views/TagsView.axaml.cs +++ b/src/Views/TagsView.axaml.cs @@ -258,7 +258,7 @@ namespace SourceGit.Views target = tag; if (target != null) - repo.UpdateFilter(target.Name, toggle.IsChecked == true); + repo.UpdateFilters([target.Name], toggle.IsChecked == true); } e.Handled = true;