From 7f8766b0a4dd0372aae8bbb1eca59e99e039d616 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Fri, 4 Sep 2020 10:28:25 -0700 Subject: [PATCH] Change display rotation to long? --- SabreTools.Library/DatFiles/Listxml.cs | 16 ++++++--- SabreTools.Library/DatFiles/SabreDat.cs | 2 +- SabreTools.Library/DatFiles/SoftwareList.cs | 36 +++++++++++---------- SabreTools.Library/DatItems/Device.cs | 3 +- SabreTools.Library/DatItems/Display.cs | 14 +++++--- SabreTools.Library/DatItems/Rom.cs | 1 + SabreTools.Library/Filtering/Filter.cs | 4 +-- 7 files changed, 46 insertions(+), 30 deletions(-) diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs index 0420673f..07ea5852 100644 --- a/SabreTools.Library/DatFiles/Listxml.cs +++ b/SabreTools.Library/DatFiles/Listxml.cs @@ -357,11 +357,10 @@ namespace SabreTools.Library.DatFiles break; case "display": - datItems.Add(new Display + var display = new Display { Tag = reader.GetAttribute("tag"), DisplayType = reader.GetAttribute("type").AsDisplayType(), - Rotate = reader.GetAttribute("rotate"), FlipX = reader.GetAttribute("flipx").AsYesNo(), Width = reader.GetAttribute("width"), Height = reader.GetAttribute("height"), @@ -379,7 +378,16 @@ namespace SabreTools.Library.DatFiles Index = indexId, Name = filename, }, - }); + }; + + // Set the rotation + if (reader.GetAttribute("rotate") != null) + { + if (Int64.TryParse(reader.GetAttribute("rotate"), out long rotate)) + display.Rotate = rotate; + } + + datItems.Add(display); reader.Read(); break; @@ -1531,7 +1539,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("display"); xtw.WriteOptionalAttributeString("tag", display.Tag); xtw.WriteOptionalAttributeString("type", display.DisplayType.FromDisplayType()); - xtw.WriteOptionalAttributeString("rotate", display.Rotate); + xtw.WriteOptionalAttributeString("rotate", display.Rotate?.ToString()); xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo()); xtw.WriteOptionalAttributeString("width", display.Width); xtw.WriteOptionalAttributeString("height", display.Height); diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs index b04f9e69..fea881bb 100644 --- a/SabreTools.Library/DatFiles/SabreDat.cs +++ b/SabreTools.Library/DatFiles/SabreDat.cs @@ -1437,7 +1437,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteAttributeString("type", "display"); xtw.WriteOptionalAttributeString("tag", display.Tag); xtw.WriteOptionalAttributeString("type", display.DisplayType.FromDisplayType()); - xtw.WriteOptionalAttributeString("rotate", display.Rotate); + xtw.WriteOptionalAttributeString("rotate", display.Rotate?.ToString()); xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo()); xtw.WriteOptionalAttributeString("width", display.Width); xtw.WriteOptionalAttributeString("height", display.Height); diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs index b98d79c1..b39424c0 100644 --- a/SabreTools.Library/DatFiles/SoftwareList.cs +++ b/SabreTools.Library/DatFiles/SoftwareList.cs @@ -359,23 +359,7 @@ namespace SabreTools.Library.DatFiles switch (reader.Name) { case "rom": - // If the rom is continue or ignore, add the size to the previous rom - if (reader.GetAttribute("loadflag") == "continue" || reader.GetAttribute("loadflag") == "ignore") - { - int index = Items[key].Count - 1; - DatItem lastrom = Items[key][index]; - if (lastrom.ItemType == ItemType.Rom) - { - ((Rom)lastrom).Size += Sanitizer.CleanSize(reader.GetAttribute("size")); - } - - Items[key].RemoveAt(index); - Items[key].Add(lastrom); - reader.Read(); - continue; - } - - DatItem rom = new Rom + var rom = new Rom { Name = reader.GetAttribute("name"), Size = Sanitizer.CleanSize(reader.GetAttribute("size")), @@ -389,6 +373,24 @@ namespace SabreTools.Library.DatFiles DataArea = dataArea, }; + // If the rom is continue or ignore, add the size to the previous rom + // TODO: Can this be done on write? We technically lose information this way. + // Order is not guaranteed, and since these don't tend to have any way + // of determining what the "previous" item was after this, that info would + // have to be stored *with* the item somehow + if (rom.LoadFlag == LoadFlag.Continue || rom.LoadFlag == LoadFlag.Ignore) + { + int index = Items[key].Count - 1; + DatItem lastrom = Items[key][index]; + if (lastrom.ItemType == ItemType.Rom) + (lastrom as Rom).Size += rom.Size; + + Items[key].RemoveAt(index); + Items[key].Add(lastrom); + reader.Read(); + continue; + } + items.Add(rom); reader.Read(); break; diff --git a/SabreTools.Library/DatItems/Device.cs b/SabreTools.Library/DatItems/Device.cs index 85e711cb..02f80ed1 100644 --- a/SabreTools.Library/DatItems/Device.cs +++ b/SabreTools.Library/DatItems/Device.cs @@ -35,8 +35,9 @@ namespace SabreTools.Library.DatItems /// /// Determines if the devices is mandatory /// + /// Only value used seems to be 1. Used like bool, but actually int [JsonProperty("mandatory", DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Mandatory { get; set; } // TODO: bool? + public string Mandatory { get; set; } // TODO: long? /// /// Device interface diff --git a/SabreTools.Library/DatItems/Display.cs b/SabreTools.Library/DatItems/Display.cs index e68d62e2..1494bed1 100644 --- a/SabreTools.Library/DatItems/Display.cs +++ b/SabreTools.Library/DatItems/Display.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using SabreTools.Library.Filtering; @@ -33,7 +34,7 @@ namespace SabreTools.Library.DatItems /// Display rotation /// [JsonProperty("rotate", DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Rotate { get; set; } // TODO: (0|90|180|270) Int32? + public long? Rotate { get; set; } /// /// Determines if display is flipped in the X-coordinates @@ -122,7 +123,10 @@ namespace SabreTools.Library.DatItems DisplayType = mappings[Field.DatItem_DisplayType].AsDisplayType(); if (mappings.Keys.Contains(Field.DatItem_Rotate)) - Rotate = mappings[Field.DatItem_Rotate]; + { + if (Int64.TryParse(mappings[Field.DatItem_Rotate], out long rotate)) + Rotate = rotate; + } if (mappings.Keys.Contains(Field.DatItem_FlipX)) FlipX = mappings[Field.DatItem_FlipX].AsYesNo(); @@ -260,9 +264,9 @@ namespace SabreTools.Library.DatItems return false; // Filter on rotation - if (filter.DatItem_Rotate.MatchesPositiveSet(Rotate) == false) + if (filter.DatItem_Rotate.MatchesPositive(null, Rotate) == false) return false; - if (filter.DatItem_Rotate.MatchesNegativeSet(Rotate) == true) + if (filter.DatItem_Rotate.MatchesNegative(null, Rotate) == true) return false; // Filter on flipx diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index 138476c2..dbbcccd0 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -51,6 +51,7 @@ namespace SabreTools.Library.DatItems /// /// Byte size of the rom /// + /// TODO: Can this be made optional instead of concrete long? Use `null` instead of `-1`? [JsonProperty("size", DefaultValueHandling = DefaultValueHandling.Ignore)] public long Size { get; set; } diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index 78e7a374..fd4aa360 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -197,7 +197,7 @@ namespace SabreTools.Library.Filtering // Display public FilterItem DatItem_DisplayType { get; private set; } = new FilterItem() { Positive = DisplayType.NULL, Negative = DisplayType.NULL }; - public FilterItem DatItem_Rotate { get; private set; } = new FilterItem(); + public FilterItem DatItem_Rotate { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null }; public FilterItem DatItem_FlipX { get; private set; } = new FilterItem() { Neutral = null }; public FilterItem DatItem_Width { get; private set; } = new FilterItem(); public FilterItem DatItem_Height { get; private set; } = new FilterItem(); @@ -839,7 +839,7 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_Rotate: - SetStringFilter(DatItem_Rotate, value, negate); + SetOptionalLongFilter(DatItem_Rotate, value, negate); break; case Field.DatItem_FlipX: