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 > ( ) ;
2020-09-04 23:03:27 -07:00
public FilterItem < long? > DatItem_Size { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-08-25 14:24:34 -07:00
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-09-04 15:02:15 -07:00
public FilterItem < string > DatItem_SpamSum { 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)
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 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-09-04 11:20:54 -07:00
public FilterItem < long? > DatItem_Clock { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-08-31 23:01:51 -07:00
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
2020-09-06 23:00:13 -07:00
public FilterItem < ControlType > DatItem_Control_Type { get ; private set ; } = new FilterItem < ControlType > ( ) { Positive = ControlType . NULL , Negative = ControlType . NULL } ;
2020-09-04 11:46:17 -07:00
public FilterItem < long? > DatItem_Control_Player { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_Control_Buttons { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-06 23:00:13 -07:00
public FilterItem < long? > DatItem_Control_ReqButtons { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-04 11:46:17 -07:00
public FilterItem < long? > DatItem_Control_Minimum { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_Control_Maximum { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_Control_Sensitivity { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_Control_KeyDelta { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-03 14:22:15 -07:00
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-04 14:10:35 -07:00
// DataArea
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 < long? > DatItem_AreaWidth { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < Endianness > DatItem_AreaEndianness { get ; private set ; } = new FilterItem < Endianness > ( ) { Positive = Endianness . NULL , Negative = Endianness . NULL } ;
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-04 10:28:25 -07:00
public FilterItem < long? > DatItem_Rotate { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-02 21:36:14 -07:00
public FilterItem < bool? > DatItem_FlipX { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-09-04 10:39:37 -07:00
public FilterItem < long? > DatItem_Width { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_Height { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-04 11:04:58 -07:00
public FilterItem < double? > DatItem_Refresh { get ; private set ; } = new FilterItem < double? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-04 10:50:08 -07:00
public FilterItem < long? > DatItem_PixClock { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-04 10:57:30 -07:00
public FilterItem < long? > DatItem_HTotal { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_HBEnd { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_HBStart { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_VTotal { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_VBEnd { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
public FilterItem < long? > DatItem_VBStart { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-02 21:36:14 -07:00
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 > ( ) ;
2020-09-06 23:08:50 -07:00
public FilterItem < long? > DatItem_Location_Number { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-03 14:22:15 -07:00
public FilterItem < bool? > DatItem_Location_Inverted { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-09-04 14:10:35 -07:00
// Part
public FilterItem < string > DatItem_Part_Name { get ; private set ; } = new FilterItem < string > ( ) ;
public FilterItem < string > DatItem_Part_Interface { get ; private set ; } = new FilterItem < string > ( ) ;
// PartFeature
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-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
2020-09-03 22:35:09 -07:00
public FilterItem < long? > DatItem_Channels { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-09-02 12:51:21 -07:00
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-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Name , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Comment :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Comment , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Description :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Description , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Year :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Year , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Manufacturer :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Manufacturer , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Publisher :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Publisher , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Category :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Category , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_RomOf :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_RomOf , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_CloneOf :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_CloneOf , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_SampleOf :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_SampleOf , value , negate ) ;
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-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Players , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Rotation :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Rotation , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Control :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Control , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-25 11:20:50 -07:00
case Field . Machine_Status :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Status , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_DisplayCount :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_DisplayCount , value , negate ) ;
2020-08-20 14:36:36 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_DisplayType :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_DisplayType , value , negate ) ;
2020-08-20 14:36:36 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Buttons :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Buttons , value , negate ) ;
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-09-03 23:27:05 -07:00
SetStringFilter ( Machine_SourceFile , value , negate ) ;
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-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Board , value , negate ) ;
2020-08-20 14:36:36 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_RebuildTo :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_RebuildTo , value , negate ) ;
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-09-03 23:27:05 -07:00
SetStringFilter ( Machine_TitleID , value , negate ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Developer :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Developer , value , negate ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Genre :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Genre , value , negate ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Subgenre :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Subgenre , value , negate ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Ratings :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Ratings , value , negate ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Score :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Score , value , negate ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Enabled :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Enabled , value , negate ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-25 12:15:28 -07:00
case Field . Machine_CRC :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( Machine_CRC , value , negate ) ;
2020-08-20 22:42:04 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_RelatedTo :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_RelatedTo , value , negate ) ;
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-09-03 23:27:05 -07:00
SetStringFilter ( Machine_GenMSXID , value , negate ) ;
2020-08-21 17:27:11 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_System :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_System , value , negate ) ;
2020-08-21 17:27:11 -07:00
break ;
2020-08-24 22:25:47 -07:00
case Field . Machine_Country :
2020-09-03 23:27:05 -07:00
SetStringFilter ( Machine_Country , value , negate ) ;
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 ;
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Type , value , negate ) ;
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-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Name , value , negate ) ;
2020-08-20 21:15:37 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Bios :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Bios , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Size :
2020-09-03 23:27:05 -07:00
SetLongFilter ( DatItem_Size , value , negate ) ;
2020-09-03 14:22:15 -07:00
break ;
case Field . DatItem_CRC :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_CRC , value , negate ) ;
2020-08-21 23:48:35 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_MD5 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_MD5 , value , negate ) ;
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-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_RIPEMD160 , value , negate ) ;
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-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_SHA1 , value , negate ) ;
2020-08-21 23:48:35 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_SHA256 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_SHA256 , value , negate ) ;
2020-08-21 23:48:35 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_SHA384 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_SHA384 , value , negate ) ;
2020-08-25 14:53:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_SHA512 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_SHA512 , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-04 15:02:15 -07:00
case Field . DatItem_SpamSum :
SetStringFilter ( DatItem_SpamSum , value , negate ) ;
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Merge :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Merge , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Region :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Region , value , negate ) ;
2020-08-25 14:53:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Offset :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Offset , value , negate ) ;
2020-08-25 14:53:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Date :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Date , value , negate ) ;
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 :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Optional , value , negate ) ;
2020-09-03 14:22:15 -07:00
break ;
2020-07-18 21:35:17 -07:00
2020-09-03 14:22:15 -07:00
case Field . DatItem_Inverted :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Inverted , value , negate ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Rom (AttractMode)
case Field . DatItem_AltName :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_AltName , value , negate ) ;
2020-08-21 13:31:22 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_AltTitle :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_AltTitle , value , negate ) ;
2020-08-21 13:31:22 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Rom (OpenMSX)
case Field . DatItem_Original :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Original , value , negate ) ;
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 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_OpenMSXType , value , negate ) ;
2020-09-03 14:22:15 -07:00
break ;
2020-08-20 21:15:37 -07:00
2020-09-03 14:22:15 -07:00
case Field . DatItem_Remark :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Remark , value , negate ) ;
2020-09-03 14:22:15 -07:00
break ;
2020-08-25 14:53:51 -07:00
2020-09-03 14:22:15 -07:00
case Field . DatItem_Boot :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Boot , value , negate ) ;
2020-09-03 14:22:15 -07:00
break ;
2020-07-18 21:35:17 -07:00
2020-09-03 14:22:15 -07:00
// Rom (SoftwareList)
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_Value :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Value , value , negate ) ;
2020-07-28 17:00:19 -07:00
break ;
2020-08-31 23:01:51 -07:00
// Disk
case Field . DatItem_Index :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Index , value , negate ) ;
2020-08-31 23:01:51 -07:00
break ;
case Field . DatItem_Writable :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Writable , value , negate ) ;
2020-08-31 23:01:51 -07:00
break ;
#endregion
#region Auxiliary
2020-09-01 11:34:52 -07:00
// Adjuster
case Field . DatItem_Default :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Default , value , negate ) ;
2020-09-01 11:34:52 -07:00
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-03 23:27:05 -07:00
SetStringFilter ( DatItem_Analog_Mask , value , negate ) ;
2020-09-02 16:31:23 -07:00
break ;
2020-08-31 23:01:51 -07:00
// BiosSet
case Field . DatItem_Description :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Description , value , negate ) ;
2020-08-31 23:01:51 -07:00
break ;
// Chip
case Field . DatItem_Tag :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Tag , value , negate ) ;
2020-08-31 23:01:51 -07:00
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 :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Clock , value , negate ) ;
2020-08-31 23:01:51 -07:00
break ;
2020-09-02 16:31:23 -07:00
// Condition
2020-09-03 14:22:15 -07:00
case Field . DatItem_Mask :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Mask , value , negate ) ;
2020-09-03 14:22:15 -07:00
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 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Condition_Tag , value , negate ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Condition_Mask :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Condition_Mask , value , negate ) ;
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 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Condition_Value , value , negate ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Control
case Field . DatItem_Control_Type :
2020-09-06 23:00:13 -07:00
if ( negate )
DatItem_Control_Type . Negative | = value . AsControlType ( ) ;
else
DatItem_Control_Type . Positive | = value . AsControlType ( ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Player :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Control_Player , value , negate ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Buttons :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Control_Buttons , value , negate ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-06 23:00:13 -07:00
case Field . DatItem_Control_RequiredButtons :
SetLongFilter ( DatItem_Control_ReqButtons , value , negate ) ;
2020-09-01 11:55:11 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Minimum :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Control_Minimum , value , negate ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Maximum :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Control_Maximum , value , negate ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Sensitivity :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Control_Sensitivity , value , negate ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_KeyDelta :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Control_KeyDelta , value , negate ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Reverse :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Control_Reverse , value , negate ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Ways :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Control_Ways , value , negate ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Ways2 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Control_Ways2 , value , negate ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Control_Ways3 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Control_Ways3 , value , negate ) ;
2020-09-02 17:09:19 -07:00
break ;
2020-09-04 14:10:35 -07:00
// DataArea
case Field . DatItem_AreaName :
SetStringFilter ( DatItem_AreaName , value , negate ) ;
break ;
case Field . DatItem_AreaSize :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_AreaSize , value , negate ) ;
2020-09-04 14:10:35 -07:00
break ;
case Field . DatItem_AreaWidth :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_AreaWidth , value , negate ) ;
2020-09-04 14:10:35 -07:00
break ;
case Field . DatItem_AreaEndianness :
if ( negate )
DatItem_AreaEndianness . Negative | = value . AsEndianness ( ) ;
else
DatItem_AreaEndianness . Positive | = value . AsEndianness ( ) ;
break ;
2020-09-03 14:22:15 -07:00
// Device
case Field . DatItem_DeviceType :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_DeviceType , value , negate ) ;
2020-09-01 13:36:32 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_FixedImage :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_FixedImage , value , negate ) ;
2020-09-01 13:36:32 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Mandatory :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Mandatory , value , negate ) ;
2020-09-01 13:36:32 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Interface :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Interface , value , negate ) ;
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 :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Rotate , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_FlipX :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_FlipX , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_Width :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Width , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_Height :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Height , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_Refresh :
2020-09-04 11:04:58 -07:00
SetDoubleFilter ( DatItem_Refresh , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_PixClock :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_PixClock , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_HTotal :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_HTotal , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_HBEnd :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_HBEnd , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_HBStart :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_HBStart , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_VTotal :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_VTotal , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_VBEnd :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_VBEnd , value , negate ) ;
2020-09-02 21:36:14 -07:00
break ;
case Field . DatItem_VBStart :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_VBStart , value , negate ) ;
2020-09-02 21:36:14 -07:00
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 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Extension_Name , value , negate ) ;
2020-09-03 14:22:15 -07:00
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 :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Service , value , negate ) ;
2020-09-02 21:59:26 -07:00
break ;
case Field . DatItem_Tilt :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Tilt , value , negate ) ;
2020-09-02 21:59:26 -07:00
break ;
case Field . DatItem_Players :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Players , value , negate ) ;
2020-09-02 21:59:26 -07:00
break ;
case Field . DatItem_Coins :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Coins , value , negate ) ;
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-03 23:27:05 -07:00
SetStringFilter ( DatItem_Instance_Name , value , negate ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Instance_BriefName :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Instance_BriefName , value , negate ) ;
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-03 23:27:05 -07:00
SetStringFilter ( DatItem_Location_Name , value , negate ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Location_Number :
2020-09-06 23:08:50 -07:00
SetLongFilter ( DatItem_Location_Number , value , negate ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Location_Inverted :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Location_Inverted , value , negate ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-04 14:10:35 -07:00
// Part
case Field . DatItem_Part_Name :
SetStringFilter ( DatItem_Part_Name , value , negate ) ;
break ;
case Field . DatItem_Part_Interface :
SetStringFilter ( DatItem_Part_Interface , value , negate ) ;
break ;
// PartFeature
case Field . DatItem_Part_Feature_Name :
SetStringFilter ( DatItem_Part_Feature_Name , value , negate ) ;
break ;
case Field . DatItem_Part_Feature_Value :
SetStringFilter ( DatItem_Part_Feature_Value , value , negate ) ;
break ;
2020-09-03 14:22:15 -07:00
// RamOption
case Field . DatItem_Content :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Content , value , negate ) ;
2020-09-02 21:59:26 -07:00
break ;
2020-09-03 14:22:15 -07:00
// Release
case Field . DatItem_Language :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Language , value , negate ) ;
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-03 23:27:05 -07:00
SetStringFilter ( DatItem_Setting_Name , value , negate ) ;
2020-09-01 11:34:52 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Setting_Value :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Setting_Value , value , negate ) ;
2020-08-31 23:01:51 -07:00
break ;
2020-09-03 14:22:15 -07:00
case Field . DatItem_Setting_Default :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_Setting_Default , value , negate ) ;
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 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_SlotOption_Name , value , negate ) ;
2020-09-01 16:21:55 -07:00
break ;
case Field . DatItem_SlotOption_DeviceName :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_SlotOption_DeviceName , value , negate ) ;
2020-09-01 16:21:55 -07:00
break ;
case Field . DatItem_SlotOption_Default :
2020-09-03 23:27:05 -07:00
SetBooleanFilter ( DatItem_SlotOption_Default , value , negate ) ;
2020-09-01 16:21:55 -07:00
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 :
2020-09-03 23:27:05 -07:00
SetStringFilter ( DatItem_Filter , value , negate ) ;
2020-08-31 23:26:07 -07:00
break ;
2020-09-02 12:51:21 -07:00
// Sound
case Field . DatItem_Channels :
2020-09-04 23:03:27 -07:00
SetLongFilter ( DatItem_Channels , value , negate ) ;
2020-09-02 12:51:21 -07:00
break ;
2020-09-03 22:35:09 -07:00
#endregion
2020-08-25 14:53:51 -07:00
2020-09-03 22:35:09 -07:00
#endregion // Item-Specific
2020-08-31 23:01:51 -07:00
2020-09-03 22:35:09 -07:00
#endregion // DatItem Filters
2020-07-18 21:35:17 -07:00
}
}
2020-09-03 23:27:05 -07:00
/// <summary>
/// Set a bool? filter
/// </summary>
/// <param name="filterItem">FilterItem to populate</param>
/// <param name="value">String value to add</param>
/// <param name="negate">True to set negative filter, false otherwise</param>
private void SetBooleanFilter ( FilterItem < bool? > filterItem , string value , bool negate )
{
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
filterItem . Neutral = false ;
else
filterItem . Neutral = true ;
}
2020-09-04 11:04:58 -07:00
/// <summary>
/// Set a long? filter
/// </summary>
/// <param name="filterItem">FilterItem to populate</param>
/// <param name="value">String value to add</param>
/// <param name="negate">True to set negative filter, false otherwise</param>
private void SetDoubleFilter ( FilterItem < double? > filterItem , string value , bool negate )
{
bool? operation = null ;
if ( value . StartsWith ( ">" ) )
operation = true ;
else if ( value . StartsWith ( "<" ) )
operation = false ;
else if ( value . StartsWith ( "=" ) )
operation = null ;
string valueString = value . TrimStart ( '>' , '<' , '=' ) ;
if ( ! Double . TryParse ( valueString , out double valueDouble ) )
return ;
// Equal
if ( operation = = null & & ! negate )
{
filterItem . Neutral = valueDouble ;
}
// Not Equal
else if ( operation = = null & & negate )
{
filterItem . Negative = valueDouble - 1 ;
filterItem . Positive = valueDouble + 1 ;
}
// Greater Than or Equal
else if ( operation = = true & & ! negate )
{
filterItem . Positive = valueDouble ;
}
// Strictly Less Than
else if ( operation = = true & & negate )
{
filterItem . Negative = valueDouble - 1 ;
}
// Less Than or Equal
else if ( operation = = false & & ! negate )
{
filterItem . Negative = valueDouble ;
}
// Strictly Greater Than
else if ( operation = = false & & negate )
{
filterItem . Positive = valueDouble + 1 ;
}
}
2020-09-03 23:27:05 -07:00
/// <summary>
/// Set a long? filter
/// </summary>
/// <param name="filterItem">FilterItem to populate</param>
/// <param name="value">String value to add</param>
/// <param name="negate">True to set negative filter, false otherwise</param>
2020-09-04 23:03:27 -07:00
private void SetLongFilter ( FilterItem < long? > filterItem , string value , bool negate )
2020-09-03 23:27:05 -07:00
{
bool? operation = null ;
if ( value . StartsWith ( ">" ) )
operation = true ;
else if ( value . StartsWith ( "<" ) )
operation = false ;
else if ( value . StartsWith ( "=" ) )
operation = null ;
string valueString = value . TrimStart ( '>' , '<' , '=' ) ;
if ( ! Int64 . TryParse ( valueString , out long valueLong ) )
return ;
// Equal
if ( operation = = null & & ! negate )
{
filterItem . Neutral = valueLong ;
}
// Not Equal
else if ( operation = = null & & negate )
{
filterItem . Negative = valueLong - 1 ;
filterItem . Positive = valueLong + 1 ;
}
// Greater Than or Equal
else if ( operation = = true & & ! negate )
{
filterItem . Positive = valueLong ;
}
// Strictly Less Than
else if ( operation = = true & & negate )
{
filterItem . Negative = valueLong - 1 ;
}
// Less Than or Equal
else if ( operation = = false & & ! negate )
{
filterItem . Negative = valueLong ;
}
// Strictly Greater Than
else if ( operation = = false & & negate )
{
filterItem . Positive = valueLong + 1 ;
}
}
/// <summary>
/// Set a string filter
/// </summary>
/// <param name="filterItem">FilterItem to populate</param>
/// <param name="value">String value to add</param>
/// <param name="negate">True to set negative filter, false otherwise</param>
private void SetStringFilter ( FilterItem < string > filterItem , string value , bool negate )
{
if ( negate )
filterItem . NegativeSet . Add ( value ) ;
else
filterItem . PositiveSet . Add ( value ) ;
}
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
}