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) {