move folders v1

This commit is contained in:
Matt Parker
2025-10-31 19:25:01 +10:00
parent fd5dba6044
commit 7fa1fedd1e
2 changed files with 15 additions and 7 deletions

View File

@@ -107,7 +107,7 @@ public class SharpIdeSolutionModificationService(FileChangedService fileChangedS
var parentFolderOrProject = (IFolderOrProject)folder.Parent; var parentFolderOrProject = (IFolderOrProject)folder.Parent;
var currentPosition = parentFolderOrProject.Folders.IndexOf(folder); var currentPosition = parentFolderOrProject.Folders.IndexOf(folder);
var insertionPosition = GetMovePosition(parentFolderOrProject, folder); var insertionPosition = GetMovePosition(parentFolderOrProject, folder);
if (currentPosition != insertionPosition) parentFolderOrProject.Files.Move(currentPosition, insertionPosition); if (currentPosition != insertionPosition) parentFolderOrProject.Folders.Move(currentPosition, insertionPosition);
var stack = new Stack<SharpIdeFolder>(); var stack = new Stack<SharpIdeFolder>();
stack.Push(folder); stack.Push(folder);

View File

@@ -226,6 +226,7 @@ public partial class SolutionExplorerPanel : MarginContainer
.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, innerEvent.NewStartingIndex)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, projectItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
NotifyCollectionChangedAction.Move => MoveTreeItem(_tree, innerEvent.NewItem.View, innerEvent.NewItem.Value, innerEvent.OldStartingIndex, innerEvent.NewStartingIndex),
NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
@@ -237,6 +238,7 @@ public partial class SolutionExplorerPanel : MarginContainer
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, projectItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, projectItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
NotifyCollectionChangedAction.Move => MoveTreeItem(_tree, innerEvent.NewItem.View, innerEvent.NewItem.Value, innerEvent.OldStartingIndex, innerEvent.NewStartingIndex),
NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
@@ -265,6 +267,7 @@ public partial class SolutionExplorerPanel : MarginContainer
.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, innerEvent.NewStartingIndex)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, folderItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
NotifyCollectionChangedAction.Move => MoveTreeItem(_tree, innerEvent.NewItem.View, innerEvent.NewItem.Value, innerEvent.OldStartingIndex, innerEvent.NewStartingIndex),
NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
@@ -310,14 +313,19 @@ public partial class SolutionExplorerPanel : MarginContainer
return fileItem; return fileItem;
} }
private async Task MoveTreeItem(Tree tree, TreeItemContainer treeItemContainer, SharpIdeFile sharpIdeFile, int oldStartingIndex, int newStartingIndex) private async Task MoveTreeItem(Tree tree, TreeItemContainer treeItemContainer, IFileOrFolder fileOrFolder, int oldStartingIndex, int newStartingIndex)
{ {
if (oldStartingIndex == newStartingIndex) throw new InvalidOperationException("Old and new starting indexes are the same"); if (oldStartingIndex == newStartingIndex) throw new InvalidOperationException("Old and new starting indexes are the same");
var treeItem = treeItemContainer.Value!; var treeItem = treeItemContainer.Value!;
var sharpIdeParent = sharpIdeFile.Parent as IFolderOrProject; var isFile = fileOrFolder is SharpIdeFile;
if (isFile)
{
var sharpIdeParent = fileOrFolder.Parent as IFolderOrProject;
Guard.Against.Null(sharpIdeParent, nameof(sharpIdeParent)); Guard.Against.Null(sharpIdeParent, nameof(sharpIdeParent));
var folderCount = sharpIdeParent.Folders.Count; var folderCount = sharpIdeParent.Folders.Count;
newStartingIndex += folderCount; newStartingIndex += folderCount;
}
var treeParent = treeItem.GetParent()!; var treeParent = treeItem.GetParent()!;
await this.InvokeAsync(() => await this.InvokeAsync(() =>
{ {
@@ -327,7 +335,7 @@ public partial class SolutionExplorerPanel : MarginContainer
newItem.SetText(0, treeItem.GetText(0)); newItem.SetText(0, treeItem.GetText(0));
newItem.SetIcon(0, treeItem.GetIcon(0)); newItem.SetIcon(0, treeItem.GetIcon(0));
newItem.SetMetadata(0, treeItem.GetMetadata(0)); newItem.SetMetadata(0, treeItem.GetMetadata(0));
newItem.SetCustomColor(0, treeItem.GetCustomColor(0)); if (isFile) newItem.SetCustomColor(0, treeItem.GetCustomColor(0));
treeItemContainer.Value = newItem; treeItemContainer.Value = newItem;
treeItem.Free(); treeItem.Free();
}); });