fix files

This commit is contained in:
Matt Parker
2025-10-20 18:40:54 +10:00
parent ba67576906
commit 76bc0afc52
2 changed files with 13 additions and 29 deletions

View File

@@ -8,16 +8,3 @@ public class TreeItemContainer
{
public TreeItem? Value { get; set; }
}
public static class ObservableTreeExtensions
{
public static ObservableHashSet<T> WithInitialPopulation<T>(this ObservableHashSet<T> hashSet, Action<ViewChangedEvent<T, TreeItemContainer>> func) where T : class
{
foreach (var existing in hashSet)
{
var viewChangedEvent = new ViewChangedEvent<T, TreeItemContainer>(NotifyCollectionChangedAction.Add, (existing, new TreeItemContainer()), (null!, null!), -1, -1, new SortOperation<T>());
func(viewChangedEvent);
}
return hashSet;
}
}

View File

@@ -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<SharpIdeFile, TreeItemContainer> 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<SharpIdeFile>(e.NewItem.Value));
e.NewItem.View.Value = fileItem;
fileItem.SetMetadata(0, new RefCountedContainer<SharpIdeFile>(sharpIdeFile));
return fileItem;
}
private async Task FreeTreeItem(TreeItem? item)