From 576aa872acc5ca1efa0b7040e6b5e7bdddccc485 Mon Sep 17 00:00:00 2001 From: Phap Dieu Duong Date: Sun, 3 Nov 2024 23:20:33 +0800 Subject: [PATCH] cancel resizing #1458 --- .../ImageGlass/FrmMain/FrmMain.IGMethods.cs | 13 ++++--- Source/ImageGlass/Local.cs | 10 ++++++ Source/ImageGlass/Tools/FrmResize.Designer.cs | 2 +- Source/ImageGlass/Tools/FrmResize.cs | 34 ++++++++++++------- 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/Source/ImageGlass/FrmMain/FrmMain.IGMethods.cs b/Source/ImageGlass/FrmMain/FrmMain.IGMethods.cs index f7d51a804..eed29d58a 100644 --- a/Source/ImageGlass/FrmMain/FrmMain.IGMethods.cs +++ b/Source/ImageGlass/FrmMain/FrmMain.IGMethods.cs @@ -3289,13 +3289,18 @@ public void IG_OpenResizeTool() { if (Local.IsBusy) return; - using var frm = new FrmResize(); - if (frm.ShowDialog() != DialogResult.OK) return; + + if (Local.FrmResize.IsDisposed) + { + Local.FrmResize = new(); + } + + if (Local.FrmResize.ShowDialog() != DialogResult.OK) return; - if (frm.Result != null) + if (Local.FrmResize.Result != null) { - LoadClipboardImage(frm.Result); + LoadClipboardImage(Local.FrmResize.Result); } } diff --git a/Source/ImageGlass/Local.cs b/Source/ImageGlass/Local.cs index 292138205..b1fdaf7cd 100644 --- a/Source/ImageGlass/Local.cs +++ b/Source/ImageGlass/Local.cs @@ -36,6 +36,7 @@ public class Local { private static CancellationTokenSource? _gcTokenSrc; private static FrmSettings _frmSetting; + private static FrmResize _frmResize; public static FrmMain? FrmMain; @@ -274,6 +275,15 @@ public static FrmSettings FrmSettings set => _frmSetting = value; } + /// + /// Gets Resize tool window. + /// + public static FrmResize FrmResize + { + get => LazyInitializer.EnsureInitialized(ref _frmResize); + set => _frmResize = value; + } + #endregion diff --git a/Source/ImageGlass/Tools/FrmResize.Designer.cs b/Source/ImageGlass/Tools/FrmResize.Designer.cs index 76e1f4308..e0f97f2e6 100644 --- a/Source/ImageGlass/Tools/FrmResize.Designer.cs +++ b/Source/ImageGlass/Tools/FrmResize.Designer.cs @@ -99,7 +99,7 @@ private void InitializeComponent() LblSizeUnit.Name = "LblSizeUnit"; LblSizeUnit.Size = new Size(28, 15); LblSizeUnit.TabIndex = 22; - LblSizeUnit.Text = "[px]"; + LblSizeUnit.Text = "px"; // // ProgStatus // diff --git a/Source/ImageGlass/Tools/FrmResize.cs b/Source/ImageGlass/Tools/FrmResize.cs index d3e63a5ed..90236cdff 100644 --- a/Source/ImageGlass/Tools/FrmResize.cs +++ b/Source/ImageGlass/Tools/FrmResize.cs @@ -26,6 +26,7 @@ namespace ImageGlass.Tools; public partial class FrmResize : DialogForm { private readonly IProgress _uiReporter; + private CancellationTokenSource? _tokenSrc; private Size _inputSize; private Size _outputSize; @@ -64,23 +65,21 @@ protected override void OnLoad(EventArgs e) ApplyLanguage(); - var workingArea = Screen.FromControl(this).WorkingArea; - if (Bottom > workingArea.Bottom) Top = workingArea.Bottom - Height; - - // load initial data _inputSize = _outputSize = new( (int)Local.FrmMain.PicMain.SourceWidth, (int)Local.FrmMain.PicMain.SourceHeight); - LoadResamplingMethods(); - LblCurrentSizeValue.Text = LblNewSizeValue.Text = - $"{_outputSize.Width:n0} x {_outputSize.Height:n0} px"; // thousands place for number + // thousands place for number + LblCurrentSizeValue.Text = $"{_outputSize.Width:n0} x {_outputSize.Height:n0} px"; + // set type of resizing - LblSizeUnit.Text = "px"; - UpdateSize(_inputSize.Width, _inputSize.Height); + LoadResamplingMethods(); + + var initSize = RadResizeByPixels.Checked ? _inputSize : new(100, 100); + UpdateSize(initSize.Width, initSize.Height); NumWidth.Minimum = NumHeight.Minimum = 1; NumWidth.Maximum = Const.MAX_IMAGE_DIMENSION; @@ -159,11 +158,17 @@ protected override void OnAcceptButtonClicked() return; } + + _tokenSrc?.Cancel(); + _tokenSrc = new(); + _ = BHelper.RunAsThread(async () => await SubmitResizeAsync(finalSize, samplingMethod)); } protected override void OnCancelButtonClicked() { + _tokenSrc?.Cancel(); + base.OnCancelButtonClicked(); } @@ -201,7 +206,8 @@ private void ApplyLanguage() private void LoadResamplingMethods() { - CmbResample.Items.Clear(); + // use cache for the next open + if (CmbResample.Items.Count > 0) return; foreach (ImageResamplingMethod method in Enum.GetValues()) { @@ -280,7 +286,11 @@ private async Task SubmitResizeAsync(Size size, ImageResamplingMethod samplingMe // perform resizing - var resizedBmp = await BHelper.ResizeImageAsync(bmp, size.Width, size.Height, samplingMethod); + WicBitmapSource? resizedBmp = null; + if (!_tokenSrc.IsCancellationRequested) + { + resizedBmp = await BHelper.ResizeImageAsync(bmp, size.Width, size.Height, samplingMethod); + } _uiReporter.Report(new("resizer:end", resizedBmp)); } @@ -296,7 +306,7 @@ private void ReportToUIThread(ImageResizedEventArgs e) if (e.Type == "resizer:end") { - if (e.Image != null) + if (e.Image != null && !_tokenSrc.IsCancellationRequested) { Result = e.Image; base.OnAcceptButtonClicked();