fix sln folders

This commit is contained in:
Matt Parker
2025-10-20 18:37:37 +10:00
parent b20469b51a
commit ba67576906

View File

@@ -116,13 +116,12 @@ public partial class SolutionExplorerPanel : MarginContainer
})).AddTo(this); })).AddTo(this);
// Observe Solution Folders // Observe Solution Folders
var foldersView = solution.SlnFolders var foldersView = solution.SlnFolders.CreateView(y => new TreeItemContainer());
.WithInitialPopulation(s => CreateSlnFolderTreeItem(_tree, _rootItem, s)) foldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateSlnFolderTreeItem(_tree, rootItem, s.Value));
.CreateView(y => new TreeItemContainer());
foldersView.ObserveChanged() foldersView.ObserveChanged()
.SubscribeAwait(async (e, ct) => await (e.Action switch .SubscribeAwait(async (e, ct) => await (e.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => CreateSlnFolderTreeItem(_tree, _rootItem, e)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => e.NewItem.View.Value = CreateSlnFolderTreeItem(_tree, _rootItem, e.NewItem.Value)),
NotifyCollectionChangedAction.Remove => FreeTreeItem(e.OldItem.View.Value), NotifyCollectionChangedAction.Remove => FreeTreeItem(e.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
@@ -132,27 +131,26 @@ public partial class SolutionExplorerPanel : MarginContainer
} }
[RequiresGodotUiThread] [RequiresGodotUiThread]
private void CreateSlnFolderTreeItem(Tree tree, TreeItem parent, ViewChangedEvent<SharpIdeSolutionFolder, TreeItemContainer> e) private TreeItem CreateSlnFolderTreeItem(Tree tree, TreeItem parent, SharpIdeSolutionFolder slnFolder)
{ {
var folderItem = tree.CreateItem(parent); var folderItem = tree.CreateItem(parent);
folderItem.SetText(0, e.NewItem.Value.Name); folderItem.SetText(0, slnFolder.Name);
folderItem.SetIcon(0, SlnFolderIcon); folderItem.SetIcon(0, SlnFolderIcon);
folderItem.SetMetadata(0, new RefCountedContainer<SharpIdeSolutionFolder>(e.NewItem.Value)); folderItem.SetMetadata(0, new RefCountedContainer<SharpIdeSolutionFolder>(slnFolder));
e.NewItem.View.Value = folderItem;
// Observe folder sub-collections // Observe folder sub-collections
var subFoldersView = e.NewItem.Value.Folders var subFoldersView = slnFolder.Folders.CreateView(y => new TreeItemContainer());
.WithInitialPopulation(s => CreateSlnFolderTreeItem(_tree, folderItem, s)) subFoldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateSlnFolderTreeItem(_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(() => CreateSlnFolderTreeItem(_tree, folderItem, innerEvent)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateSlnFolderTreeItem(_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);
var projectsView = e.NewItem.Value.Projects.CreateView(y => new TreeItemContainer()); var projectsView = slnFolder.Projects.CreateView(y => new TreeItemContainer());
projectsView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateProjectTreeItem(_tree, folderItem, s.Value)); projectsView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateProjectTreeItem(_tree, folderItem, s.Value));
projectsView.ObserveChanged() projectsView.ObserveChanged()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
@@ -162,7 +160,7 @@ public partial class SolutionExplorerPanel : MarginContainer
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
var filesView = e.NewItem.Value.Files var filesView = slnFolder.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()
@@ -172,6 +170,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]