This commit is contained in:
Matt Parker
2025-09-12 19:04:13 +10:00
parent cf9b62f395
commit 019e86ed79

View File

@@ -1,5 +1,6 @@
using System.Collections.Specialized; using System.Collections.Specialized;
using Godot; using Godot;
using Microsoft.CodeAnalysis;
using ObservableCollections; using ObservableCollections;
using R3; using R3;
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
@@ -41,30 +42,14 @@ public partial class ProblemsPanel : Control
{ {
var treeItem = _tree.CreateItem(_rootItem); var treeItem = _tree.CreateItem(_rootItem);
treeItem.SetText(0, x.Name); treeItem.SetText(0, x.Name);
var projectDiagnosticsView = x.Diagnostics.CreateView(y => var projectDiagnosticsView = x.Diagnostics.CreateView(y => new TreeItemContainer());
{ var disposable = projectDiagnosticsView.ObserveChanged()
return new TreeItemContainer(); .SubscribeAwait(async (e, ct) => await (e.Action switch
});
var test = projectDiagnosticsView.ObserveChanged()
.SubscribeAwait(async (e, ct) =>
{ {
if (e.Action is NotifyCollectionChangedAction.Add) NotifyCollectionChangedAction.Add => CreateDiagnosticTreeItem(_tree, treeItem, e),
{ NotifyCollectionChangedAction.Remove => FreeDiagnosticTreeItem(e),
await this.InvokeAsync(() => _ => Task.CompletedTask
{ }));
var diagItem = _tree.CreateItem(treeItem);
diagItem.SetText(0, e.NewItem.Value.GetMessage());
e.NewItem.View.Value = diagItem;
});
}
if (e.Action is NotifyCollectionChangedAction.Remove)
{
await this.InvokeAsync(() =>
{
e.OldItem.View.Value?.Free();
});
}
});
Observable.EveryValueChanged(x, s => s.Diagnostics.Count) Observable.EveryValueChanged(x, s => s.Diagnostics.Count)
.Subscribe(s => treeItem.Visible = s is not 0); .Subscribe(s => treeItem.Visible = s is not 0);
return treeItem; return treeItem;
@@ -72,6 +57,24 @@ public partial class ProblemsPanel : Control
view.ViewChanged += OnViewChanged; view.ViewChanged += OnViewChanged;
} }
private async Task FreeDiagnosticTreeItem(ViewChangedEvent<Diagnostic, TreeItemContainer> e)
{
await this.InvokeAsync(() =>
{
e.OldItem.View.Value?.Free();
});
}
private async Task CreateDiagnosticTreeItem(Tree tree, TreeItem parent, ViewChangedEvent<Diagnostic, TreeItemContainer> e)
{
await this.InvokeAsync(() =>
{
var diagItem = tree.CreateItem(parent);
diagItem.SetText(0, e.NewItem.Value.GetMessage());
e.NewItem.View.Value = diagItem;
});
}
private static void OnViewChanged(in SynchronizedViewChangedEventArgs<SharpIdeProjectModel, TreeItem> eventArgs) private static void OnViewChanged(in SynchronizedViewChangedEventArgs<SharpIdeProjectModel, TreeItem> eventArgs)
{ {
GD.Print("View changed: " + eventArgs.Action); GD.Print("View changed: " + eventArgs.Action);