sort folders
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user