This commit is contained in:
Matt Parker
2025-09-12 19:23:02 +10:00
parent 21dc0be9cf
commit 1f829314dd

View File

@@ -38,30 +38,34 @@ public partial class ProblemsPanel : Control
} }
public void BindToTree(ObservableHashSet<SharpIdeProjectModel> list) public void BindToTree(ObservableHashSet<SharpIdeProjectModel> list)
{ {
var view = list.CreateView(x => var view = list.CreateView(y => new TreeItemContainer());
{ view.ObserveChanged()
var treeItem = _tree.CreateItem(_rootItem);
treeItem.SetText(0, x.Name);
var projectDiagnosticsView = x.Diagnostics.CreateView(y => new TreeItemContainer());
projectDiagnosticsView.ObserveChanged()
.SubscribeAwait(async (e, ct) => await (e.Action switch .SubscribeAwait(async (e, ct) => await (e.Action switch
{ {
NotifyCollectionChangedAction.Add => CreateDiagnosticTreeItem(_tree, treeItem, e), NotifyCollectionChangedAction.Add => CreateProjectTreeItem(_tree, _rootItem, e),
NotifyCollectionChangedAction.Remove => FreeDiagnosticTreeItem(e), NotifyCollectionChangedAction.Remove => FreeTreeItem(e.OldItem.View.Value),
_ => Task.CompletedTask _ => Task.CompletedTask
})).AddTo(this); })).AddTo(this);
Observable.EveryValueChanged(x, s => s.Diagnostics.Count)
.Subscribe(s => treeItem.Visible = s is not 0).AddTo(this);
return treeItem;
});
view.ViewChanged += OnViewChanged;
} }
private async Task FreeDiagnosticTreeItem(ViewChangedEvent<Diagnostic, TreeItemContainer> e) private async Task CreateProjectTreeItem(Tree tree, TreeItem parent, ViewChangedEvent<SharpIdeProjectModel, TreeItemContainer> e)
{ {
await this.InvokeAsync(() => await this.InvokeAsync(() =>
{ {
e.OldItem.View.Value?.Free(); var treeItem = tree.CreateItem(parent);
treeItem.SetText(0, e.NewItem.Value.Name);
e.NewItem.View.Value = treeItem;
Observable.EveryValueChanged(e.NewItem.Value, s => s.Diagnostics.Count).Subscribe(s => treeItem.Visible = s is not 0).AddTo(this);
var projectDiagnosticsView = e.NewItem.Value.Diagnostics.CreateView(y => new TreeItemContainer());
projectDiagnosticsView.ObserveChanged()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{
NotifyCollectionChangedAction.Add => CreateDiagnosticTreeItem(_tree, treeItem, innerEvent),
NotifyCollectionChangedAction.Remove => FreeTreeItem(e.OldItem.View.Value),
_ => Task.CompletedTask
})).AddTo(this);
}); });
} }
@@ -75,13 +79,11 @@ public partial class ProblemsPanel : Control
}); });
} }
private static void OnViewChanged(in SynchronizedViewChangedEventArgs<SharpIdeProjectModel, TreeItem> eventArgs) private async Task FreeTreeItem(TreeItem? treeItem)
{ {
GD.Print("View changed: " + eventArgs.Action); await this.InvokeAsync(() =>
if (eventArgs.Action == NotifyCollectionChangedAction.Remove)
{ {
var treeItem = eventArgs.OldItem.View; treeItem?.Free();
Callable.From(() => treeItem.Free()).CallDeferred(); });
}
} }
} }