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 @@ -124,17 +124,22 @@ namespace ICSharpCode.ILSpy
dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
AvalonEditTextOutput output = new AvalonEditTextOutput();
Stopwatch stopwatch = Stopwatch.StartNew();
var writtenFiles = new List<string>();
foreach (var node in nodes)
{
if (node is AssemblyTreeNode { PackageEntry: { } assembly })
{
string fileName = GetFileName(path, isFile, node.Parent, assembly);
SaveEntry(output, assembly, fileName);
if (File.Exists(fileName))
writtenFiles.Add(fileName);
}
else if (node is ResourceTreeNode { Resource: PackageEntry { } resource })
{
string fileName = GetFileName(path, isFile, node.Parent, resource);
SaveEntry(output, resource, fileName);
if (File.Exists(fileName))
writtenFiles.Add(fileName);
}
else if (node is PackageFolderTreeNode)
{
@ -145,11 +150,15 @@ namespace ICSharpCode.ILSpy @@ -145,11 +150,15 @@ namespace ICSharpCode.ILSpy
{
string fileName = GetFileName(path, isFile, item.Parent, asm);
SaveEntry(output, asm, fileName);
if (File.Exists(fileName))
writtenFiles.Add(fileName);
}
else if (item is ResourceTreeNode { Resource: PackageEntry { } entry })
{
string fileName = GetFileName(path, isFile, item.Parent, entry);
SaveEntry(output, entry, fileName);
if (File.Exists(fileName))
writtenFiles.Add(fileName);
}
else if (item is PackageFolderTreeNode)
{
@ -161,7 +170,18 @@ namespace ICSharpCode.ILSpy @@ -161,7 +170,18 @@ namespace ICSharpCode.ILSpy
stopwatch.Stop();
output.WriteLine(Resources.GenerationCompleteInSeconds, stopwatch.Elapsed.TotalSeconds.ToString("F1"));
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();
return output;
}, ct)).Then(dockWorkspace.ShowText).HandleExceptions();

5
ILSpy/TreeNodes/AssemblyTreeNode.cs

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

Loading…
Cancel
Save