fix sln explorer folder init

This commit is contained in:
Matt Parker
2025-10-20 18:06:25 +10:00
parent 4278b729dc
commit 67490f8a44
2 changed files with 15 additions and 14 deletions

View File

@@ -5,6 +5,7 @@
[node name="NewDirectoryDialog" type="ConfirmationDialog"] [node name="NewDirectoryDialog" type="ConfirmationDialog"]
oversampling_override = 1.0 oversampling_override = 1.0
title = "Create: Directory" title = "Create: Directory"
position = Vector2i(0, 36)
size = Vector2i(405, 115) size = Vector2i(405, 115)
visible = true visible = true
script = ExtResource("1_4utum") script = ExtResource("1_4utum")

View File

@@ -185,13 +185,13 @@ public partial class SolutionExplorerPanel : MarginContainer
e.NewItem.View.Value = projectItem; e.NewItem.View.Value = projectItem;
// Observe project folders // Observe project folders
var foldersView = e.NewItem.Value.Folders var foldersView = e.NewItem.Value.Folders.CreateView(y => new TreeItemContainer());
.WithInitialPopulation(s => CreateFolderTreeItem(_tree, projectItem, s)) foldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFolderTreeItem(_tree, projectItem, s.Value));
.CreateView(y => new TreeItemContainer());
foldersView.ObserveChanged() foldersView.ObserveChanged()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => CreateFolderTreeItem(_tree, projectItem, innerEvent)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, projectItem, innerEvent.NewItem.Value)),
NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
@@ -210,28 +210,27 @@ public partial class SolutionExplorerPanel : MarginContainer
} }
[RequiresGodotUiThread] [RequiresGodotUiThread]
private void CreateFolderTreeItem(Tree tree, TreeItem parent, ViewChangedEvent<SharpIdeFolder, TreeItemContainer> e) private TreeItem CreateFolderTreeItem(Tree tree, TreeItem parent, SharpIdeFolder sharpIdeFolder)
{ {
var folderItem = tree.CreateItem(parent); var folderItem = tree.CreateItem(parent);
folderItem.SetText(0, e.NewItem.Value.Name); folderItem.SetText(0, sharpIdeFolder.Name);
folderItem.SetIcon(0, FolderIcon); folderItem.SetIcon(0, FolderIcon);
folderItem.SetMetadata(0, new RefCountedContainer<SharpIdeFolder>(e.NewItem.Value)); folderItem.SetMetadata(0, new RefCountedContainer<SharpIdeFolder>(sharpIdeFolder));
e.NewItem.View.Value = folderItem;
// Observe subfolders // Observe subfolders
var subFoldersView = e.NewItem.Value.Folders var subFoldersView = sharpIdeFolder.Folders.CreateView(y => new TreeItemContainer());
.WithInitialPopulation(s => CreateFolderTreeItem(_tree, folderItem, s)) subFoldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFolderTreeItem(_tree, folderItem, s.Value));
.CreateView(y => new TreeItemContainer());
subFoldersView.ObserveChanged() subFoldersView.ObserveChanged()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => CreateFolderTreeItem(_tree, folderItem, innerEvent)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, folderItem, innerEvent.NewItem.Value)),
NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
// Observe files // Observe files
var filesView = e.NewItem.Value.Files var filesView = sharpIdeFolder.Files
.WithInitialPopulation(s => CreateFileTreeItem(_tree, folderItem, s)) .WithInitialPopulation(s => CreateFileTreeItem(_tree, folderItem, s))
.CreateView(y => new TreeItemContainer()); .CreateView(y => new TreeItemContainer());
filesView.ObserveChanged() filesView.ObserveChanged()
@@ -241,6 +240,7 @@ public partial class SolutionExplorerPanel : MarginContainer
NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
return folderItem;
} }
[RequiresGodotUiThread] [RequiresGodotUiThread]