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);
|
|
}
|
|
}
|