Create and use DatItems.FeatureType

This commit is contained in:
Matt Nadareski
2020-09-02 14:04:02 -07:00
parent 3d55e1462b
commit 26bb28afba
14 changed files with 347 additions and 199 deletions

View File

@@ -292,7 +292,7 @@ namespace SabreTools.Library.DatFiles
case "feature":
datItems.Add(new Feature
{
Type = reader.GetAttribute("type"),
Type = reader.GetAttribute("type").AsFeatureType(),
Status = reader.GetAttribute("status"),
Overall = reader.GetAttribute("overall"),
});
@@ -1569,7 +1569,7 @@ namespace SabreTools.Library.DatFiles
case ItemType.Feature:
var feature = datItem as Feature;
xtw.WriteStartElement("feature");
xtw.WriteOptionalAttributeString("type", feature.Type);
xtw.WriteOptionalAttributeString("type", feature.Type.FromFeatureType());
xtw.WriteOptionalAttributeString("status", feature.Status);
xtw.WriteOptionalAttributeString("overall", feature.Overall);
xtw.WriteEndElement();

View File

@@ -1393,7 +1393,7 @@ namespace SabreTools.Library.DatFiles
var feature = datItem as Feature;
xtw.WriteStartElement("file");
xtw.WriteAttributeString("type", "feature");
xtw.WriteOptionalAttributeString("type", feature.Type);
xtw.WriteOptionalAttributeString("type", feature.Type.FromFeatureType());
xtw.WriteOptionalAttributeString("status", feature.Status);
xtw.WriteOptionalAttributeString("overall", feature.Overall);
xtw.WriteEndElement();

View File

@@ -17,6 +17,33 @@ namespace SabreTools.Library.DatItems
External = 1 << 3,
}
/// <summary>
/// Determine the feature type
/// </summary>
[Flags]
public enum FeatureType
{
/// <summary>
/// This is a fake flag that is used for filter only
/// </summary>
NULL = 0,
Protection = 1 << 0,
Palette = 1 << 1,
Graphics = 1 << 2,
Sound = 1 << 3,
Controls = 1 << 4,
Keyboard = 1 << 5,
Mouse = 1 << 6,
Microphone = 1 << 7,
Camera = 1 << 8,
Disk = 1 << 9,
Printer = 1 << 10,
Lan = 1 << 11,
Wan = 1 << 12,
Timing = 1 << 13,
}
/// <summary>
/// List of valid field types within a DatItem/Machine
/// </summary>

View File

@@ -3,6 +3,7 @@ using System.Linq;
using SabreTools.Library.Filtering;
using Newtonsoft.Json;
using SabreTools.Library.Tools;
namespace SabreTools.Library.DatItems
{
@@ -18,7 +19,7 @@ namespace SabreTools.Library.DatItems
/// Type of feature
/// </summary>
[JsonProperty("type")]
public string Type { get; set; } // TODO: (protection|palette|graphics|sound|controls|keyboard|mouse|microphone|camera|disk|printer|lan|wan|timing)
public FeatureType Type { get; set; }
/// <summary>
/// Emulation status
@@ -47,7 +48,7 @@ namespace SabreTools.Library.DatItems
// Handle Feature-specific fields
if (mappings.Keys.Contains(Field.DatItem_FeatureType))
Type = mappings[Field.DatItem_FeatureType];
Type = mappings[Field.DatItem_FeatureType].AsFeatureType();
if (mappings.Keys.Contains(Field.DatItem_FeatureStatus))
Status = mappings[Field.DatItem_FeatureStatus];
@@ -140,9 +141,9 @@ namespace SabreTools.Library.DatItems
return false;
// Filter on type
if (filter.DatItem_FeatureType.MatchesPositiveSet(Type) == false)
if (filter.DatItem_FeatureType.MatchesPositive(FeatureType.NULL, Type) == false)
return false;
if (filter.DatItem_FeatureType.MatchesNegativeSet(Type) == true)
if (filter.DatItem_FeatureType.MatchesNegative(FeatureType.NULL, Type) == true)
return false;
// Filter on status
@@ -171,7 +172,7 @@ namespace SabreTools.Library.DatItems
// Remove the fields
if (fields.Contains(Field.DatItem_FeatureType))
Type = null;
Type = FeatureType.NULL;
if (fields.Contains(Field.DatItem_FeatureStatus))
Status = null;

View File

@@ -295,7 +295,7 @@ namespace SabreTools.Library.Filtering
public FilterItem<bool?> DatItem_Value_Default { get; private set; } = new FilterItem<bool?>() { Neutral = null };
// Feature
public FilterItem<string> DatItem_FeatureType { get; private set; } = new FilterItem<string>();
public FilterItem<FeatureType> DatItem_FeatureType { get; private set; } = new FilterItem<FeatureType>() { Positive = FeatureType.NULL, Negative = FeatureType.NULL };
public FilterItem<string> DatItem_FeatureStatus { get; private set; } = new FilterItem<string>();
public FilterItem<string> DatItem_FeatureOverall { get; private set; } = new FilterItem<string>();
@@ -1700,9 +1700,9 @@ namespace SabreTools.Library.Filtering
// Feature
case Field.DatItem_FeatureType:
if (negate)
DatItem_FeatureType.NegativeSet.Add(value);
DatItem_FeatureType.Negative |= value.AsFeatureType();
else
DatItem_FeatureType.PositiveSet.Add(value);
DatItem_FeatureType.Positive |= value.AsFeatureType();
break;
case Field.DatItem_FeatureStatus:

View File

@@ -145,6 +145,69 @@ namespace SabreTools.Library.Tools
}
}
/// <summary>
/// Get FeatureType value from input string
/// </summary>
/// <param name="featureType">String to get value from</param>
/// <returns>FeatureType value corresponding to the string</returns>
public static FeatureType AsFeatureType(this string featureType)
{
#if NET_FRAMEWORK
switch (featureType?.ToLowerInvariant())
{
case "protection":
return FeatureType.Protection;
case "palette":
return FeatureType.Palette;
case "graphics":
return FeatureType.Graphics;
case "sound":
return FeatureType.Sound;
case "controls":
return FeatureType.Controls;
case "keyboard":
return FeatureType.Keyboard;
case "mouse":
return FeatureType.Mouse;
case "microphone":
return FeatureType.Microphone;
case "camera":
return FeatureType.Camera;
case "disk":
return FeatureType.Disk;
case "printer":
return FeatureType.Printer;
case "lan":
return FeatureType.Lan;
case "wan":
return FeatureType.Wan;
case "timing":
return FeatureType.Timing;
default:
return FeatureType.NULL;
}
#else
return featureType?.ToLowerInvariant() switch
{
"protection" => FeatureType.Protection,
"palette" => FeatureType.Palette,
"graphics" => FeatureType.Graphics,
"sound" => FeatureType.Sound,
"controls" => FeatureType.Controls,
"keyboard" => FeatureType.Keyboard,
"mouse" => FeatureType.Mouse,
"microphone" => FeatureType.Microphone,
"camera" => FeatureType.Camera,
"disk" => FeatureType.Disk,
"printer" => FeatureType.Printer,
"lan" => FeatureType.Lan,
"wan" => FeatureType.Wan,
"timing" => FeatureType.Timing,
_ => FeatureType.NULL,
};
#endif
}
/// <summary>
/// Get Field value from input string
/// </summary>
@@ -1955,6 +2018,69 @@ namespace SabreTools.Library.Tools
// TODO: DatFormat -> string
// TODO: Field -> string
/// <summary>
/// Get string value from input FeatureType
/// </summary>
/// <param name="featureType">FeatureType to get value from</param>
/// <returns>String value corresponding to the FeatureType</returns>
public static string FromFeatureType(this FeatureType featureType)
{
#if NET_FRAMEWORK
switch (featureType)
{
case FeatureType.Protection:
return "protection";
case FeatureType.Palette:
return "palette";
case FeatureType.Graphics:
return "graphics";
case FeatureType.Sound:
return "sound";
case FeatureType.Controls:
return "controls";
case FeatureType.Keyboard:
return "keyboard";
case FeatureType.Mouse:
return "mouse";
case FeatureType.Microphone:
return "microphone";
case FeatureType.Camera:
return "camera";
case FeatureType.Disk:
return "disk";
case FeatureType.Printer:
return "printer";
case FeatureType.Lan:
return "lan";
case FeatureType.Wan:
return "wan";
case FeatureType.Timing:
return "timing";
default:
return null;
}
#else
return featureType switch
{
FeatureType.Protection => "protection",
FeatureType.Palette => "palette",
FeatureType.Graphics => "graphics",
FeatureType.Sound => "sound",
FeatureType.Controls => "controls",
FeatureType.Keyboard => "keyboard",
FeatureType.Mouse => "mouse",
FeatureType.Microphone => "microphone",
FeatureType.Camera => "camera",
FeatureType.Disk => "disk",
FeatureType.Printer => "printer",
FeatureType.Lan => "lan",
FeatureType.Wan => "wan",
FeatureType.Timing => "timing",
_ => null,
};
#endif
}
/// <summary>
/// Get string value from input ItemStatus
/// </summary>