From 15c67e6b682d353b0105abef75c9e0e60e1ab9ad Mon Sep 17 00:00:00 2001 From: Gerhard Olsson Date: Sun, 13 Mar 2022 22:43:07 +0100 Subject: [PATCH] Share gitRefs when reloading after changing sort criterias --- .../RepoObjectsTree.BranchTree.cs | 4 ++-- .../RepoObjectsTree.ContextActions.cs | 15 +++--------- .../RepoObjectsTree.Nodes.Tags.cs | 4 ++-- .../BranchTreePanel/RepoObjectsTree.Nodes.cs | 8 +++---- .../RepoObjectsTree.RemoteBranchTree.cs | 4 ++-- GitUI/BranchTreePanel/RepoObjectsTree.cs | 16 +++++++++---- .../FormBrowse.InitRevisionGrid.cs | 2 +- .../RevisionGrid/RevisionGridControl.cs | 24 +++++++++---------- .../FilteredGitRefsProvider.cs | 13 ++++++---- .../GitUIPluginInterfaces/GitUIEventArgs.cs | 17 +++++++++---- 10 files changed, 60 insertions(+), 47 deletions(-) diff --git a/GitUI/BranchTreePanel/RepoObjectsTree.BranchTree.cs b/GitUI/BranchTreePanel/RepoObjectsTree.BranchTree.cs index b629632642f..1c9d5448e61 100644 --- a/GitUI/BranchTreePanel/RepoObjectsTree.BranchTree.cs +++ b/GitUI/BranchTreePanel/RepoObjectsTree.BranchTree.cs @@ -60,12 +60,12 @@ protected override async Task LoadNodesAsync(CancellationToken token, Fun } /// - protected internal override void Refresh() + protected internal override void Refresh(Func> getRefs) { // Break the local cache to ensure the data is requeried to reflect the required sort order. _loadedBranches = null; - base.Refresh(); + base.Refresh(getRefs); } private Nodes FillBranchTree(IReadOnlyList branches, CancellationToken token) diff --git a/GitUI/BranchTreePanel/RepoObjectsTree.ContextActions.cs b/GitUI/BranchTreePanel/RepoObjectsTree.ContextActions.cs index f5c18880812..9fde0c9113d 100644 --- a/GitUI/BranchTreePanel/RepoObjectsTree.ContextActions.cs +++ b/GitUI/BranchTreePanel/RepoObjectsTree.ContextActions.cs @@ -10,6 +10,7 @@ using GitUI.BranchTreePanel.Interfaces; using GitUI.CommandsDialogs; using GitUI.UserControls.RevisionGrid; +using GitUIPluginInterfaces; using ResourceManager; namespace GitUI.BranchTreePanel @@ -254,18 +255,8 @@ private void RegisterContextActions() AddContextMenuItems(menuBranch, _menuBranchCopyContextMenuItems); AddContextMenuItems(menuRemote, _menuRemoteCopyContextMenuItems); - _sortOrderContextMenuItem = new GitRefsSortOrderContextMenuItem(() => - { - _branchesTree.Refresh(); - _remotesTree.Refresh(); - _tagTree.Refresh(); - }); - _sortByContextMenuItem = new GitRefsSortByContextMenuItem(() => - { - _branchesTree.Refresh(); - _remotesTree.Refresh(); - _tagTree.Refresh(); - }); + _sortOrderContextMenuItem = new GitRefsSortOrderContextMenuItem(() => Refresh(new FilteredGitRefsProvider(UICommands.GitModule).GetRefs)); + _sortByContextMenuItem = new GitRefsSortByContextMenuItem(() => Refresh(new FilteredGitRefsProvider(UICommands.GitModule).GetRefs)); _localBranchMenuItems = new LocalBranchMenuItems(this); AddContextMenuItems(menuBranch, _localBranchMenuItems.Select(s => s.Item), insertAfter: _menuBranchCopyContextMenuItems[1]); diff --git a/GitUI/BranchTreePanel/RepoObjectsTree.Nodes.Tags.cs b/GitUI/BranchTreePanel/RepoObjectsTree.Nodes.Tags.cs index c250768b19b..a66bc072fa3 100644 --- a/GitUI/BranchTreePanel/RepoObjectsTree.Nodes.Tags.cs +++ b/GitUI/BranchTreePanel/RepoObjectsTree.Nodes.Tags.cs @@ -109,12 +109,12 @@ protected override Task PostRepositoryChangedAsync(GitUIEventArgs e) } /// - protected internal override void Refresh() + protected internal override void Refresh(Func> getRefs) { // Break the local cache to ensure the data is requeried to reflect the required sort order. _loadedTags = null; - base.Refresh(); + base.Refresh(getRefs); } protected override async Task LoadNodesAsync(CancellationToken token, Func> getRefs) diff --git a/GitUI/BranchTreePanel/RepoObjectsTree.Nodes.cs b/GitUI/BranchTreePanel/RepoObjectsTree.Nodes.cs index e32ffcf5f23..11946c64c0c 100644 --- a/GitUI/BranchTreePanel/RepoObjectsTree.Nodes.cs +++ b/GitUI/BranchTreePanel/RepoObjectsTree.Nodes.cs @@ -224,7 +224,7 @@ protected virtual void OnDetached() /// /// Requests to refresh the data tree and to apply filtering, if necessary. /// - protected internal virtual void Refresh() + protected internal virtual void Refresh(Func> getRefs) { // NOTE: descendants may need to break their local caches to ensure the latest data is loaded. @@ -232,7 +232,7 @@ protected internal virtual void Refresh() { IsFiltering.Value = _isCurrentlyFiltering; - await ReloadNodesAsync(LoadNodesAsync, new FilteredGitRefsProvider(Module).GetRefs); + await ReloadNodesAsync(LoadNodesAsync, getRefs); }); } @@ -242,7 +242,7 @@ protected internal virtual void Refresh() /// /// , if the data is being filtered; otherwise . /// - internal void ToggleFilterMode(bool isFiltering) + internal void Refresh(bool isFiltering, Func> getRefs) { // If we're not currently filtering and no need to filter now -> exit. // Else we need to iterate over the list and rebind the tree - whilst there @@ -262,7 +262,7 @@ internal void ToggleFilterMode(bool isFiltering) { IsFiltering.Value = true; - await ReloadNodesAsync(LoadNodesAsync, new FilteredGitRefsProvider(Module).GetRefs); + await ReloadNodesAsync(LoadNodesAsync, getRefs); }); } diff --git a/GitUI/BranchTreePanel/RepoObjectsTree.RemoteBranchTree.cs b/GitUI/BranchTreePanel/RepoObjectsTree.RemoteBranchTree.cs index 2b55e77a9ca..b0bc2289d30 100644 --- a/GitUI/BranchTreePanel/RepoObjectsTree.RemoteBranchTree.cs +++ b/GitUI/BranchTreePanel/RepoObjectsTree.RemoteBranchTree.cs @@ -59,12 +59,12 @@ protected override async Task LoadNodesAsync(CancellationToken token, Fun } /// - protected internal override void Refresh() + protected internal override void Refresh(Func> getRefs) { // Break the local cache to ensure the data is requeried to reflect the required sort order. _loadedBranches = null; - base.Refresh(); + base.Refresh(getRefs); } private async Task FillBranchTreeAsync(IReadOnlyList branches, CancellationToken token) diff --git a/GitUI/BranchTreePanel/RepoObjectsTree.cs b/GitUI/BranchTreePanel/RepoObjectsTree.cs index 99240299115..1999449f615 100644 --- a/GitUI/BranchTreePanel/RepoObjectsTree.cs +++ b/GitUI/BranchTreePanel/RepoObjectsTree.cs @@ -251,11 +251,19 @@ public void Initialize(IAheadBehindDataProvider? aheadBehindDataProvider, Action /// /// , if the data is being filtered; otherwise . /// - public void ToggleFilterMode(bool isFiltering) + /// Function to get refs. + public void Refresh(bool isFiltering, Func> getRefs) { - _branchesTree.ToggleFilterMode(isFiltering); - _remotesTree.ToggleFilterMode(isFiltering); - _tagTree.ToggleFilterMode(isFiltering); + _branchesTree.Refresh(isFiltering, getRefs); + _remotesTree.Refresh(isFiltering, getRefs); + _tagTree.Refresh(isFiltering, getRefs); + } + + public void Refresh(Func> getRefs) + { + _branchesTree.Refresh(getRefs); + _remotesTree.Refresh(getRefs); + _tagTree.Refresh(getRefs); } public void SelectionChanged(IReadOnlyList selectedRevisions) diff --git a/GitUI/CommandsDialogs/FormBrowse.InitRevisionGrid.cs b/GitUI/CommandsDialogs/FormBrowse.InitRevisionGrid.cs index 5277b25b3c0..8de99adf4b5 100644 --- a/GitUI/CommandsDialogs/FormBrowse.InitRevisionGrid.cs +++ b/GitUI/CommandsDialogs/FormBrowse.InitRevisionGrid.cs @@ -62,7 +62,7 @@ private void InitRevisionGrid(ObjectId? selectedId, ObjectId? firstId, bool isBl // b) filter on specific branch bool isFiltering = !AppSettings.ShowReflogReferences && (AppSettings.ShowCurrentBranchOnly || AppSettings.BranchFilterEnabled); - repoObjectsTree.ToggleFilterMode(isFiltering); + repoObjectsTree.Refresh(isFiltering, e.GetRefs); }; RevisionGrid.SelectionChanged += (sender, e) => { diff --git a/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs b/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs index ad7dd936d84..e4fdfa032b6 100644 --- a/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs +++ b/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs @@ -62,7 +62,7 @@ public sealed partial class RevisionGridControl : GitModuleControl, IScriptHostC { public event EventHandler? DoubleClickRevision; public event EventHandler? FilterChanged; - public event EventHandler? RevisionGraphLoaded; + public event EventHandler? RevisionGraphLoaded; public event EventHandler? SelectionChanged; /// @@ -301,7 +301,7 @@ protected override void Dispose(bool disposing) /// This is used to remove spinners added when loading and to replace the gridview at errors. /// /// The content to show. - private void SetPage(Control content) + private void SetPage(Control content, Lazy> getRefs) { for (int i = Controls.Count - 1; i >= 0; i--) { @@ -317,7 +317,7 @@ private void SetPage(Control content) Controls.Add(content); } - RevisionGraphLoaded?.Invoke(content == _gridView ? _gridView : null, EventArgs.Empty); + RevisionGraphLoaded?.Invoke(content == _gridView ? _gridView : null, new GitUIEventArgs(this, UICommands, getRefs)); } internal int DrawColumnText(DataGridViewCellPaintingEventArgs e, string text, Font font, Color color, Rectangle bounds, bool useEllipsis = true) @@ -402,21 +402,21 @@ public void SetAndApplyPathFilter(string filter) PerformRefreshRevisions(); } - private void InitiateRefAction(IReadOnlyList? refs, Action action, FormQuickGitRefSelector.Action actionLabel) + private void InitiateRefAction(IReadOnlyList? gitRefs, Action action, FormQuickGitRefSelector.Action actionLabel) { - if (refs is null || refs.Count < 1) + if (gitRefs is null || gitRefs.Count < 1) { return; } - if (refs.Count == 1) + if (gitRefs.Count == 1) { - action(refs[0]); + action(gitRefs[0]); return; } using FormQuickGitRefSelector dlg = new(); - dlg.Init(actionLabel, refs); + dlg.Init(actionLabel, gitRefs); dlg.Location = GetQuickItemSelectorLocation(); if (dlg.ShowDialog(ParentForm) != DialogResult.OK || dlg.SelectedRef is null) { @@ -1010,7 +1010,7 @@ public void PerformRefreshRevisions(Func> get } catch { - SetPage(new ErrorControl()); + SetPage(new ErrorControl(), getUnfilteredRefs); throw; } @@ -1241,7 +1241,7 @@ void AddArtificialRevisions(bool insertAsFirst) void OnRevisionReaderError(Exception exception) { // This has to happen on the UI thread - this.InvokeAsync(() => SetPage(new ErrorControl())) + this.InvokeAsync(() => SetPage(new ErrorControl(), getUnfilteredRefs)) .FileAndForget(); _refreshRevisionsSequence.CancelCurrent(); @@ -1267,7 +1267,7 @@ void OnRevisionReadCompleted() this.InvokeAsync( () => { - SetPage(new EmptyRepoControl(Module.IsBareRepository())); + SetPage(new EmptyRepoControl(Module.IsBareRepository()), getUnfilteredRefs); _isRefreshingRevisions = false; }) .FileAndForget(); @@ -1280,7 +1280,7 @@ void OnRevisionReadCompleted() await this.SwitchToMainThreadAsync(); _gridView.LoadingCompleted(); - SetPage(_gridView); + SetPage(_gridView, getUnfilteredRefs); _isRefreshingRevisions = false; CheckAndRepairInitialRevision(); HighlightRevisionsByAuthor(GetSelectedRevisions()); diff --git a/Plugins/GitUIPluginInterfaces/FilteredGitRefsProvider.cs b/Plugins/GitUIPluginInterfaces/FilteredGitRefsProvider.cs index 6b10e9890ec..2c6c30f638d 100644 --- a/Plugins/GitUIPluginInterfaces/FilteredGitRefsProvider.cs +++ b/Plugins/GitUIPluginInterfaces/FilteredGitRefsProvider.cs @@ -10,20 +10,25 @@ public sealed class FilteredGitRefsProvider : IFilteredGitRefsProvider { public FilteredGitRefsProvider(IGitModule module) { - _refs = new(() => module.GetRefs(RefsFilter.NoFilter)); + _getRefs = new(() => module.GetRefs(RefsFilter.NoFilter)); } - private readonly Lazy> _refs; + public FilteredGitRefsProvider(Lazy> getRefs) + { + _getRefs = getRefs; + } + + private readonly Lazy> _getRefs; /// public IReadOnlyList GetRefs(RefsFilter filter) { if (filter == RefsFilter.NoFilter) { - return _refs.Value; + return _getRefs.Value; } - return _refs.Value.Where(r => + return _getRefs.Value.Where(r => ((filter & RefsFilter.Tags) != 0 && r.IsTag) || ((filter & RefsFilter.Remotes) != 0 && r.IsRemote) || ((filter & RefsFilter.Heads) != 0 && r.IsHead)).ToList(); diff --git a/Plugins/GitUIPluginInterfaces/GitUIEventArgs.cs b/Plugins/GitUIPluginInterfaces/GitUIEventArgs.cs index a6c950e8e87..247ce191420 100644 --- a/Plugins/GitUIPluginInterfaces/GitUIEventArgs.cs +++ b/Plugins/GitUIPluginInterfaces/GitUIEventArgs.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; @@ -6,14 +7,22 @@ namespace GitUIPluginInterfaces { public class GitUIEventArgs : CancelEventArgs { - private readonly IFilteredGitRefsProvider _refs; + private readonly IFilteredGitRefsProvider _getRefs; + + public GitUIEventArgs(IWin32Window? ownerForm, IGitUICommands gitUICommands, Lazy> getRefs) + : base(cancel: false) + { + OwnerForm = ownerForm; + GitUICommands = gitUICommands; + _getRefs = new FilteredGitRefsProvider(getRefs); + } public GitUIEventArgs(IWin32Window? ownerForm, IGitUICommands gitUICommands) : base(cancel: false) { OwnerForm = ownerForm; GitUICommands = gitUICommands; - _refs = new FilteredGitRefsProvider(GitModule); + _getRefs = new FilteredGitRefsProvider(GitModule); } public IGitUICommands GitUICommands { get; } @@ -22,6 +31,6 @@ public GitUIEventArgs(IWin32Window? ownerForm, IGitUICommands gitUICommands) public IGitModule GitModule => GitUICommands.GitModule; - public IReadOnlyList GetRefs(RefsFilter filter) => _refs.GetRefs(filter); + public IReadOnlyList GetRefs(RefsFilter filter) => _getRefs.GetRefs(filter); } }