[ImageResizer]Fix: Deleting an Image Resizer preset deletes the wrong preset (#38476)

* [ImageResizer]Fix: Deleting an Image Resizer preset deletes the wrong preset

* update the helper

* sort items
This commit is contained in:
leileizhang
2025-04-23 09:35:40 +08:00
committed by GitHub
parent 232e1b79bd
commit e8b02cd797
5 changed files with 74 additions and 7 deletions

View File

@@ -0,0 +1,51 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ManagedCommon
{
public static class IdRecoveryHelper
{
/// <summary>
/// Fixes invalid IDs in the given list by assigning unique values.
/// It ensures that all IDs are non-empty and unique, correcting any duplicates or empty IDs.
/// </summary>
/// <param name="items">The list of items that may contain invalid IDs.</param>
public static void RecoverInvalidIds<T>(IEnumerable<T> items)
where T : class, IHasId
{
var idSet = new HashSet<int>();
int newId = 0;
var sortedItems = items.OrderBy(i => i.Id).ToList(); // Sort items by ID for consistent processing
// Iterate through the list and fix invalid IDs
foreach (var item in sortedItems)
{
// If the ID is invalid or already exists in the set (duplicate), assign a new unique ID
if (!idSet.Add(item.Id))
{
// Find the next available unique ID
while (idSet.Contains(newId))
{
newId++;
}
item.Id = newId;
idSet.Add(newId); // Add the newly assigned ID to the set
}
}
}
}
public interface IHasId
{
int Id { get; set; }
}
}

View File

@@ -11,10 +11,11 @@ using System.Text.Json.Serialization;
using ImageResizer.Helpers; using ImageResizer.Helpers;
using ImageResizer.Properties; using ImageResizer.Properties;
using ManagedCommon;
namespace ImageResizer.Models namespace ImageResizer.Models
{ {
public class ResizeSize : Observable public class ResizeSize : Observable, IHasId
{ {
private static readonly Dictionary<string, string> _tokens = new Dictionary<string, string> private static readonly Dictionary<string, string> _tokens = new Dictionary<string, string>
{ {
@@ -24,6 +25,7 @@ namespace ImageResizer.Models
["$phone$"] = Resources.Phone, ["$phone$"] = Resources.Phone,
}; };
private int _id;
private string _name; private string _name;
private ResizeFit _fit = ResizeFit.Fit; private ResizeFit _fit = ResizeFit.Fit;
private double _width; private double _width;
@@ -31,8 +33,9 @@ namespace ImageResizer.Models
private bool _showHeight = true; private bool _showHeight = true;
private ResizeUnit _unit = ResizeUnit.Pixel; private ResizeUnit _unit = ResizeUnit.Pixel;
public ResizeSize(string name, ResizeFit fit, double width, double height, ResizeUnit unit) public ResizeSize(int id, string name, ResizeFit fit, double width, double height, ResizeUnit unit)
{ {
Id = id;
Name = name; Name = name;
Fit = fit; Fit = fit;
Width = width; Width = width;
@@ -44,6 +47,13 @@ namespace ImageResizer.Models
{ {
} }
[JsonPropertyName("Id")]
public int Id
{
get => _id;
set => Set(ref _id, value);
}
[JsonPropertyName("name")] [JsonPropertyName("name")]
public virtual string Name public virtual string Name
{ {

View File

@@ -19,6 +19,7 @@ using System.Threading;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using ImageResizer.Models; using ImageResizer.Models;
using ManagedCommon;
namespace ImageResizer.Properties namespace ImageResizer.Properties
{ {
@@ -63,10 +64,10 @@ namespace ImageResizer.Properties
FileName = "%1 (%2)"; FileName = "%1 (%2)";
Sizes = new ObservableCollection<ResizeSize> Sizes = new ObservableCollection<ResizeSize>
{ {
new ResizeSize("$small$", ResizeFit.Fit, 854, 480, ResizeUnit.Pixel), new ResizeSize(0, "$small$", ResizeFit.Fit, 854, 480, ResizeUnit.Pixel),
new ResizeSize("$medium$", ResizeFit.Fit, 1366, 768, ResizeUnit.Pixel), new ResizeSize(1, "$medium$", ResizeFit.Fit, 1366, 768, ResizeUnit.Pixel),
new ResizeSize("$large$", ResizeFit.Fit, 1920, 1080, ResizeUnit.Pixel), new ResizeSize(2, "$large$", ResizeFit.Fit, 1920, 1080, ResizeUnit.Pixel),
new ResizeSize("$phone$", ResizeFit.Fit, 320, 568, ResizeUnit.Pixel), new ResizeSize(3, "$phone$", ResizeFit.Fit, 320, 568, ResizeUnit.Pixel),
}; };
KeepDateModified = false; KeepDateModified = false;
FallbackEncoder = new System.Guid("19e4a5aa-5662-4fc5-a0c0-1758028e1057"); FallbackEncoder = new System.Guid("19e4a5aa-5662-4fc5-a0c0-1758028e1057");
@@ -480,6 +481,9 @@ namespace ImageResizer.Properties
{ {
Sizes.Clear(); Sizes.Clear();
Sizes.AddRange(jsonSettings.Sizes); Sizes.AddRange(jsonSettings.Sizes);
// Ensure Ids are unique and handle missing Ids
IdRecoveryHelper.RecoverInvalidIds(Sizes);
} }
}); });

View File

@@ -8,11 +8,12 @@ using System.ComponentModel;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using ManagedCommon;
using Settings.UI.Library.Resources; using Settings.UI.Library.Resources;
namespace Microsoft.PowerToys.Settings.UI.Library; namespace Microsoft.PowerToys.Settings.UI.Library;
public partial class ImageSize : INotifyPropertyChanged public partial class ImageSize : INotifyPropertyChanged, IHasId
{ {
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;

View File

@@ -67,6 +67,7 @@ public partial class ImageResizerViewModel : Observable
try try
{ {
Settings = _settingsUtils.GetSettings<ImageResizerSettings>(ModuleName); Settings = _settingsUtils.GetSettings<ImageResizerSettings>(ModuleName);
IdRecoveryHelper.RecoverInvalidIds(Settings.Properties.ImageresizerSizes.Value);
} }
catch (Exception e) catch (Exception e)
{ {