display diagnostics

This commit is contained in:
Matt Parker
2025-09-12 18:32:22 +10:00
parent b968443968
commit 460c2544d2

View File

@@ -30,25 +30,55 @@ public partial class ProblemsPanel : Control
});
BindToTree(_projects);
}
private class TreeItemContainer
{
public TreeItem? Value { get; set; }
}
public void BindToTree(ObservableHashSet<SharpIdeProjectModel> list)
{
var view = list.CreateView(x =>
{
var treeItem = _tree.CreateItem(_rootItem);
treeItem.SetText(0, x.Name);
var projectDiagnosticsView = x.Diagnostics.CreateView(y =>
{
return new TreeItemContainer();
});
var test = projectDiagnosticsView.ObserveChanged().SubscribeOnCurrentSynchronizationContext()
.SubscribeAwait(async (e, ct) =>
{
if (e.Action is NotifyCollectionChangedAction.Add)
{
await this.InvokeAsync(() =>
{
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)
.Subscribe(s => treeItem.Visible = s is not 0);
return treeItem;
});
view.ViewChanged += OnViewChanged;
}
private static void OnViewChanged(in SynchronizedViewChangedEventArgs<SharpIdeProjectModel, TreeItem> eventArgs)
{
GD.Print("View changed: " + eventArgs.Action);
if (eventArgs.Action == NotifyCollectionChangedAction.Remove)
{
eventArgs.OldItem.View.Free();
var treeItem = eventArgs.OldItem.View;
Callable.From(() => treeItem.Free()).CallDeferred();
}
}
}