mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-06-21 02:15:00 +00:00
feature: supports to ignore new files in folder from context menu of selected folder node in change tree (#1432)
Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
parent
f9f44ae9cb
commit
6729d4e896
5 changed files with 98 additions and 35 deletions
|
@ -764,6 +764,7 @@
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">Git Ignore</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">Git Ignore</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">Ignore all *{0} files</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">Ignore all *{0} files</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">Ignore *{0} files in the same folder</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">Ignore *{0} files in the same folder</x:String>
|
||||||
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InFolder" xml:space="preserve">Ignore files in this folder</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">Ignore files in the same folder</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">Ignore files in the same folder</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">Ignore this file only</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">Ignore this file only</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">Amend</x:String>
|
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">Amend</x:String>
|
||||||
|
|
|
@ -768,6 +768,7 @@
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">添加至 .gitignore 忽略列表</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">添加至 .gitignore 忽略列表</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">忽略所有 *{0} 文件</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">忽略所有 *{0} 文件</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">忽略同目录下所有 *{0} 文件</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">忽略同目录下所有 *{0} 文件</x:String>
|
||||||
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InFolder" xml:space="preserve">忽略该目录下的新文件</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">忽略同目录下所有文件</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">忽略同目录下所有文件</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">忽略本文件</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">忽略本文件</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">修补</x:String>
|
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">修补</x:String>
|
||||||
|
|
|
@ -768,6 +768,7 @@
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">加入至 .gitignore 忽略清單</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">加入至 .gitignore 忽略清單</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">忽略所有 *{0} 檔案</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">忽略所有 *{0} 檔案</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">忽略同路徑下所有 *{0} 檔案</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">忽略同路徑下所有 *{0} 檔案</x:String>
|
||||||
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InFolder" xml:space="preserve">忽略本路徑下的新增檔案</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">忽略同路徑下所有檔案</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">忽略同路徑下所有檔案</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">忽略本檔案</x:String>
|
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">忽略本檔案</x:String>
|
||||||
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">修補</x:String>
|
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">修補</x:String>
|
||||||
|
|
|
@ -581,7 +581,7 @@ namespace SourceGit.ViewModels
|
||||||
DoCommit(false, true);
|
DoCommit(false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ContextMenu CreateContextMenuForUnstagedChanges()
|
public ContextMenu CreateContextMenuForUnstagedChanges(string selectedSingleFolder)
|
||||||
{
|
{
|
||||||
if (_selectedUnstaged == null || _selectedUnstaged.Count == 0)
|
if (_selectedUnstaged == null || _selectedUnstaged.Count == 0)
|
||||||
return null;
|
return null;
|
||||||
|
@ -761,52 +761,87 @@ namespace SourceGit.ViewModels
|
||||||
var hasExtra = false;
|
var hasExtra = false;
|
||||||
if (change.WorkTree == Models.ChangeState.Untracked)
|
if (change.WorkTree == Models.ChangeState.Untracked)
|
||||||
{
|
{
|
||||||
var isRooted = change.Path.IndexOf('/', StringComparison.Ordinal) <= 0;
|
|
||||||
var addToIgnore = new MenuItem();
|
var addToIgnore = new MenuItem();
|
||||||
addToIgnore.Header = App.Text("WorkingCopy.AddToGitIgnore");
|
addToIgnore.Header = App.Text("WorkingCopy.AddToGitIgnore");
|
||||||
addToIgnore.Icon = App.CreateMenuIcon("Icons.GitIgnore");
|
addToIgnore.Icon = App.CreateMenuIcon("Icons.GitIgnore");
|
||||||
|
|
||||||
var singleFile = new MenuItem();
|
if (!string.IsNullOrEmpty(selectedSingleFolder))
|
||||||
singleFile.Header = App.Text("WorkingCopy.AddToGitIgnore.SingleFile");
|
|
||||||
singleFile.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
Commands.GitIgnore.Add(_repo.FullPath, change.Path);
|
var ignoreFolder = new MenuItem();
|
||||||
e.Handled = true;
|
ignoreFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InFolder");
|
||||||
};
|
ignoreFolder.Click += (_, e) =>
|
||||||
addToIgnore.Items.Add(singleFile);
|
|
||||||
|
|
||||||
var byParentFolder = new MenuItem();
|
|
||||||
byParentFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InSameFolder");
|
|
||||||
byParentFolder.IsVisible = !isRooted;
|
|
||||||
byParentFolder.Click += (_, e) =>
|
|
||||||
{
|
|
||||||
var dir = Path.GetDirectoryName(change.Path)!.Replace('\\', '/').TrimEnd('/');
|
|
||||||
Commands.GitIgnore.Add(_repo.FullPath, dir + "/");
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
addToIgnore.Items.Add(byParentFolder);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(extension))
|
|
||||||
{
|
|
||||||
var byExtension = new MenuItem();
|
|
||||||
byExtension.Header = App.Text("WorkingCopy.AddToGitIgnore.Extension", extension);
|
|
||||||
byExtension.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
Commands.GitIgnore.Add(_repo.FullPath, $"*{extension}");
|
Commands.GitIgnore.Add(_repo.FullPath, $"{selectedSingleFolder}/");
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
addToIgnore.Items.Add(byExtension);
|
addToIgnore.Items.Add(ignoreFolder);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var isRooted = change.Path.IndexOf('/', StringComparison.Ordinal) <= 0;
|
||||||
|
var singleFile = new MenuItem();
|
||||||
|
singleFile.Header = App.Text("WorkingCopy.AddToGitIgnore.SingleFile");
|
||||||
|
singleFile.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
Commands.GitIgnore.Add(_repo.FullPath, change.Path);
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
addToIgnore.Items.Add(singleFile);
|
||||||
|
|
||||||
var byExtensionInSameFolder = new MenuItem();
|
var byParentFolder = new MenuItem();
|
||||||
byExtensionInSameFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.ExtensionInSameFolder", extension);
|
byParentFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InSameFolder");
|
||||||
byExtensionInSameFolder.IsVisible = !isRooted;
|
byParentFolder.IsVisible = !isRooted;
|
||||||
byExtensionInSameFolder.Click += (_, e) =>
|
byParentFolder.Click += (_, e) =>
|
||||||
{
|
{
|
||||||
var dir = Path.GetDirectoryName(change.Path)!.Replace('\\', '/').TrimEnd('/');
|
var dir = Path.GetDirectoryName(change.Path)!.Replace('\\', '/').TrimEnd('/');
|
||||||
Commands.GitIgnore.Add(_repo.FullPath, $"{dir}/*{extension}");
|
Commands.GitIgnore.Add(_repo.FullPath, dir + "/");
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
addToIgnore.Items.Add(byExtensionInSameFolder);
|
addToIgnore.Items.Add(byParentFolder);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(extension))
|
||||||
|
{
|
||||||
|
var byExtension = new MenuItem();
|
||||||
|
byExtension.Header = App.Text("WorkingCopy.AddToGitIgnore.Extension", extension);
|
||||||
|
byExtension.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
Commands.GitIgnore.Add(_repo.FullPath, $"*{extension}");
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
addToIgnore.Items.Add(byExtension);
|
||||||
|
|
||||||
|
var byExtensionInSameFolder = new MenuItem();
|
||||||
|
byExtensionInSameFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.ExtensionInSameFolder", extension);
|
||||||
|
byExtensionInSameFolder.IsVisible = !isRooted;
|
||||||
|
byExtensionInSameFolder.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
var dir = Path.GetDirectoryName(change.Path)!.Replace('\\', '/').TrimEnd('/');
|
||||||
|
Commands.GitIgnore.Add(_repo.FullPath, $"{dir}/*{extension}");
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
addToIgnore.Items.Add(byExtensionInSameFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.Items.Add(addToIgnore);
|
||||||
|
hasExtra = true;
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(selectedSingleFolder))
|
||||||
|
{
|
||||||
|
var addToIgnore = new MenuItem();
|
||||||
|
addToIgnore.Header = App.Text("WorkingCopy.AddToGitIgnore");
|
||||||
|
addToIgnore.Icon = App.CreateMenuIcon("Icons.GitIgnore");
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(selectedSingleFolder))
|
||||||
|
{
|
||||||
|
var ignoreFolder = new MenuItem();
|
||||||
|
ignoreFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InFolder");
|
||||||
|
ignoreFolder.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
Commands.GitIgnore.Add(_repo.FullPath, $"{selectedSingleFolder}/");
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
addToIgnore.Items.Add(ignoreFolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.Items.Add(addToIgnore);
|
menu.Items.Add(addToIgnore);
|
||||||
|
@ -1086,6 +1121,25 @@ namespace SourceGit.ViewModels
|
||||||
menu.Items.Add(discard);
|
menu.Items.Add(discard);
|
||||||
menu.Items.Add(stash);
|
menu.Items.Add(stash);
|
||||||
menu.Items.Add(patch);
|
menu.Items.Add(patch);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(selectedSingleFolder))
|
||||||
|
{
|
||||||
|
var ignoreFolder = new MenuItem();
|
||||||
|
ignoreFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InFolder");
|
||||||
|
ignoreFolder.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
Commands.GitIgnore.Add(_repo.FullPath, $"{selectedSingleFolder}/");
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
var addToIgnore = new MenuItem();
|
||||||
|
addToIgnore.Header = App.Text("WorkingCopy.AddToGitIgnore");
|
||||||
|
addToIgnore.Icon = App.CreateMenuIcon("Icons.GitIgnore");
|
||||||
|
addToIgnore.Items.Add(ignoreFolder);
|
||||||
|
|
||||||
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
menu.Items.Add(addToIgnore);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return menu;
|
return menu;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.VisualTree;
|
||||||
|
|
||||||
namespace SourceGit.Views
|
namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
|
@ -29,7 +30,12 @@ namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
if (DataContext is ViewModels.WorkingCopy vm && sender is Control control)
|
if (DataContext is ViewModels.WorkingCopy vm && sender is Control control)
|
||||||
{
|
{
|
||||||
var menu = vm.CreateContextMenuForUnstagedChanges();
|
var container = control.FindDescendantOfType<ChangeCollectionContainer>();
|
||||||
|
var selectedSingleFolder = string.Empty;
|
||||||
|
if (container is { SelectedItems: { Count: 1 }, SelectedItem: ViewModels.ChangeTreeNode { IsFolder: true } node })
|
||||||
|
selectedSingleFolder = node.FullPath;
|
||||||
|
|
||||||
|
var menu = vm.CreateContextMenuForUnstagedChanges(selectedSingleFolder);
|
||||||
menu?.Open(control);
|
menu?.Open(control);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue