using System.Text.Json.Serialization; namespace EnvelopeGenerator.Web.Models.Annotation; public class AnnotationParams { public AnnotationParams() { _AnnotationJSObjectInitor = new(CreateAnnotationJSObject); } public Background? Background { get; init; } #region Annotation [JsonIgnore] public Annotation? DefaultAnnotation { get; init; } private readonly List _annots = new List(); public bool TryGet(string name, out Annotation annotation) { #pragma warning disable CS8601 // Possible null reference assignment. annotation = _annots.FirstOrDefault(a => a.Name == name); #pragma warning restore CS8601 // Possible null reference assignment. return annotation is not null; } public required IEnumerable Annotations { get => _annots; init { _annots = value.ToList(); if (DefaultAnnotation is not null) foreach (var annot in _annots) annot.Default = DefaultAnnotation; for (int i = 0; i < _annots.Count; i++) { #region set bound annotations // horizontal if (_annots[i].HorBoundAnnotName is string horBoundAnnotName) if (TryGet(horBoundAnnotName, out var horBoundAnnot)) _annots[i].HorBoundAnnot = horBoundAnnot; else throw new InvalidOperationException($"{horBoundAnnotName} added as bound anotation. However, it is not defined."); // vertical if (_annots[i].VerBoundAnnotName is string verBoundAnnotName) if (TryGet(verBoundAnnotName, out var verBoundAnnot)) _annots[i].VerBoundAnnot = verBoundAnnot; else throw new InvalidOperationException($"{verBoundAnnotName} added as bound anotation. However, it is not defined."); #endregion } } } #endregion #region AnnotationJSObject private Dictionary CreateAnnotationJSObject() { var dict = _annots.ToDictionary(a => a.Name.ToLower(), a => a as IAnnotation); if (Background is not null) { Background.Locate(_annots); dict.Add(Background.Name.ToLower(), Background); } return dict; } private readonly Lazy> _AnnotationJSObjectInitor; public Dictionary AnnotationJSObject => _AnnotationJSObjectInitor.Value; #endregion }