using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using InABox.Core; namespace InABox.Core { public class DFLayoutEmbeddedMediaValues : IEnumerable, INotifyPropertyChanged { private readonly List _values = new List(); public DFLayoutEmbeddedMediaValue[] Values => _values.ToArray(); public List AsByteArrays { get => _values.Select(x => x?.Data).OfType().ToList(); set { _values.Clear(); foreach (var bytes in value) _values.Add(new DFLayoutEmbeddedMediaValue() { ID = Guid.Empty, Data = bytes}); OnPropertyChanged(nameof(Values)); } } public void Load(String serialized) { _values.Clear(); List values = Serialization.Deserialize>(serialized) ?? new List(); foreach (string s in values) { if (!String.IsNullOrWhiteSpace(s)) { var externaldata = Serialization.Deserialize<(Guid, byte[])>(s); if (externaldata.Item1 != Guid.Empty) { _values.Add(new DFLayoutEmbeddedMediaValue() { ID = externaldata.Item1, Thumbnail = externaldata.Item2 }); } } } } public override String ToString() { List results = new List(); foreach (var value in _values) results.Add(value.ToString()); return Serialization.Serialize(results); } public IEnumerator GetEnumerator() => _values.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public void Add(DFLayoutEmbeddedMediaValue value) { _values.Add(value); OnPropertyChanged(nameof(Values)); } public void Remove(DFLayoutEmbeddedMediaValue value) { if (_values.Contains(value)) { _values.Remove(value); OnPropertyChanged(nameof(Values)); } } public void Clear() { _values.Clear(); OnPropertyChanged(nameof(Values)); } public event PropertyChangedEventHandler? PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected bool SetField(ref T field, T value, [CallerMemberName] string propertyName = "") { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; OnPropertyChanged(propertyName); return true; } } }