From 3e350b666b569f116450b6a115cb577aa2cd78cb Mon Sep 17 00:00:00 2001 From: Deterous <138427222+Deterous@users.noreply.github.com> Date: Tue, 16 Apr 2024 23:11:09 +0900 Subject: [PATCH] Custom non-redump Redumper options (#691) * Gate advanced Redumper options in UI, add read method + sector order * Update changelog * Fixed-width text/combo boxes --- CHANGELIST.md | 1 + MPF.Core/Converters/EnumConverter.cs | 89 +++++++++++++++++++++- MPF.Core/Data/Enumerations.cs | 25 ++++++ MPF.Core/Data/Options.cs | 40 +++++++++- MPF.Core/Modules/Redumper/Parameters.cs | 9 ++- MPF.Core/UI/ViewModels/OptionsViewModel.cs | 41 +++++++++- MPF.UI.Core/ElementConverter.cs | 4 + MPF.UI.Core/Windows/OptionsWindow.xaml | 38 +++++---- MPF.UI.Core/Windows/OptionsWindow.xaml.cs | 13 +++- 9 files changed, 238 insertions(+), 22 deletions(-) diff --git a/CHANGELIST.md b/CHANGELIST.md index 13fc1e55..ef6c2172 100644 --- a/CHANGELIST.md +++ b/CHANGELIST.md @@ -2,6 +2,7 @@ - Fix parameter parsing for `=` symbol (Deterous) - Define better default categories (Deterous) +- Custom non-redump Redumper options (Deterous) ### 3.1.5 (2024-04-05) diff --git a/MPF.Core/Converters/EnumConverter.cs b/MPF.Core/Converters/EnumConverter.cs index ca3ac7bc..ae66672c 100644 --- a/MPF.Core/Converters/EnumConverter.cs +++ b/MPF.Core/Converters/EnumConverter.cs @@ -111,7 +111,44 @@ namespace MPF.Core.Converters }; } -#endregion + /// + /// Get the string representation of the RedumperReadMethod enum values + /// + /// RedumperReadMethod value to convert + /// String representing the value, if possible + public static string LongName(this RedumperReadMethod? method) + { + return (method) switch + { + RedumperReadMethod.D8 => "D8", + RedumperReadMethod.BE => "BE", + RedumperReadMethod.BE_CDDA => "BE_CDDA", + + RedumperReadMethod.NONE => "Default", + _ => "Unknown", + }; + } + + /// + /// Get the string representation of the RedumperSectorOrder enum values + /// + /// RedumperSectorOrder value to convert + /// String representing the value, if possible + public static string LongName(this RedumperSectorOrder? order) + { + return (order) switch + { + RedumperSectorOrder.DATA_C2_SUB => "DATA_C2_SUB", + RedumperSectorOrder.DATA_SUB_C2 => "DATA_SUB_C2", + RedumperSectorOrder.DATA_SUB => "DATA_SUB", + RedumperSectorOrder.DATA_C2 => "DATA_C2", + + RedumperSectorOrder.NONE => "Default", + _ => "Unknown", + }; + } + + #endregion #region Convert From String @@ -299,6 +336,56 @@ namespace MPF.Core.Converters }; } + /// + /// Get the RedumperReadMethod enum value for a given string + /// + /// String value to convert + /// RedumperReadMethod represented by the string, if possible + public static RedumperReadMethod ToRedumperReadMethod(string? method) + { + return (method?.ToLowerInvariant()) switch + { + "d8" => RedumperReadMethod.D8, + "be" => RedumperReadMethod.BE, + "be_cdda" + or "be cdda" + or "be-cdda" + or "becdda" => RedumperReadMethod.BE_CDDA, + + _ => RedumperReadMethod.NONE, + }; + } + + /// + /// Get the RedumperSectorOrder enum value for a given string + /// + /// String value to convert + /// RedumperSectorOrder represented by the string, if possible + public static RedumperSectorOrder ToRedumperSectorOrder(string? order) + { + return (order?.ToLowerInvariant()) switch + { + "data_c2_sub" + or "data c2 sub" + or "data-c2-sub" + or "datac2sub" => RedumperSectorOrder.DATA_C2_SUB, + "data_sub_c2" + or "data sub c2" + or "data-sub-c2" + or "datasubc2" => RedumperSectorOrder.DATA_SUB_C2, + "data_sub" + or "data sub" + or "data-sub" + or "datasub" => RedumperSectorOrder.DATA_SUB, + "data_c2" + or "data c2" + or "data-c2" + or "datac2" => RedumperSectorOrder.DATA_C2, + + _ => RedumperSectorOrder.NONE, + }; + } + #endregion } } diff --git a/MPF.Core/Data/Enumerations.cs b/MPF.Core/Data/Enumerations.cs index fd4ed2b4..afcaf644 100644 --- a/MPF.Core/Data/Enumerations.cs +++ b/MPF.Core/Data/Enumerations.cs @@ -50,6 +50,31 @@ UmdImageCreator, } + /// + /// Drive read method option + /// + public enum RedumperReadMethod + { + NONE = 0, + + BE, + D8, + BE_CDDA, + } + + /// + /// Drive sector order option + /// + public enum RedumperSectorOrder + { + NONE = 0, + + DATA_C2_SUB, + DATA_SUB_C2, + DATA_SUB, + DATA_C2, + } + /// /// Log level for output /// diff --git a/MPF.Core/Data/Options.cs b/MPF.Core/Data/Options.cs index 0bdd53ac..c79c0e41 100644 --- a/MPF.Core/Data/Options.cs +++ b/MPF.Core/Data/Options.cs @@ -326,12 +326,12 @@ namespace MPF.Core.Data } /// - /// Enable BE reading by default with Redumper + /// Enable options incompatible with redump submissions /// - public bool RedumperUseBEReading + public bool RedumperNonRedumpMode { - get { return GetBooleanSetting(Settings, "RedumperUseBEReading", false); } - set { Settings["RedumperUseBEReading"] = value.ToString(); } + get { return GetBooleanSetting(Settings, "RedumperNonRedumpMode", false); } + set { Settings["RedumperNonRedumpMode"] = value.ToString(); } } /// @@ -343,6 +343,38 @@ namespace MPF.Core.Data set { Settings["RedumperUseGenericDriveType"] = value.ToString(); } } + /// + /// Currently selected default redumper read method + /// + public RedumperReadMethod RedumperReadMethod + { + get + { + var valueString = GetStringSetting(Settings, "RedumperReadMethod", RedumperReadMethod.NONE.ToString()); + return EnumConverter.ToRedumperReadMethod(valueString); + } + set + { + Settings["RedumperReadMethod"] = value.ToString(); + } + } + + /// + /// Currently selected default redumper sector order + /// + public RedumperSectorOrder RedumperSectorOrder + { + get + { + var valueString = GetStringSetting(Settings, "RedumperSectorOrder", RedumperSectorOrder.NONE.ToString()); + return EnumConverter.ToRedumperSectorOrder(valueString); + } + set + { + Settings["RedumperSectorOrder"] = value.ToString(); + } + } + /// /// Default number of rereads /// diff --git a/MPF.Core/Modules/Redumper/Parameters.cs b/MPF.Core/Modules/Redumper/Parameters.cs index d13694f2..bbf4af4b 100644 --- a/MPF.Core/Modules/Redumper/Parameters.cs +++ b/MPF.Core/Modules/Redumper/Parameters.cs @@ -1098,10 +1098,15 @@ namespace MPF.Core.Modules.Redumper this[FlagStrings.Verbose] = options.RedumperEnableVerbose; if (options.RedumperEnableDebug) this[FlagStrings.Debug] = options.RedumperEnableDebug; - if (options.RedumperUseBEReading) + if (options.RedumperReadMethod != RedumperReadMethod.NONE) { this[FlagStrings.DriveReadMethod] = true; - DriveReadMethodValue = "BE_CDDA"; + DriveReadMethodValue = options.RedumperReadMethod.ToString(); + } + if (options.RedumperSectorOrder != RedumperSectorOrder.NONE) + { + this[FlagStrings.DriveSectorOrder] = true; + DriveSectorOrderValue = options.RedumperSectorOrder.ToString(); } if (options.RedumperUseGenericDriveType) { diff --git a/MPF.Core/UI/ViewModels/OptionsViewModel.cs b/MPF.Core/UI/ViewModels/OptionsViewModel.cs index 2a97fe39..b051888a 100644 --- a/MPF.Core/UI/ViewModels/OptionsViewModel.cs +++ b/MPF.Core/UI/ViewModels/OptionsViewModel.cs @@ -51,6 +51,16 @@ namespace MPF.Core.UI.ViewModels /// public static List> InternalPrograms => PopulateInternalPrograms(); + /// + /// Current list of supported Redumper read methods + /// + public static List> RedumperReadMethods => PopulateRedumperReadMethods(); + + /// + /// Current list of supported Redumper sector orders + /// + public static List> RedumperSectorOrders => PopulateRedumperSectorOrders(); + /// /// Current list of supported system profiles /// @@ -77,7 +87,7 @@ namespace MPF.Core.UI.ViewModels #region Population /// - /// Get a complete list of supported internal programs + /// Get a complete list of supported internal programs /// private static List> PopulateInternalPrograms() { @@ -85,6 +95,24 @@ namespace MPF.Core.UI.ViewModels return internalPrograms.Select(ip => new Element(ip)).ToList(); } + /// + /// Get a complete list of supported redumper drive read methods + /// + private static List> PopulateRedumperReadMethods() + { + var readMethods = new List { RedumperReadMethod.NONE, RedumperReadMethod.D8, RedumperReadMethod.BE, RedumperReadMethod.BE_CDDA }; + return readMethods.Select(rm => new Element(rm)).ToList(); + } + + /// + /// Get a complete list of supported redumper drive sector orders + /// + private static List> PopulateRedumperSectorOrders() + { + var sectorOrders = new List { RedumperSectorOrder.NONE, RedumperSectorOrder.DATA_C2_SUB, RedumperSectorOrder.DATA_SUB_C2, RedumperSectorOrder.DATA_SUB, RedumperSectorOrder.DATA_C2 }; + return sectorOrders.Select(so => new Element(so)).ToList(); + } + #endregion #region UI Commands @@ -107,6 +135,17 @@ namespace MPF.Core.UI.ViewModels #endif } + /// + /// Reset Redumper non-redump options (Read Method, Sector Order, Drive Type) + /// + public void NonRedumpModeUnChecked() + { + Options.RedumperReadMethod = RedumperReadMethod.NONE; + Options.RedumperSectorOrder = RedumperSectorOrder.NONE; + Options.RedumperUseGenericDriveType = false; + TriggerPropertyChanged(nameof(Options)); + } + #endregion #region Property Updates diff --git a/MPF.UI.Core/ElementConverter.cs b/MPF.UI.Core/ElementConverter.cs index 640588a0..1353a2f9 100644 --- a/MPF.UI.Core/ElementConverter.cs +++ b/MPF.UI.Core/ElementConverter.cs @@ -16,6 +16,8 @@ namespace MPF.UI.Core DiscCategory discCategory => new Element(discCategory), InternalProgram internalProgram => new Element(internalProgram), MediaType mediaType => new Element(mediaType), + RedumperReadMethod readMethod => new Element(readMethod), + RedumperSectorOrder sectorOrder => new Element(sectorOrder), RedumpSystem redumpSystem => new RedumpSystemComboBoxItem(redumpSystem), Region region => new Element(region), @@ -35,6 +37,8 @@ namespace MPF.UI.Core Element dcElement => dcElement.Value, Element ipElement => ipElement.Value, Element mtElement => mtElement.Value, + Element rmElement => rmElement.Value, + Element soElement => soElement.Value, RedumpSystemComboBoxItem rsElement => rsElement.Value, Element reValue => reValue.Value, _ => null, diff --git a/MPF.UI.Core/Windows/OptionsWindow.xaml b/MPF.UI.Core/Windows/OptionsWindow.xaml index 45a2254d..48661926 100644 --- a/MPF.UI.Core/Windows/OptionsWindow.xaml +++ b/MPF.UI.Core/Windows/OptionsWindow.xaml @@ -370,7 +370,7 @@ />