DynamicDashboard.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using InABox.Core;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics.CodeAnalysis;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Text.Json;
  8. using System.Text.Json.Serialization;
  9. using System.Text.Json.Serialization.Metadata;
  10. using System.Threading.Tasks;
  11. namespace InABox.Wpf.Dashboard;
  12. public class DynamicDashboard
  13. {
  14. public DynamicDashboardDataComponent DataComponent { get; set; } = new();
  15. [JsonIgnore]
  16. public IDynamicDashboardDataPresenter? DataPresenter { get; set; }
  17. #region Serialization
  18. private string _presenterProperties = "";
  19. [JsonPropertyOrder(1)]
  20. [JsonPropertyName("PresenterProperties")]
  21. [JsonInclude]
  22. private string PresenterProperties
  23. {
  24. get => DataPresenter is not null ? Serialization.Serialize(DataPresenter.Properties) : "";
  25. set
  26. {
  27. _presenterProperties = value;
  28. }
  29. }
  30. [JsonPropertyOrder(2)]
  31. [JsonPropertyName("PresenterType")]
  32. [JsonInclude]
  33. private Type? PresenterType
  34. {
  35. get => DataPresenter?.GetType();
  36. set
  37. {
  38. if(value is null)
  39. {
  40. DataPresenter = null;
  41. }
  42. else
  43. {
  44. DataPresenter = Activator.CreateInstance(value) as IDynamicDashboardDataPresenter;
  45. var propertiesType = value.GetInterfaceDefinition(typeof(IDynamicDashboardDataPresenter<>))!.GenericTypeArguments[0];
  46. DataPresenter!.Properties = Serialization.Deserialize(propertiesType, _presenterProperties)
  47. ?? Activator.CreateInstance(propertiesType)!;
  48. }
  49. }
  50. }
  51. #endregion
  52. }
  53. public static class DynamicDashboardUtils
  54. {
  55. private static Type[]? _presenterTypes;
  56. private static bool _loaded;
  57. [MemberNotNull(nameof(_presenterTypes))]
  58. private static void LoadTypes()
  59. {
  60. if(!_loaded)
  61. {
  62. var presenters = new List<Type>();
  63. var presenterEditors = new Dictionary<Type, Type>();
  64. foreach(var entity in CoreUtils.Entities)
  65. {
  66. if (entity.HasInterface<IDynamicDashboardDataPresenter>())
  67. {
  68. presenters.Add(entity);
  69. }
  70. }
  71. _presenterTypes = presenters.ToArray();
  72. _loaded = true;
  73. }
  74. }
  75. public static IEnumerable<Type> GetPresenterTypes()
  76. {
  77. LoadTypes();
  78. return _presenterTypes;
  79. }
  80. private static JsonSerializerOptions SerializationSettings()
  81. {
  82. var settings = Serialization.CreateSerializerSettings();
  83. settings.TypeInfoResolver = (settings.TypeInfoResolver ?? new DefaultJsonTypeInfoResolver())
  84. .WithAddedModifier(Serialization.WritablePropertiesOnly);
  85. return settings;
  86. }
  87. public static string Serialize(DynamicDashboard data)
  88. {
  89. return JsonSerializer.Serialize(data, typeof(DynamicDashboard), SerializationSettings());
  90. }
  91. public static DynamicDashboard? Deserialize(string? json)
  92. {
  93. if (json.IsNullOrWhiteSpace()) return null;
  94. return JsonSerializer.Deserialize<DynamicDashboard>(json, SerializationSettings())!;
  95. }
  96. }