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 DFLayoutEmbeddedMediaValues(String json = "") { if (String.IsNullOrWhiteSpace(json)) return; _values.Clear(); List values = Serialization.Deserialize>(json) ?? new List(); foreach (string s in values) { if (!String.IsNullOrWhiteSpace(s)) { if (Guid.TryParse(s, out Guid id) && (id != Guid.Empty)) { // DigitalFormDocumentHandler.LoadDocument(id, data => // { // Add(new DigitalFormEmbeddedMediaValue() // { // ID = id, // Data = data // }); // }); } else if (s.IsBase64String()) { Add(new DFLayoutEmbeddedMediaValue() { ID = Guid.Empty, Data = Convert.FromBase64String(s) }); } } } } 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; } } }