mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-11 05:52:19 +02:00
Merge ImageResizer into master (#1469)
* Import Image Resizer for Windows * getting code analysis and stylecop hooked in * upgrading to 4.7.2 * adding copyright * getting stuff to work headers and trailing commas adding braces updated encoder * Revert "getting stuff to work" This reverts commit5310866120. * update to .net 4.7.2 * access modifier * zero errors * Fixed unit tests not running issue * Fixed ImageResizer.Test stylecop warning * Formatted ShellExtensions project with clang-format * Fixed annotation warnings * Suppressed 6031 and 26812 warnings for specific lines * Shifting ImageResizer projects to PowerToys solution (#1054) * Shifted ImageResizer projects to PowerToys solution: Builds, all tests pass, ImageResizer C# project works independently * Deleted extra files * Deleted nuget config file and fixed code analysis paths * Convert ImageResizer to a PowerToy (#1073) * Updated vcxproj file with common project references and cpp version flags * Added module template code to dllmain and updated headers for successful build * Removed unnecessary include * Added dll to runner and add fixes to show up in PT Settings * Added settings file * Added support for enabling/disabling based on PowerRename codebase * Fixed missing braces * Fixed call_custom_action * Add ImageResizer to msi installer (dev/imageResizer) (#1094) * Updated vcxproj file with common project references and cpp version flags * Added module template code to dllmain and updated headers for successful build * Removed unnecessary include * Added dll to runner and add fixes to show up in PT Settings * Added settings file * Added support for enabling/disabling based on PowerRename codebase * Fixed solution file configurations * Removed Any CPU from ImageResizer csprojs * Renamed registry writing and removed build time registry addition * Added ImageResizer installation details to msi * Fixed comment on conditions to close explorer.exe * Sync dev/imageResizer with master (#1105) * tweaking language * adjusting elevated permission verbiage to match Windows * npm audit fix to update stuff * slight bump for fabric ui * Remove unwanted files (#1037) Add temp build files to gitignore * Ensure previous search and replace texts are evaluated and updated in the UI at startup (#1043) Ensure stored settings get evaluated after initial enumeration There was a bug where the list view was not getting updated with the results of the search and replace on launch when we are using a stored search or replace text from a previous session. * adding fancy zone opacity setting, enhancement #631 (#1008) * adding fancy zone opacity setting, enhancement #631 * applying zone opacity setting to all zones during zone selection * changing opacity setting to percentage * runner: show message box when restarting with different elevation fails (#1061) Also make the message box appear on top of the settings window. * Fix misaligned display of zones in layout priview and grid editor (#1010) Fix misaligned display of zones in layout preview and grid editor * MSIX: Extract MSIX building functionality from msix_reinstall.ps1 to a separate script (#1068) * MSIX: label PowerToys as Preview (#1090) * MSIX: Code sign msixbundle (#1093) * Update to MSIX README.md (#1095) * Update README.md few adjustments * Update README.md * Update README.md * adding in privacy statement, removing About in dialog (#1087) * adding in privacy statement, removing About in dialog * added Preview * Revert "Fix misaligned display of zones in layout priview and grid editor (#1010)" (#1097) This reverts commitd03690cffd. * Fix reversed order of zones in layout (#1071) * Shifted three functions to common (#1101) Co-authored-by: Clint Rutkas <clint@rutkas.com> Co-authored-by: Enrico Giordani <enricogior@users.noreply.github.com> Co-authored-by: Chris Davis <chrisdavis@outlook.com> Co-authored-by: Yosef Durr <yodurr@microsoft.com> Co-authored-by: Bartosz Sosnowski <bzoz@users.noreply.github.com> Co-authored-by: vldmr11080 <57061786+vldmr11080@users.noreply.github.com> Co-authored-by: yuyoyuppe <yuyoyuppe@users.noreply.github.com> * Revert "Sync dev/imageResizer with master (#1105)" This reverts commitdb7f15541f. * Added icon to Resize pictures context menu entry (dev/imageResizer) (#1113) * Updated vcxproj file with common project references and cpp version flags * Added module template code to dllmain and updated headers for successful build * Removed unnecessary include * Added dll to runner and add fixes to show up in PT Settings * Added settings file * Added support for enabling/disabling based on PowerRename codebase * Fixed solution file configurations * Removed Any CPU from ImageResizer csprojs * Renamed registry writing and removed build time registry addition * Added ImageResizer installation details to msi * Shifted to MII, TODO: Fix position * Incorporated ImageResizer Icon in context menu entry * Fixed typo * Merged with dev/imageResizer * Renamed Advanced Options to Settings and removed About tab (dev/imageResizer) (#1123) * Removed about tab, renamed advanced opt to settings, changed assembly info * Restored Resource designer file * Reverted changes on AssemblyInfo * MSI: Fix ImageResizer menu item position (dev/imageResizer) (#1114) * Updated vcxproj file with common project references and cpp version flags * Added module template code to dllmain and updated headers for successful build * Removed unnecessary include * Added dll to runner and add fixes to show up in PT Settings * Added settings file * Added support for enabling/disabling based on PowerRename codebase * Fixed solution file configurations * Removed Any CPU from ImageResizer csprojs * Renamed registry writing and removed build time registry addition * Added ImageResizer installation details to msi * Shifted to MII, TODO: Fix position * Incorporated ImageResizer Icon in context menu entry * Changed registry entries to SystemFileAssociations and added index changes in InsertMenuItem * Fixed extra newline * Fixed merge conflict * Refactor ImageResizer code base naming to match PowerRename (#1121) * Created empty README file * Renamed dll project * Removed ShellExtensions references in src * Fixed ImageResizerUI assembly name and added changes to MSI * added the helper functions * localized dllmain powerrename * localized powerRenameExt * localized the settings file * built the proj * Modified resourceIDs for strings in the table * added common as a reference project * Removed get_res_string_wchar and used the get_resource_string() function instead which returns a wstring typecast into wchar* * Added new lines to the end of the file * Removed string resources from the settings.cpp file * rebuilt project PowerRename * moved app name to constructor to init only once * updated formatting of common.cpp * reverting formatting of files * Removed some IDs from resource file. Changed SHIFT to Shift * Localizing C# Project of FancyZones (FancyZonesEditor) (#199) (#1122) * removed hardcoded strings from CanvasEditorWindow.xaml * removed hardcoded strings from GridEditorWindow.xaml * loc * Localized MainWindow * reverting MainWindow.xaml as it is not rendering the window as expected * Changed the resource settings from internal to public * the culture is set based on the culture of the system UI set in the system settings * Removed the french resource files used for testing * Localized canvasWindow and mainwindow * Removed setting the UI culture explicitly as it would be implicitly set to the culture of system UI * Removed redundant header file * Localize the Shortcut guide PowerToy (#199) (#1126) * Localized shortcut_guide.cpp * localized overlay_window.cpp * formatting changes * Localize overlay window * removed the README link from the set of localized resources * Typo: changed upper to lower * Localize C++ Projects of FancyZones (#1130) * localized dllmain.cpp of fancyzones project * localized FancyZones.cpp * format fancyzones.rc file * Moved SuperFancyZones back to being a string instead of having it in the resource file as it is the window class name * reverted changes for window name * Formatted fancyzones rc file * Align zone dimensions from layout preview with those from grid editor (#1115) * MSIX: add a dedicated .rc for UWPUI which joins both UI and DLL .rc's (#1139) * Runner: fix restarting with same elevation (#1133) * MSIX: reinstall script uses bundle instead of .msi to be able to reinstall in all cases * Telemetry: add WebView init failure errors * Settings: initialize COM security to allow communication between elevated Settings and WebView * Common: implement on_scope_exit helper and typed_storage * Changes for #1140 and #569 (#1152) * MSIX build instructions adjustmnet (#1170) * MSIX: hide the "Run at Startup" option if running as packaged * MSIX: update identity name and publisher (#1176) * Runner: fix startup task state setting for MSIX (#1181) * Add ImageResizer to MSIX installer and make the code MSIX-compatible (#1219) * Removed ImageResizer.exe location registry key * Added working resize pictures to MSIX context menu without icon * Fixed missing icon on MSIX build * Added comments * Changed to single context handler entry * Made changes as per PR comments * Localize ImageResizer (#1261) * Removed hardcoded strings * Added resource dlls to MSIX installer * Save ImageResizer settings in JSON format (#1258) * Combined settings files * Added JSON settings functionality in PowerToys format with thread safety * Reverting changes to csproj file * Removed settings.settings and designer file and added target sdk tools to fix warning * Added NewtonSoft Json package * Added 3 tests * Added propertychanged test * Removed unused libraries * Removed additional allocation statements in test * Added comments on test * Added one-time setup code * Added Newtonsoft.Json.dll to MSI and MSIX installer * Fixed copyright header * Fixed folder location in MSIX * Renamed jsonMutex to _jsonMutex * Fixed line endings * Created private setup functions and added Arrange, Act, Assert comments * Created private setup functions and added Arrange, Act, Assert comments * Suppressed copyright warning on AppFixture and enabled treat warnings as errors * Added comments on Reload/AppFixture and added constructor andispose * Added telemetry to ImageResizer Shell Extension code (dev/imageResizer) (#1272) * Added telemetry to C++ ImageResizerExt * Added Register and unregister calls * Changed default enable setting * Set startup location to center of the screen (ImageResizer) (#1452) * Added ImageResizer resources.dlls to the MSI installer (#1448) * Implemented fix for foreground issue for ImageResizer (#1434) * Fixed conflict in installer README.md file * Fixed conflict in bundle.js * Auto-generate AssemblyInfo in ImageResizer (#1467) * Updated assembly info * Added auto-generation of AssemblyInfo.cs * Fixed minor issues * Remove the License file since Notice.md have been added * Fix errors due to resolving merge conflicts Co-authored-by: Brice Lambson <brice@bricelam.net> Co-authored-by: Clint Rutkas <clint@rutkas.com> Co-authored-by: Arjun Balgovind <arbalgov@microsoft.com> Co-authored-by: Enrico Giordani <enricogior@users.noreply.github.com> Co-authored-by: Chris Davis <chrisdavis@outlook.com> Co-authored-by: Yosef Durr <yodurr@microsoft.com> Co-authored-by: Bartosz Sosnowski <bzoz@users.noreply.github.com> Co-authored-by: vldmr11080 <57061786+vldmr11080@users.noreply.github.com> Co-authored-by: yuyoyuppe <yuyoyuppe@users.noreply.github.com> Co-authored-by: Alekhya Kommuru <alkommur@microsoft.com> Co-authored-by: Alekhya <reddykalekhya@gmail.com> Co-authored-by: yuyoyuppe <a.yuyoyuppe@gmail.com> Co-authored-by: Udit Singh <udsing@microsoft.com>
This commit is contained in:
435
src/modules/imageresizer/ui/Properties/Settings.cs
Normal file
435
src/modules/imageresizer/ui/Properties/Settings.cs
Normal file
@@ -0,0 +1,435 @@
|
||||
// Copyright (c) Brice Lambson
|
||||
// The Brice Lambson licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information. Code forked from Brice Lambson's https://github.com/bricelam/ImageResizer/
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Collections.Specialized;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Windows.Media.Imaging;
|
||||
using ImageResizer.Models;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
|
||||
namespace ImageResizer.Properties
|
||||
{
|
||||
[JsonObject(MemberSerialization.OptIn)]
|
||||
public partial class Settings : IDataErrorInfo, INotifyPropertyChanged
|
||||
{
|
||||
// Used to synchronize access to the settings.json file
|
||||
private static Mutex _jsonMutex = new Mutex();
|
||||
private static string _settingsPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "Microsoft", "PowerToys", "ImageResizer", "settings.json");
|
||||
private string _fileNameFormat;
|
||||
private bool _shrinkOnly;
|
||||
private int _selectedSizeIndex;
|
||||
private bool _replace;
|
||||
private bool _ignoreOrientation;
|
||||
private int _jpegQualityLevel;
|
||||
private PngInterlaceOption _pngInterlaceOption;
|
||||
private TiffCompressOption _tiffCompressOption;
|
||||
private string _fileName;
|
||||
private ObservableCollection<ImageResizer.Models.ResizeSize> _sizes;
|
||||
private bool _keepDateModified;
|
||||
private System.Guid _fallbackEncoder;
|
||||
private CustomSize _customSize;
|
||||
|
||||
public Settings()
|
||||
{
|
||||
SelectedSizeIndex = 0;
|
||||
ShrinkOnly = false;
|
||||
Replace = false;
|
||||
IgnoreOrientation = true;
|
||||
JpegQualityLevel = 90;
|
||||
PngInterlaceOption = System.Windows.Media.Imaging.PngInterlaceOption.Default;
|
||||
TiffCompressOption = System.Windows.Media.Imaging.TiffCompressOption.Default;
|
||||
FileName = "%1 (%2)";
|
||||
Sizes = new ObservableCollection<ResizeSize>
|
||||
{
|
||||
new ResizeSize("$small$", ResizeFit.Fit, 854, 480, ResizeUnit.Pixel),
|
||||
new ResizeSize("$medium$", ResizeFit.Fit, 1366, 768, ResizeUnit.Pixel),
|
||||
new ResizeSize("$large$", ResizeFit.Fit, 1920, 1080, ResizeUnit.Pixel),
|
||||
new ResizeSize("$phone$", ResizeFit.Fit, 320, 568, ResizeUnit.Pixel),
|
||||
};
|
||||
KeepDateModified = false;
|
||||
FallbackEncoder = new System.Guid("19e4a5aa-5662-4fc5-a0c0-1758028e1057");
|
||||
CustomSize = new CustomSize(ResizeFit.Fit, 1024, 640, ResizeUnit.Pixel);
|
||||
AllSizes = new AllSizesCollection(this);
|
||||
}
|
||||
|
||||
public IEnumerable<ResizeSize> AllSizes { get; set; }
|
||||
|
||||
public string FileNameFormat
|
||||
=> _fileNameFormat
|
||||
?? (_fileNameFormat = FileName
|
||||
.Replace("{", "{{")
|
||||
.Replace("}", "}}")
|
||||
.Replace("%1", "{0}")
|
||||
.Replace("%2", "{1}")
|
||||
.Replace("%3", "{2}")
|
||||
.Replace("%4", "{3}")
|
||||
.Replace("%5", "{4}")
|
||||
.Replace("%6", "{5}"));
|
||||
|
||||
public ResizeSize SelectedSize
|
||||
{
|
||||
get => SelectedSizeIndex >= 0 && SelectedSizeIndex < Sizes.Count
|
||||
? Sizes[SelectedSizeIndex]
|
||||
: CustomSize;
|
||||
set
|
||||
{
|
||||
var index = Sizes.IndexOf(value);
|
||||
if (index == -1)
|
||||
{
|
||||
index = Sizes.Count;
|
||||
}
|
||||
|
||||
SelectedSizeIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
string IDataErrorInfo.Error
|
||||
=> string.Empty;
|
||||
|
||||
string IDataErrorInfo.this[string columnName]
|
||||
{
|
||||
get
|
||||
{
|
||||
if (columnName != nameof(JpegQualityLevel))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
if (JpegQualityLevel < 1 || JpegQualityLevel > 100)
|
||||
{
|
||||
return string.Format(Resources.ValueMustBeBetween, 1, 100);
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
private class AllSizesCollection : IEnumerable<ResizeSize>, INotifyCollectionChanged, INotifyPropertyChanged
|
||||
{
|
||||
private ObservableCollection<ResizeSize> _sizes;
|
||||
private CustomSize _customSize;
|
||||
|
||||
public AllSizesCollection(Settings settings)
|
||||
{
|
||||
_sizes = settings.Sizes;
|
||||
_customSize = settings.CustomSize;
|
||||
|
||||
_sizes.CollectionChanged += HandleCollectionChanged;
|
||||
((INotifyPropertyChanged)_sizes).PropertyChanged += HandlePropertyChanged;
|
||||
|
||||
settings.PropertyChanged += (sender, e) =>
|
||||
{
|
||||
if (e.PropertyName == nameof(Models.CustomSize))
|
||||
{
|
||||
var oldCustomSize = _customSize;
|
||||
_customSize = settings.CustomSize;
|
||||
|
||||
OnCollectionChanged(
|
||||
new NotifyCollectionChangedEventArgs(
|
||||
NotifyCollectionChangedAction.Replace,
|
||||
_customSize,
|
||||
oldCustomSize,
|
||||
_sizes.Count));
|
||||
}
|
||||
else if (e.PropertyName == nameof(Sizes))
|
||||
{
|
||||
var oldSizes = _sizes;
|
||||
|
||||
oldSizes.CollectionChanged -= HandleCollectionChanged;
|
||||
((INotifyPropertyChanged)oldSizes).PropertyChanged -= HandlePropertyChanged;
|
||||
|
||||
_sizes = settings.Sizes;
|
||||
|
||||
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
||||
|
||||
_sizes.CollectionChanged += HandleCollectionChanged;
|
||||
((INotifyPropertyChanged)_sizes).PropertyChanged += HandlePropertyChanged;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public event NotifyCollectionChangedEventHandler CollectionChanged;
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
public int Count
|
||||
=> _sizes.Count + 1;
|
||||
|
||||
public ResizeSize this[int index]
|
||||
=> index == _sizes.Count
|
||||
? _customSize
|
||||
: _sizes[index];
|
||||
|
||||
public IEnumerator<ResizeSize> GetEnumerator()
|
||||
=> new AllSizesEnumerator(this);
|
||||
|
||||
private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||
=> OnCollectionChanged(e);
|
||||
|
||||
private void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||
=> PropertyChanged?.Invoke(this, e);
|
||||
|
||||
private void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
|
||||
=> CollectionChanged?.Invoke(this, e);
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
=> GetEnumerator();
|
||||
|
||||
private class AllSizesEnumerator : IEnumerator<ResizeSize>
|
||||
{
|
||||
private readonly AllSizesCollection _list;
|
||||
|
||||
private int _index = -1;
|
||||
|
||||
public AllSizesEnumerator(AllSizesCollection list)
|
||||
=> _list = list;
|
||||
|
||||
public ResizeSize Current
|
||||
=> _list[_index];
|
||||
|
||||
object IEnumerator.Current
|
||||
=> Current;
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
}
|
||||
|
||||
public bool MoveNext()
|
||||
=> ++_index < _list.Count;
|
||||
|
||||
public void Reset()
|
||||
=> _index = -1;
|
||||
}
|
||||
}
|
||||
|
||||
private static Settings defaultInstance = new Settings();
|
||||
|
||||
public static Settings Default
|
||||
{
|
||||
get
|
||||
{
|
||||
defaultInstance.Reload();
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_selectedSizeIndex")]
|
||||
public int SelectedSizeIndex
|
||||
{
|
||||
get => _selectedSizeIndex;
|
||||
set
|
||||
{
|
||||
_selectedSizeIndex = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_shrinkOnly")]
|
||||
public bool ShrinkOnly
|
||||
{
|
||||
get => _shrinkOnly;
|
||||
set
|
||||
{
|
||||
_shrinkOnly = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_replace")]
|
||||
public bool Replace
|
||||
{
|
||||
get => _replace;
|
||||
set
|
||||
{
|
||||
_replace = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_ignoreOrientation")]
|
||||
public bool IgnoreOrientation
|
||||
{
|
||||
get => _ignoreOrientation;
|
||||
set
|
||||
{
|
||||
_ignoreOrientation = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_jpegQualityLevel")]
|
||||
public int JpegQualityLevel
|
||||
{
|
||||
get => _jpegQualityLevel;
|
||||
set
|
||||
{
|
||||
_jpegQualityLevel = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_pngInterlaceOption")]
|
||||
public PngInterlaceOption PngInterlaceOption
|
||||
{
|
||||
get => _pngInterlaceOption;
|
||||
set
|
||||
{
|
||||
_pngInterlaceOption = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_tiffCompressOption")]
|
||||
public TiffCompressOption TiffCompressOption
|
||||
{
|
||||
get => _tiffCompressOption;
|
||||
set
|
||||
{
|
||||
_tiffCompressOption = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_fileName")]
|
||||
public string FileName
|
||||
{
|
||||
get => _fileName;
|
||||
set
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
{
|
||||
throw new System.ArgumentNullException();
|
||||
}
|
||||
|
||||
_fileName = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_sizes")]
|
||||
public ObservableCollection<ResizeSize> Sizes
|
||||
{
|
||||
get => _sizes;
|
||||
set
|
||||
{
|
||||
_sizes = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_keepDateModified")]
|
||||
public bool KeepDateModified
|
||||
{
|
||||
get => _keepDateModified;
|
||||
set
|
||||
{
|
||||
_keepDateModified = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_fallbackEncoder")]
|
||||
public System.Guid FallbackEncoder
|
||||
{
|
||||
get => _fallbackEncoder;
|
||||
set
|
||||
{
|
||||
_fallbackEncoder = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty(PropertyName = "imageresizer_customSize")]
|
||||
public CustomSize CustomSize
|
||||
{
|
||||
get => _customSize;
|
||||
set
|
||||
{
|
||||
_customSize = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public static string SettingsPath { get => _settingsPath; set => _settingsPath = value; }
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
_jsonMutex.WaitOne();
|
||||
string jsonData = "{\"version\":\"1.0\",\"name\":\"ImageResizer\",\"properties\":";
|
||||
string tempJsonData = JsonConvert.SerializeObject(this);
|
||||
JObject tempSettings = JObject.Parse(tempJsonData);
|
||||
|
||||
// Replace the <Value> of the property with { "value": <Value> } to be consistent with PowerToys
|
||||
foreach (var property in tempSettings)
|
||||
{
|
||||
tempSettings[property.Key] = new JObject { { "value", property.Value } };
|
||||
}
|
||||
|
||||
jsonData += tempSettings.ToString(Formatting.None);
|
||||
jsonData += "}";
|
||||
|
||||
// Create directory if it doesn't exist
|
||||
FileInfo file = new FileInfo(SettingsPath);
|
||||
file.Directory.Create();
|
||||
|
||||
// write string to file
|
||||
File.WriteAllText(SettingsPath, jsonData);
|
||||
_jsonMutex.ReleaseMutex();
|
||||
}
|
||||
|
||||
public void Reload()
|
||||
{
|
||||
_jsonMutex.WaitOne();
|
||||
if (!File.Exists(SettingsPath))
|
||||
{
|
||||
_jsonMutex.ReleaseMutex();
|
||||
Save();
|
||||
return;
|
||||
}
|
||||
|
||||
string jsonData = File.ReadAllText(SettingsPath);
|
||||
JObject imageResizerSettings = JObject.Parse(jsonData);
|
||||
|
||||
// Replace the { "value": <Value> } with <Value> to match the Settings object format
|
||||
foreach (var property in (JObject)imageResizerSettings["properties"])
|
||||
{
|
||||
imageResizerSettings["properties"][property.Key] = property.Value["value"];
|
||||
}
|
||||
|
||||
Settings jsonSettings = JsonConvert.DeserializeObject<Settings>(imageResizerSettings["properties"].ToString(), new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace });
|
||||
|
||||
// Needs to be called on the App UI thread as the properties are bound to the UI.
|
||||
App.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
ShrinkOnly = jsonSettings.ShrinkOnly;
|
||||
Replace = jsonSettings.Replace;
|
||||
IgnoreOrientation = jsonSettings.IgnoreOrientation;
|
||||
JpegQualityLevel = jsonSettings.JpegQualityLevel;
|
||||
PngInterlaceOption = jsonSettings.PngInterlaceOption;
|
||||
TiffCompressOption = jsonSettings.TiffCompressOption;
|
||||
FileName = jsonSettings.FileName;
|
||||
Sizes = jsonSettings.Sizes;
|
||||
KeepDateModified = jsonSettings.KeepDateModified;
|
||||
FallbackEncoder = jsonSettings.FallbackEncoder;
|
||||
CustomSize = jsonSettings.CustomSize;
|
||||
SelectedSizeIndex = jsonSettings.SelectedSizeIndex;
|
||||
});
|
||||
_jsonMutex.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user