diff --git a/src/core/Microsoft.PowerToys.Settings.UI.Lib/ImageResizerSettings.cs b/src/core/Microsoft.PowerToys.Settings.UI.Lib/ImageResizerSettings.cs index f78fdded5d6b..1591cbbdb43d 100644 --- a/src/core/Microsoft.PowerToys.Settings.UI.Lib/ImageResizerSettings.cs +++ b/src/core/Microsoft.PowerToys.Settings.UI.Lib/ImageResizerSettings.cs @@ -30,7 +30,11 @@ public ImageResizerSettings() public string ToJsonString() { - return JsonSerializer.Serialize(this); + var options = new JsonSerializerOptions + { + WriteIndented = true, + }; + return JsonSerializer.Serialize(this, options); } } } diff --git a/src/core/Microsoft.PowerToys.Settings.UI.Lib/ImageSize.cs b/src/core/Microsoft.PowerToys.Settings.UI.Lib/ImageSize.cs index 43a2b9615729..491973b138e6 100644 --- a/src/core/Microsoft.PowerToys.Settings.UI.Lib/ImageSize.cs +++ b/src/core/Microsoft.PowerToys.Settings.UI.Lib/ImageSize.cs @@ -4,13 +4,15 @@ using System; using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; namespace Microsoft.PowerToys.Settings.UI.Lib { - public class ImageSize + public class ImageSize : INotifyPropertyChanged { public ImageSize(int id) { @@ -42,22 +44,140 @@ public ImageSize(int id, string name, ResizeFit fit, double width, double height Unit = (int)unit; } - public int Id { get; set; } + private int _id; + private string _name; + private int _fit; + private double _height; + private double _width; + private int _unit; + + public int Id + { + get + { + return _id; + } + + set + { + if (_id != value) + { + _id = value; + OnPropertyChanged(); + } + } + } [JsonPropertyName("name")] - public string Name { get; set; } + public string Name + { + get + { + return _name; + } + + set + { + if (_name != value) + { + _name = value; + OnPropertyChanged(); + } + } + } [JsonPropertyName("fit")] - public int Fit { get; set; } + public int Fit + { + get + { + return _fit; + } + + set + { + if (_fit != value) + { + _fit = value; + OnPropertyChanged(); + } + } + } [JsonPropertyName("width")] - public double Width { get; set; } + public double Width + { + get + { + return _width; + } + + set + { + if (_width != value) + { + _width = value; + OnPropertyChanged(); + } + } + } [JsonPropertyName("height")] - public double Height { get; set; } + public double Height + { + get + { + return _height; + } + + set + { + if (_height != value) + { + _height = value; + OnPropertyChanged(); + } + } + } [JsonPropertyName("unit")] - public int Unit { get; set; } + public int Unit + { + get + { + return _unit; + } + + set + { + if (_unit != value) + { + _unit = value; + OnPropertyChanged(); + } + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + public void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + var handler = PropertyChanged; + if (handler != null) + { + handler(this, new PropertyChangedEventArgs(propertyName)); + } + } + + public void Update(ImageSize modifiedSize) + { + Id = modifiedSize.Id; + Name = modifiedSize.Name; + Fit = modifiedSize.Fit; + Width = modifiedSize.Width; + Height = modifiedSize.Height; + Unit = modifiedSize.Unit; + } public string ToJsonString() { diff --git a/src/core/Microsoft.PowerToys.Settings.UI/ViewModels/ImageResizerViewModel.cs b/src/core/Microsoft.PowerToys.Settings.UI/ViewModels/ImageResizerViewModel.cs index 8b99d5727cd1..f94d21e3b014 100644 --- a/src/core/Microsoft.PowerToys.Settings.UI/ViewModels/ImageResizerViewModel.cs +++ b/src/core/Microsoft.PowerToys.Settings.UI/ViewModels/ImageResizerViewModel.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; +using System.ComponentModel; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Input; @@ -53,6 +54,15 @@ public ImageResizerViewModel() this._tiffCompressOption = Settings.Properties.ImageresizerTiffCompressOption.Value; this._fileName = Settings.Properties.ImageresizerFileName.Value; this._keepDateModified = Settings.Properties.ImageresizerKeepDateModified.Value; + this._encoderGuidId = GetEncoderIndex(Settings.Properties.ImageresizerFallbackEncoder.Value); + + int i = 0; + foreach (ImageSize size in _advancedSizes) + { + size.Id = i; + i++; + size.PropertyChanged += Size_PropertyChanged; + } } private bool _isEnabled = false; @@ -94,12 +104,10 @@ public ObservableCollection Sizes set { - if (_advancedSizes != value) - { - _advancedSizes = value; - Settings.Properties.ImageresizerSizes.Value = value; - OnPropertyChanged("Sizes"); - } + _advancedSizes = value; + Settings.Properties.ImageresizerSizes.Value = value; + SettingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName); + OnPropertyChanged("Sizes"); } } @@ -209,43 +217,8 @@ public int Encoder { if (_encoderGuidId != value) { - // PNG Encoder guid - if (value == 0) - { - Settings.Properties.ImageresizerFallbackEncoder.Value = "1b7cfaf4-713f-473c-bbcd-6137425faeaf"; - } - - // Bitmap Encoder guid - else if (value == 1) - { - Settings.Properties.ImageresizerFallbackEncoder.Value = "0af1d87e-fcfe-4188-bdeb-a7906471cbe3"; - } - - // JPEG Encoder guid - else if (value == 2) - { - Settings.Properties.ImageresizerFallbackEncoder.Value = "19e4a5aa-5662-4fc5-a0c0-1758028e1057"; - } - - // Tiff encoder guid. - else if (value == 3) - { - Settings.Properties.ImageresizerFallbackEncoder.Value = "163bcc30-e2e9-4f0b-961d-a3e9fdb788a3"; - } - - // Tiff encoder guid. - else if (value == 4) - { - Settings.Properties.ImageresizerFallbackEncoder.Value = "57a37caa-367a-4540-916b-f183c5093a4b"; - } - - // Gif encoder guid. - else if (value == 5) - { - Settings.Properties.ImageresizerFallbackEncoder.Value = "1f8a5601-7d4d-4cbd-9c82-1bc8d4eeb9a5"; - } - _encoderGuidId = value; + Settings.Properties.ImageresizerFallbackEncoder.Value = GetEncoderGuid(value); SettingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName); OnPropertyChanged("Encoder"); } @@ -278,8 +251,12 @@ public ICommand AddImageSizeEventHandler public void AddRow() { - ImageSize maxSize = Sizes.OrderBy(x => x.Id).Last(); - Sizes.Add(new ImageSize(maxSize.Id + 1)); + ObservableCollection imageSizes = Sizes; + ImageSize maxSize = imageSizes.OrderBy(x => x.Id).Last(); + ImageSize newSize = new ImageSize(maxSize.Id + 1); + newSize.PropertyChanged += Size_PropertyChanged; + imageSizes.Add(newSize); + Sizes = imageSizes; OnPropertyChanged("Sizes"); } @@ -288,7 +265,9 @@ public void DeleteImageSize(int id) try { ImageSize size = Sizes.Where(x => x.Id == id).First(); - Sizes.Remove(size); + ObservableCollection imageSizes = Sizes; + imageSizes.Remove(size); + Sizes = imageSizes; OnPropertyChanged("Sizes"); } catch @@ -298,12 +277,97 @@ public void DeleteImageSize(int id) public void SavesImageSizes() { - OnPropertyChanged("Sizes"); SettingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName); } - public void OnSizesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + public string GetEncoderGuid(int value) + { + // PNG Encoder guid + if (value == 0) + { + return "1b7cfaf4-713f-473c-bbcd-6137425faeaf"; + } + + // Bitmap Encoder guid + else if (value == 1) + { + return "0af1d87e-fcfe-4188-bdeb-a7906471cbe3"; + } + + // JPEG Encoder guid + else if (value == 2) + { + return "19e4a5aa-5662-4fc5-a0c0-1758028e1057"; + } + + // Tiff encoder guid. + else if (value == 3) + { + return "163bcc30-e2e9-4f0b-961d-a3e9fdb788a3"; + } + + // Tiff encoder guid. + else if (value == 4) + { + return "57a37caa-367a-4540-916b-f183c5093a4b"; + } + + // Gif encoder guid. + else if (value == 5) + { + return "1f8a5601-7d4d-4cbd-9c82-1bc8d4eeb9a5"; + } + + return null; + } + + public int GetEncoderIndex(string guid) + { + // PNG Encoder guid + if (guid == "1b7cfaf4-713f-473c-bbcd-6137425faeaf") + { + return 0; + } + + // Bitmap Encoder guid + else if (guid == "0af1d87e-fcfe-4188-bdeb-a7906471cbe3") + { + return 1; + } + + // JPEG Encoder guid + else if (guid == "19e4a5aa-5662-4fc5-a0c0-1758028e1057") + { + return 2; + } + + // Tiff encoder guid. + else if (guid == "163bcc30-e2e9-4f0b-961d-a3e9fdb788a3") + { + return 3; + } + + // Tiff encoder guid. + else if (guid == "57a37caa-367a-4540-916b-f183c5093a4b") + { + return 4; + } + + // Gif encoder guid. + else if (guid == "1f8a5601-7d4d-4cbd-9c82-1bc8d4eeb9a5") + { + return 5; + } + + return -1; + } + + public void Size_PropertyChanged(object sender, PropertyChangedEventArgs e) { + ImageSize modifiedSize = (ImageSize)sender; + ObservableCollection imageSizes = Sizes; + imageSizes.Where(x => x.Id == modifiedSize.Id).First().Update(modifiedSize); + Sizes = imageSizes; OnPropertyChanged("Sizes"); } } diff --git a/src/core/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml b/src/core/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml index 0178a6e06cec..f9c1ec9a549d 100644 --- a/src/core/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml +++ b/src/core/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml @@ -53,8 +53,8 @@ - + + Padding="0" + IsEnabled="{ Binding Mode=TwoWay, Path=IsEnabled}" + Margin="0" + > + + + + + - - - + + + Height="35" + Margin="{StaticResource SmallTopMargin}"/> - + Height="35" + Margin="{StaticResource SmallTopMargin}"> - + - + Height="34" + Margin="{StaticResource SmallTopMargin}"/> - + Height="35" + Margin="{StaticResource SmallTopMargin}"> @@ -108,13 +146,15 @@ Command = "{Binding DeleteImageSizeEventHandler, Source={StaticResource ViewModel}}" CommandParameter="{Binding Id}" Icon="Delete" - Width="68" - Height="35"/> + Width="52" + Height="32" + Margin="{StaticResource SmallTopMargin}" Padding="0,0,50,100" UseLayoutRounding="False"/> + - - - PNG Encoder - BMP Encoder - JPEG Encoder - TIFF Encoder - WMPhoto Encoder - GIF Encoder + + + + + + diff --git a/src/core/Microsoft.PowerToys.Settings.UnitTest/ViewModelTests/ImageResizer.cs b/src/core/Microsoft.PowerToys.Settings.UnitTest/ViewModelTests/ImageResizer.cs index f69843790cc3..aca4e550f79d 100644 --- a/src/core/Microsoft.PowerToys.Settings.UnitTest/ViewModelTests/ImageResizer.cs +++ b/src/core/Microsoft.PowerToys.Settings.UnitTest/ViewModelTests/ImageResizer.cs @@ -72,8 +72,8 @@ public void JPEGQualityLevel_ShouldSetValueToTen_WhenSuccefull() viewModel.JPEGQualityLevel = 10; // Assert - ImageResizerSettings settings = SettingsUtils.GetSettings(Module); - Assert.AreEqual(10, settings.Properties.ImageresizerJpegQualityLevel.Value); + viewModel = new ImageResizerViewModel(); + Assert.AreEqual(10, viewModel.JPEGQualityLevel); } [TestMethod] @@ -86,8 +86,8 @@ public void PngInterlaceOption_ShouldSetValueToTen_WhenSuccefull() viewModel.PngInterlaceOption = 10; // Assert - ImageResizerSettings settings = SettingsUtils.GetSettings(Module); - Assert.AreEqual(10, settings.Properties.ImageresizerPngInterlaceOption.Value); + viewModel = new ImageResizerViewModel(); + Assert.AreEqual(10, viewModel.PngInterlaceOption); } [TestMethod] @@ -100,8 +100,8 @@ public void TiffCompressOption_ShouldSetValueToTen_WhenSuccefull() viewModel.TiffCompressOption = 10; // Assert - ImageResizerSettings settings = SettingsUtils.GetSettings(Module); - Assert.AreEqual(10, settings.Properties.ImageresizerTiffCompressOption.Value); + viewModel = new ImageResizerViewModel(); + Assert.AreEqual(10, viewModel.TiffCompressOption); } [TestMethod] @@ -115,8 +115,8 @@ public void FileName_ShouldUpdateValue_WhenSuccefull() viewModel.FileName = exptectedValue; // Assert - ImageResizerSettings settings = SettingsUtils.GetSettings(Module); - Assert.AreEqual(exptectedValue, settings.Properties.ImageresizerFileName.Value); + viewModel = new ImageResizerViewModel(); + Assert.AreEqual(exptectedValue, viewModel.FileName); } [TestMethod] @@ -142,6 +142,7 @@ public void FileName_ShouldNOTUpdateValue_WhenNameIsInValid () // act and Assert foreach (string invalidName in invalidNames) { + viewModel = new ImageResizerViewModel(); viewModel.FileName = invalidName; Assert.AreNotEqual(invalidName, viewModel.FileName); @@ -175,8 +176,8 @@ public void Encoder_ShouldUpdateValue_WhenSuccefull() viewModel.Encoder = 3; // Assert - ImageResizerSettings settings = SettingsUtils.GetSettings(Module); - Assert.AreEqual("163bcc30-e2e9-4f0b-961d-a3e9fdb788a3", settings.Properties.ImageresizerFallbackEncoder.Value); + viewModel = new ImageResizerViewModel(); + Assert.AreEqual("163bcc30-e2e9-4f0b-961d-a3e9fdb788a3", viewModel.GetEncoderGuid(viewModel.Encoder)); Assert.AreEqual(3, viewModel.Encoder); }