57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Elwig.Helpers;
 | |
| using System;
 | |
| using System.Threading.Tasks;
 | |
| using System.Windows;
 | |
| using System.Windows.Input;
 | |
| 
 | |
| namespace Elwig.Windows {
 | |
|     public abstract class ContextWindow : Window {
 | |
| 
 | |
|         private bool _lockContext = false;
 | |
|         protected bool LockContext {
 | |
|             get => _lockContext;
 | |
|             set {
 | |
|                 _lockContext = value;
 | |
|                 if (!_lockContext && _renewPending) {
 | |
|                     Dispatcher.BeginInvoke(async () => await RenewContext());
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private bool _renewPending = false;
 | |
| 
 | |
|         private readonly RoutedCommand CtrlR = new("CtrlR", typeof(ContextWindow), [new KeyGesture(Key.R, ModifierKeys.Control)]);
 | |
|         private readonly RoutedCommand F5 = new("F5", typeof(ContextWindow), [new KeyGesture(Key.F5)]);
 | |
| 
 | |
|         public ContextWindow() : base() {
 | |
|             CommandBindings.Add(new CommandBinding(CtrlR, ForceContextReload));
 | |
|             CommandBindings.Add(new CommandBinding(F5, ForceContextReload));
 | |
|             Loaded += OnLoaded;
 | |
|         }
 | |
| 
 | |
|         public async void ForceContextReload(object sender, EventArgs evt) {
 | |
|             await HintContextChange();
 | |
|         }
 | |
| 
 | |
|         public async Task HintContextChange() {
 | |
|             _renewPending = true;
 | |
|             if (LockContext) return;
 | |
|             await RenewContext();
 | |
|         }
 | |
| 
 | |
|         protected async void OnLoaded(object? sender, RoutedEventArgs? evt) {
 | |
|             using var ctx = new AppDbContext();
 | |
|             await OnRenewContext(ctx);
 | |
|         }
 | |
| 
 | |
|         protected async Task RenewContext() {
 | |
|             if (!_renewPending) return;
 | |
|             using var ctx = new AppDbContext();
 | |
|             await OnRenewContext(ctx);
 | |
|             _renewPending = false;
 | |
|         }
 | |
| 
 | |
|         abstract protected Task OnRenewContext(AppDbContext ctx);
 | |
|     }
 | |
| }
 |