From f9bb7ba2709fb4502102366c1b07ae078acb3bb5 Mon Sep 17 00:00:00 2001 From: Heiko <61519853+htcfreek@users.noreply.github.com> Date: Wed, 22 Sep 2021 00:55:42 +0200 Subject: [PATCH] [ImageResizer] Default values for new size (#13285) * Code changes * small fix in unittests * Add new Unit Test * Fix tests * fix typo * remove unused code from unit test * Update resource string name * Add name counter * comment update * Update tests --- .../ViewModels/ImageResizerViewModel.cs | 32 ++++++++++++- .../ViewModelTests/ImageResizer.cs | 47 +++++++++++++++++-- .../Strings/en-us/Resources.resw | 6 ++- .../Views/ImageResizerPage.xaml.cs | 2 +- 4 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/settings-ui/Microsoft.PowerToys.Settings.UI.Library/ViewModels/ImageResizerViewModel.cs b/src/settings-ui/Microsoft.PowerToys.Settings.UI.Library/ViewModels/ImageResizerViewModel.cs index b9bea9686b..ab018b3f3e 100644 --- a/src/settings-ui/Microsoft.PowerToys.Settings.UI.Library/ViewModels/ImageResizerViewModel.cs +++ b/src/settings-ui/Microsoft.PowerToys.Settings.UI.Library/ViewModels/ImageResizerViewModel.cs @@ -250,11 +250,16 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels } } - public void AddRow() + public void AddRow(string sizeNamePrefix) { + // Without validation we get warning CA1062 when unsing the parameter variable sizeNamePrefix + string prefixString = string.IsNullOrEmpty(sizeNamePrefix) ? "New Size" : sizeNamePrefix; + ObservableCollection imageSizes = Sizes; int maxId = imageSizes.Count > 0 ? imageSizes.OrderBy(x => x.Id).Last().Id : -1; - ImageSize newSize = new ImageSize(maxId + 1); + string sizeName = GenerateNameForNewSize(imageSizes, prefixString); + + ImageSize newSize = new ImageSize(maxId + 1, sizeName, ResizeFit.Fit, 854, 480, ResizeUnit.Pixel); newSize.PropertyChanged += SizePropertyChanged; imageSizes.Add(newSize); _advancedSizes = imageSizes; @@ -371,5 +376,28 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels _advancedSizes = imageSizes; SavesImageSizes(imageSizes); } + + private static string GenerateNameForNewSize(in ObservableCollection sizesList, in string namePrefix) + { + int newSizeCounter = 0; + + foreach (ImageSize imgSize in sizesList) + { + string name = imgSize.Name; + + if (name.StartsWith(namePrefix, StringComparison.InvariantCulture)) + { + if (int.TryParse(name.Substring(namePrefix.Length), out int number)) + { + if (newSizeCounter < number) + { + newSizeCounter = number; + } + } + } + } + + return $"{namePrefix} {++newSizeCounter}"; + } } } diff --git a/src/settings-ui/Microsoft.PowerToys.Settings.UI.UnitTests/ViewModelTests/ImageResizer.cs b/src/settings-ui/Microsoft.PowerToys.Settings.UI.UnitTests/ViewModelTests/ImageResizer.cs index d8e65c1fa6..d62eb83107 100644 --- a/src/settings-ui/Microsoft.PowerToys.Settings.UI.UnitTests/ViewModelTests/ImageResizer.cs +++ b/src/settings-ui/Microsoft.PowerToys.Settings.UI.UnitTests/ViewModelTests/ImageResizer.cs @@ -204,7 +204,7 @@ namespace ViewModelTests } [TestMethod] - public void AddRowShouldAddEmptyImageSizeWhenSuccessful() + public void AddRowShouldAddNewImageSizeWhenSuccessful() { // arrange var mockSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils(); @@ -213,12 +213,32 @@ namespace ViewModelTests int sizeOfOriginalArray = viewModel.Sizes.Count; // act - viewModel.AddRow(); + viewModel.AddRow("New size"); // Assert Assert.AreEqual(sizeOfOriginalArray + 1, viewModel.Sizes.Count); } + [TestMethod] + public void NewlyAddedImageSizeHasCorrectValues() + { + // arrange + var mockSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils(); + Func sendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(mockSettingsUtils.Object, SettingsRepository.GetInstance(_mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, (string name) => name); + + // act + viewModel.AddRow("New size"); + + // Assert + ImageSize newTestSize = viewModel.Sizes.Where(x => x.Id == 0).First(); + Assert.AreEqual(newTestSize.Name, "New size 1"); + Assert.AreEqual(newTestSize.Fit, (int)ResizeFit.Fit); + Assert.AreEqual(newTestSize.Width, 854); + Assert.AreEqual(newTestSize.Height, 480); + Assert.AreEqual(newTestSize.Unit, (int)ResizeUnit.Pixel); + } + [TestMethod] public void DeleteImageSizeShouldDeleteImageSizeWhenSuccessful() { @@ -226,7 +246,7 @@ namespace ViewModelTests var mockSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils(); Func sendMockIPCConfigMSG = msg => { return 0; }; ImageResizerViewModel viewModel = new ImageResizerViewModel(mockSettingsUtils.Object, SettingsRepository.GetInstance(_mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, (string name) => name); - viewModel.AddRow(); + viewModel.AddRow("New Size"); int sizeOfOriginalArray = viewModel.Sizes.Count; ImageSize deleteCandidate = viewModel.Sizes.Where(x => x.Id == 0).First(); @@ -238,6 +258,27 @@ namespace ViewModelTests Assert.IsFalse(viewModel.Sizes.Contains(deleteCandidate)); } + [TestMethod] + public void NameOfNewImageSizesIsIncrementedCorrectly() + { + // arrange + var mockSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils(); + Func sendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(mockSettingsUtils.Object, SettingsRepository.GetInstance(_mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, (string name) => name); + + // act + viewModel.AddRow("New size"); // Add: "New size 1" + viewModel.AddRow("New size"); // Add: "New size 2" + viewModel.AddRow("New size"); // Add: "New size 3" + viewModel.DeleteImageSize(1); // Delete: "New size 2" + viewModel.AddRow("New size"); // Add: "New Size 4" + + // Assert + Assert.AreEqual(viewModel.Sizes[0].Name, "New size 1"); + Assert.AreEqual(viewModel.Sizes[1].Name, "New size 3"); + Assert.AreEqual(viewModel.Sizes[2].Name, "New size 4"); + } + [TestMethod] public void UpdateWidthAndHeightShouldUpdateSizeWhenCorrectValuesAreProvided() { diff --git a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw index 42d9c3ad1b..7bedd15da0 100644 --- a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw +++ b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw @@ -875,7 +875,7 @@ Use original date modified - + Keep the original modified date of the file (instead of the resize date) @@ -1620,4 +1620,8 @@ From there, simply click on a Markdown file, PDF file or SVG icon in the File Ex All monitors must have the same DPI scaling and will be treated as one large combined rectangle which contains all monitors + + New size + First part of the default name of new sizes that can be added in PT's settings ui. + \ No newline at end of file diff --git a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml.cs b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml.cs index 0b542c0198..ec078da38e 100644 --- a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml.cs +++ b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml.cs @@ -72,7 +72,7 @@ namespace Microsoft.PowerToys.Settings.UI.Views { try { - ViewModel.AddRow(); + ViewModel.AddRow(ResourceLoader.GetForCurrentView().GetString("ImageResizer_DefaultSize_NewSizePrefix")); } catch (Exception ex) {