sort folders

This commit is contained in:
Matt Parker
2025-10-31 18:42:09 +10:00
parent 5e170a752e
commit cb6b6c29ee
2 changed files with 19 additions and 8 deletions

View File

@@ -13,13 +13,24 @@ public class SharpIdeSolutionModificationService(FileChangedService fileChangedS
public SharpIdeSolutionModel SolutionModel { get; set; } = null!; public SharpIdeSolutionModel SolutionModel { get; set; } = null!;
/// The directory must already exist on disk /// The directory must already exist on disk
public async Task<SharpIdeFolder> AddDirectory(IFolderOrProject parentFolder, string directoryName) public async Task<SharpIdeFolder> AddDirectory(IFolderOrProject parentNode, string directoryName)
{ {
var addedDirectoryPath = Path.Combine(parentFolder.ChildNodeBasePath, directoryName); var addedDirectoryPath = Path.Combine(parentNode.ChildNodeBasePath, directoryName);
var allFiles = new ConcurrentBag<SharpIdeFile>(); var allFiles = new ConcurrentBag<SharpIdeFile>();
var allFolders = new ConcurrentBag<SharpIdeFolder>(); var allFolders = new ConcurrentBag<SharpIdeFolder>();
var sharpIdeFolder = new SharpIdeFolder(new DirectoryInfo(addedDirectoryPath), parentFolder, allFiles, allFolders); var sharpIdeFolder = new SharpIdeFolder(new DirectoryInfo(addedDirectoryPath), parentNode, allFiles, allFolders);
parentFolder.Folders.Add(sharpIdeFolder);
var correctInsertionPosition = parentNode.Folders.list.BinarySearch(sharpIdeFolder, SharpIdeFolderComparer.Instance);
if (correctInsertionPosition < 0)
{
correctInsertionPosition = ~correctInsertionPosition;
}
else
{
throw new InvalidOperationException("Folder already exists in the containing folder or project");
}
parentNode.Folders.Insert(correctInsertionPosition, sharpIdeFolder);
SolutionModel.AllFolders.AddRange((IEnumerable<SharpIdeFolder>)[sharpIdeFolder, ..allFolders]); SolutionModel.AllFolders.AddRange((IEnumerable<SharpIdeFolder>)[sharpIdeFolder, ..allFolders]);
SolutionModel.AllFiles.AddRange(allFiles); SolutionModel.AllFiles.AddRange(allFiles);
foreach (var file in allFiles) foreach (var file in allFiles)

View File

@@ -225,7 +225,7 @@ public partial class SolutionExplorerPanel : MarginContainer
foldersView.ObserveChanged() foldersView.ObserveChanged()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, projectItem, innerEvent.NewItem.Value)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, projectItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
@@ -244,9 +244,9 @@ public partial class SolutionExplorerPanel : MarginContainer
} }
[RequiresGodotUiThread] [RequiresGodotUiThread]
private TreeItem CreateFolderTreeItem(Tree tree, TreeItem parent, SharpIdeFolder sharpIdeFolder) private TreeItem CreateFolderTreeItem(Tree tree, TreeItem parent, SharpIdeFolder sharpIdeFolder, int newStartingIndex = -1)
{ {
var folderItem = tree.CreateItem(parent); var folderItem = tree.CreateItem(parent, newStartingIndex);
folderItem.SetText(0, sharpIdeFolder.Name); folderItem.SetText(0, sharpIdeFolder.Name);
folderItem.SetIcon(0, FolderIcon); folderItem.SetIcon(0, FolderIcon);
folderItem.SetMetadata(0, new RefCountedContainer<SharpIdeFolder>(sharpIdeFolder)); folderItem.SetMetadata(0, new RefCountedContainer<SharpIdeFolder>(sharpIdeFolder));
@@ -264,7 +264,7 @@ public partial class SolutionExplorerPanel : MarginContainer
subFoldersView.ObserveChanged() subFoldersView.ObserveChanged()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, folderItem, innerEvent.NewItem.Value)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, folderItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);