diff --git a/GitUI/CommandsDialogs/FormBrowse.cs b/GitUI/CommandsDialogs/FormBrowse.cs index f5572f6c5d8..8a5d9b0b621 100644 --- a/GitUI/CommandsDialogs/FormBrowse.cs +++ b/GitUI/CommandsDialogs/FormBrowse.cs @@ -311,14 +311,14 @@ public FormBrowse(GitUICommands commands, BrowseArguments args) _aheadBehindDataProvider = new AheadBehindDataProvider(() => Module.GitExecutable); toolStripButtonPush.Initialize(_aheadBehindDataProvider); repoObjectsTree.Initialize(_aheadBehindDataProvider, branchFilterAction: ToolStripFilters.SetBranchFilter, RevisionGrid, RevisionGrid, RevisionGrid); - revisionDiff.Bind(RevisionGrid, fileTree, RequestRefresh); - fileTree.Bind(RevisionGrid, RequestRefresh); + revisionDiff.Bind(RevisionGrid, fileTree, RefreshGitStatusMonitor); + fileTree.Bind(RevisionGrid, RefreshGitStatusMonitor); + RevisionGrid.ResumeRefreshRevisions(); // We're launching the main form, and whilst the module has been set for us we still need to formally switch to it + // Also triggers RefreshRevisions() SetGitModule(this, new GitModuleEventArgs(new GitModule(Module.WorkingDir))); - RevisionGrid.ResumeRefreshRevisions(); - return; void InitCountArtificial(out GitStatusMonitor gitStatusMonitor) @@ -447,11 +447,9 @@ protected override void OnLoad(EventArgs e) { _formBrowseMenus.CreateToolbarsMenus(ToolStripMain, ToolStripFilters, ToolStripScripts); - HideVariableMainMenuItems(); RefreshSplitViewLayout(); LayoutRevisionInfo(); SetSplitterPositions(); - InternalInitialize(false); base.OnLoad(e); @@ -572,22 +570,33 @@ private void RefreshRevisions() return; } - _gitStatusMonitor.InvalidateGitWorkingDirectoryStatus(); - RequestRefresh(); - - if (_dashboard is null || !_dashboard.Visible) + bool isDashboard = string.IsNullOrEmpty(Module.WorkingDir) || (_dashboard?.Visible ?? false); + if (isDashboard) { - revisionDiff.RefreshArtificial(); - RevisionGrid.ForceRefreshRevisions(); - RevisionGrid.IndexWatcher.Reset(); + // Explicit call: Title is normally updated on RevisionGrid filter change + _appTitleGenerator.Generate(); + + // "Repo" related methods, creates _dashboard + InternalInitialize(); + + return; + } - InternalInitialize(true); + if (!RevisionGrid.CanRefresh) + { + // Still loading, the method will be called again + return; } - toolStripButtonPush.DisplayAheadBehindInformation(Module.GetSelectedBranch()); + RevisionGrid.ForceRefreshRevisions(); + + InternalInitialize(); + + RefreshGitStatusMonitor(); + revisionDiff.RefreshArtificial(); } - private void RequestRefresh() => _gitStatusMonitor?.RequestRefresh(); + private void RefreshGitStatusMonitor() => _gitStatusMonitor?.RequestRefresh(); private void RefreshSelection() { @@ -658,7 +667,7 @@ private void ShowDashboard() private void HideDashboard() { MainSplitContainer.Visible = true; - if (_dashboard is null || !_dashboard.Visible) + if (!_dashboard?.Visible ?? true) { return; } @@ -714,6 +723,7 @@ private void RegisterPlugins() { if (plugin.Execute(new GitUIEventArgs(this, UICommands))) { + _gitStatusMonitor.InvalidateGitWorkingDirectoryStatus(); RefreshRevisions(); } }; @@ -772,7 +782,7 @@ private void HideVariableMainMenuItems() mainMenuStrip.Refresh(); } - private void InternalInitialize(bool hard) + private void InternalInitialize() { toolPanel.SuspendLayout(); toolPanel.TopToolStripPanel.SuspendLayout(); @@ -798,7 +808,7 @@ private void InternalInitialize(bool hard) } bool bareRepository = Module.IsBareRepository(); - bool isDashboard = _dashboard is not null && _dashboard.Visible; + bool isDashboard = _dashboard?.Visible ?? false; bool validBrowseDir = !isDashboard && Module.IsValidGitWorkingDir(); branchSelect.Text = validBrowseDir ? Module.GetSelectedBranch() : ""; @@ -834,7 +844,8 @@ private void InternalInitialize(bool hard) _createPullRequestsToolStripMenuItem.Enabled = validBrowseDir; _viewPullRequestsToolStripMenuItem.Enabled = validBrowseDir; - if (repositoryToolStripMenuItem.Visible) + // repositoryToolStripMenuItem.Visible + if (validBrowseDir) { manageSubmodulesToolStripMenuItem.Enabled = !bareRepository; updateAllSubmodulesToolStripMenuItem.Enabled = !bareRepository; @@ -844,7 +855,8 @@ private void InternalInitialize(bool hard) editmailmapToolStripMenuItem.Enabled = !bareRepository; } - if (commandsToolStripMenuItem.Visible) + // commandsToolStripMenuItem.Visible + if (validBrowseDir) { commitToolStripMenuItem.Enabled = !bareRepository; mergeToolStripMenuItem.Enabled = !bareRepository; @@ -863,7 +875,7 @@ private void InternalInitialize(bool hard) SetShortcutKeyDisplayStringsFromHotkeySettings(); - if (hard && hasWorkingDir) + if (hasWorkingDir) { ShowRevisions(); } @@ -885,7 +897,7 @@ private void InternalInitialize(bool hard) _formBrowseMenus.InsertRevisionGridMainMenuItems(repositoryToolStripMenuItem); - toolStripButtonPush.DisplayAheadBehindInformation(Module.GetSelectedBranch()); + toolStripButtonPush.DisplayAheadBehindInformation(branchSelect.Text); ActiveControl = RevisionGrid; RevisionGrid.IndexWatcher.Reset(); @@ -1309,7 +1321,7 @@ private void StashToolStripMenuItemClick(object sender, EventArgs e) private void ResetToolStripMenuItem_Click(object sender, EventArgs e) { UICommands.StartResetChangesDialog(this); - RequestRefresh(); + RefreshGitStatusMonitor(); revisionDiff.RefreshArtificial(); } @@ -2993,7 +3005,7 @@ private void undoLastCommitToolStripMenuItem_Click(object sender, EventArgs e) var args = GitCommandHelpers.ResetCmd(ResetMode.Soft, "HEAD~1"); Module.GitExecutable.GetOutput(args); refreshToolStripMenuItem.PerformClick(); - RequestRefresh(); + RefreshGitStatusMonitor(); } } diff --git a/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs b/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs index 42a5b50f7bd..c715cbd193f 100644 --- a/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs +++ b/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs @@ -465,17 +465,12 @@ public void DisableContextMenu() internal void SuspendRefreshRevisions() => _updatingFilters++; /// - /// Resume revisions refreshes and invokes . + /// Resume revisions refreshes. /// internal void ResumeRefreshRevisions() { --_updatingFilters; Debug.Assert(_updatingFilters >= 0, $"{nameof(ResumeRefreshRevisions)} was called without matching {nameof(SuspendRefreshRevisions)}!"); - - if (_updatingFilters == 0) - { - ForceRefreshRevisions(); - } } public void SetAndApplyBranchFilter(string filter) @@ -825,11 +820,13 @@ private void ShowLoading(bool sync = true) _loadingControlAsync.BringToFront(); } + public bool CanRefresh => !_isRefreshingRevisions && _updatingFilters == 0; + public void ForceRefreshRevisions() { ThreadHelper.AssertOnUIThread(); - if (_isRefreshingRevisions || _updatingFilters != 0) + if (!CanRefresh) { return; }