2016-10-26 21:02:01 -07:00
using System ;
2017-01-11 17:27:25 -08:00
using System.Collections.Generic ;
2020-08-20 14:36:36 -07:00
2019-01-08 17:40:28 -08:00
using SabreTools.Library.Data ;
using SabreTools.Library.DatItems ;
2020-07-15 09:41:59 -07:00
using SabreTools.Library.Tools ;
2016-10-26 21:02:01 -07:00
2020-07-30 22:51:33 -07:00
namespace SabreTools.Library.Filtering
2016-10-26 21:02:01 -07:00
{
2019-01-08 17:40:28 -08:00
/// <summary>
/// Represents the filtering operations that need to be performed on a set of items, usually a DAT
/// </summary>
2020-07-18 21:35:17 -07:00
/// TODO: Can clever use of Filtering allow for easier external splitting methods?
2019-01-11 13:44:29 -08:00
public class Filter
2019-01-08 17:40:28 -08:00
{
2020-08-20 14:36:36 -07:00
#region Fields
2019-01-08 17:40:28 -08:00
2020-07-15 09:41:59 -07:00
#region Machine Filters
2020-08-20 14:36:36 -07:00
#region Common
2020-08-25 14:11:00 -07:00
public FilterItem < string > Machine_Name { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Comment { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Description { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Year { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Manufacturer { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Publisher { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Category { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_RomOf { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_CloneOf { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_SampleOf { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-31 15:33:05 -07:00
public FilterItem < MachineType > Machine_Type { get ; private set ; } = new FilterItem < MachineType > ( ) { Positive = 0x0 , Negative = 0x0 } ;
2020-07-18 21:35:17 -07:00
2020-08-20 14:36:36 -07:00
#endregion
#region AttractMode
2020-08-25 14:11:00 -07:00
public FilterItem < string > Machine_Players { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Rotation { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Control { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Status { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_DisplayCount { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_DisplayType { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Buttons { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-20 14:36:36 -07:00
#endregion
#region ListXML
2020-08-25 14:11:00 -07:00
public FilterItem < string > Machine_SourceFile { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < Runnable > Machine_Runnable { get ; private set ; } = new FilterItem < Runnable > ( ) { Positive = Runnable . NULL , Negative = Runnable . NULL } ;
2020-07-15 09:41:59 -07:00
#endregion
2020-08-20 14:36:36 -07:00
#region Logiqx
2020-08-25 14:11:00 -07:00
public FilterItem < string > Machine_Board { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_RebuildTo { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-20 14:36:36 -07:00
#endregion
2020-08-20 22:42:04 -07:00
#region Logiqx EmuArc
2020-08-25 14:11:00 -07:00
public FilterItem < string > Machine_TitleID { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Developer { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Genre { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Subgenre { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Ratings { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Score { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Enabled { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < bool? > Machine_CRC { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
public FilterItem < string > Machine_RelatedTo { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-20 22:42:04 -07:00
#endregion
2020-08-21 17:27:11 -07:00
#region OpenMSX
2020-08-25 14:11:00 -07:00
public FilterItem < string > Machine_GenMSXID { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_System { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > Machine_Country { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-21 17:27:11 -07:00
#endregion
2020-08-20 14:36:36 -07:00
#region SoftwareList
2020-08-25 14:11:00 -07:00
public FilterItem < Supported > Machine_Supported { get ; private set ; } = new FilterItem < Supported > ( ) { Positive = Supported . NULL , Negative = Supported . NULL } ;
2020-08-20 14:36:36 -07:00
#endregion
#endregion // Machine Filters
2020-07-15 09:41:59 -07:00
#region DatItem Filters
2020-08-20 21:15:37 -07:00
#region Common
2020-08-25 14:24:34 -07:00
public FilterItem < string > DatItem_Type { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
2020-08-20 21:15:37 -07:00
#endregion
2020-08-25 14:24:34 -07:00
#region Item - Specific
2019-01-08 17:40:28 -08:00
2020-08-31 23:01:51 -07:00
#region Actionable
2020-08-25 14:24:34 -07:00
// Rom
2020-09-03 14:22:15 -07:00
public FilterItem < string > DatItem_Name { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-25 14:24:34 -07:00
public FilterItem < string > DatItem_Bios { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < long > DatItem_Size { get ; private set ; } = new FilterItem < long > ( ) { Positive = - 1 , Negative = - 1 , Neutral = - 1 } ;
public FilterItem < string > DatItem_CRC { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-31 23:01:51 -07:00
public FilterItem < string > DatItem_MD5 { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-27 16:57:22 -07:00
#if NET_FRAMEWORK
public FilterItem < string > DatItem_RIPEMD160 { get ; private set ; } = new FilterItem < string > ( ) ;
#endif
2020-08-31 23:01:51 -07:00
public FilterItem < string > DatItem_SHA1 { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_SHA256 { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-27 16:57:22 -07:00
public FilterItem < string > DatItem_SHA384 { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_SHA512 { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-31 23:01:51 -07:00
public FilterItem < string > DatItem_Merge { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Region { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-25 14:24:34 -07:00
public FilterItem < string > DatItem_Offset { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-31 23:01:51 -07:00
public FilterItem < string > DatItem_Date { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < ItemStatus > DatItem_Status { get ; private set ; } = new FilterItem < ItemStatus > ( ) { Positive = ItemStatus . NULL , Negative = ItemStatus . NULL } ;
public FilterItem < bool? > DatItem_Optional { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-08-25 14:24:34 -07:00
public FilterItem < bool? > DatItem_Inverted { get ; private set ; } = new FilterItem < bool? > ( ) ;
2020-06-05 22:26:44 -07:00
2020-09-03 14:22:15 -07:00
// Rom (AttractMode)
public FilterItem < string > DatItem_AltName { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_AltTitle { get ; private set ; } = new FilterItem < string > ( ) ;
// Rom (OpenMSX)
public FilterItem < string > DatItem_Original { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < OpenMSXSubType > DatItem_OpenMSXSubType { get ; private set ; } = new FilterItem < OpenMSXSubType > ( ) { Positive = OpenMSXSubType . NULL , Negative = OpenMSXSubType . NULL } ;
public FilterItem < string > DatItem_OpenMSXType { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Remark { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Boot { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-03 11:48:30 -07:00
// Rom (SoftwareList)
public FilterItem < string > DatItem_AreaName { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < long? > DatItem_AreaSize { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < string > DatItem_AreaWidth { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-03 21:39:16 -07:00
public FilterItem < Endianness > DatItem_AreaEndianness { get ; private set ; } = new FilterItem < Endianness > ( ) { Positive = Endianness . NULL , Negative = Endianness . NULL } ;
2020-09-03 21:32:00 -07:00
public FilterItem < LoadFlag > DatItem_LoadFlag { get ; private set ; } = new FilterItem < LoadFlag > ( ) { Positive = LoadFlag . NULL , Negative = LoadFlag . NULL } ;
2020-09-03 14:22:15 -07:00
public FilterItem < string > DatItem_Part_Name { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Part_Interface { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Part_Feature_Name { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Part_Feature_Value { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-03 11:48:30 -07:00
public FilterItem < string > DatItem_Value { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-31 23:01:51 -07:00
// Disk
public FilterItem < string > DatItem_Index { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < bool? > DatItem_Writable { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-08-25 14:24:34 -07:00
#endregion
2020-07-28 17:00:19 -07:00
2020-08-31 23:01:51 -07:00
#region Auxiliary
2020-09-01 11:34:52 -07:00
// Adjuster
2020-09-03 14:22:15 -07:00
public FilterItem < bool? > DatItem_Default { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-09-01 11:34:52 -07:00
2020-09-02 16:31:23 -07:00
// Analog
2020-09-03 14:22:15 -07:00
public FilterItem < string > DatItem_Analog_Mask { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-02 16:31:23 -07:00
2020-08-31 23:01:51 -07:00
// BiosSet
public FilterItem < string > DatItem_Description { get ; private set ; } = new FilterItem < string > ( ) ;
// Chip
public FilterItem < string > DatItem_Tag { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-02 14:32:16 -07:00
public FilterItem < ChipType > DatItem_ChipType { get ; private set ; } = new FilterItem < ChipType > ( ) { Positive = ChipType . NULL , Negative = ChipType . NULL } ;
2020-08-31 23:01:51 -07:00
public FilterItem < string > DatItem_Clock { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-02 16:31:23 -07:00
// Condition
2020-09-03 14:22:15 -07:00
public FilterItem < string > DatItem_Mask { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-03 21:59:53 -07:00
public FilterItem < Relation > DatItem_Relation { get ; private set ; } = new FilterItem < Relation > ( ) { Positive = Relation . NULL , Negative = Relation . NULL } ;
2020-09-03 14:22:15 -07:00
public FilterItem < string > DatItem_Condition_Tag { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Condition_Mask { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-03 21:59:53 -07:00
public FilterItem < Relation > DatItem_Condition_Relation { get ; private set ; } = new FilterItem < Relation > ( ) { Positive = Relation . NULL , Negative = Relation . NULL } ;
2020-09-03 14:22:15 -07:00
public FilterItem < string > DatItem_Condition_Value { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-01 11:55:11 -07:00
2020-09-03 14:22:15 -07:00
// Control
public FilterItem < string > DatItem_Control_Type { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_Player { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_Buttons { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_RegButtons { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_Minimum { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_Maximum { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_Sensitivity { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_KeyDelta { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < bool? > DatItem_Control_Reverse { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
public FilterItem < string > DatItem_Control_Ways { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_Ways2 { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Control_Ways3 { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-01 11:55:11 -07:00
2020-09-02 17:09:19 -07:00
// Device
public FilterItem < string > DatItem_DeviceType { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_FixedImage { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Mandatory { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Interface { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-02 21:36:14 -07:00
// Display
2020-09-03 21:32:00 -07:00
public FilterItem < DisplayType > DatItem_DisplayType { get ; private set ; } = new FilterItem < DisplayType > ( ) { Positive = DisplayType . NULL , Negative = DisplayType . NULL } ;
2020-09-02 21:36:14 -07:00
public FilterItem < string > DatItem_Rotate { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < bool? > DatItem_FlipX { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
public FilterItem < string > DatItem_Width { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Height { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Refresh { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_PixClock { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_HTotal { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_HBEnd { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_HBStart { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_VTotal { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_VBEnd { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_VBStart { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-02 15:38:10 -07:00
// Driver
public FilterItem < SupportStatus > DatItem_SupportStatus { get ; private set ; } = new FilterItem < SupportStatus > ( ) { Positive = SupportStatus . NULL , Negative = SupportStatus . NULL } ;
public FilterItem < SupportStatus > DatItem_EmulationStatus { get ; private set ; } = new FilterItem < SupportStatus > ( ) { Positive = SupportStatus . NULL , Negative = SupportStatus . NULL } ;
public FilterItem < SupportStatus > DatItem_CocktailStatus { get ; private set ; } = new FilterItem < SupportStatus > ( ) { Positive = SupportStatus . NULL , Negative = SupportStatus . NULL } ;
public FilterItem < Supported > DatItem_SaveStateStatus { get ; private set ; } = new FilterItem < Supported > ( ) { Positive = Supported . NULL , Negative = Supported . NULL } ;
2020-09-03 14:22:15 -07:00
// Extension
public FilterItem < string > DatItem_Extension_Name { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-02 13:31:50 -07:00
// Feature
2020-09-02 14:04:02 -07:00
public FilterItem < FeatureType > DatItem_FeatureType { get ; private set ; } = new FilterItem < FeatureType > ( ) { Positive = FeatureType . NULL , Negative = FeatureType . NULL } ;
2020-09-02 14:34:41 -07:00
public FilterItem < FeatureStatus > DatItem_FeatureStatus { get ; private set ; } = new FilterItem < FeatureStatus > ( ) { Positive = FeatureStatus . NULL , Negative = FeatureStatus . NULL } ;
public FilterItem < FeatureStatus > DatItem_FeatureOverall { get ; private set ; } = new FilterItem < FeatureStatus > ( ) { Positive = FeatureStatus . NULL , Negative = FeatureStatus . NULL } ;
2020-09-02 13:31:50 -07:00
2020-09-02 21:59:26 -07:00
// Input
public FilterItem < bool? > DatItem_Service { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
public FilterItem < bool? > DatItem_Tilt { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-09-03 22:28:48 -07:00
public FilterItem < long? > DatItem_Players { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_Coins { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-02 21:59:26 -07:00
2020-09-03 14:22:15 -07:00
// Instance
public FilterItem < string > DatItem_Instance_Name { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Instance_BriefName { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-02 21:59:26 -07:00
2020-09-03 14:22:15 -07:00
// Location
public FilterItem < string > DatItem_Location_Name { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Location_Number { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < bool? > DatItem_Location_Inverted { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-09-02 17:22:31 -07:00
2020-09-03 14:22:15 -07:00
// RamOption
2020-09-01 11:34:52 -07:00
public FilterItem < string > DatItem_Content { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-31 23:01:51 -07:00
// Release
public FilterItem < string > DatItem_Language { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-03 14:22:15 -07:00
// Setting
public FilterItem < string > DatItem_Setting_Name { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Setting_Value { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < bool? > DatItem_Setting_Default { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
// SlotOption
2020-09-01 16:21:55 -07:00
public FilterItem < string > DatItem_SlotOption_Name { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_SlotOption_DeviceName { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < bool? > DatItem_SlotOption_Default { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-09-03 14:22:15 -07:00
// SoftwareList
2020-08-31 23:26:07 -07:00
public FilterItem < SoftwareListStatus > DatItem_SoftwareListStatus { get ; private set ; } = new FilterItem < SoftwareListStatus > ( ) { Positive = SoftwareListStatus . NULL , Negative = SoftwareListStatus . NULL } ;
public FilterItem < string > DatItem_Filter { get ; private set ; } = new FilterItem < string > ( ) ;
2020-09-02 12:51:21 -07:00
// Sound
public FilterItem < string > DatItem_Channels { get ; private set ; } = new FilterItem < string > ( ) ;
2020-08-31 23:01:51 -07:00
#endregion
#endregion // Item-Specific
2020-08-20 21:15:37 -07:00
#endregion // DatItem Filters
2020-07-15 09:41:59 -07:00
2020-08-28 13:33:05 -07:00
#region Additional Flags
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include romof and cloneof when filtering machine names
/// </summary>
public bool IncludeOfInGame { get ; set ; }
2019-01-11 13:43:59 -08:00
2020-07-15 09:41:59 -07:00
#endregion
2020-08-20 14:36:36 -07:00
#endregion // Fields
2019-01-08 17:40:28 -08:00
#region Instance methods
2020-07-18 21:35:17 -07:00
#region Filter Population
/// <summary>
/// Populate the filters object using a set of key:value filters
/// </summary>
/// <param name="filters">List of key:value where ~key/!key is negated</param>
public void PopulateFromList ( List < string > filters )
{
foreach ( string filterPair in filters )
{
2020-07-22 10:05:35 -07:00
// If we don't even have a possible filter pair
if ( ! filterPair . Contains ( ":" ) )
{
Globals . Logger . Warning ( $"'{filterPair}` is not a valid filter string. Valid filter strings are of the form 'key:value'. Please refer to README.1ST or the help feature for more details." ) ;
continue ;
}
2020-07-18 21:35:17 -07:00
string filterPairTrimmed = filterPair . Trim ( '"' , ' ' , '\t' ) ;
bool negate = filterPairTrimmed . StartsWith ( "!" )
| | filterPairTrimmed . StartsWith ( "~" )
| | filterPairTrimmed . StartsWith ( "not-" ) ;
filterPairTrimmed = filterPairTrimmed . TrimStart ( '!' , '~' ) ;
filterPairTrimmed = filterPairTrimmed . StartsWith ( "not-" ) ? filterPairTrimmed . Substring ( 4 ) : filterPairTrimmed ;
string filterFieldString = filterPairTrimmed . Split ( ':' ) [ 0 ] . ToLowerInvariant ( ) . Trim ( '"' , ' ' , '\t' ) ;
string filterValue = filterPairTrimmed . Substring ( filterFieldString . Length + 1 ) . Trim ( '"' , ' ' , '\t' ) ;
Field filterField = filterFieldString . AsField ( ) ;
SetFilter ( filterField , filterValue , negate ) ;
}
}
/// <summary>
/// Set multiple filters from key
/// </summary>
/// <param name="key">Key for the filter to be set</param>
/// <param name="values">List of values for the filter</param>
/// <param name="negate">True if negative filter, false otherwise</param>
public void SetFilter ( Field key , List < string > values , bool negate )
{
foreach ( string value in values )
{
SetFilter ( key , value , negate ) ;
}
}
/// <summary>
/// Set a single filter from key
/// </summary>
/// <param name="key">Key for the filter to be set</param>
/// <param name="value">Value of the filter</param>
/// <param name="negate">True if negative filter, false otherwise</param>
public void SetFilter ( Field key , string value , bool negate )
{
switch ( key )
{
#region Machine Filters
2020-08-20 14:36:36 -07:00
#region Common
2020-08-24 22:25:47 -07:00
case Field . Machine_Name :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Name . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Name . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Comment :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Comment . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Comment . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Description :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Description . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Description . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Year :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Year . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Year . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Manufacturer :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Manufacturer . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Manufacturer . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Publisher :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Publisher . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Publisher . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Category :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Category . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Category . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_RomOf :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_RomOf . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_RomOf . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_CloneOf :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_CloneOf . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_CloneOf . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_SampleOf :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_SampleOf . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_SampleOf . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Type :
2020-08-20 15:39:32 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Type . Negative | = value . AsMachineType ( ) ;
2020-08-20 15:39:32 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Type . Positive | = value . AsMachineType ( ) ;
2020-08-20 15:39:32 -07:00
break ;
2020-08-20 14:36:36 -07:00
#endregion
#region AttractMode
2020-08-24 22:25:47 -07:00
case Field . Machine_Players :
2020-08-20 14:36:36 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Players . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Players . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Rotation :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Rotation . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Rotation . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Control :
2020-08-20 14:36:36 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Control . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Control . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-25 11:20:50 -07:00
case Field . Machine_Status :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Status . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Status . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_DisplayCount :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_DisplayCount . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_DisplayCount . PositiveSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_DisplayType :
2020-08-20 14:36:36 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_DisplayType . NegativeSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_DisplayType . PositiveSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Buttons :
2020-08-20 14:36:36 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Buttons . NegativeSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Buttons . PositiveSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
break ;
#endregion
#region ListXML
2020-08-24 22:25:47 -07:00
case Field . Machine_SourceFile :
2020-08-20 14:36:36 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_SourceFile . NegativeSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_SourceFile . PositiveSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Runnable :
2020-08-23 15:34:42 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Runnable . Negative | = value . AsRunnable ( ) ;
2020-07-26 23:39:33 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Runnable . Positive | = value . AsRunnable ( ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-08-25 14:53:51 -07:00
2020-07-18 21:35:17 -07:00
#endregion
2020-08-20 14:36:36 -07:00
#region Logiqx
2020-08-24 22:25:47 -07:00
case Field . Machine_Board :
2020-08-20 14:36:36 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Board . NegativeSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Board . PositiveSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_RebuildTo :
2020-08-20 14:36:36 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_RebuildTo . NegativeSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_RebuildTo . PositiveSet . Add ( value ) ;
2020-08-20 14:36:36 -07:00
break ;
#endregion
2020-08-20 22:42:04 -07:00
#region Logiqx EmuArc
2020-08-24 22:25:47 -07:00
case Field . Machine_TitleID :
2020-08-20 22:42:04 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_TitleID . NegativeSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_TitleID . PositiveSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Developer :
2020-08-20 22:42:04 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Developer . NegativeSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Developer . PositiveSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Genre :
2020-08-20 22:42:04 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Genre . NegativeSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Genre . PositiveSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Subgenre :
2020-08-20 22:42:04 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Subgenre . NegativeSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Subgenre . PositiveSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Ratings :
2020-08-20 22:42:04 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Ratings . NegativeSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Ratings . PositiveSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Score :
2020-08-20 22:42:04 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Score . NegativeSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Score . PositiveSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Enabled :
2020-08-20 22:42:04 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Enabled . NegativeSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Enabled . PositiveSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-25 12:15:28 -07:00
case Field . Machine_CRC :
2020-08-20 22:42:04 -07:00
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
2020-08-25 14:11:00 -07:00
Machine_CRC . Neutral = false ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_CRC . Neutral = true ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_RelatedTo :
2020-08-20 22:42:04 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_RelatedTo . NegativeSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_RelatedTo . PositiveSet . Add ( value ) ;
2020-08-20 22:42:04 -07:00
break ;
#endregion
2020-08-21 17:27:11 -07:00
#region OpenMSX
2020-08-24 22:25:47 -07:00
case Field . Machine_GenMSXID :
2020-08-21 17:27:11 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_GenMSXID . NegativeSet . Add ( value ) ;
2020-08-21 17:27:11 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_GenMSXID . PositiveSet . Add ( value ) ;
2020-08-21 17:27:11 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_System :
2020-08-21 17:27:11 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_System . NegativeSet . Add ( value ) ;
2020-08-21 17:27:11 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_System . PositiveSet . Add ( value ) ;
2020-08-21 17:27:11 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Country :
2020-08-21 17:27:11 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Country . NegativeSet . Add ( value ) ;
2020-08-21 17:27:11 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Country . PositiveSet . Add ( value ) ;
2020-08-21 17:27:11 -07:00
break ;
#endregion
2020-08-20 14:36:36 -07:00
#region SoftwareList
2020-08-24 22:25:47 -07:00
case Field . Machine_Supported :
2020-08-22 13:31:13 -07:00
if ( negate )
2020-08-25 14:11:00 -07:00
Machine_Supported . Negative | = value . AsSupported ( ) ;
2020-08-20 14:36:36 -07:00
else
2020-08-25 14:11:00 -07:00
Machine_Supported . Positive | = value . AsSupported ( ) ;
2020-08-20 14:36:36 -07:00
break ;
#endregion
#endregion // Machine Filters
2020-07-18 21:35:17 -07:00
#region DatItem Filters
2020-08-20 21:15:37 -07:00
#region Common
2020-08-24 22:25:47 -07:00
case Field . DatItem_Type :
2020-07-18 21:35:17 -07:00
if ( value . AsItemType ( ) = = null )
return ;
if ( negate )
2020-08-25 14:24:34 -07:00
DatItem_Type . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-25 14:24:34 -07:00
DatItem_Type . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-20 21:15:37 -07:00
#endregion
2020-09-03 14:22:15 -07:00
#region Item - Specific
2020-08-20 21:15:37 -07:00
2020-09-03 14:22:15 -07:00
#region Actionable
// Rom
case Field . DatItem_Name :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Name . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Name . PositiveSet . Add ( value ) ;
2020-08-20 21:15:37 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Bios :
2020-08-20 21:15:37 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Bios . NegativeSet . Add ( value ) ;
2020-08-20 21:15:37 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Bios . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Size :
2020-09-03 22:28:48 -07:00
bool? sizeOperation = null ;
2020-09-03 14:22:15 -07:00
if ( value . StartsWith ( ">" ) )
2020-09-03 22:28:48 -07:00
sizeOperation = true ;
2020-09-03 14:22:15 -07:00
else if ( value . StartsWith ( "<" ) )
2020-09-03 22:28:48 -07:00
sizeOperation = false ;
2020-09-03 14:22:15 -07:00
else if ( value . StartsWith ( "=" ) )
2020-09-03 22:28:48 -07:00
sizeOperation = null ;
2020-08-20 21:15:37 -07:00
2020-09-03 14:22:15 -07:00
string sizeString = value . TrimStart ( '>' , '<' , '=' ) ;
if ( ! Int64 . TryParse ( sizeString , out long size ) )
return ;
2020-08-21 23:48:35 -07:00
2020-09-03 14:22:15 -07:00
// Equal
2020-09-03 22:28:48 -07:00
if ( sizeOperation = = null & & ! negate )
2020-09-03 14:22:15 -07:00
{
DatItem_Size . Neutral = size ;
}
// Not Equal
2020-09-03 22:28:48 -07:00
else if ( sizeOperation = = null & & negate )
2020-09-03 14:22:15 -07:00
{
DatItem_Size . Negative = size - 1 ;
DatItem_Size . Positive = size + 1 ;
}
// Greater Than or Equal
2020-09-03 22:28:48 -07:00
else if ( sizeOperation = = true & & ! negate )
2020-09-03 14:22:15 -07:00
{
DatItem_Size . Positive = size ;
}
// Strictly Less Than
2020-09-03 22:28:48 -07:00
else if ( sizeOperation = = true & & negate )
2020-09-03 14:22:15 -07:00
{
DatItem_Size . Negative = size - 1 ;
}
// Less Than or Equal
2020-09-03 22:28:48 -07:00
else if ( sizeOperation = = false & & ! negate )
2020-09-03 14:22:15 -07:00
{
DatItem_Size . Negative = size ;
}
// Strictly Greater Than
2020-09-03 22:28:48 -07:00
else if ( sizeOperation = = false & & negate )
2020-09-03 14:22:15 -07:00
{
DatItem_Size . Positive = size + 1 ;
}
break ;
case Field . DatItem_CRC :
2020-08-21 23:48:35 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_CRC . NegativeSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_CRC . PositiveSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_MD5 :
2020-08-21 23:48:35 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_MD5 . NegativeSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_MD5 . PositiveSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
break ;
2020-09-03 14:22:15 -07:00
#if NET_FRAMEWORK
case Field . DatItem_RIPEMD160 :
2020-08-21 23:48:35 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_RIPEMD160 . NegativeSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_RIPEMD160 . PositiveSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
break ;
2020-09-03 14:22:15 -07:00
#endif
2020-08-21 23:48:35 -07:00
2020-09-03 14:22:15 -07:00
case Field . DatItem_SHA1 :
2020-08-21 23:48:35 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_SHA1 . NegativeSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_SHA1 . PositiveSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_SHA256 :
2020-08-21 23:48:35 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_SHA256 . NegativeSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_SHA256 . PositiveSet . Add ( value ) ;
2020-08-21 23:48:35 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_SHA384 :
if ( negate )
DatItem_SHA384 . NegativeSet . Add ( value ) ;
2020-08-25 14:53:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_SHA384 . PositiveSet . Add ( value ) ;
2020-08-25 14:53:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_SHA512 :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_SHA512 . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_SHA512 . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Merge :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Merge . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Merge . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Region :
if ( negate )
DatItem_Region . NegativeSet . Add ( value ) ;
2020-08-25 14:53:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Region . PositiveSet . Add ( value ) ;
2020-08-25 14:53:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Offset :
2020-08-25 14:53:51 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Offset . NegativeSet . Add ( value ) ;
2020-08-25 14:53:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Offset . PositiveSet . Add ( value ) ;
2020-08-25 14:53:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Date :
2020-08-25 14:53:51 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Date . NegativeSet . Add ( value ) ;
2020-08-25 14:53:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Date . PositiveSet . Add ( value ) ;
2020-08-25 14:53:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Status :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Status . Negative | = value . AsItemStatus ( ) ;
2020-07-18 21:35:17 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Status . Positive | = value . AsItemStatus ( ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Optional :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
DatItem_Optional . Neutral = false ;
else
DatItem_Optional . Neutral = true ;
break ;
2020-07-18 21:35:17 -07:00
2020-09-03 14:22:15 -07:00
case Field . DatItem_Inverted :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
DatItem_Inverted . Neutral = false ;
else
DatItem_Inverted . Neutral = true ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Rom (AttractMode)
case Field . DatItem_AltName :
2020-08-21 13:31:22 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_AltName . NegativeSet . Add ( value ) ;
2020-08-21 13:31:22 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_AltName . PositiveSet . Add ( value ) ;
2020-08-21 13:31:22 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_AltTitle :
2020-08-21 13:31:22 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_AltTitle . NegativeSet . Add ( value ) ;
2020-08-21 13:31:22 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_AltTitle . PositiveSet . Add ( value ) ;
2020-08-21 13:31:22 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Rom (OpenMSX)
case Field . DatItem_Original :
2020-08-21 14:20:17 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Original . NegativeSet . Add ( value ) ;
2020-08-21 14:20:17 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Original . PositiveSet . Add ( value ) ;
2020-08-21 14:20:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_OpenMSXSubType :
2020-08-21 14:20:17 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_OpenMSXSubType . Negative | = value . AsOpenMSXSubType ( ) ;
2020-08-21 14:20:17 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_OpenMSXSubType . Positive | = value . AsOpenMSXSubType ( ) ;
2020-08-21 14:20:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_OpenMSXType :
if ( negate )
DatItem_OpenMSXType . NegativeSet . Add ( value ) ;
else
DatItem_OpenMSXType . PositiveSet . Add ( value ) ;
break ;
2020-08-20 21:15:37 -07:00
2020-09-03 14:22:15 -07:00
case Field . DatItem_Remark :
if ( negate )
DatItem_Remark . NegativeSet . Add ( value ) ;
else
DatItem_Remark . PositiveSet . Add ( value ) ;
break ;
2020-08-25 14:53:51 -07:00
2020-09-03 14:22:15 -07:00
case Field . DatItem_Boot :
if ( negate )
DatItem_Boot . NegativeSet . Add ( value ) ;
else
DatItem_Boot . PositiveSet . Add ( value ) ;
break ;
2020-07-18 21:35:17 -07:00
2020-09-03 14:22:15 -07:00
// Rom (SoftwareList)
case Field . DatItem_AreaName :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_AreaName . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_AreaName . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_AreaSize :
bool? asOperation = null ;
2020-08-25 14:53:51 -07:00
if ( value . StartsWith ( ">" ) )
2020-09-03 14:22:15 -07:00
asOperation = true ;
2020-08-25 14:53:51 -07:00
else if ( value . StartsWith ( "<" ) )
2020-09-03 14:22:15 -07:00
asOperation = false ;
2020-08-25 14:53:51 -07:00
else if ( value . StartsWith ( "=" ) )
2020-09-03 14:22:15 -07:00
asOperation = null ;
2020-08-25 14:53:51 -07:00
2020-09-03 14:22:15 -07:00
string areasizeString = value . TrimStart ( '>' , '<' , '=' ) ;
if ( ! Int64 . TryParse ( areasizeString , out long areasize ) )
2020-08-25 14:53:51 -07:00
return ;
// Equal
2020-09-03 14:22:15 -07:00
if ( asOperation = = null & & ! negate )
2020-08-25 14:53:51 -07:00
{
2020-09-03 14:22:15 -07:00
DatItem_AreaSize . Neutral = areasize ;
2020-08-25 14:53:51 -07:00
}
// Not Equal
2020-09-03 14:22:15 -07:00
else if ( asOperation = = null & & negate )
2020-08-25 14:53:51 -07:00
{
2020-09-03 14:22:15 -07:00
DatItem_AreaSize . Negative = areasize - 1 ;
DatItem_AreaSize . Positive = areasize + 1 ;
2020-08-25 14:53:51 -07:00
}
// Greater Than or Equal
2020-09-03 14:22:15 -07:00
else if ( asOperation = = true & & ! negate )
2020-08-25 14:53:51 -07:00
{
2020-09-03 14:22:15 -07:00
DatItem_AreaSize . Positive = areasize ;
2020-08-25 14:53:51 -07:00
}
// Strictly Less Than
2020-09-03 14:22:15 -07:00
else if ( asOperation = = true & & negate )
2020-08-25 14:53:51 -07:00
{
2020-09-03 14:22:15 -07:00
DatItem_AreaSize . Negative = areasize - 1 ;
2020-08-25 14:53:51 -07:00
}
// Less Than or Equal
2020-09-03 14:22:15 -07:00
else if ( asOperation = = false & & ! negate )
2020-08-25 14:53:51 -07:00
{
2020-09-03 14:22:15 -07:00
DatItem_AreaSize . Negative = areasize ;
2020-08-25 14:53:51 -07:00
}
// Strictly Greater Than
2020-09-03 14:22:15 -07:00
else if ( asOperation = = false & & negate )
2020-08-25 14:53:51 -07:00
{
2020-09-03 14:22:15 -07:00
DatItem_AreaSize . Positive = areasize + 1 ;
2020-08-25 14:53:51 -07:00
}
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_AreaWidth :
2020-08-31 23:01:51 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_AreaWidth . NegativeSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_AreaWidth . PositiveSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_AreaEndianness :
2020-08-27 16:57:22 -07:00
if ( negate )
2020-09-03 21:39:16 -07:00
DatItem_AreaEndianness . Negative | = value . AsEndianness ( ) ;
2020-08-27 16:57:22 -07:00
else
2020-09-03 21:39:16 -07:00
DatItem_AreaEndianness . Positive | = value . AsEndianness ( ) ;
2020-08-27 16:57:22 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_LoadFlag :
2020-08-27 16:57:22 -07:00
if ( negate )
2020-09-03 21:32:00 -07:00
DatItem_LoadFlag . Negative | = value . AsLoadFlag ( ) ;
2020-08-27 16:57:22 -07:00
else
2020-09-03 21:32:00 -07:00
DatItem_LoadFlag . Positive | = value . AsLoadFlag ( ) ;
2020-08-27 16:57:22 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Part_Name :
2020-08-31 23:01:51 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Part_Name . NegativeSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Part_Name . PositiveSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Part_Interface :
2020-08-31 23:01:51 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Part_Interface . NegativeSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Part_Interface . PositiveSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Part_Feature_Name :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Part_Feature_Name . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Part_Feature_Name . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Part_Feature_Value :
2020-08-31 23:01:51 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Part_Feature_Value . NegativeSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Part_Feature_Value . PositiveSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Value :
2020-08-31 23:01:51 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Value . NegativeSet . Add ( value ) ;
2020-07-28 17:00:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Value . PositiveSet . Add ( value ) ;
2020-07-28 17:00:19 -07:00
break ;
2020-08-31 23:01:51 -07:00
// Disk
case Field . DatItem_Index :
if ( negate )
DatItem_Index . NegativeSet . Add ( value ) ;
else
DatItem_Index . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_Writable :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
DatItem_Writable . Neutral = false ;
else
DatItem_Writable . Neutral = true ;
break ;
#endregion
#region Auxiliary
2020-09-01 11:34:52 -07:00
// Adjuster
case Field . DatItem_Default :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
DatItem_Default . Neutral = false ;
else
DatItem_Default . Neutral = true ;
break ;
2020-09-02 16:31:23 -07:00
// Analog
2020-09-03 14:22:15 -07:00
case Field . DatItem_Analog_Mask :
2020-09-02 16:31:23 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Analog_Mask . NegativeSet . Add ( value ) ;
2020-09-02 16:31:23 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Analog_Mask . PositiveSet . Add ( value ) ;
2020-09-02 16:31:23 -07:00
break ;
2020-08-31 23:01:51 -07:00
// BiosSet
case Field . DatItem_Description :
if ( negate )
DatItem_Description . NegativeSet . Add ( value ) ;
else
DatItem_Description . PositiveSet . Add ( value ) ;
break ;
// Chip
case Field . DatItem_Tag :
if ( negate )
DatItem_Tag . NegativeSet . Add ( value ) ;
else
DatItem_Tag . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_ChipType :
if ( negate )
2020-09-02 14:32:16 -07:00
DatItem_ChipType . Negative | = value . AsChipType ( ) ;
2020-08-31 23:01:51 -07:00
else
2020-09-02 14:32:16 -07:00
DatItem_ChipType . Positive | = value . AsChipType ( ) ;
2020-08-31 23:01:51 -07:00
break ;
case Field . DatItem_Clock :
if ( negate )
DatItem_Clock . NegativeSet . Add ( value ) ;
else
DatItem_Clock . PositiveSet . Add ( value ) ;
break ;
2020-09-02 16:31:23 -07:00
// Condition
2020-09-03 14:22:15 -07:00
case Field . DatItem_Mask :
if ( negate )
DatItem_Mask . NegativeSet . Add ( value ) ;
else
DatItem_Mask . PositiveSet . Add ( value ) ;
break ;
2020-09-02 16:31:23 -07:00
case Field . DatItem_Relation :
2020-09-01 11:55:11 -07:00
if ( negate )
2020-09-03 21:59:53 -07:00
DatItem_Relation . Negative | = value . AsRelation ( ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 21:59:53 -07:00
DatItem_Relation . Positive | = value . AsRelation ( ) ;
2020-09-02 16:31:23 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Condition_Tag :
if ( negate )
DatItem_Condition_Tag . NegativeSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Condition_Tag . PositiveSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Condition_Mask :
2020-09-01 11:55:11 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Condition_Mask . NegativeSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Condition_Mask . PositiveSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Condition_Relation :
2020-09-01 11:55:11 -07:00
if ( negate )
2020-09-03 21:59:53 -07:00
DatItem_Condition_Relation . Negative | = value . AsRelation ( ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 21:59:53 -07:00
DatItem_Condition_Relation . Positive | = value . AsRelation ( ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Condition_Value :
if ( negate )
DatItem_Condition_Value . NegativeSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Condition_Value . PositiveSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Control
case Field . DatItem_Control_Type :
if ( negate )
DatItem_Control_Type . NegativeSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Type . PositiveSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Player :
2020-09-01 11:55:11 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_Player . NegativeSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Player . PositiveSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Buttons :
2020-09-01 11:55:11 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_Buttons . NegativeSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Buttons . PositiveSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_RegButtons :
if ( negate )
DatItem_Control_RegButtons . NegativeSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_RegButtons . PositiveSet . Add ( value ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Minimum :
2020-09-02 17:09:19 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_Minimum . NegativeSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Minimum . PositiveSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Maximum :
2020-09-02 17:09:19 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_Maximum . NegativeSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Maximum . PositiveSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Sensitivity :
2020-09-02 17:09:19 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_Sensitivity . NegativeSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Sensitivity . PositiveSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_KeyDelta :
2020-09-02 17:09:19 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_KeyDelta . NegativeSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_KeyDelta . PositiveSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Reverse :
2020-09-02 17:09:19 -07:00
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
2020-09-03 14:22:15 -07:00
DatItem_Control_Reverse . Neutral = false ;
2020-09-02 17:09:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Reverse . Neutral = true ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Ways :
2020-09-02 17:09:19 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_Ways . NegativeSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Ways . PositiveSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Ways2 :
2020-09-02 17:09:19 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_Ways2 . NegativeSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Ways2 . PositiveSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Ways3 :
2020-09-02 17:09:19 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Control_Ways3 . NegativeSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Control_Ways3 . PositiveSet . Add ( value ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Device
case Field . DatItem_DeviceType :
if ( negate )
DatItem_DeviceType . NegativeSet . Add ( value ) ;
2020-09-01 13:36:32 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_DeviceType . PositiveSet . Add ( value ) ;
2020-09-01 13:36:32 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_FixedImage :
2020-09-01 13:36:32 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_FixedImage . NegativeSet . Add ( value ) ;
2020-09-01 13:36:32 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_FixedImage . PositiveSet . Add ( value ) ;
2020-09-01 13:36:32 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Mandatory :
2020-09-01 13:36:32 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Mandatory . NegativeSet . Add ( value ) ;
2020-09-01 13:36:32 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Mandatory . PositiveSet . Add ( value ) ;
2020-09-01 13:36:32 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Interface :
if ( negate )
DatItem_Interface . NegativeSet . Add ( value ) ;
2020-09-01 13:36:32 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Interface . PositiveSet . Add ( value ) ;
2020-09-01 13:36:32 -07:00
break ;
2020-09-02 21:36:14 -07:00
// Display
case Field . DatItem_DisplayType :
if ( negate )
2020-09-03 21:32:00 -07:00
DatItem_DisplayType . Negative | = value . AsDisplayType ( ) ;
2020-09-02 21:36:14 -07:00
else
2020-09-03 21:32:00 -07:00
DatItem_DisplayType . Positive | = value . AsDisplayType ( ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_Rotate :
if ( negate )
DatItem_Rotate . NegativeSet . Add ( value ) ;
else
DatItem_Rotate . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_FlipX :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
DatItem_FlipX . Neutral = false ;
else
DatItem_FlipX . Neutral = true ;
break ;
case Field . DatItem_Width :
if ( negate )
DatItem_Width . NegativeSet . Add ( value ) ;
else
DatItem_Width . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_Height :
if ( negate )
DatItem_Height . NegativeSet . Add ( value ) ;
else
DatItem_Height . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_Refresh :
if ( negate )
DatItem_Refresh . NegativeSet . Add ( value ) ;
else
DatItem_Refresh . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_PixClock :
if ( negate )
DatItem_PixClock . NegativeSet . Add ( value ) ;
else
DatItem_PixClock . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_HTotal :
if ( negate )
DatItem_HTotal . NegativeSet . Add ( value ) ;
else
DatItem_HTotal . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_HBEnd :
if ( negate )
DatItem_HBEnd . NegativeSet . Add ( value ) ;
else
DatItem_HBEnd . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_HBStart :
if ( negate )
DatItem_HBStart . NegativeSet . Add ( value ) ;
else
DatItem_HBStart . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_VTotal :
if ( negate )
DatItem_VTotal . NegativeSet . Add ( value ) ;
else
DatItem_VTotal . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_VBEnd :
if ( negate )
DatItem_VBEnd . NegativeSet . Add ( value ) ;
else
DatItem_VBEnd . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_VBStart :
if ( negate )
DatItem_VBStart . NegativeSet . Add ( value ) ;
else
DatItem_VBStart . PositiveSet . Add ( value ) ;
break ;
2020-09-01 13:36:32 -07:00
2020-09-02 15:38:10 -07:00
// Driver
case Field . DatItem_SupportStatus :
if ( negate )
DatItem_SupportStatus . Negative | = value . AsSupportStatus ( ) ;
else
DatItem_SupportStatus . Positive | = value . AsSupportStatus ( ) ;
break ;
case Field . DatItem_EmulationStatus :
if ( negate )
DatItem_EmulationStatus . Negative | = value . AsSupportStatus ( ) ;
else
DatItem_EmulationStatus . Positive | = value . AsSupportStatus ( ) ;
break ;
case Field . DatItem_CocktailStatus :
if ( negate )
DatItem_CocktailStatus . Negative | = value . AsSupportStatus ( ) ;
else
DatItem_CocktailStatus . Positive | = value . AsSupportStatus ( ) ;
break ;
case Field . DatItem_SaveStateStatus :
if ( negate )
DatItem_SaveStateStatus . Negative | = value . AsSupported ( ) ;
else
DatItem_SaveStateStatus . Positive | = value . AsSupported ( ) ;
break ;
2020-09-03 14:22:15 -07:00
// Extension
case Field . DatItem_Extension_Name :
if ( negate )
DatItem_Extension_Name . NegativeSet . Add ( value ) ;
else
DatItem_Extension_Name . PositiveSet . Add ( value ) ;
break ;
2020-09-02 13:31:50 -07:00
// Feature
case Field . DatItem_FeatureType :
if ( negate )
2020-09-02 14:04:02 -07:00
DatItem_FeatureType . Negative | = value . AsFeatureType ( ) ;
2020-09-02 13:31:50 -07:00
else
2020-09-02 14:04:02 -07:00
DatItem_FeatureType . Positive | = value . AsFeatureType ( ) ;
2020-09-02 13:31:50 -07:00
break ;
case Field . DatItem_FeatureStatus :
if ( negate )
2020-09-02 14:34:41 -07:00
DatItem_FeatureStatus . Negative | = value . AsFeatureStatus ( ) ;
2020-09-02 13:31:50 -07:00
else
2020-09-02 14:34:41 -07:00
DatItem_FeatureStatus . Positive | = value . AsFeatureStatus ( ) ;
2020-09-02 13:31:50 -07:00
break ;
case Field . DatItem_FeatureOverall :
if ( negate )
2020-09-02 14:34:41 -07:00
DatItem_FeatureOverall . Negative | = value . AsFeatureStatus ( ) ;
2020-09-02 13:31:50 -07:00
else
2020-09-02 14:34:41 -07:00
DatItem_FeatureOverall . Positive | = value . AsFeatureStatus ( ) ;
2020-09-02 13:31:50 -07:00
break ;
2020-09-02 21:59:26 -07:00
// Input
case Field . DatItem_Service :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
DatItem_Service . Neutral = false ;
else
DatItem_Service . Neutral = true ;
break ;
case Field . DatItem_Tilt :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
DatItem_Tilt . Neutral = false ;
else
DatItem_Tilt . Neutral = true ;
break ;
case Field . DatItem_Players :
2020-09-03 22:28:48 -07:00
bool? playersOperation = null ;
if ( value . StartsWith ( ">" ) )
playersOperation = true ;
else if ( value . StartsWith ( "<" ) )
playersOperation = false ;
else if ( value . StartsWith ( "=" ) )
playersOperation = null ;
string playersString = value . TrimStart ( '>' , '<' , '=' ) ;
if ( ! Int64 . TryParse ( playersString , out long players ) )
return ;
// Equal
if ( playersOperation = = null & & ! negate )
{
DatItem_Players . Neutral = players ;
}
// Not Equal
else if ( playersOperation = = null & & negate )
{
DatItem_Players . Negative = players - 1 ;
DatItem_Players . Positive = players + 1 ;
}
// Greater Than or Equal
else if ( playersOperation = = true & & ! negate )
{
DatItem_Players . Positive = players ;
}
// Strictly Less Than
else if ( playersOperation = = true & & negate )
{
DatItem_Players . Negative = players - 1 ;
}
// Less Than or Equal
else if ( playersOperation = = false & & ! negate )
{
DatItem_Players . Negative = players ;
}
// Strictly Greater Than
else if ( playersOperation = = false & & negate )
{
DatItem_Players . Positive = players + 1 ;
}
2020-09-02 21:59:26 -07:00
break ;
case Field . DatItem_Coins :
2020-09-03 22:28:48 -07:00
bool? coinsOperation = null ;
if ( value . StartsWith ( ">" ) )
coinsOperation = true ;
else if ( value . StartsWith ( "<" ) )
coinsOperation = false ;
else if ( value . StartsWith ( "=" ) )
coinsOperation = null ;
string coinsString = value . TrimStart ( '>' , '<' , '=' ) ;
if ( ! Int64 . TryParse ( coinsString , out long coins ) )
return ;
// Equal
if ( coinsOperation = = null & & ! negate )
{
DatItem_Coins . Neutral = coins ;
}
// Not Equal
else if ( coinsOperation = = null & & negate )
{
DatItem_Coins . Negative = coins - 1 ;
DatItem_Coins . Positive = coins + 1 ;
}
// Greater Than or Equal
else if ( coinsOperation = = true & & ! negate )
{
DatItem_Coins . Positive = coins ;
}
// Strictly Less Than
else if ( coinsOperation = = true & & negate )
{
DatItem_Coins . Negative = coins - 1 ;
}
// Less Than or Equal
else if ( coinsOperation = = false & & ! negate )
{
DatItem_Coins . Negative = coins ;
}
// Strictly Greater Than
else if ( coinsOperation = = false & & negate )
{
DatItem_Coins . Positive = coins + 1 ;
}
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Instance
case Field . DatItem_Instance_Name :
2020-09-02 21:59:26 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Instance_Name . NegativeSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Instance_Name . PositiveSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Instance_BriefName :
2020-09-02 21:59:26 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Instance_BriefName . NegativeSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Instance_BriefName . PositiveSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Location
case Field . DatItem_Location_Name :
2020-09-02 21:59:26 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Location_Name . NegativeSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Location_Name . PositiveSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Location_Number :
2020-09-02 21:59:26 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Location_Number . NegativeSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Location_Number . PositiveSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Location_Inverted :
2020-09-02 21:59:26 -07:00
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
2020-09-03 14:22:15 -07:00
DatItem_Location_Inverted . Neutral = false ;
2020-09-02 21:59:26 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Location_Inverted . Neutral = true ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
// RamOption
case Field . DatItem_Content :
2020-09-02 21:59:26 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Content . NegativeSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Content . PositiveSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Release
case Field . DatItem_Language :
2020-09-02 21:59:26 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Language . NegativeSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Language . PositiveSet . Add ( value ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Setting
case Field . DatItem_Setting_Name :
2020-09-01 11:34:52 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Setting_Name . NegativeSet . Add ( value ) ;
2020-09-01 11:34:52 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Setting_Name . PositiveSet . Add ( value ) ;
2020-09-01 11:34:52 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Setting_Value :
2020-08-31 23:01:51 -07:00
if ( negate )
2020-09-03 14:22:15 -07:00
DatItem_Setting_Value . NegativeSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Setting_Value . PositiveSet . Add ( value ) ;
2020-08-31 23:01:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Setting_Default :
2020-09-01 16:21:55 -07:00
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
2020-09-03 14:22:15 -07:00
DatItem_Setting_Default . Neutral = false ;
2020-09-01 16:21:55 -07:00
else
2020-09-03 14:22:15 -07:00
DatItem_Setting_Default . Neutral = true ;
2020-09-01 16:21:55 -07:00
break ;
2020-09-03 14:22:15 -07:00
// SlotOption
2020-09-01 16:21:55 -07:00
case Field . DatItem_SlotOption_Name :
if ( negate )
DatItem_SlotOption_Name . NegativeSet . Add ( value ) ;
else
DatItem_SlotOption_Name . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_SlotOption_DeviceName :
if ( negate )
DatItem_SlotOption_DeviceName . NegativeSet . Add ( value ) ;
else
DatItem_SlotOption_DeviceName . PositiveSet . Add ( value ) ;
break ;
case Field . DatItem_SlotOption_Default :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
DatItem_SlotOption_Default . Neutral = false ;
else
DatItem_SlotOption_Default . Neutral = true ;
break ;
2020-09-03 14:22:15 -07:00
// SoftwareList
2020-08-31 23:26:07 -07:00
case Field . DatItem_SoftwareListStatus :
if ( negate )
DatItem_SoftwareListStatus . Negative | = value . AsSoftwareListStatus ( ) ;
else
DatItem_SoftwareListStatus . Positive | = value . AsSoftwareListStatus ( ) ;
break ;
case Field . DatItem_Filter :
if ( negate )
DatItem_Filter . NegativeSet . Add ( value ) ;
else
DatItem_Filter . PositiveSet . Add ( value ) ;
break ;
2020-09-02 12:51:21 -07:00
// Sound
case Field . DatItem_Channels :
if ( negate )
DatItem_Channels . NegativeSet . Add ( value ) ;
else
DatItem_Channels . PositiveSet . Add ( value ) ;
break ;
#endregion
2020-08-25 14:53:51 -07:00
2020-09-03 14:22:15 -07:00
#endregion // Item-Specific
2020-08-31 23:01:51 -07:00
2020-09-03 14:22:15 -07:00
#endregion // DatItem Filters
2020-07-18 21:35:17 -07:00
}
}
#endregion
2020-07-15 09:41:59 -07:00
#endregion // Instance Methods
2019-01-08 17:40:28 -08:00
}
2016-10-26 21:02:01 -07:00
}