Browse Source

Added Setting wrapper

CPKreuz 1 year ago
parent
commit
fac1ef801e

+ 10 - 0
src/PixiEditor.Extensions.CommonApi/UserPreferences/Settings/LocalSetting.cs

@@ -0,0 +1,10 @@
+namespace PixiEditor.Extensions.CommonApi.UserPreferences.Settings;
+
+public class LocalSetting<T>(string name, T? fallbackValue = default) : Setting<T>(name, fallbackValue)
+{
+    protected override TAny? GetValue<TAny>(IPreferences preferences, TAny fallbackValue) where TAny : default =>
+        preferences.GetLocalPreference(Name, fallbackValue);
+
+    protected override void SetValue(IPreferences preferences, T value) =>
+        preferences.UpdateLocalPreference(Name, value);
+}

+ 56 - 0
src/PixiEditor.Extensions.CommonApi/UserPreferences/Settings/Setting.cs

@@ -0,0 +1,56 @@
+using System.ComponentModel;
+
+namespace PixiEditor.Extensions.CommonApi.UserPreferences.Settings;
+
+public abstract class Setting<T> : INotifyPropertyChanged
+{
+    private readonly IPreferences preferences;
+    private event PropertyChangedEventHandler PropertyChanged;
+
+    public string Name { get; }
+
+    public T? Value
+    {
+        get => GetValue(preferences, FallbackValue);
+        set => SetValue(preferences, value);
+    }
+
+    public T? FallbackValue { get; }
+
+    public Setting(string name, T? fallbackValue = default)
+    {
+        Name = name;
+        FallbackValue = fallbackValue;
+        
+        preferences = IPreferences.Current;
+        preferences.AddCallback<T>(Name, SettingChangeCallback);
+    }
+
+    public T GetValueOrDefault(T fallbackValue) => GetValue(preferences, fallbackValue);
+
+    public T? As<T>(T? fallbackValue = default) => GetValue(preferences, fallbackValue);
+
+    protected abstract TAny? GetValue<TAny>(IPreferences preferences, TAny fallbackValue);
+
+    protected abstract void SetValue(IPreferences preferences, T? value);
+
+    private void SettingChangeCallback(T newValue)
+    {
+        ValueChanged?.Invoke(this, newValue);
+        PropertyChanged?.Invoke(this, PropertyChangedConstants.ValueChangedPropertyArgs);
+    }
+
+    public event SettingChangedHandler<T> ValueChanged; 
+    
+    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
+    {
+        add => PropertyChanged += value;
+        remove => PropertyChanged -= value;
+    }
+}
+
+// Generic types would create a instance for every type combination.
+file static class PropertyChangedConstants
+{
+    public static readonly PropertyChangedEventArgs ValueChangedPropertyArgs = new("Value");
+}

+ 3 - 0
src/PixiEditor.Extensions.CommonApi/UserPreferences/Settings/SettingChangedHandler.cs

@@ -0,0 +1,3 @@
+namespace PixiEditor.Extensions.CommonApi.UserPreferences.Settings;
+
+public delegate void SettingChangedHandler<T>(Setting<T> setting, T? newValue);

+ 16 - 0
src/PixiEditor.Extensions.CommonApi/UserPreferences/Settings/SettingExtensions.cs

@@ -0,0 +1,16 @@
+namespace PixiEditor.Extensions.CommonApi.UserPreferences.Settings;
+
+public static class SettingExtensions
+{
+    public static List<T> AsList<T>(this Setting<IEnumerable<T>> setting) =>
+        setting.As(new List<T>());
+    
+    public static T[] AsArray<T>(this Setting<IEnumerable<T>> setting) =>
+        setting.As(Array.Empty<T>());
+
+    public static void AddListCallback<T>(this Setting<IEnumerable<T>> setting, Action<List<T>> callback) =>
+        setting.ValueChanged += (_, value) => callback(value.ToList());
+
+    public static void AddArrayCallback<T>(this Setting<IEnumerable<T>> setting, Action<T[]> callback) =>
+        setting.ValueChanged += (_, value) => callback(value.ToArray());
+}

+ 10 - 0
src/PixiEditor.Extensions.CommonApi/UserPreferences/Settings/SyncedSetting.cs

@@ -0,0 +1,10 @@
+namespace PixiEditor.Extensions.CommonApi.UserPreferences.Settings;
+
+public class SyncedSetting<T>(string name, T? fallbackValue = default) : Setting<T>(name, fallbackValue)
+{
+    protected override TAny? GetValue<TAny>(IPreferences preferences, TAny fallbackValue) where TAny : default =>
+        preferences.GetPreference(Name, fallbackValue);
+
+    protected override void SetValue(IPreferences preferences, T value) =>
+        preferences.UpdatePreference(Name, value);
+}