using System.Xml.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.Filter; namespace SabreTools.DatItems.Formats { /// /// Represents one machine display /// [JsonObject("display"), XmlRoot("display")] public class Display : DatItem { #region Fields /// /// Display tag /// [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")] public string? Tag { get => _internal.ReadString(Models.Metadata.Display.TagKey); set => _internal[Models.Metadata.Display.TagKey] = value; } /// /// Display type /// [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")] [JsonConverter(typeof(StringEnumConverter))] public DisplayType DisplayType { get => _internal.ReadString(Models.Metadata.Display.DisplayTypeKey).AsEnumValue(); set => _internal[Models.Metadata.Display.DisplayTypeKey] = value.AsStringValue(); } [JsonIgnore] public bool DisplayTypeSpecified { get { return DisplayType != DisplayType.NULL; } } /// /// Display rotation /// [JsonProperty("rotate", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("rotate")] public long? Rotate { get => _internal.ReadLong(Models.Metadata.Display.RotateKey); set => _internal[Models.Metadata.Display.RotateKey] = value; } [JsonIgnore] public bool RotateSpecified { get { return Rotate != null; } } /// /// Determines if display is flipped in the X-coordinates /// [JsonProperty("flipx", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("flipx")] public bool? FlipX { get => _internal.ReadBool(Models.Metadata.Display.FlipXKey); set => _internal[Models.Metadata.Display.FlipXKey] = value; } [JsonIgnore] public bool FlipXSpecified { get { return FlipX != null; } } /// /// Display width /// [JsonProperty("width", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("width")] public long? Width { get => _internal.ReadLong(Models.Metadata.Display.WidthKey); set => _internal[Models.Metadata.Display.WidthKey] = value; } [JsonIgnore] public bool WidthSpecified { get { return Width != null; } } /// /// Display height /// [JsonProperty("height", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("height")] public long? Height { get => _internal.ReadLong(Models.Metadata.Display.HeightKey); set => _internal[Models.Metadata.Display.HeightKey] = value; } [JsonIgnore] public bool HeightSpecified { get { return Height != null; } } /// /// Refresh rate /// [JsonProperty("refresh", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("refresh")] public double? Refresh { get => _internal.ReadDouble(Models.Metadata.Display.RefreshKey); set => _internal[Models.Metadata.Display.RefreshKey] = value; } [JsonIgnore] public bool RefreshSpecified { get { return Refresh != null; } } /// /// Pixel clock timer /// [JsonProperty("pixclock", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("pixclock")] public long? PixClock { get => _internal.ReadLong(Models.Metadata.Display.PixClockKey); set => _internal[Models.Metadata.Display.PixClockKey] = value; } [JsonIgnore] public bool PixClockSpecified { get { return PixClock != null; } } /// /// Total horizontal lines /// [JsonProperty("htotal", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("htotal")] public long? HTotal { get => _internal.ReadLong(Models.Metadata.Display.HTotalKey); set => _internal[Models.Metadata.Display.HTotalKey] = value; } [JsonIgnore] public bool HTotalSpecified { get { return HTotal != null; } } /// /// Horizontal blank end /// [JsonProperty("hbend", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("hbend")] public long? HBEnd { get => _internal.ReadLong(Models.Metadata.Display.HBEndKey); set => _internal[Models.Metadata.Display.HBEndKey] = value; } [JsonIgnore] public bool HBEndSpecified { get { return HBEnd != null; } } /// /// Horizontal blank start /// [JsonProperty("hbstart", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("hbstart")] public long? HBStart { get => _internal.ReadLong(Models.Metadata.Display.HBStartKey); set => _internal[Models.Metadata.Display.HBStartKey] = value; } [JsonIgnore] public bool HBStartSpecified { get { return HBStart != null; } } /// /// Total vertical lines /// [JsonProperty("vtotal", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("vtotal")] public long? VTotal { get => _internal.ReadLong(Models.Metadata.Display.VTotalKey); set => _internal[Models.Metadata.Display.VTotalKey] = value; } [JsonIgnore] public bool VTotalSpecified { get { return VTotal != null; } } /// /// Vertical blank end /// [JsonProperty("vbend", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("vbend")] public long? VBEnd { get => _internal.ReadLong(Models.Metadata.Display.VBEndKey); set => _internal[Models.Metadata.Display.VBEndKey] = value; } [JsonIgnore] public bool VBEndSpecified { get { return VBEnd != null; } } /// /// Vertical blank start /// [JsonProperty("vbstart", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("vbstart")] public long? VBStart { get => _internal.ReadLong(Models.Metadata.Display.VBStartKey); set => _internal[Models.Metadata.Display.VBStartKey] = value; } [JsonIgnore] public bool VBStartSpecified { get { return VBStart != null; } } #endregion #region Constructors /// /// Create a default, empty Display object /// public Display() { _internal = new Models.Metadata.Display(); Machine = new Machine(); ItemType = ItemType.Display; } #endregion #region Cloning Methods /// public override object Clone() { return new Display() { ItemType = this.ItemType, DupeType = this.DupeType, Machine = this.Machine.Clone() as Machine ?? new Machine(), Source = this.Source?.Clone() as Source, Remove = this.Remove, _internal = this._internal?.Clone() as Models.Metadata.Display ?? [], }; } #endregion #region Manipulation /// public override bool SetField(DatItemField datItemField, string value) { // Get the correct internal field name string? fieldName = datItemField switch { DatItemField.DisplayType => Models.Metadata.Display.DisplayTypeKey, DatItemField.FlipX => Models.Metadata.Display.FlipXKey, DatItemField.HBEnd => Models.Metadata.Display.HBEndKey, DatItemField.HBStart => Models.Metadata.Display.HBStartKey, DatItemField.Height => Models.Metadata.Display.HeightKey, DatItemField.HTotal => Models.Metadata.Display.HTotalKey, DatItemField.PixClock => Models.Metadata.Display.PixClockKey, DatItemField.Refresh => Models.Metadata.Display.RefreshKey, DatItemField.Rotate => Models.Metadata.Display.RotateKey, DatItemField.Tag => Models.Metadata.Display.TagKey, DatItemField.VBEnd => Models.Metadata.Display.VBEndKey, DatItemField.VBStart => Models.Metadata.Display.VBStartKey, DatItemField.VTotal => Models.Metadata.Display.VTotalKey, DatItemField.Width => Models.Metadata.Display.WidthKey, _ => null, }; // Set the field and return return FieldManipulator.SetField(_internal, fieldName, value); } #endregion } }