From f4520594077a5abee9b1a1f5636e9260210e9f86 Mon Sep 17 00:00:00 2001 From: Oleksandr Bezdieniezhnykh Date: Sat, 20 Jul 2024 19:35:42 +0300 Subject: [PATCH] add debounced config save after 7 sec after window resizing/moving --- Azaion.Annotator/Extensions/FuncExtensions.cs | 16 ++++++++++++++++ Azaion.Annotator/MainWindow.xaml.cs | 8 ++++++++ 2 files changed, 24 insertions(+) create mode 100644 Azaion.Annotator/Extensions/FuncExtensions.cs 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;