DFLayoutEmbeddedMediaValues.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. storage.SetBlobValue(results);
  32. }
  33. public void Deserialize(DFLoadStorageEntry storage)
  34. {
  35. _values.Clear();
  36. Present = storage.HasValue();
  37. var values = storage.GetValue<string[]>() ?? Array.Empty<string>();
  38. foreach (string s in values)
  39. {
  40. if (!s.IsNullOrWhiteSpace())
  41. {
  42. var externaldata = Serialization.Deserialize<(Guid, byte[])>(s);
  43. if (externaldata.Item1 != Guid.Empty)
  44. {
  45. _values.Add(new DFLayoutEmbeddedMediaValue()
  46. {
  47. ID = externaldata.Item1,
  48. Thumbnail = externaldata.Item2
  49. });
  50. }
  51. }
  52. }
  53. }
  54. public IEnumerator<DFLayoutEmbeddedMediaValue> GetEnumerator() => _values.GetEnumerator();
  55. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
  56. public void Add(DFLayoutEmbeddedMediaValue value)
  57. {
  58. _values.Add(value);
  59. OnPropertyChanged(nameof(Values));
  60. }
  61. public void Remove(DFLayoutEmbeddedMediaValue value)
  62. {
  63. if (_values.Contains(value))
  64. {
  65. _values.Remove(value);
  66. OnPropertyChanged(nameof(Values));
  67. }
  68. }
  69. public void Clear()
  70. {
  71. _values.Clear();
  72. OnPropertyChanged(nameof(Values));
  73. }
  74. public event PropertyChangedEventHandler? PropertyChanged;
  75. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
  76. {
  77. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  78. }
  79. protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
  80. {
  81. if (EqualityComparer<T>.Default.Equals(field, value)) return false;
  82. field = value;
  83. OnPropertyChanged(propertyName);
  84. return true;
  85. }
  86. }
  87. }