/ src / settings-ui / Settings.UI.Library / SettingsSerializationContext.cs
SettingsSerializationContext.cs
  1  // Copyright (c) Microsoft Corporation
  2  // The Microsoft Corporation licenses this file to you under the MIT license.
  3  // See the LICENSE file in the project root for more information.
  4  
  5  using System.Collections.Generic;
  6  using System.Text.Json.Serialization;
  7  using PowerDisplay.Common.Models;
  8  using SettingsUILibrary = Settings.UI.Library;
  9  using SettingsUILibraryHelpers = Settings.UI.Library.Helpers;
 10  
 11  namespace Microsoft.PowerToys.Settings.UI.Library
 12  {
 13      /// <summary>
 14      /// JSON serialization context for Native AOT compatibility.
 15      /// This context provides source-generated serialization for all PowerToys settings types.
 16      /// </summary>
 17      /// <remarks>
 18      /// <para><strong>⚠️ CRITICAL REQUIREMENT FOR ALL NEW SETTINGS CLASSES ⚠️</strong></para>
 19      /// <para>
 20      /// When adding a new PowerToys module or any class that inherits from <see cref="BasePTModuleSettings"/>,
 21      /// you <strong>MUST</strong> add a <c>[JsonSerializable(typeof(YourNewSettingsClass))]</c> attribute
 22      /// to this class. This is a MANDATORY step for Native AOT compatibility.
 23      /// </para>
 24      /// <para><strong>Steps to add a new settings class:</strong></para>
 25      /// <list type="number">
 26      /// <item><description>Create your new settings class (e.g., <c>MyNewModuleSettings</c>) that inherits from <see cref="BasePTModuleSettings"/></description></item>
 27      /// <item><description>Add <c>[JsonSerializable(typeof(MyNewModuleSettings))]</c> attribute to this <see cref="SettingsSerializationContext"/> class</description></item>
 28      /// <item><description>If you have a corresponding Properties class, also add <c>[JsonSerializable(typeof(MyNewModuleProperties))]</c></description></item>
 29      /// <item><description>Rebuild the project - source generator will create serialization code at compile time</description></item>
 30      /// </list>
 31      /// <para><strong>⚠️ Failure to register types will cause runtime errors:</strong></para>
 32      /// <para>
 33      /// If you forget to add the <c>[JsonSerializable]</c> attribute, calling <c>ToJsonString()</c> or
 34      /// deserialization methods will throw <see cref="InvalidOperationException"/> at runtime with a clear
 35      /// error message indicating which type is missing registration.
 36      /// </para>
 37      /// </remarks>
 38      [JsonSourceGenerationOptions(
 39          WriteIndented = false,
 40          DefaultIgnoreCondition = JsonIgnoreCondition.Never,
 41          IncludeFields = true)]
 42  
 43      // Main Settings Classes
 44      [JsonSerializable(typeof(GeneralSettings))]
 45      [JsonSerializable(typeof(OutGoingGeneralSettings))]
 46      [JsonSerializable(typeof(AdvancedPasteSettings))]
 47      [JsonSerializable(typeof(AlwaysOnTopSettings))]
 48      [JsonSerializable(typeof(AwakeSettings))]
 49      [JsonSerializable(typeof(CmdNotFoundSettings))]
 50      [JsonSerializable(typeof(ColorPickerSettings))]
 51      [JsonSerializable(typeof(ColorPickerSettingsVersion1))]
 52      [JsonSerializable(typeof(CropAndLockSettings))]
 53      [JsonSerializable(typeof(CursorWrapSettings))]
 54      [JsonSerializable(typeof(EnvironmentVariablesSettings))]
 55      [JsonSerializable(typeof(FancyZonesSettings))]
 56      [JsonSerializable(typeof(FileLocksmithSettings))]
 57      [JsonSerializable(typeof(FindMyMouseSettings))]
 58      [JsonSerializable(typeof(HostsSettings))]
 59      [JsonSerializable(typeof(ImageResizerSettings))]
 60      [JsonSerializable(typeof(KeyboardManagerSettings))]
 61      [JsonSerializable(typeof(LightSwitchSettings))]
 62      [JsonSerializable(typeof(MeasureToolSettings))]
 63      [JsonSerializable(typeof(MouseHighlighterSettings))]
 64      [JsonSerializable(typeof(MouseJumpSettings))]
 65      [JsonSerializable(typeof(MousePointerCrosshairsSettings))]
 66      [JsonSerializable(typeof(MouseWithoutBordersSettings))]
 67      [JsonSerializable(typeof(NewPlusSettings))]
 68      [JsonSerializable(typeof(PeekSettings))]
 69      [JsonSerializable(typeof(PowerAccentSettings))]
 70      [JsonSerializable(typeof(PowerDisplaySettings))]
 71      [JsonSerializable(typeof(PowerLauncherSettings))]
 72      [JsonSerializable(typeof(PowerOcrSettings))]
 73      [JsonSerializable(typeof(PowerPreviewSettings))]
 74      [JsonSerializable(typeof(PowerRenameSettings))]
 75      [JsonSerializable(typeof(RegistryPreviewSettings))]
 76      [JsonSerializable(typeof(ShortcutGuideSettings))]
 77      [JsonSerializable(typeof(WorkspacesSettings))]
 78      [JsonSerializable(typeof(ZoomItSettings))]
 79  
 80      // Properties Classes
 81      [JsonSerializable(typeof(AdvancedPasteProperties))]
 82      [JsonSerializable(typeof(AlwaysOnTopProperties))]
 83      [JsonSerializable(typeof(AwakeProperties))]
 84      [JsonSerializable(typeof(CmdPalProperties))]
 85      [JsonSerializable(typeof(ColorPickerProperties))]
 86      [JsonSerializable(typeof(ColorPickerPropertiesVersion1))]
 87      [JsonSerializable(typeof(CropAndLockProperties))]
 88      [JsonSerializable(typeof(CursorWrapProperties))]
 89      [JsonSerializable(typeof(EnvironmentVariablesProperties))]
 90      [JsonSerializable(typeof(FileLocksmithProperties))]
 91      [JsonSerializable(typeof(FileLocksmithLocalProperties))]
 92      [JsonSerializable(typeof(FindMyMouseProperties))]
 93      [JsonSerializable(typeof(FZConfigProperties))]
 94      [JsonSerializable(typeof(HostsProperties))]
 95      [JsonSerializable(typeof(ImageResizerProperties))]
 96      [JsonSerializable(typeof(KeyboardManagerProperties))]
 97      [JsonSerializable(typeof(KeyboardManagerProfile))]
 98      [JsonSerializable(typeof(LightSwitchProperties))]
 99      [JsonSerializable(typeof(MeasureToolProperties))]
100      [JsonSerializable(typeof(MouseHighlighterProperties))]
101      [JsonSerializable(typeof(MouseJumpProperties))]
102      [JsonSerializable(typeof(MousePointerCrosshairsProperties))]
103      [JsonSerializable(typeof(MouseWithoutBordersProperties))]
104      [JsonSerializable(typeof(NewPlusProperties))]
105      [JsonSerializable(typeof(PeekProperties))]
106      [JsonSerializable(typeof(SettingsUILibrary.PeekPreviewSettings))]
107      [JsonSerializable(typeof(PowerAccentProperties))]
108      [JsonSerializable(typeof(PowerDisplayProperties))]
109      [JsonSerializable(typeof(PowerLauncherProperties))]
110      [JsonSerializable(typeof(PowerOcrProperties))]
111      [JsonSerializable(typeof(PowerPreviewProperties))]
112      [JsonSerializable(typeof(PowerRenameProperties))]
113      [JsonSerializable(typeof(PowerRenameLocalProperties))]
114      [JsonSerializable(typeof(RegistryPreviewProperties))]
115      [JsonSerializable(typeof(ShortcutConflictProperties))]
116      [JsonSerializable(typeof(ShortcutGuideProperties))]
117      [JsonSerializable(typeof(WorkspacesProperties))]
118      [JsonSerializable(typeof(ZoomItProperties))]
119  
120      // Base Property Types (used throughout settings)
121      [JsonSerializable(typeof(BoolProperty))]
122      [JsonSerializable(typeof(StringProperty))]
123      [JsonSerializable(typeof(IntProperty))]
124      [JsonSerializable(typeof(DoubleProperty))]
125  
126      // Helper and Utility Types
127      [JsonSerializable(typeof(HotkeySettings))]
128      [JsonSerializable(typeof(ColorFormatModel))]
129      [JsonSerializable(typeof(ImageSize))]
130      [JsonSerializable(typeof(KeysDataModel))]
131      [JsonSerializable(typeof(EnabledModules))]
132      [JsonSerializable(typeof(GeneralSettingsCustomAction))]
133      [JsonSerializable(typeof(OutGoingGeneralSettings))]
134      [JsonSerializable(typeof(OutGoingLanguageSettings))]
135      [JsonSerializable(typeof(AdvancedPasteCustomActions))]
136      [JsonSerializable(typeof(AdvancedPasteAdditionalActions))]
137      [JsonSerializable(typeof(AdvancedPasteCustomAction))]
138      [JsonSerializable(typeof(AdvancedPasteAdditionalAction))]
139      [JsonSerializable(typeof(AdvancedPastePasteAsFileAction))]
140      [JsonSerializable(typeof(AdvancedPasteTranscodeAction))]
141      [JsonSerializable(typeof(ImageResizerSizes))]
142      [JsonSerializable(typeof(ImageResizerCustomSizeProperty))]
143      [JsonSerializable(typeof(KeyboardKeysProperty))]
144      [JsonSerializable(typeof(MonitorInfo))]
145      [JsonSerializable(typeof(PowerDisplayActionMessage))]
146      [JsonSerializable(typeof(PowerDisplayActionMessage.ActionData))]
147      [JsonSerializable(typeof(PowerDisplayActionMessage.PowerDisplayAction))]
148      [JsonSerializable(typeof(VcpCodeDisplayInfo))]
149      [JsonSerializable(typeof(VcpValueInfo))]
150      [JsonSerializable(typeof(List<string>))]
151      [JsonSerializable(typeof(List<MonitorInfo>))]
152      [JsonSerializable(typeof(List<VcpCodeDisplayInfo>))]
153      [JsonSerializable(typeof(List<VcpValueInfo>))]
154      [JsonSerializable(typeof(SettingsUILibraryHelpers.SearchLocation))]
155  
156      // AdvancedPaste AI Provider Types (for AOT compatibility)
157      [JsonSerializable(typeof(PasteAIConfiguration))]
158      [JsonSerializable(typeof(PasteAIProviderDefinition))]
159      [JsonSerializable(typeof(System.Collections.ObjectModel.ObservableCollection<PasteAIProviderDefinition>))]
160  
161      // PowerDisplay Profile Types (for AOT compatibility)
162      [JsonSerializable(typeof(PowerDisplayProfile))]
163      [JsonSerializable(typeof(List<PowerDisplayProfile>))]
164      [JsonSerializable(typeof(PowerDisplayProfiles))]
165      [JsonSerializable(typeof(ProfileMonitorSetting))]
166      [JsonSerializable(typeof(List<ProfileMonitorSetting>))]
167  
168      // IPC Send Message Wrapper Classes (Snd*)
169      [JsonSerializable(typeof(SndAwakeSettings))]
170      [JsonSerializable(typeof(SndCursorWrapSettings))]
171      [JsonSerializable(typeof(SndFindMyMouseSettings))]
172      [JsonSerializable(typeof(SndLightSwitchSettings))]
173      [JsonSerializable(typeof(SndMouseHighlighterSettings))]
174      [JsonSerializable(typeof(SndMouseJumpSettings))]
175      [JsonSerializable(typeof(SndMousePointerCrosshairsSettings))]
176      [JsonSerializable(typeof(SndPowerAccentSettings))]
177      [JsonSerializable(typeof(SndPowerPreviewSettings))]
178      [JsonSerializable(typeof(SndPowerRenameSettings))]
179      [JsonSerializable(typeof(SndShortcutGuideSettings))]
180  
181      // IPC Message Generic Wrapper Types (SndModuleSettings<T>)
182      [JsonSerializable(typeof(SndModuleSettings<SndAwakeSettings>))]
183      [JsonSerializable(typeof(SndModuleSettings<SndCursorWrapSettings>))]
184      [JsonSerializable(typeof(SndModuleSettings<SndFindMyMouseSettings>))]
185      [JsonSerializable(typeof(SndModuleSettings<SndLightSwitchSettings>))]
186      [JsonSerializable(typeof(SndModuleSettings<SndMouseHighlighterSettings>))]
187      [JsonSerializable(typeof(SndModuleSettings<SndMouseJumpSettings>))]
188      [JsonSerializable(typeof(SndModuleSettings<SndMousePointerCrosshairsSettings>))]
189      [JsonSerializable(typeof(SndModuleSettings<SndPowerAccentSettings>))]
190      [JsonSerializable(typeof(SndModuleSettings<SndPowerPreviewSettings>))]
191      [JsonSerializable(typeof(SndModuleSettings<SndPowerRenameSettings>))]
192      [JsonSerializable(typeof(SndModuleSettings<SndShortcutGuideSettings>))]
193  
194      public partial class SettingsSerializationContext : JsonSerializerContext
195      {
196      }
197  }