using System.Text.Json.Serialization; namespace EnvelopeGenerator.Web.Models; public record Annotation { public required string Name { get; init; } #region Bound Annotation [JsonIgnore] public string? HorBoundAnnotName { get; init; } [JsonIgnore] public string? VerBoundAnnotName { get; init; } #endregion #region Layout [JsonIgnore] public double? MarginLeft { get; set; } [JsonIgnore] public double MarginLeftRatio { get; init; } = 1; [JsonIgnore] public double? MarginTop { get; set; } [JsonIgnore] public double MarginTopRatio { get; init; } = 1; public double? Width { get; set; } [JsonIgnore] public double WidthRatio { get; init; } = 1; public double? Height { get; set; } [JsonIgnore] public double HeightRatio { get; init; } = 1; #endregion #region Position public double Left => (MarginLeft ?? 0) + (HorBoundAnnot?.HorBoundary ?? 0); public double Top => (MarginTop ?? 0) + (VerBoundAnnot?.VerBoundary ?? 0); #endregion #region Boundary [JsonIgnore] public double HorBoundary => Left + (Width ?? 0); [JsonIgnore] public double VerBoundary => Top + (Height ?? 0); #endregion #region BoundAnnot [JsonIgnore] public Annotation? HorBoundAnnot { get; set; } [JsonIgnore] public Annotation? VerBoundAnnot { get; set; } #endregion [JsonIgnore] internal Annotation Default { set { // To set null value, annotation must have null (0) value but null must has non-null value if (MarginLeft == null && value.MarginLeft != null) MarginLeft = value.MarginLeft * MarginLeftRatio; if (MarginTop == null && value.MarginTop != null) MarginTop = value.MarginTop * MarginTopRatio; if (Width == null && value.Width != null) Width = value.Width * WidthRatio; if (Height == null && value.Height != null) Height = value.Height * HeightRatio; } } };