diff --git a/Azaion.Annotator/Extensions/FuncExtensions.cs b/Azaion.Annotator/Extensions/FuncExtensions.cs new file mode 100644 index 0000000..b7a1ce5 --- /dev/null +++ b/Azaion.Annotator/Extensions/FuncExtensions.cs @@ -0,0 +1,16 @@ +namespace Azaion.Annotator.Extensions; + +public static class FuncExtensions +{ + private static CancellationTokenSource? _lastCToken; + + public static Action Debounce(this Action func, TimeSpan? throttleTime = null) => + () => + { + _lastCToken?.Cancel(); + + var tokenSrc = _lastCToken = new CancellationTokenSource(); + Task.Delay(throttleTime ?? TimeSpan.FromMilliseconds(500), tokenSrc.Token) + .ContinueWith(_ => func(), tokenSrc.Token); + }; +} \ No newline at end of file diff --git a/Azaion.Annotator/MainWindow.xaml.cs b/Azaion.Annotator/MainWindow.xaml.cs index f348576..2b619b1 100644 --- a/Azaion.Annotator/MainWindow.xaml.cs +++ b/Azaion.Annotator/MainWindow.xaml.cs @@ -132,12 +132,20 @@ public partial class MainWindow SizeChanged += (sender, args) => { if (!_suspendLayout) + { _config.WindowSize = args.NewSize; + var saveConfigFn = () => _configRepository.Save(_config); + saveConfigFn.Debounce(TimeSpan.FromSeconds(7)).Invoke(); + } }; LocationChanged += (_, _) => { if (!_suspendLayout) + { _config.WindowLocation = new Point(Left, Top); + var saveConfigFn = () => _configRepository.Save(_config); + saveConfigFn.Debounce(TimeSpan.FromSeconds(7)).Invoke(); + } }; Editor.FormState = _formState;