@@ -51,7 +51,10 @@ public sealed partial class MainViewModel : IDisposable
51
51
[ Notify ]
52
52
private AppState _appState = AppState . NotRunning ;
53
53
54
- public bool IsRefreshButtonEnabled => AppState == AppState . NotRunning ;
54
+ [ Notify ]
55
+ private bool _isRefreshing ;
56
+
57
+ public bool IsRefreshButtonEnabled => AppState == AppState . NotRunning && ! IsRefreshing ;
55
58
56
59
public bool IsStartButtonEnabled => AppState == AppState . NotRunning
57
60
&& Source != null
@@ -404,63 +407,71 @@ await _dispatcher.InvokeAsync(async () =>
404
407
private async Task RefreshWindowsAsync ( )
405
408
{
406
409
_logger . LogInformation ( "Refreshing windows" ) ;
410
+ IsRefreshing = true ;
407
411
408
- var newWindows = await Task . Run ( ( ) => _winApiService . ListWindows ( ) ) ;
412
+ try
413
+ {
414
+ var newWindows = await Task . Run ( ( ) => _winApiService . ListWindows ( ) ) ;
409
415
410
- // remember the old windows to replace them with the new ones
411
- var oldSource = Source ;
412
- var oldTarget = Target ;
416
+ // remember the old windows to replace them with the new ones
417
+ var oldSource = Source ;
418
+ var oldTarget = Target ;
413
419
414
- // remove windows that are not in the new list
415
- var toBeRemoved = Windows
416
- . Where ( w => newWindows . All ( nw => nw . WindowHandle != w . WindowHandle ) )
417
- . ToList ( ) ;
420
+ // remove windows that are not in the new list
421
+ var toBeRemoved = Windows
422
+ . Where ( w => newWindows . All ( nw => nw . WindowHandle != w . WindowHandle ) )
423
+ . ToList ( ) ;
418
424
419
- foreach ( var window in toBeRemoved )
420
- {
421
- Windows . Remove ( window ) ;
422
- }
425
+ foreach ( var window in toBeRemoved )
426
+ {
427
+ Windows . Remove ( window ) ;
428
+ }
423
429
424
- // update windows that are in the new list
425
- var toBeUpdated = Windows
426
- . Join ( newWindows ,
427
- w => w . WindowHandle ,
428
- nw => nw . WindowHandle ,
429
- ( w , nw ) => new
430
- {
431
- OldWindow = w ,
432
- NewWindow = nw ,
433
- } )
434
- . ToList ( ) ;
430
+ // update windows that are in the new list
431
+ var toBeUpdated = Windows
432
+ . Join ( newWindows ,
433
+ w => w . WindowHandle ,
434
+ nw => nw . WindowHandle ,
435
+ ( w , nw ) => new
436
+ {
437
+ OldWindow = w ,
438
+ NewWindow = nw ,
439
+ } )
440
+ . ToList ( ) ;
435
441
436
- foreach ( var windowToBeUpdated in toBeUpdated )
437
- {
438
- var i = Windows . IndexOf ( windowToBeUpdated . OldWindow ) ;
439
- if ( i != - 1 )
442
+ foreach ( var windowToBeUpdated in toBeUpdated )
440
443
{
441
- Windows [ i ] = windowToBeUpdated . NewWindow ;
444
+ var i = Windows . IndexOf ( windowToBeUpdated . OldWindow ) ;
445
+ if ( i != - 1 )
446
+ {
447
+ Windows [ i ] = windowToBeUpdated . NewWindow ;
448
+ }
442
449
}
443
- }
444
450
445
- // add windows that are not in the old list
446
- var toBeAdded = newWindows
447
- . Where ( nw => Windows . All ( w => nw . WindowHandle != w . WindowHandle ) )
448
- . ToList ( ) ;
451
+ // add windows that are not in the old list
452
+ var toBeAdded = newWindows
453
+ . Where ( nw => Windows . All ( w => nw . WindowHandle != w . WindowHandle ) )
454
+ . ToList ( ) ;
449
455
450
- foreach ( var window in toBeAdded )
451
- {
452
- Windows . Add ( window ) ;
453
- }
456
+ foreach ( var window in toBeAdded )
457
+ {
458
+ Windows . Add ( window ) ;
459
+ }
454
460
455
- // restore the old source and target windows
456
- if ( oldSource != null )
457
- {
458
- Source = Windows . FirstOrDefault ( w => w . WindowHandle == oldSource . WindowHandle ) ;
459
- }
461
+ // restore the old source and target windows
462
+ if ( oldSource != null )
463
+ {
464
+ Source = Windows . FirstOrDefault ( w => w . WindowHandle == oldSource . WindowHandle ) ;
465
+ }
460
466
461
- if ( oldTarget != null )
467
+ if ( oldTarget != null )
468
+ {
469
+ Target = Windows . FirstOrDefault ( w => w . WindowHandle == oldTarget . WindowHandle ) ;
470
+ }
471
+ }
472
+ finally
462
473
{
463
- Target = Windows . FirstOrDefault ( w => w . WindowHandle == oldTarget . WindowHandle ) ;
474
+ IsRefreshing = false ;
464
475
}
465
476
}
466
477
0 commit comments