DFLayoutEmbeddedMediaValues.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. using System.Runtime.CompilerServices;
  7. using InABox.Core;
  8. namespace InABox.Core
  9. {
  10. public class DFLayoutEmbeddedMediaValues : IEnumerable<DFLayoutEmbeddedMediaValue>, INotifyPropertyChanged, IDFLayoutValue<List<DFLayoutEmbeddedMediaValue>>
  11. {
  12. private readonly List<DFLayoutEmbeddedMediaValue> _values = new List<DFLayoutEmbeddedMediaValue>();
  13. public DFLayoutEmbeddedMediaValue[] Values => _values.ToArray();
  14. public bool Present { get; set; } = false;
  15. public List<byte[]> AsByteArrays
  16. {
  17. get => _values.Select(x => x?.Data).OfType<byte[]>().ToList();
  18. set
  19. {
  20. _values.Clear();
  21. foreach (var bytes in value)
  22. _values.Add(new DFLayoutEmbeddedMediaValue() { ID = Guid.Empty, Data = bytes});
  23. OnPropertyChanged(nameof(Values));
  24. }
  25. }
  26. public void Serialize(DFSaveStorageEntry storage)
  27. {
  28. var results = new List<string>();
  29. foreach (var value in _values)
  30. results.Add(Serialization.Serialize((value.ID, value.Thumbnail)));
  31. if (results.Any())
  32. storage.SetBlobValue(results);
  33. }
  34. public void Deserialize(DFLoadStorageEntry storage)
  35. {
  36. _values.Clear();
  37. Present = storage.HasValue();
  38. if (Present)
  39. {
  40. var values = storage.GetValue<string[]>() ?? Array.Empty<string>();
  41. foreach (string s in values)
  42. {
  43. if (!s.IsNullOrWhiteSpace())
  44. {
  45. var externaldata = Serialization.Deserialize<(Guid, byte[])>(s);
  46. if (externaldata.Item1 != Guid.Empty)
  47. {
  48. _values.Add(new DFLayoutEmbeddedMediaValue()
  49. {
  50. ID = externaldata.Item1,
  51. Thumbnail = externaldata.Item2
  52. });
  53. }
  54. }
  55. }
  56. }
  57. }
  58. public IEnumerator<DFLayoutEmbeddedMediaValue> GetEnumerator() => _values.GetEnumerator();
  59. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
  60. public void Add(DFLayoutEmbeddedMediaValue value)
  61. {
  62. _values.Add(value);
  63. OnPropertyChanged(nameof(Values));
  64. }
  65. public void Remove(DFLayoutEmbeddedMediaValue value)
  66. {
  67. if (_values.Contains(value))
  68. {
  69. _values.Remove(value);
  70. OnPropertyChanged(nameof(Values));
  71. }
  72. }
  73. public void Clear()
  74. {
  75. _values.Clear();
  76. OnPropertyChanged(nameof(Values));
  77. }
  78. public event PropertyChangedEventHandler? PropertyChanged;
  79. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
  80. {
  81. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  82. }
  83. protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
  84. {
  85. if (EqualityComparer<T>.Default.Equals(field, value)) return false;
  86. field = value;
  87. OnPropertyChanged(propertyName);
  88. return true;
  89. }
  90. }
  91. }