diff --git a/src/SharpIDE.Godot/Features/Common/TreeItemContainer.cs b/src/SharpIDE.Godot/Features/Common/TreeItemContainer.cs index ff9b5d7..3fc87ce 100644 --- a/src/SharpIDE.Godot/Features/Common/TreeItemContainer.cs +++ b/src/SharpIDE.Godot/Features/Common/TreeItemContainer.cs @@ -8,16 +8,3 @@ public class TreeItemContainer { public TreeItem? Value { get; set; } } - -public static class ObservableTreeExtensions -{ - public static ObservableHashSet WithInitialPopulation(this ObservableHashSet hashSet, Action> func) where T : class - { - foreach (var existing in hashSet) - { - var viewChangedEvent = new ViewChangedEvent(NotifyCollectionChangedAction.Add, (existing, new TreeItemContainer()), (null!, null!), -1, -1, new SortOperation()); - func(viewChangedEvent); - } - return hashSet; - } -} \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs index de22b10..de6d950 100644 --- a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs +++ b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs @@ -160,13 +160,12 @@ public partial class SolutionExplorerPanel : MarginContainer _ => Task.CompletedTask })).AddTo(this); - var filesView = slnFolder.Files - .WithInitialPopulation(s => CreateFileTreeItem(_tree, folderItem, s)) - .CreateView(y => new TreeItemContainer()); + var filesView = slnFolder.Files.CreateView(y => new TreeItemContainer()); + filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, folderItem, s.Value)); filesView.ObserveChanged() .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch { - NotifyCollectionChangedAction.Add => this.InvokeAsync(() => CreateFileTreeItem(_tree, folderItem, innerEvent)), + NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, folderItem, innerEvent.NewItem.Value)), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), _ => Task.CompletedTask })).AddTo(this); @@ -194,13 +193,12 @@ public partial class SolutionExplorerPanel : MarginContainer })).AddTo(this); // Observe project files - var filesView = projectModel.Files - .WithInitialPopulation(s => CreateFileTreeItem(_tree, projectItem, s)) - .CreateView(y => new TreeItemContainer()); + var filesView = projectModel.Files.CreateView(y => new TreeItemContainer()); + filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, projectItem, s.Value)); filesView.ObserveChanged() .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch { - NotifyCollectionChangedAction.Add => this.InvokeAsync(() => CreateFileTreeItem(_tree, projectItem, innerEvent)), + NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, projectItem, innerEvent.NewItem.Value)), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), _ => Task.CompletedTask })).AddTo(this); @@ -228,13 +226,12 @@ public partial class SolutionExplorerPanel : MarginContainer })).AddTo(this); // Observe files - var filesView = sharpIdeFolder.Files - .WithInitialPopulation(s => CreateFileTreeItem(_tree, folderItem, s)) - .CreateView(y => new TreeItemContainer()); + var filesView = sharpIdeFolder.Files.CreateView(y => new TreeItemContainer()); + filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, folderItem, s.Value)); filesView.ObserveChanged() .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch { - NotifyCollectionChangedAction.Add => this.InvokeAsync(() => CreateFileTreeItem(_tree, folderItem, innerEvent)), + NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, folderItem, innerEvent.NewItem.Value)), NotifyCollectionChangedAction.Remove => FreeTreeItem(innerEvent.OldItem.View.Value), _ => Task.CompletedTask })).AddTo(this); @@ -242,13 +239,13 @@ public partial class SolutionExplorerPanel : MarginContainer } [RequiresGodotUiThread] - private void CreateFileTreeItem(Tree tree, TreeItem parent, ViewChangedEvent e) + private TreeItem CreateFileTreeItem(Tree tree, TreeItem parent, SharpIdeFile sharpIdeFile) { var fileItem = tree.CreateItem(parent); - fileItem.SetText(0, e.NewItem.Value.Name); + fileItem.SetText(0, sharpIdeFile.Name); fileItem.SetIcon(0, CsharpFileIcon); - fileItem.SetMetadata(0, new RefCountedContainer(e.NewItem.Value)); - e.NewItem.View.Value = fileItem; + fileItem.SetMetadata(0, new RefCountedContainer(sharpIdeFile)); + return fileItem; } private async Task FreeTreeItem(TreeItem? item)