@@ -163,6 +163,8 @@ public async Task BindToSolution(SharpIdeSolutionModel solution)
163163 rootItem . SetText ( 0 , solution . Name ) ;
164164 rootItem . SetIcon ( 0 , SlnIcon ) ;
165165 _rootItem = rootItem ;
166+
167+ var disposableBuilder = new DisposableBuilder ( ) ;
166168
167169 // Observe Projects
168170 var projectsView = solution . Projects . CreateView ( y => new TreeItemContainer ( ) ) ;
@@ -173,7 +175,7 @@ public async Task BindToSolution(SharpIdeSolutionModel solution)
173175 NotifyCollectionChangedAction . Add => this . InvokeAsync ( ( ) => e . NewItem . View . Value = CreateProjectTreeItem ( _tree , _rootItem , e . NewItem . Value ) ) ,
174176 NotifyCollectionChangedAction . Remove => FreeTreeItem ( e . OldItem . View . Value ) ,
175177 _ => Task . CompletedTask
176- } ) , configureAwait : false ) . AddToDeferred ( this ) ;
178+ } ) , configureAwait : false ) . AddTo ( ref disposableBuilder ) ;
177179
178180 // Observe Solution Folders
179181 var foldersView = solution . SlnFolders . CreateView ( y => new TreeItemContainer ( ) ) ;
@@ -184,10 +186,11 @@ public async Task BindToSolution(SharpIdeSolutionModel solution)
184186 NotifyCollectionChangedAction . Add => this . InvokeAsync ( ( ) => e . NewItem . View . Value = CreateSlnFolderTreeItem ( _tree , _rootItem , e . NewItem . Value ) ) ,
185187 NotifyCollectionChangedAction . Remove => FreeTreeItem ( e . OldItem . View . Value ) ,
186188 _ => Task . CompletedTask
187- } ) , configureAwait : false ) . AddToDeferred ( this ) ;
189+ } ) , configureAwait : false ) . AddTo ( ref disposableBuilder ) ;
188190
189191 rootItem . SetCollapsedRecursive ( true ) ;
190192 rootItem . Collapsed = false ;
193+ rootItem . SharpIdeDisposable = disposableBuilder . Build ( ) ;
191194 await this . InvokeAsync ( ( ) =>
192195 {
193196 _panelContainer . AddChild ( _tree ) ;
@@ -201,6 +204,8 @@ private TreeItem CreateSlnFolderTreeItem(Tree tree, TreeItem parent, SharpIdeSol
201204 folderItem . SetText ( 0 , slnFolder . Name ) ;
202205 folderItem . SetIcon ( 0 , SlnFolderIcon ) ;
203206 folderItem . SharpIdeNode = slnFolder ;
207+
208+ var disposableBuilder = new DisposableBuilder ( ) ;
204209
205210 // Observe folder sub-collections
206211 var subFoldersView = slnFolder . Folders . CreateView ( y => new TreeItemContainer ( ) ) ;
@@ -212,7 +217,7 @@ private TreeItem CreateSlnFolderTreeItem(Tree tree, TreeItem parent, SharpIdeSol
212217 NotifyCollectionChangedAction . Add => this . InvokeAsync ( ( ) => innerEvent . NewItem . View . Value = CreateSlnFolderTreeItem ( _tree , folderItem , innerEvent . NewItem . Value ) ) ,
213218 NotifyCollectionChangedAction . Remove => FreeTreeItem ( innerEvent . OldItem . View . Value ) ,
214219 _ => Task . CompletedTask
215- } ) , configureAwait : false ) . AddToDeferred ( this ) ;
220+ } ) , configureAwait : false ) . AddTo ( ref disposableBuilder ) ;
216221
217222 var projectsView = slnFolder . Projects . CreateView ( y => new TreeItemContainer ( ) ) ;
218223 projectsView . Unfiltered . ToList ( ) . ForEach ( s => s . View . Value = CreateProjectTreeItem ( _tree , folderItem , s . Value ) ) ;
@@ -222,7 +227,7 @@ private TreeItem CreateSlnFolderTreeItem(Tree tree, TreeItem parent, SharpIdeSol
222227 NotifyCollectionChangedAction . Add => this . InvokeAsync ( ( ) => innerEvent . NewItem . View . Value = CreateProjectTreeItem ( _tree , folderItem , innerEvent . NewItem . Value ) ) ,
223228 NotifyCollectionChangedAction . Remove => FreeTreeItem ( innerEvent . OldItem . View . Value ) ,
224229 _ => Task . CompletedTask
225- } ) , configureAwait : false ) . AddToDeferred ( this ) ;
230+ } ) , configureAwait : false ) . AddTo ( ref disposableBuilder ) ;
226231
227232 var filesView = slnFolder . Files . CreateView ( y => new TreeItemContainer ( ) ) ;
228233 filesView . Unfiltered . ToList ( ) . ForEach ( s => s . View . Value = CreateFileTreeItem ( _tree , folderItem , s . Value ) ) ;
@@ -232,7 +237,8 @@ private TreeItem CreateSlnFolderTreeItem(Tree tree, TreeItem parent, SharpIdeSol
232237 NotifyCollectionChangedAction . Add => this . InvokeAsync ( ( ) => innerEvent . NewItem . View . Value = CreateFileTreeItem ( _tree , folderItem , innerEvent . NewItem . Value , innerEvent . NewStartingIndex ) ) ,
233238 NotifyCollectionChangedAction . Remove => FreeTreeItem ( innerEvent . OldItem . View . Value ) ,
234239 _ => Task . CompletedTask
235- } ) , configureAwait : false ) . AddToDeferred ( this ) ;
240+ } ) , configureAwait : false ) . AddTo ( ref disposableBuilder ) ;
241+ folderItem . SharpIdeDisposable = disposableBuilder . Build ( ) ;
236242 return folderItem ;
237243 }
238244
@@ -246,6 +252,8 @@ private TreeItem CreateProjectTreeItem(Tree tree, TreeItem parent, SharpIdeProje
246252 if ( projectModel . IsLoading is false && projectModel . IsInvalid ) projectItem . SetSuffix ( 0 , " · load failed" ) ;
247253 projectItem . SharpIdeNode = projectModel ;
248254
255+ var disposableBuilder = new DisposableBuilder ( ) ;
256+
249257 projectModel . MsBuildProjectLoadState . SubscribeOnThreadPool ( ) . ObserveOnThreadPool ( ) . SubscribeAwait ( async ( loadState , ct ) =>
250258 {
251259 var newIcon = loadState switch
@@ -262,7 +270,7 @@ await this.InvokeAsync(() =>
262270 projectItem . SetIcon ( 0 , newIcon ) ;
263271 projectItem . SetSuffix ( 0 , suffix ) ;
264272 } ) ;
265- } , configureAwait : false ) . AddToDeferred ( this ) ;
273+ } , configureAwait : false ) . AddTo ( ref disposableBuilder ) ;
266274
267275 // Observe project folder's subfolders and files
268276 var projectFolder = projectModel . Folder ;
@@ -277,7 +285,7 @@ await this.InvokeAsync(() =>
277285 NotifyCollectionChangedAction . Move => MoveTreeItem ( _tree , innerEvent . NewItem . View , innerEvent . NewItem . Value , innerEvent . OldStartingIndex , innerEvent . NewStartingIndex ) ,
278286 NotifyCollectionChangedAction . Remove => FreeTreeItem ( innerEvent . OldItem . View . Value ) ,
279287 _ => Task . CompletedTask
280- } ) , configureAwait : false ) . AddToDeferred ( this ) ;
288+ } ) , configureAwait : false ) . AddTo ( ref disposableBuilder ) ;
281289
282290 var filesView = projectFolder . Files . CreateView ( y => new TreeItemContainer ( ) ) ;
283291 filesView . Unfiltered . ToList ( ) . ForEach ( s => s . View . Value = CreateFileTreeItem ( _tree , projectItem , s . Value ) ) ;
@@ -288,7 +296,8 @@ await this.InvokeAsync(() =>
288296 NotifyCollectionChangedAction . Move => MoveTreeItem ( _tree , innerEvent . NewItem . View , innerEvent . NewItem . Value , innerEvent . OldStartingIndex , innerEvent . NewStartingIndex ) ,
289297 NotifyCollectionChangedAction . Remove => FreeTreeItem ( innerEvent . OldItem . View . Value ) ,
290298 _ => Task . CompletedTask
291- } ) , configureAwait : false ) . AddToDeferred ( this ) ;
299+ } ) , configureAwait : false ) . AddTo ( ref disposableBuilder ) ;
300+ projectItem . SharpIdeDisposable = disposableBuilder . Build ( ) ;
292301 return projectItem ;
293302 }
294303
@@ -356,15 +365,11 @@ private TreeItem CreateFileTreeItem(Tree tree, TreeItem parent, SharpIdeFile sha
356365 fileItem . SharpIdeNode = sharpIdeFile ;
357366
358367 sharpIdeFile . Name . Skip ( 1 ) . SubscribeOnThreadPool ( ) . ObserveOnThreadPool ( )
359- . SubscribeAwait ( async ( newName , ct ) =>
368+ . SubscribeAwait ( async ( newName , ct ) => await this . InvokeAsync ( ( ) =>
360369 {
361- await this . InvokeAsync ( ( ) =>
362- {
363- GD . Print ( $ "Updating file name in solution explorer to '{ newName } '") ;
364- fileItem . SetText ( 0 , newName ) ;
365- fileItem . SetIconsForFileExtension ( sharpIdeFile ) ;
366- } ) ;
367- } , configureAwait : false )
370+ fileItem . SetText ( 0 , newName ) ;
371+ fileItem . SetIconsForFileExtension ( sharpIdeFile ) ;
372+ } ) , configureAwait : false )
368373 . AddTo ( ref disposableBuilder ) ;
369374 fileItem . SharpIdeDisposable = disposableBuilder . Build ( ) ;
370375 return fileItem ;
0 commit comments