sln explorer - fix projects

This commit is contained in:
Matt Parker
2025-10-20 18:22:12 +10:00
parent 67490f8a44
commit b20469b51a

View File

@@ -104,13 +104,13 @@ public partial class SolutionExplorerPanel : MarginContainer
_rootItem = rootItem; _rootItem = rootItem;
// Observe Projects // Observe Projects
var projectsView = solution.Projects var projectsView = solution.Projects.CreateView(y => new TreeItemContainer());
.WithInitialPopulation(s => CreateProjectTreeItem(_tree, _rootItem, s)) projectsView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateProjectTreeItem(_tree, rootItem, s.Value));
.CreateView(y => new TreeItemContainer());
projectsView.ObserveChanged() projectsView.ObserveChanged()
.SubscribeAwait(async (e, ct) => await (e.Action switch .SubscribeAwait(async (e, ct) => await (e.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => CreateProjectTreeItem(_tree, _rootItem, e)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => e.NewItem.View.Value = CreateProjectTreeItem(_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);
@@ -152,13 +152,12 @@ public partial class SolutionExplorerPanel : MarginContainer
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
var projectsView = e.NewItem.Value.Projects var projectsView = e.NewItem.Value.Projects.CreateView(y => new TreeItemContainer());
.WithInitialPopulation(s => CreateProjectTreeItem(_tree, folderItem, s)) projectsView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateProjectTreeItem(_tree, folderItem, s.Value));
.CreateView(y => new TreeItemContainer());
projectsView.ObserveChanged() projectsView.ObserveChanged()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => CreateProjectTreeItem(_tree, folderItem, innerEvent)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateProjectTreeItem(_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);
@@ -176,16 +175,15 @@ public partial class SolutionExplorerPanel : MarginContainer
} }
[RequiresGodotUiThread] [RequiresGodotUiThread]
private void CreateProjectTreeItem(Tree tree, TreeItem parent, ViewChangedEvent<SharpIdeProjectModel, TreeItemContainer> e) private TreeItem CreateProjectTreeItem(Tree tree, TreeItem parent, SharpIdeProjectModel projectModel)
{ {
var projectItem = tree.CreateItem(parent); var projectItem = tree.CreateItem(parent);
projectItem.SetText(0, e.NewItem.Value.Name); projectItem.SetText(0, projectModel.Name);
projectItem.SetIcon(0, CsprojIcon); projectItem.SetIcon(0, CsprojIcon);
projectItem.SetMetadata(0, new RefCountedContainer<SharpIdeProjectModel>(e.NewItem.Value)); projectItem.SetMetadata(0, new RefCountedContainer<SharpIdeProjectModel>(projectModel));
e.NewItem.View.Value = projectItem;
// Observe project folders // Observe project folders
var foldersView = e.NewItem.Value.Folders.CreateView(y => new TreeItemContainer()); var foldersView = projectModel.Folders.CreateView(y => new TreeItemContainer());
foldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFolderTreeItem(_tree, projectItem, s.Value)); foldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFolderTreeItem(_tree, projectItem, s.Value));
foldersView.ObserveChanged() foldersView.ObserveChanged()
@@ -197,7 +195,7 @@ public partial class SolutionExplorerPanel : MarginContainer
})).AddTo(this); })).AddTo(this);
// Observe project files // Observe project files
var filesView = e.NewItem.Value.Files var filesView = projectModel.Files
.WithInitialPopulation(s => CreateFileTreeItem(_tree, projectItem, s)) .WithInitialPopulation(s => CreateFileTreeItem(_tree, projectItem, s))
.CreateView(y => new TreeItemContainer()); .CreateView(y => new TreeItemContainer());
filesView.ObserveChanged() filesView.ObserveChanged()
@@ -207,6 +205,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 projectItem;
} }
[RequiresGodotUiThread] [RequiresGodotUiThread]