Browse Source

Batch calls to `ShellHelper.OpenFolderAndSelectItems` instead of looping `OpenFolderAndSelectItem`.

pull/3619/head
sonyps5201314 1 month ago
parent
commit
cae002273c
  1. 22
      ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs
  2. 5
      ILSpy/TreeNodes/AssemblyTreeNode.cs

22
ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs

@ -124,17 +124,22 @@ namespace ICSharpCode.ILSpy
dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => { dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
AvalonEditTextOutput output = new AvalonEditTextOutput(); AvalonEditTextOutput output = new AvalonEditTextOutput();
Stopwatch stopwatch = Stopwatch.StartNew(); Stopwatch stopwatch = Stopwatch.StartNew();
var writtenFiles = new List<string>();
foreach (var node in nodes) foreach (var node in nodes)
{ {
if (node is AssemblyTreeNode { PackageEntry: { } assembly }) if (node is AssemblyTreeNode { PackageEntry: { } assembly })
{ {
string fileName = GetFileName(path, isFile, node.Parent, assembly); string fileName = GetFileName(path, isFile, node.Parent, assembly);
SaveEntry(output, assembly, fileName); SaveEntry(output, assembly, fileName);
if (File.Exists(fileName))
writtenFiles.Add(fileName);
} }
else if (node is ResourceTreeNode { Resource: PackageEntry { } resource }) else if (node is ResourceTreeNode { Resource: PackageEntry { } resource })
{ {
string fileName = GetFileName(path, isFile, node.Parent, resource); string fileName = GetFileName(path, isFile, node.Parent, resource);
SaveEntry(output, resource, fileName); SaveEntry(output, resource, fileName);
if (File.Exists(fileName))
writtenFiles.Add(fileName);
} }
else if (node is PackageFolderTreeNode) else if (node is PackageFolderTreeNode)
{ {
@ -145,11 +150,15 @@ namespace ICSharpCode.ILSpy
{ {
string fileName = GetFileName(path, isFile, item.Parent, asm); string fileName = GetFileName(path, isFile, item.Parent, asm);
SaveEntry(output, asm, fileName); SaveEntry(output, asm, fileName);
if (File.Exists(fileName))
writtenFiles.Add(fileName);
} }
else if (item is ResourceTreeNode { Resource: PackageEntry { } entry }) else if (item is ResourceTreeNode { Resource: PackageEntry { } entry })
{ {
string fileName = GetFileName(path, isFile, item.Parent, entry); string fileName = GetFileName(path, isFile, item.Parent, entry);
SaveEntry(output, entry, fileName); SaveEntry(output, entry, fileName);
if (File.Exists(fileName))
writtenFiles.Add(fileName);
} }
else if (item is PackageFolderTreeNode) else if (item is PackageFolderTreeNode)
{ {
@ -161,7 +170,18 @@ namespace ICSharpCode.ILSpy
stopwatch.Stop(); stopwatch.Stop();
output.WriteLine(Resources.GenerationCompleteInSeconds, stopwatch.Elapsed.TotalSeconds.ToString("F1")); output.WriteLine(Resources.GenerationCompleteInSeconds, stopwatch.Elapsed.TotalSeconds.ToString("F1"));
output.WriteLine(); output.WriteLine();
output.AddButton(null, Resources.OpenExplorer, delegate { if (isFile) ShellHelper.OpenFolderAndSelectItem(path); else ShellHelper.OpenFolder(path); }); // If we have written files, open explorer and select them grouped by folder; otherwise fall back to opening containing folder.
if (writtenFiles.Count > 0)
{
output.AddButton(null, Resources.OpenExplorer, delegate { ShellHelper.OpenFolderAndSelectItems(writtenFiles); });
}
else
{
if (isFile && File.Exists(path))
output.AddButton(null, Resources.OpenExplorer, delegate { ShellHelper.OpenFolderAndSelectItems(new[] { path }); });
else
output.AddButton(null, Resources.OpenExplorer, delegate { ShellHelper.OpenFolder(path); });
}
output.WriteLine(); output.WriteLine();
return output; return output;
}, ct)).Then(dockWorkspace.ShowText).HandleExceptions(); }, ct)).Then(dockWorkspace.ShowText).HandleExceptions();

5
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -690,15 +690,18 @@ namespace ICSharpCode.ILSpy.TreeNodes
{ {
if (context.SelectedTreeNodes == null) if (context.SelectedTreeNodes == null)
return; return;
var paths = new List<string>();
foreach (var n in context.SelectedTreeNodes) foreach (var n in context.SelectedTreeNodes)
{ {
var node = GetAssemblyTreeNode(n); var node = GetAssemblyTreeNode(n);
var path = node.LoadedAssembly.FileName; var path = node.LoadedAssembly.FileName;
if (File.Exists(path)) if (File.Exists(path))
{ {
ShellHelper.OpenFolderAndSelectItem(path); paths.Add(path);
} }
} }
if (paths.Count > 0)
ShellHelper.OpenFolderAndSelectItems(paths);
} }
} }

Loading…
Cancel
Save