Preferences.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace PixiEditor.SDK
  8. {
  9. public class Preferences
  10. {
  11. private static Action<Extension, string, object, PreferenceStorageLocation> SavePreferenceCallback { get; set; }
  12. private static Func<Extension, string, PreferenceStorageLocation, object> LoadPreferenceCallback { get; set; }
  13. private Extension Extension { get; set; }
  14. internal static void Init(Action<Extension, string, object, PreferenceStorageLocation> savePreference, Func<Extension, string, PreferenceStorageLocation, object> loadPreference)
  15. {
  16. SavePreferenceCallback = savePreference;
  17. LoadPreferenceCallback = loadPreference;
  18. }
  19. internal Preferences(Extension extension)
  20. {
  21. Extension = extension;
  22. }
  23. public void UpdatePreference<T>(string name, T value)
  24. {
  25. SavePreferenceCallback(Extension, name, value, PreferenceStorageLocation.Local);
  26. if (Callbacks.ContainsKey((name, PreferenceStorageLocation.Roaming)))
  27. {
  28. foreach (var action in Callbacks[(name, PreferenceStorageLocation.Roaming)])
  29. {
  30. action.Invoke(value);
  31. }
  32. }
  33. }
  34. public void UpdateLocalPreference<T>(string name, T value)
  35. {
  36. SavePreferenceCallback(Extension, name, value, PreferenceStorageLocation.Local);
  37. if (Callbacks.ContainsKey((name, PreferenceStorageLocation.Local)))
  38. {
  39. foreach (var action in Callbacks[(name, PreferenceStorageLocation.Local)])
  40. {
  41. action.Invoke(value);
  42. }
  43. }
  44. }
  45. private Dictionary<(string, PreferenceStorageLocation), List<Action<object>>> Callbacks { get; set; } = new Dictionary<(string, PreferenceStorageLocation), List<Action<object>>>();
  46. public void AddCallback(string name, Action<object> action)
  47. {
  48. if (action == null)
  49. {
  50. throw new ArgumentNullException(nameof(action));
  51. }
  52. if (Callbacks.ContainsKey((name, PreferenceStorageLocation.Local)))
  53. {
  54. Callbacks[(name, PreferenceStorageLocation.Roaming)].Add(action);
  55. return;
  56. }
  57. Callbacks.Add((name, PreferenceStorageLocation.Roaming), new List<Action<object>>() { action });
  58. }
  59. public void AddCallback<T>(string name, Action<T> action)
  60. {
  61. if (action == null)
  62. {
  63. throw new ArgumentNullException(nameof(action));
  64. }
  65. AddCallback(name, new Action<object>(o => action((T)o)));
  66. }
  67. public void AddLocalCallback(string name, Action<object> action)
  68. {
  69. if (action == null)
  70. {
  71. throw new ArgumentNullException(nameof(action));
  72. }
  73. if (Callbacks.ContainsKey((name, PreferenceStorageLocation.Local)))
  74. {
  75. Callbacks[(name, PreferenceStorageLocation.Local)].Add(action);
  76. return;
  77. }
  78. Callbacks.Add((name, PreferenceStorageLocation.Local), new List<Action<object>>() { action });
  79. }
  80. public void AddLocalCallback<T>(string name, Action<T> action)
  81. {
  82. if (action == null)
  83. {
  84. throw new ArgumentNullException(nameof(action));
  85. }
  86. AddLocalCallback(name, new Action<object>(o => action((T)o)));
  87. }
  88. #nullable enable
  89. public T? GetPreference<T>(string name)
  90. {
  91. return GetLocalPreference(name, default(T));
  92. }
  93. public T? GetPreference<T>(string name, T? fallbackValue) =>
  94. GetPreference(name, fallbackValue, PreferenceStorageLocation.Roaming);
  95. public T? GetLocalPreference<T>(string name)
  96. {
  97. return GetLocalPreference(name, default(T));
  98. }
  99. public T? GetLocalPreference<T>(string name, T? fallbackValue) =>
  100. GetPreference(name, fallbackValue, PreferenceStorageLocation.Local);
  101. private T? GetPreference<T>(string name, T? fallbackValue, PreferenceStorageLocation location)
  102. {
  103. object value;
  104. try
  105. {
  106. value = LoadPreferenceCallback(Extension, name, location);
  107. }
  108. catch (KeyNotFoundException)
  109. {
  110. return fallbackValue;
  111. }
  112. if (value is JObject jObj)
  113. {
  114. return jObj.ToObject<T>();
  115. }
  116. else
  117. {
  118. return (T?)Convert.ChangeType(value, typeof(T));
  119. }
  120. }
  121. }
  122. }