From 54e7e4b276ef1c8cf6910a68526f60eab83ff5d7 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 2 Sep 2020 22:44:54 -0700 Subject: [PATCH] Promote SlotOption --- SabreTools.Library/DatFiles/Json.cs | 3 + SabreTools.Library/DatItems/Auxiliary.cs | 29 --- SabreTools.Library/DatItems/DatItem.cs | 4 + SabreTools.Library/DatItems/Enums.cs | 1 + SabreTools.Library/DatItems/SlotOption.cs | 265 ++++++++++++++++++++++ SabreTools.Library/Tools/Converters.cs | 6 + 6 files changed, 279 insertions(+), 29 deletions(-) create mode 100644 SabreTools.Library/DatItems/SlotOption.cs diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index e7a5f11e..1ba292ff 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -289,6 +289,9 @@ namespace SabreTools.Library.DatFiles case ItemType.Slot: datItem = datItemObj.ToObject(); break; + case ItemType.SlotOption: + datItem = datItemObj.ToObject(); + break; case ItemType.SoftwareList: datItem = datItemObj.ToObject(); break; diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index 8a2e5167..32b58c1f 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -100,35 +100,6 @@ namespace SabreTools.Library.DatItems #endregion } - /// - /// Represents one ListXML slotoption - /// - [JsonObject("slotoption")] - public class SlotOption - { - #region Fields - - /// - /// Slot option name - /// - [JsonProperty("name")] - public string Name { get; set; } - - /// - /// Referenced device name - /// - [JsonProperty("devname")] - public string DeviceName { get; set; } - - /// - /// Determines if this slot option is default or not - /// - [JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore)] - public bool? Default { get; set; } - - #endregion - } - #endregion #region OpenMSX diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index cdf10123..5530593b 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -536,6 +536,9 @@ namespace SabreTools.Library.DatItems case ItemType.Slot: return new Slot(); + case ItemType.SlotOption: + return new SlotOption(); + case ItemType.SoftwareList: return new SoftwareList(); @@ -573,6 +576,7 @@ namespace SabreTools.Library.DatItems ItemType.Rom => new Rom(), ItemType.Sample => new Sample(), ItemType.Slot => new Slot(), + ItemType.SlotOption => new SlotOption(), ItemType.SoftwareList => new SoftwareList(), ItemType.Sound => new Sound(), _ => new Rom(), diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index 1597e649..de91ab44 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -499,6 +499,7 @@ namespace SabreTools.Library.DatItems Sample, Setting, Slot, + SlotOption, SoftwareList, Sound, diff --git a/SabreTools.Library/DatItems/SlotOption.cs b/SabreTools.Library/DatItems/SlotOption.cs new file mode 100644 index 00000000..55f23050 --- /dev/null +++ b/SabreTools.Library/DatItems/SlotOption.cs @@ -0,0 +1,265 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using SabreTools.Library.Filtering; +using Newtonsoft.Json; +using SabreTools.Library.Tools; + +namespace SabreTools.Library.DatItems +{ + /// + /// Represents one ListXML slotoption + /// + [JsonObject("slotoption")] + public class SlotOption : DatItem + { + #region Fields + + /// + /// Slot option name + /// + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// Referenced device name + /// + [JsonProperty("devname")] + public string DeviceName { get; set; } + + /// + /// Determines if this slot option is default or not + /// + [JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore)] + public bool? Default { get; set; } + + #endregion + + #region Accessors + + /// + /// Gets the name to use for a DatItem + /// + /// Name if available, null otherwise + public override string GetName() + { + return Name; + } + + /// + /// Set fields with given values + /// + /// Mappings dictionary + public override void SetFields(Dictionary mappings) + { + // Set base fields + base.SetFields(mappings); + + // Handle SlotOption-specific fields + if (mappings.Keys.Contains(Field.DatItem_SlotOption_Name)) + Name = mappings[Field.DatItem_SlotOption_Name]; + + if (mappings.Keys.Contains(Field.DatItem_SlotOption_DeviceName)) + DeviceName = mappings[Field.DatItem_SlotOption_DeviceName]; + + if (mappings.Keys.Contains(Field.DatItem_SlotOption_Default)) + Default = mappings[Field.DatItem_SlotOption_Default].AsYesNo(); + } + + #endregion + + #region Constructors + + /// + /// Create a default, empty SlotOption object + /// + public SlotOption() + { + Name = string.Empty; + ItemType = ItemType.SlotOption; + } + + #endregion + + #region Cloning Methods + + public override object Clone() + { + return new SlotOption() + { + Name = this.Name, + ItemType = this.ItemType, + DupeType = this.DupeType, + + AltName = this.AltName, + AltTitle = this.AltTitle, + + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + + Part = this.Part, + Features = this.Features, + AreaName = this.AreaName, + AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, + Value = this.Value, + LoadFlag = this.LoadFlag, + + Machine = this.Machine.Clone() as Machine, + Source = this.Source.Clone() as Source, + Remove = this.Remove, + + DeviceName = this.DeviceName, + Default = this.Default, + }; + } + + #endregion + + #region Comparision Methods + + public override bool Equals(DatItem other) + { + // If we don't have a SlotOption, return false + if (ItemType != other.ItemType) + return false; + + // Otherwise, treat it as a SlotOption + SlotOption newOther = other as SlotOption; + + // If the SlotOption information matches + return (Name == newOther.Name + && DeviceName == newOther.DeviceName + && Default == newOther.Default); + } + + #endregion + + #region Filtering + + /// + /// Clean a DatItem according to the cleaner + /// + /// Cleaner to implement + public override void Clean(Cleaner cleaner) + { + // Clean common items first + base.Clean(cleaner); + + // If we're stripping unicode characters, strip item name + if (cleaner?.RemoveUnicode == true) + Name = Sanitizer.RemoveUnicodeCharacters(Name); + + // If we are in NTFS trim mode, trim the game name + if (cleaner?.Trim == true) + { + // Windows max name length is 260 + int usableLength = 260 - Machine.Name.Length - (cleaner.Root?.Length ?? 0); + if (Name.Length > usableLength) + { + string ext = Path.GetExtension(Name); + Name = Name.Substring(0, usableLength - ext.Length); + Name += ext; + } + } + } + + /// + /// Check to see if a DatItem passes the filter + /// + /// Filter to check against + /// True if the item passed the filter, false otherwise + public override bool PassesFilter(Filter filter) + { + // Check common fields first + if (!base.PassesFilter(filter)) + return false; + + // Filter on item name + if (filter.DatItem_SlotOption_Name.MatchesPositiveSet(Name) == false) + return false; + if (filter.DatItem_SlotOption_Name.MatchesNegativeSet(Name) == true) + return false; + + // Filter on device name + if (filter.DatItem_SlotOption_DeviceName.MatchesPositiveSet(DeviceName) == false) + return false; + if (filter.DatItem_SlotOption_DeviceName.MatchesNegativeSet(DeviceName) == true) + return false; + + // Filter on default + if (filter.DatItem_SlotOption_Default.MatchesNeutral(null, Default) == false) + return false; + + return true; + } + + /// + /// Remove fields from the DatItem + /// + /// List of Fields to remove + public override void RemoveFields(List fields) + { + // Remove common fields first + base.RemoveFields(fields); + + // Remove the fields + if (fields.Contains(Field.DatItem_SlotOption_Name)) + Name = null; + + if (fields.Contains(Field.DatItem_SlotOption_DeviceName)) + DeviceName = null; + + if (fields.Contains(Field.DatItem_SlotOption_Default)) + Default = null; + } + + /// + /// Set internal names to match One Rom Per Game (ORPG) logic + /// + public override void SetOneRomPerGame() + { + string[] splitname = Name.Split('.'); + Machine.Name += $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1))}"; + Name = Path.GetFileName(Name); + } + + #endregion + + #region Sorting and Merging + + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public override void ReplaceFields(DatItem item, List fields) + { + // Replace common fields first + base.ReplaceFields(item, fields); + + // If we don't have a SlotOption to replace from, ignore specific fields + if (item.ItemType != ItemType.SlotOption) + return; + + // Cast for easier access + SlotOption newItem = item as SlotOption; + + // Replace the fields + if (fields.Contains(Field.DatItem_SlotOption_Name)) + Name = newItem.Name; + + if (fields.Contains(Field.DatItem_SlotOption_DeviceName)) + DeviceName = newItem.DeviceName; + + if (fields.Contains(Field.DatItem_SlotOption_Default)) + Default = newItem.Default; + } + + #endregion + } +} diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index e917b1b9..0de9aa80 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -1693,6 +1693,8 @@ namespace SabreTools.Library.Tools return ItemType.Setting; case "slot": return ItemType.Slot; + case "slotoption": + return ItemType.SlotOption; case "softwarelist": return ItemType.SoftwareList; case "sound": @@ -1730,6 +1732,7 @@ namespace SabreTools.Library.Tools "sample" => ItemType.Sample, "setting" => ItemType.Setting, "slot" => ItemType.Slot, + "slotoption" => ItemType.SlotOption, "softwarelist" => ItemType.SoftwareList, "sound" => ItemType.Sound, _ => null, @@ -2328,6 +2331,8 @@ namespace SabreTools.Library.Tools return "setting"; case ItemType.Slot: return "slot"; + case ItemType.SlotOption: + return "slotoption"; case ItemType.SoftwareList: return "softwarelist"; case ItemType.Sound: @@ -2365,6 +2370,7 @@ namespace SabreTools.Library.Tools ItemType.Sample => "sample", ItemType.Setting => "setting", ItemType.Slot => "slot", + ItemType.SlotOption => "slotoption", ItemType.SoftwareList => "softwarelist", ItemType.Sound => "sound", _ => null,