Skip to content

Commit 13caebe

Browse files
committed
ProblemsPanel - batch ui updates
1 parent ae75f4d commit 13caebe

1 file changed

Lines changed: 36 additions & 24 deletions

File tree

src/SharpIDE.Godot/Features/Problems/ProblemsPanel.cs

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -50,43 +50,55 @@ public void BindToTree(ObservableHashSet<SharpIdeProjectModel> list)
5050
var view = list.CreateView(y => new TreeItemContainer());
5151
var disposableBuilder = new DisposableBuilder();
5252
view.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
53-
.SubscribeAwait(async (e, ct) => await (e.Action switch
53+
.Chunk(TimeSpan.FromMilliseconds(50))
54+
.SubscribeAwait(async (events, ct) =>
5455
{
55-
NotifyCollectionChangedAction.Add => CreateProjectTreeItem(_tree, _rootItem, e),
56-
NotifyCollectionChangedAction.Remove => this.InvokeAsync(() => FreeTreeItem(e.OldItem.View.Value)),
57-
_ => Task.CompletedTask
58-
}), configureAwait: false).AddTo(ref disposableBuilder);
56+
await this.InvokeAsync(() =>
57+
{
58+
foreach (var e in events)
59+
{
60+
switch (e.Action)
61+
{
62+
case NotifyCollectionChangedAction.Add: CreateProjectTreeItem(_tree, _rootItem, e); break;
63+
case NotifyCollectionChangedAction.Remove: FreeTreeItem(e.OldItem.View.Value); break;
64+
}
65+
}
66+
});
67+
68+
}, configureAwait: false).AddTo(ref disposableBuilder);
5969
_rootItem.SharpIdeDisposable = disposableBuilder.Build();
6070
}
6171

62-
private async Task CreateProjectTreeItem(Tree tree, TreeItem parent, ViewChangedEvent<SharpIdeProjectModel, TreeItemContainer> e)
72+
[RequiresGodotUiThread]
73+
private void CreateProjectTreeItem(Tree tree, TreeItem parent, ViewChangedEvent<SharpIdeProjectModel, TreeItemContainer> e)
6374
{
64-
await this.InvokeAsync(() =>
65-
{
66-
var treeItem = tree.CreateItem(parent);
67-
treeItem.SetText(0, e.NewItem.Value.Name.Value);
68-
treeItem.SetIcon(0, CsprojIcon);
69-
treeItem.Visible = e.NewItem.Value.Diagnostics.Count is not 0;
70-
e.NewItem.View.Value = treeItem;
71-
var disposableBuilder = new DisposableBuilder();
72-
73-
var projectDiagnosticsView = e.NewItem.Value.Diagnostics.CreateView(y => new TreeItemContainer());
74-
projectDiagnosticsView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
75-
.SubscribeAwait(async (innerEvent, ct) =>
75+
var treeItem = tree.CreateItem(parent);
76+
treeItem.SetText(0, e.NewItem.Value.Name.Value);
77+
treeItem.SetIcon(0, CsprojIcon);
78+
treeItem.Visible = e.NewItem.Value.Diagnostics.Count is not 0;
79+
e.NewItem.View.Value = treeItem;
80+
var disposableBuilder = new DisposableBuilder();
81+
82+
var projectDiagnosticsView = e.NewItem.Value.Diagnostics.CreateView(y => new TreeItemContainer());
83+
projectDiagnosticsView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
84+
.Chunk(TimeSpan.FromMilliseconds(50))
85+
.SubscribeAwait(async (innerEvents, ct) =>
86+
{
87+
await this.InvokeAsync(() =>
7688
{
77-
if (innerEvent.Action is not (NotifyCollectionChangedAction.Add or NotifyCollectionChangedAction.Remove)) return;
78-
await this.InvokeAsync(() =>
89+
foreach (var innerEvent in innerEvents)
7990
{
91+
if (innerEvent.Action is not (NotifyCollectionChangedAction.Add or NotifyCollectionChangedAction.Remove)) return;
8092
treeItem.Visible = e.NewItem.Value.Diagnostics.Count is not 0;
8193
switch (innerEvent.Action)
8294
{
8395
case NotifyCollectionChangedAction.Add: CreateDiagnosticTreeItem(_tree, treeItem, innerEvent); break;
8496
case NotifyCollectionChangedAction.Remove: FreeTreeItem(innerEvent.OldItem.View.Value); break;
8597
}
86-
});
87-
}, configureAwait: false).AddTo(ref disposableBuilder);
88-
treeItem.SharpIdeDisposable = disposableBuilder.Build();
89-
});
98+
}
99+
});
100+
}, configureAwait: false).AddTo(ref disposableBuilder);
101+
treeItem.SharpIdeDisposable = disposableBuilder.Build();
90102
}
91103

92104
private Callable? _diagnosticCustomDrawCallable;

0 commit comments

Comments
 (0)