Fix many issues with SoftwareList-specific functionality

This commit is contained in:
Matt Nadareski
2024-03-12 16:17:05 -04:00
parent fbaddb40d5
commit 1235e72432
4 changed files with 87 additions and 19 deletions

View File

@@ -308,11 +308,14 @@ namespace SabreTools.DatFiles
{ {
var partItem = diskItem.Read<DatItems.Formats.Part>(DatItems.Formats.Disk.PartKey); var partItem = diskItem.Read<DatItems.Formats.Part>(DatItems.Formats.Disk.PartKey);
if (partItem != null) if (partItem != null)
partMappings[partItem.GetInternalClone()] = diskItem; {
var partItemInternal = partItem.GetInternalClone();
partMappings[partItemInternal] = diskItem;
var diskAreaItem = diskItem.Read<DatItems.Formats.DiskArea>(DatItems.Formats.Disk.DiskAreaKey); var diskAreaItem = diskItem.Read<DatItems.Formats.DiskArea>(DatItems.Formats.Disk.DiskAreaKey);
if (diskAreaItem != null) if (diskAreaItem != null)
diskAreaMappings[partItem!.GetInternalClone()] = (diskAreaItem.GetInternalClone(), diskItem); diskAreaMappings[partItemInternal] = (diskAreaItem.GetInternalClone(), diskItem);
}
} }
break; break;
case DatItems.Formats.Display display: case DatItems.Formats.Display display:
@@ -386,11 +389,14 @@ namespace SabreTools.DatFiles
{ {
var partItem = romItem.Read<DatItems.Formats.Part>(DatItems.Formats.Rom.PartKey); var partItem = romItem.Read<DatItems.Formats.Part>(DatItems.Formats.Rom.PartKey);
if (partItem != null) if (partItem != null)
partMappings[partItem.GetInternalClone()] = romItem; {
var partItemInternal = partItem.GetInternalClone();
partMappings[partItemInternal] = romItem;
var dataAreaItem = romItem.Read<DatItems.Formats.DataArea>(DatItems.Formats.Rom.DataAreaKey); var dataAreaItem = romItem.Read<DatItems.Formats.DataArea>(DatItems.Formats.Rom.DataAreaKey);
if (dataAreaItem != null) if (dataAreaItem != null)
dataAreaMappings[partItem!.GetInternalClone()] = (dataAreaItem.GetInternalClone(), romItem); dataAreaMappings[partItemInternal] = (dataAreaItem.GetInternalClone(), romItem);
}
} }
break; break;
case DatItems.Formats.Sample sample: case DatItems.Formats.Sample sample:
@@ -448,12 +454,18 @@ namespace SabreTools.DatFiles
if (!partItems[partName].ContainsKey(Models.Metadata.Part.InterfaceKey)) if (!partItems[partName].ContainsKey(Models.Metadata.Part.InterfaceKey))
partItems[partName][Models.Metadata.Part.InterfaceKey] = partItem.ReadString(Models.Metadata.Part.InterfaceKey); partItems[partName][Models.Metadata.Part.InterfaceKey] = partItem.ReadString(Models.Metadata.Part.InterfaceKey);
// Clear any empty fields
ClearEmptyKeys(partItems[partName]);
// If the item has a DataArea mapping // If the item has a DataArea mapping
if (dataAreaMappings.ContainsKey(partItem)) if (dataAreaMappings.ContainsKey(partItem))
{ {
// Get the mapped items // Get the mapped items
var (dataArea, romItem) = dataAreaMappings[partItem]; var (dataArea, romItem) = dataAreaMappings[partItem];
// Clear any empty fields
ClearEmptyKeys(romItem);
// Get the data area name and skip if there's none // Get the data area name and skip if there's none
string? dataAreaName = dataArea.ReadString(Models.Metadata.DataArea.NameKey); string? dataAreaName = dataArea.ReadString(Models.Metadata.DataArea.NameKey);
if (dataAreaName != null) if (dataAreaName != null)
@@ -465,9 +477,20 @@ namespace SabreTools.DatFiles
int dataAreaIndex = dataAreas.FindIndex(da => da.ReadString(Models.Metadata.DataArea.NameKey) == dataAreaName); int dataAreaIndex = dataAreas.FindIndex(da => da.ReadString(Models.Metadata.DataArea.NameKey) == dataAreaName);
Models.Metadata.DataArea aggregateDataArea; Models.Metadata.DataArea aggregateDataArea;
if (dataAreaIndex > -1) if (dataAreaIndex > -1)
{
aggregateDataArea = dataAreas[dataAreaIndex]; aggregateDataArea = dataAreas[dataAreaIndex];
}
else else
{
aggregateDataArea = []; aggregateDataArea = [];
aggregateDataArea[Models.Metadata.DataArea.EndiannessKey] = dataArea.ReadString(Models.Metadata.DataArea.EndiannessKey);
aggregateDataArea[Models.Metadata.DataArea.NameKey] = dataArea.ReadString(Models.Metadata.DataArea.NameKey);
aggregateDataArea[Models.Metadata.DataArea.SizeKey] = dataArea.ReadString(Models.Metadata.DataArea.SizeKey);
aggregateDataArea[Models.Metadata.DataArea.WidthKey] = dataArea.ReadString(Models.Metadata.DataArea.WidthKey);
}
// Clear any empty fields
ClearEmptyKeys(aggregateDataArea);
// Get existing roms as a list // Get existing roms as a list
var roms = aggregateDataArea.Read<Models.Metadata.Rom[]>(Models.Metadata.DataArea.RomKey)?.ToList() ?? []; var roms = aggregateDataArea.Read<Models.Metadata.Rom[]>(Models.Metadata.DataArea.RomKey)?.ToList() ?? [];
@@ -495,6 +518,9 @@ namespace SabreTools.DatFiles
// Get the mapped items // Get the mapped items
var (diskArea, diskItem) = diskAreaMappings[partItem]; var (diskArea, diskItem) = diskAreaMappings[partItem];
// Clear any empty fields
ClearEmptyKeys(diskItem);
// Get the disk area name and skip if there's none // Get the disk area name and skip if there's none
string? diskAreaName = diskArea.ReadString(Models.Metadata.DiskArea.NameKey); string? diskAreaName = diskArea.ReadString(Models.Metadata.DiskArea.NameKey);
if (diskAreaName != null) if (diskAreaName != null)
@@ -506,18 +532,26 @@ namespace SabreTools.DatFiles
int diskAreaIndex = diskAreas.FindIndex(da => da.ReadString(Models.Metadata.DiskArea.NameKey) == diskAreaName); int diskAreaIndex = diskAreas.FindIndex(da => da.ReadString(Models.Metadata.DiskArea.NameKey) == diskAreaName);
Models.Metadata.DiskArea aggregateDiskArea; Models.Metadata.DiskArea aggregateDiskArea;
if (diskAreaIndex > -1) if (diskAreaIndex > -1)
{
aggregateDiskArea = diskAreas[diskAreaIndex]; aggregateDiskArea = diskAreas[diskAreaIndex];
}
else else
{
aggregateDiskArea = []; aggregateDiskArea = [];
aggregateDiskArea[Models.Metadata.DiskArea.NameKey] = diskArea.ReadString(Models.Metadata.DiskArea.NameKey);
}
// Clear any empty fields
ClearEmptyKeys(aggregateDiskArea);
// Get existing disks as a list // Get existing disks as a list
var roms = aggregateDiskArea.Read<Models.Metadata.Disk[]>(Models.Metadata.DiskArea.DiskKey)?.ToList() ?? []; var disks = aggregateDiskArea.Read<Models.Metadata.Disk[]>(Models.Metadata.DiskArea.DiskKey)?.ToList() ?? [];
// Add the disk to the data area // Add the disk to the data area
roms.Add(diskItem); disks.Add(diskItem);
// Assign back the disks // Assign back the disks
aggregateDiskArea[Models.Metadata.DiskArea.DiskKey] = roms.ToArray(); aggregateDiskArea[Models.Metadata.DiskArea.DiskKey] = disks.ToArray();
// Assign back the disk area // Assign back the disk area
if (diskAreaIndex > -1) if (diskAreaIndex > -1)
@@ -536,19 +570,25 @@ namespace SabreTools.DatFiles
// Get existing dipswitches as a list // Get existing dipswitches as a list
var dipSwitches = partItems[partName].Read<Models.Metadata.DipSwitch[]>(Models.Metadata.Part.DipSwitchKey)?.ToList() ?? []; var dipSwitches = partItems[partName].Read<Models.Metadata.DipSwitch[]>(Models.Metadata.Part.DipSwitchKey)?.ToList() ?? [];
// Clear any empty fields
ClearEmptyKeys(dipSwitchItem);
// Add the dipswitch // Add the dipswitch
dipSwitches.Add(dipSwitchItem); dipSwitches.Add(dipSwitchItem);
// Assign back the dipswitches // Assign back the dipswitches
partItems[partName][Models.Metadata.Part.DipSwitchKey] = dipSwitches.ToArray(); partItems[partName][Models.Metadata.Part.DipSwitchKey] = dipSwitches.ToArray();
} }
// If the item is a Feature // If the item is a Feature
else if (datItem is Models.Metadata.Feature featureItem) else if (datItem is Models.Metadata.Feature featureItem)
{ {
// Get existing features as a list // Get existing features as a list
var features = partItems[partName].Read<Models.Metadata.Feature[]>(Models.Metadata.Part.FeatureKey)?.ToList() ?? []; var features = partItems[partName].Read<Models.Metadata.Feature[]>(Models.Metadata.Part.FeatureKey)?.ToList() ?? [];
// Clear any empty fields
ClearEmptyKeys(featureItem);
// Add the feature // Add the feature
features.Add(featureItem); features.Add(featureItem);
@@ -906,17 +946,35 @@ namespace SabreTools.DatFiles
/// <summary> /// <summary>
/// Append to a machine key as if its an array /// Append to a machine key as if its an array
/// </summary> /// </summary>
private static void AppendToMachineKey<T>(Models.Metadata.Machine machine, string key, T value) private static void AppendToMachineKey<T>(Models.Metadata.Machine machine, string key, T value) where T : Models.Metadata.DatItem
{ {
// Get the existing array
var arr = machine.Read<T[]>(key); var arr = machine.Read<T[]>(key);
if (arr == null) if (arr == null)
return; return;
// Trim all null fields
ClearEmptyKeys(value);
// Add to the array
List<T> list = [.. arr]; List<T> list = [.. arr];
list.Add(value); list.Add(value);
machine[key] = list.ToArray(); machine[key] = list.ToArray();
} }
/// <summary>
/// Clear empty keys from a DictionaryBase object
/// </summary>
private static void ClearEmptyKeys(Models.Metadata.DictionaryBase obj)
{
string[] fieldNames = obj.Keys.ToArray();
foreach (string fieldName in fieldNames)
{
if (obj[fieldName] == null)
obj.Remove(fieldName);
}
}
#endregion #endregion
} }
} }

View File

@@ -155,8 +155,14 @@ namespace SabreTools.DatItems
if (string.IsNullOrEmpty(fieldName) || !_internal.ContainsKey(fieldName!)) if (string.IsNullOrEmpty(fieldName) || !_internal.ContainsKey(fieldName!))
return default; return default;
// Get the value based on the type // Try to parse directly
return _internal.ReadDouble(fieldName!); double? doubleValue = _internal.ReadDouble(fieldName!);
if (doubleValue != null)
return doubleValue;
// Try to parse from the string
string? stringValue = _internal.ReadString(fieldName!);
return NumberHelper.ConvertToDouble(stringValue);
} }
/// <summary> /// <summary>
@@ -170,8 +176,14 @@ namespace SabreTools.DatItems
if (string.IsNullOrEmpty(fieldName) || !_internal.ContainsKey(fieldName!)) if (string.IsNullOrEmpty(fieldName) || !_internal.ContainsKey(fieldName!))
return default; return default;
// Get the value based on the type // Try to parse directly
return _internal.ReadLong(fieldName!); long? longValue = _internal.ReadLong(fieldName!);
if (longValue != null)
return longValue;
// Try to parse from the string
string? stringValue = _internal.ReadString(fieldName!);
return NumberHelper.ConvertToInt64(stringValue);
} }
/// <summary> /// <summary>

View File

@@ -69,7 +69,6 @@ namespace SabreTools.DatItems.Formats
public Disk(Models.Metadata.Disk item) : base(item) public Disk(Models.Metadata.Disk item) : base(item)
{ {
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00); SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<string?>(Models.Metadata.Disk.StatusKey, ItemStatus.None.AsStringValue());
} }
public Disk(BaseFile baseFile) : base() public Disk(BaseFile baseFile) : base()

View File

@@ -110,7 +110,6 @@ namespace SabreTools.DatItems.Formats
public Rom(Models.Metadata.Rom item) : base(item) public Rom(Models.Metadata.Rom item) : base(item)
{ {
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00); SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<string?>(Models.Metadata.Rom.StatusKey, ItemStatus.None.AsStringValue());
} }
#endregion #endregion