mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
Fix many issues with SoftwareList-specific functionality
This commit is contained in:
@@ -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,6 +570,9 @@ 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);
|
||||||
|
|
||||||
@@ -549,6 +586,9 @@ namespace SabreTools.DatFiles
|
|||||||
// 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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user