@@ -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