diff --git a/src/ViewModels/RevisionCompare.cs b/src/ViewModels/RevisionCompare.cs index 18e8044b..1d4350a1 100644 --- a/src/ViewModels/RevisionCompare.cs +++ b/src/ViewModels/RevisionCompare.cs @@ -1,17 +1,18 @@ using System; using System.Collections.Generic; -using System.IO; using System.Threading.Tasks; - -using Avalonia.Controls; using Avalonia.Threading; - using CommunityToolkit.Mvvm.ComponentModel; namespace SourceGit.ViewModels { public class RevisionCompare : ObservableObject, IDisposable { + public string RepositoryPath + { + get => _repo; + } + public bool IsLoading { get => _isLoading; @@ -96,6 +97,14 @@ namespace SourceGit.ViewModels _diffContext = null; } + public void OpenChangeWithExternalDiffTool(Models.Change change) + { + var opt = new Models.DiffOption(GetSHA(_startPoint), GetSHA(_endPoint), change); + var toolType = Preferences.Instance.ExternalMergeToolType; + var toolPath = Preferences.Instance.ExternalMergeToolPath; + new Commands.DiffTool(_repo, toolType, toolPath, opt).Open(); + } + public void NavigateTo(string commitSHA) { var launcher = App.GetLauncher(); @@ -136,68 +145,6 @@ namespace SourceGit.ViewModels SearchFilter = string.Empty; } - public ContextMenu CreateChangeContextMenu() - { - if (_selectedChanges is not { Count: 1 }) - return null; - - var change = _selectedChanges[0]; - var menu = new ContextMenu(); - - var openWithMerger = new MenuItem(); - openWithMerger.Header = App.Text("OpenInExternalMergeTool"); - openWithMerger.Icon = App.CreateMenuIcon("Icons.OpenWith"); - openWithMerger.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+D" : "Ctrl+Shift+D"; - openWithMerger.Click += (_, ev) => - { - var opt = new Models.DiffOption(GetSHA(_startPoint), GetSHA(_endPoint), change); - var toolType = Preferences.Instance.ExternalMergeToolType; - var toolPath = Preferences.Instance.ExternalMergeToolPath; - new Commands.DiffTool(_repo, toolType, toolPath, opt).Open(); - ev.Handled = true; - }; - menu.Items.Add(openWithMerger); - - if (change.Index != Models.ChangeState.Deleted) - { - var full = Path.GetFullPath(Path.Combine(_repo, change.Path)); - var explore = new MenuItem(); - explore.Header = App.Text("RevealFile"); - explore.Icon = App.CreateMenuIcon("Icons.Explore"); - explore.IsEnabled = File.Exists(full); - explore.Click += (_, ev) => - { - Native.OS.OpenInFileManager(full, true); - ev.Handled = true; - }; - menu.Items.Add(explore); - } - - var copyPath = new MenuItem(); - copyPath.Header = App.Text("CopyPath"); - copyPath.Icon = App.CreateMenuIcon("Icons.Copy"); - copyPath.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C"; - copyPath.Click += async (_, ev) => - { - await App.CopyTextAsync(change.Path); - ev.Handled = true; - }; - menu.Items.Add(copyPath); - - var copyFullPath = new MenuItem(); - copyFullPath.Header = App.Text("CopyFullPath"); - copyFullPath.Icon = App.CreateMenuIcon("Icons.Copy"); - copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C"; - copyFullPath.Click += async (_, e) => - { - await App.CopyTextAsync(Native.OS.GetAbsPath(_repo, change.Path)); - e.Handled = true; - }; - menu.Items.Add(copyFullPath); - - return menu; - } - private void RefreshVisible() { if (_changes == null) diff --git a/src/Views/RevisionCompare.axaml.cs b/src/Views/RevisionCompare.axaml.cs index 1f0e5fc1..d5b36a6b 100644 --- a/src/Views/RevisionCompare.axaml.cs +++ b/src/Views/RevisionCompare.axaml.cs @@ -1,3 +1,6 @@ +using System; +using System.IO; + using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; @@ -14,9 +17,60 @@ namespace SourceGit.Views private void OnChangeContextRequested(object sender, ContextRequestedEventArgs e) { - if (DataContext is ViewModels.RevisionCompare vm && sender is ChangeCollectionView view) + if (DataContext is ViewModels.RevisionCompare { SelectedChanges: { Count: 1 } selected } vm && + sender is ChangeCollectionView view) { - var menu = vm.CreateChangeContextMenu(); + var repo = vm.RepositoryPath; + var change = selected[0]; + var changeFullPath = Native.OS.GetAbsPath(repo, change.Path); + var menu = new ContextMenu(); + + var openWithMerger = new MenuItem(); + openWithMerger.Header = App.Text("OpenInExternalMergeTool"); + openWithMerger.Icon = App.CreateMenuIcon("Icons.OpenWith"); + openWithMerger.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+D" : "Ctrl+Shift+D"; + openWithMerger.Click += (_, ev) => + { + vm.OpenChangeWithExternalDiffTool(change); + ev.Handled = true; + }; + menu.Items.Add(openWithMerger); + + if (change.Index != Models.ChangeState.Deleted) + { + var explore = new MenuItem(); + explore.Header = App.Text("RevealFile"); + explore.Icon = App.CreateMenuIcon("Icons.Explore"); + explore.IsEnabled = File.Exists(changeFullPath); + explore.Click += (_, ev) => + { + Native.OS.OpenInFileManager(changeFullPath, true); + ev.Handled = true; + }; + menu.Items.Add(explore); + } + + var copyPath = new MenuItem(); + copyPath.Header = App.Text("CopyPath"); + copyPath.Icon = App.CreateMenuIcon("Icons.Copy"); + copyPath.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C"; + copyPath.Click += async (_, ev) => + { + await App.CopyTextAsync(change.Path); + ev.Handled = true; + }; + menu.Items.Add(copyPath); + + var copyFullPath = new MenuItem(); + copyFullPath.Header = App.Text("CopyFullPath"); + copyFullPath.Icon = App.CreateMenuIcon("Icons.Copy"); + copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C"; + copyFullPath.Click += async (_, e) => + { + await App.CopyTextAsync(changeFullPath); + e.Handled = true; + }; + menu.Items.Add(copyFullPath); menu?.Open(view); }