From f9d9966536833f2114f1db119fe08a8293a69497 Mon Sep 17 00:00:00 2001 From: Philippe Miossec Date: Tue, 28 Apr 2020 23:47:32 +0200 Subject: [PATCH] Split pull button in 2 buttons (fetch and pull) * One for fetch operations, * One for rebase operations, With there own default operation setting. Improvement over #3923 --- GitCommands/Settings/AppSettings.cs | 9 +++ GitUI/CommandsDialogs/FormBrowse.Designer.cs | 41 ++++++++-- .../FormBrowse.InitMenusAndToolbars.cs | 74 +++++++++++++------ GitUI/CommandsDialogs/FormBrowse.cs | 19 ++++- GitUI/GitUICommands.cs | 2 +- GitUI/Translation/English.xlf | 8 ++ GitUI/WindowsJumpListManager.cs | 25 +++++-- GitUI/WindowsThumbnailToolbarButtons.cs | 6 +- 8 files changed, 140 insertions(+), 44 deletions(-) diff --git a/GitCommands/Settings/AppSettings.cs b/GitCommands/Settings/AppSettings.cs index b39fb3c74c8..fbd9f5d0351 100644 --- a/GitCommands/Settings/AppSettings.cs +++ b/GitCommands/Settings/AppSettings.cs @@ -895,6 +895,15 @@ public enum PullAction Default } + /// + /// Gets or sets the default fetch action that is performed by the toolbar icon when it is clicked on. + /// + public static PullAction DefaultFetchAction + { + get => GetEnum("DefaultFetchAction", PullAction.Fetch); + set => SetEnum("DefaultFetchAction", value); + } + /// /// Gets or sets the default pull action that is performed by the toolbar icon when it is clicked on. /// diff --git a/GitUI/CommandsDialogs/FormBrowse.Designer.cs b/GitUI/CommandsDialogs/FormBrowse.Designer.cs index 853378bcd1f..7f823378ec3 100644 --- a/GitUI/CommandsDialogs/FormBrowse.Designer.cs +++ b/GitUI/CommandsDialogs/FormBrowse.Designer.cs @@ -48,10 +48,12 @@ private void InitializeComponent() this.toolStripButtonPull = new System.Windows.Forms.ToolStripSplitButton(); this.mergeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.rebaseToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripButtonFetch = new System.Windows.Forms.ToolStripSplitButton(); this.fetchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.pullToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.fetchAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fetchPruneAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setDefaultFetchButtonActionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.setDefaultPullButtonActionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripButtonPush = new GitUI.CommandsDialogs.ToolStripPushButton(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); @@ -254,6 +256,7 @@ private void InitializeComponent() this._NO_TRANSLATE_WorkingDir, this.branchSelect, this.toolStripSeparator1, + this.toolStripButtonFetch, this.toolStripButtonPull, this.toolStripButtonPush, this.toolStripButtonCommit, @@ -266,7 +269,7 @@ private void InitializeComponent() this.ToolStripMain.Location = new System.Drawing.Point(3, 0); this.ToolStripMain.Name = "ToolStripMain"; this.ToolStripMain.Padding = new System.Windows.Forms.Padding(0); - this.ToolStripMain.Size = new System.Drawing.Size(479, 25); + this.ToolStripMain.Size = new System.Drawing.Size(607, 25); this.ToolStripMain.TabIndex = 0; this.ToolStripMain.Text = "Standard"; // @@ -402,6 +405,23 @@ private void InitializeComponent() this.toolStripSplitStash.ToolTipText = "Manage stashes"; this.toolStripSplitStash.ButtonClick += new System.EventHandler(this.ToolStripSplitStashButtonClick); // + // toolStripButtonFetch + // + this.toolStripButtonFetch.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonFetch.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fetchToolStripMenuItem, + this.fetchAllToolStripMenuItem, + this.fetchPruneAllToolStripMenuItem, + toolStripSeparator11, + this.setDefaultFetchButtonActionToolStripMenuItem}); + this.toolStripButtonFetch.Image = global::GitUI.Properties.Images.Pull; + this.toolStripButtonFetch.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonFetch.Name = "toolStripButtonFetch"; + this.toolStripButtonFetch.Size = new System.Drawing.Size(32, 22); + this.toolStripButtonFetch.Text = "Fetch"; + this.toolStripButtonFetch.ButtonClick += new System.EventHandler(this.ToolStripButtonFetchClick); + this.toolStripButtonFetch.DropDownOpened += new System.EventHandler(this.ToolStripButtonFetch_DropDownOpened); + // // stashChangesToolStripMenuItem // this.stashChangesToolStripMenuItem.Name = "stashChangesToolStripMenuItem"; @@ -431,6 +451,12 @@ private void InitializeComponent() this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Size = new System.Drawing.Size(164, 6); // + // setDefaultFetchButtonActionToolStripMenuItem + // + this.setDefaultFetchButtonActionToolStripMenuItem.Name = "setDefaultFetchButtonActionToolStripMenuItem"; + this.setDefaultFetchButtonActionToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.setDefaultFetchButtonActionToolStripMenuItem.Text = "Set default Fetch button action"; + // // manageStashesToolStripMenuItem // this.manageStashesToolStripMenuItem.Name = "manageStashesToolStripMenuItem"; @@ -462,12 +488,8 @@ private void InitializeComponent() this.toolStripButtonPull.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.toolStripButtonPull.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.pullToolStripMenuItem1, - toolStripSeparator11, this.mergeToolStripMenuItem, this.rebaseToolStripMenuItem1, - this.fetchToolStripMenuItem, - this.fetchAllToolStripMenuItem, - this.fetchPruneAllToolStripMenuItem, toolStripSeparator14, this.setDefaultPullButtonActionToolStripMenuItem}); this.toolStripButtonPull.Image = global::GitUI.Properties.Images.Pull; @@ -486,7 +508,7 @@ private void InitializeComponent() // this.mergeToolStripMenuItem.Image = global::GitUI.Properties.Images.PullMerge; this.mergeToolStripMenuItem.Name = "mergeToolStripMenuItem"; - this.mergeToolStripMenuItem.Size = new System.Drawing.Size(239, 22); + this.mergeToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.mergeToolStripMenuItem.Text = "Pull - &merge"; this.mergeToolStripMenuItem.Click += new System.EventHandler(this.mergeToolStripMenuItem_Click); // @@ -494,7 +516,7 @@ private void InitializeComponent() // this.rebaseToolStripMenuItem1.Image = global::GitUI.Properties.Images.PullRebase; this.rebaseToolStripMenuItem1.Name = "rebaseToolStripMenuItem1"; - this.rebaseToolStripMenuItem1.Size = new System.Drawing.Size(239, 22); + this.rebaseToolStripMenuItem1.Size = new System.Drawing.Size(228, 22); this.rebaseToolStripMenuItem1.Text = "Pull - &rebase"; this.rebaseToolStripMenuItem1.Click += new System.EventHandler(this.rebaseToolStripMenuItem1_Click); // @@ -513,6 +535,7 @@ private void InitializeComponent() this.pullToolStripMenuItem1.Name = "pullToolStripMenuItem1"; this.pullToolStripMenuItem1.Size = new System.Drawing.Size(239, 22); this.pullToolStripMenuItem1.Text = "Open &pull dialog..."; + this.pullToolStripMenuItem1.ToolTipText = "Open pull dialog"; this.pullToolStripMenuItem1.Click += new System.EventHandler(this.pullToolStripMenuItem1_Click); // // fetchAllToolStripMenuItem @@ -536,7 +559,7 @@ private void InitializeComponent() // setDefaultPullButtonActionToolStripMenuItem // this.setDefaultPullButtonActionToolStripMenuItem.Name = "setDefaultPullButtonActionToolStripMenuItem"; - this.setDefaultPullButtonActionToolStripMenuItem.Size = new System.Drawing.Size(239, 22); + this.setDefaultPullButtonActionToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.setDefaultPullButtonActionToolStripMenuItem.Text = "Set &default Pull button action"; // // toolStripButtonPush @@ -1907,6 +1930,8 @@ private void InitializeComponent() private ToolStripMenuItem setDefaultPullButtonActionToolStripMenuItem; private ToolStripMenuItem fetchAllToolStripMenuItem; private ToolStripMenuItem fetchPruneAllToolStripMenuItem; + private ToolStripMenuItem setDefaultFetchButtonActionToolStripMenuItem; + private ToolStripSplitButton toolStripButtonFetch; private ToolStripMenuItem resetToolStripMenuItem; private ToolStripMenuItem reportAnIssueToolStripMenuItem; private ToolStripSeparator toolStripSeparator41; diff --git a/GitUI/CommandsDialogs/FormBrowse.InitMenusAndToolbars.cs b/GitUI/CommandsDialogs/FormBrowse.InitMenusAndToolbars.cs index 85261ac94a4..5ed3a6bed85 100644 --- a/GitUI/CommandsDialogs/FormBrowse.InitMenusAndToolbars.cs +++ b/GitUI/CommandsDialogs/FormBrowse.InitMenusAndToolbars.cs @@ -31,6 +31,7 @@ private void InitMenusAndToolbars(string? revFilter, string? pathFilter) translateToolStripMenuItem, recoverLostObjectsToolStripMenuItem, branchSelect, + toolStripButtonFetch, toolStripButtonPull, pullToolStripMenuItem, pullToolStripMenuItem1, @@ -65,8 +66,9 @@ private void InitMenusAndToolbars(string? revFilter, string? pathFilter) UpdateCommitButtonAndGetBrush(status: null, AppSettings.ShowGitStatusInBrowseToolbar); + FillNextFetchActionAsDefaultToolStripMenuItems(); FillNextPullActionAsDefaultToolStripMenuItems(); - RefreshDefaultPullAction(); + RefreshDefaultActions(); FillUserShells(defaultShell: BashShell.ShellName); @@ -139,9 +141,32 @@ void WorkaroundToolbarLocationBug() } } + private void FillNextFetchActionAsDefaultToolStripMenuItems() + { + FillNextActionAsDefaultToolStripMenuItems(toolStripButtonFetch, setDefaultFetchButtonActionToolStripMenuItem, + (object sender, EventArgs eventArgs) => + { + var clickedMenuItem = (ToolStripMenuItem)sender; + AppSettings.DefaultFetchAction = (AppSettings.PullAction)clickedMenuItem.Tag; + RefreshDefaultFetchAction(); + }); + } + private void FillNextPullActionAsDefaultToolStripMenuItems() { - var setDefaultPullActionDropDown = (ToolStripDropDownMenu)setDefaultPullButtonActionToolStripMenuItem.DropDown; + FillNextActionAsDefaultToolStripMenuItems(toolStripButtonPull, setDefaultPullButtonActionToolStripMenuItem, + (object sender, EventArgs eventArgs) => + { + var clickedMenuItem = (ToolStripMenuItem)sender; + AppSettings.DefaultPullAction = (AppSettings.PullAction)clickedMenuItem.Tag; + RefreshDefaultPullAction(); + }); + } + + private void FillNextActionAsDefaultToolStripMenuItems(ToolStripSplitButton buttonActionToolStripMenuItem, + ToolStripMenuItem defaultButtonActionToolStripMenuItem, EventHandler setDefaultPullActionMenuItemClick) + { + var setDefaultPullActionDropDown = (ToolStripDropDownMenu)defaultButtonActionToolStripMenuItem.DropDown; // Show both Check and Image margins in a menu setDefaultPullActionDropDown.ShowImageMargin = true; @@ -156,7 +181,7 @@ private void FillNextPullActionAsDefaultToolStripMenuItems() } }; - var setDefaultPullActionDropDownItems = toolStripButtonPull.DropDownItems + var setDefaultPullActionDropDownItems = buttonActionToolStripMenuItem.DropDownItems .OfType() .Where(tsmi => tsmi.Tag is AppSettings.PullAction) .Select(tsmi => @@ -170,19 +195,12 @@ private void FillNextPullActionAsDefaultToolStripMenuItems() Tag = tsmi.Tag }; - tsi.Click += SetDefaultPullActionMenuItemClick; + tsi.Click += setDefaultPullActionMenuItemClick; return tsi; }); setDefaultPullActionDropDown.Items.AddRange(setDefaultPullActionDropDownItems.ToArray()); - - void SetDefaultPullActionMenuItemClick(object sender, EventArgs eventArgs) - { - var clickedMenuItem = (ToolStripMenuItem)sender; - AppSettings.DefaultPullAction = (AppSettings.PullAction)clickedMenuItem.Tag; - RefreshDefaultPullAction(); - } } private void FillUserShells(string defaultShell) @@ -234,17 +252,31 @@ private void FillUserShells(string defaultShell) gitBashToolStripMenuItem.Tag = _shellProvider.GetShell(BashShell.ShellName); } + private void RefreshDefaultActions() + { + RefreshDefaultFetchAction(); + RefreshDefaultPullAction(); + } + + private void RefreshDefaultFetchAction() + { + RefreshDefaultAction(setDefaultFetchButtonActionToolStripMenuItem, AppSettings.DefaultFetchAction); + } + private void RefreshDefaultPullAction() { - if (setDefaultPullButtonActionToolStripMenuItem is null) + RefreshDefaultAction(setDefaultPullButtonActionToolStripMenuItem, AppSettings.DefaultPullAction); + } + + private void RefreshDefaultAction(ToolStripMenuItem? toolStripMenuItem, AppSettings.PullAction defaultPullAction) + { + if (toolStripMenuItem is null) { // We may get called while instantiating the form return; } - var defaultPullAction = AppSettings.DefaultPullAction; - - foreach (ToolStripMenuItem menuItem in setDefaultPullButtonActionToolStripMenuItem.DropDown.Items) + foreach (ToolStripMenuItem menuItem in toolStripMenuItem.DropDown.Items) { menuItem.Checked = (AppSettings.PullAction)menuItem.Tag == defaultPullAction; } @@ -252,18 +284,18 @@ private void RefreshDefaultPullAction() switch (defaultPullAction) { case AppSettings.PullAction.Fetch: - toolStripButtonPull.Image = Images.PullFetch.AdaptLightness(); - toolStripButtonPull.ToolTipText = _pullFetch.Text; + toolStripButtonFetch.Image = Images.PullFetch.AdaptLightness(); + toolStripButtonFetch.ToolTipText = _pullFetch.Text; break; case AppSettings.PullAction.FetchAll: - toolStripButtonPull.Image = Images.PullFetchAll.AdaptLightness(); - toolStripButtonPull.ToolTipText = _pullFetchAll.Text; + toolStripButtonFetch.Image = Images.PullFetchAll.AdaptLightness(); + toolStripButtonFetch.ToolTipText = _pullFetchAll.Text; break; case AppSettings.PullAction.FetchPruneAll: - toolStripButtonPull.Image = Images.PullFetchPruneAll.AdaptLightness(); - toolStripButtonPull.ToolTipText = _pullFetchPruneAll.Text; + toolStripButtonFetch.Image = Images.PullFetchPruneAll.AdaptLightness(); + toolStripButtonFetch.ToolTipText = _pullFetchPruneAll.Text; break; case AppSettings.PullAction.Merge: diff --git a/GitUI/CommandsDialogs/FormBrowse.cs b/GitUI/CommandsDialogs/FormBrowse.cs index 4ea0cff830e..e42e3c8aca8 100644 --- a/GitUI/CommandsDialogs/FormBrowse.cs +++ b/GitUI/CommandsDialogs/FormBrowse.cs @@ -474,8 +474,9 @@ protected override void OnActivated(EventArgs e) Handle, new WindowsThumbnailToolbarButtons( new WindowsThumbnailToolbarButton(toolStripButtonCommit.Text, toolStripButtonCommit.Image, CommitToolStripMenuItemClick), - new WindowsThumbnailToolbarButton(toolStripButtonPush.Text, toolStripButtonPush.Image, PushToolStripMenuItemClick), - new WindowsThumbnailToolbarButton(toolStripButtonPull.Text, toolStripButtonPull.Image, PullToolStripMenuItemClick))); + new WindowsThumbnailToolbarButton(toolStripButtonFetch.Text, toolStripButtonFetch.Image, fetchToolStripMenuItem_Click), + new WindowsThumbnailToolbarButton(toolStripButtonPull.Text, toolStripButtonPull.Image, PullToolStripMenuItemClick), + new WindowsThumbnailToolbarButton(toolStripButtonPush.Text, toolStripButtonPush.Image, PushToolStripMenuItemClick))); } this.InvokeAsync(OnActivate).FileAndForget(); @@ -516,7 +517,7 @@ protected override void OnClosed(EventArgs e) protected override void OnUICommandsChanged(GitUICommandsChangedEventArgs e) { var oldCommands = e.OldCommands; - RefreshDefaultPullAction(); + RefreshDefaultActions(); if (oldCommands is not null) { @@ -1431,7 +1432,7 @@ private void OpenSettings(SettingsPageReference? initialPage = null) _gitStatusMonitor.Active = NeedsGitStatusMonitor() && Module.IsValidGitWorkingDir(); - RefreshDefaultPullAction(); + RefreshDefaultActions(); } private void GitextSettingsToolStripMenuItem_Click(object sender, System.EventArgs e) @@ -2510,6 +2511,16 @@ private void pullToolStripMenuItem1_Click(object sender, EventArgs e) DoPull(pullAction: AppSettings.FormPullAction, isSilent: false); } + private void ToolStripButtonFetchClick(object sender, EventArgs e) + { + DoPull(pullAction: AppSettings.DefaultFetchAction, isSilent: true); + } + + private void ToolStripButtonFetch_DropDownOpened(object sender, EventArgs e) + { + ToolStripFilters.PreventToolStripSplitButtonClosing(sender as ToolStripSplitButton); + } + private void mergeToolStripMenuItem_Click(object sender, EventArgs e) { DoPull(pullAction: AppSettings.PullAction.Merge, isSilent: true); diff --git a/GitUI/GitUICommands.cs b/GitUI/GitUICommands.cs index e4b7200a4eb..b5827e71c58 100644 --- a/GitUI/GitUICommands.cs +++ b/GitUI/GitUICommands.cs @@ -1870,7 +1870,7 @@ private static void UpdateSettingsBasedOnArguments(IReadOnlyDictionary &Solve merge conflicts... + + Set default Fetch button action + + Set &default Pull button action @@ -3179,6 +3183,10 @@ Do you want to continue? Commit + + Fetch + + Submodules diff --git a/GitUI/WindowsJumpListManager.cs b/GitUI/WindowsJumpListManager.cs index e2692dad1ac..8571f66ba10 100644 --- a/GitUI/WindowsJumpListManager.cs +++ b/GitUI/WindowsJumpListManager.cs @@ -33,6 +33,7 @@ public sealed class WindowsJumpListManager : IWindowsJumpListManager private readonly IRepositoryDescriptionProvider _repositoryDescriptionProvider; private ThumbnailToolBarButton? _commitButton; private ThumbnailToolBarButton? _pushButton; + private ThumbnailToolBarButton? _fetchButton; private ThumbnailToolBarButton? _pullButton; private string? _deferredAddToRecent; private bool ToolbarButtonsCreated => _commitButton is not null; @@ -65,6 +66,7 @@ private void Dispose(bool disposing) _commitButton?.Dispose(); _pushButton?.Dispose(); _pullButton?.Dispose(); + _fetchButton?.Dispose(); } } @@ -124,10 +126,12 @@ public void AddToRecent(string workingDir) Validates.NotNull(_commitButton); Validates.NotNull(_pushButton); + Validates.NotNull(_fetchButton); Validates.NotNull(_pullButton); _commitButton.Enabled = true; _pushButton.Enabled = true; + _fetchButton.Enabled = true; _pullButton.Enabled = true; }, nameof(AddToRecent)); } @@ -184,17 +188,20 @@ public void CreateJumpList(IntPtr windowHandle, WindowsThumbnailToolbarButtons b void CreateTaskbarButtons(IntPtr handle, WindowsThumbnailToolbarButtons thumbButtons) { - _commitButton = new ThumbnailToolBarButton(MakeIcon(thumbButtons.Commit.Image, 48, true), thumbButtons.Commit.Text); - _commitButton.Click += thumbButtons.Commit.Click; + _commitButton = CreateThumbnailToolBarButton(thumbButtons.Commit); + _fetchButton = CreateThumbnailToolBarButton(thumbButtons.Fetch); + _pullButton = CreateThumbnailToolBarButton(thumbButtons.Pull); + _pushButton = CreateThumbnailToolBarButton(thumbButtons.Push); - _pushButton = new ThumbnailToolBarButton(MakeIcon(thumbButtons.Push.Image, 48, true), thumbButtons.Push.Text); - _pushButton.Click += thumbButtons.Push.Click; - - _pullButton = new ThumbnailToolBarButton(MakeIcon(thumbButtons.Pull.Image, 48, true), thumbButtons.Pull.Text); - _pullButton.Click += thumbButtons.Pull.Click; + ThumbnailToolBarButton CreateThumbnailToolBarButton(WindowsThumbnailToolbarButton button) + { + var thumbnailToolBarButton = new ThumbnailToolBarButton(MakeIcon(button.Image, 48, true), button.Text); + thumbnailToolBarButton.Click += button.Click; + return thumbnailToolBarButton; + } // Call this method using reflection. This is a workaround to *not* reference WPF libraries, because of how the WindowsAPICodePack was implemented. - TaskbarManager.Instance.ThumbnailToolBars.AddButtons(handle, _commitButton, _pullButton, _pushButton); + TaskbarManager.Instance.ThumbnailToolBars.AddButtons(handle, _commitButton, _fetchButton, _pullButton, _pushButton); } } @@ -212,10 +219,12 @@ public void DisableThumbnailToolbar() { Validates.NotNull(_commitButton); Validates.NotNull(_pushButton); + Validates.NotNull(_fetchButton); Validates.NotNull(_pullButton); _commitButton.Enabled = false; _pushButton.Enabled = false; _pullButton.Enabled = false; + _fetchButton.Enabled = false; }, nameof(DisableThumbnailToolbar)); } diff --git a/GitUI/WindowsThumbnailToolbarButtons.cs b/GitUI/WindowsThumbnailToolbarButtons.cs index c176dc0e54f..b54c771ac68 100644 --- a/GitUI/WindowsThumbnailToolbarButtons.cs +++ b/GitUI/WindowsThumbnailToolbarButtons.cs @@ -2,15 +2,17 @@ { public sealed class WindowsThumbnailToolbarButtons { - public WindowsThumbnailToolbarButtons(WindowsThumbnailToolbarButton commit, WindowsThumbnailToolbarButton pull, WindowsThumbnailToolbarButton push) + public WindowsThumbnailToolbarButtons(WindowsThumbnailToolbarButton commit, WindowsThumbnailToolbarButton fetch, WindowsThumbnailToolbarButton pull, WindowsThumbnailToolbarButton push) { Commit = commit; + Fetch = fetch; Pull = pull; Push = push; } public WindowsThumbnailToolbarButton Commit { get; } + public WindowsThumbnailToolbarButton Fetch { get; } public WindowsThumbnailToolbarButton Pull { get; } public WindowsThumbnailToolbarButton Push { get; } } -} \ No newline at end of file +}