DynamicDashboard.cs 2.9 KB

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