From 992fb507e745ea16c275e2482d56ae4ec5c72f87 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 7 Feb 2026 13:23:57 -0500 Subject: [PATCH] Replace Options with SegmentedOptions in most places --- CHANGELIST.md | 1 + MPF.CLI/Features/BaseFeature.cs | 82 +++++------ MPF.CLI/Features/InteractiveFeature.cs | 10 +- MPF.CLI/Features/MainFeature.cs | 2 +- MPF.Check/Features/BaseFeature.cs | 62 ++++---- MPF.Check/Features/InteractiveFeature.cs | 109 +++++++------- MPF.Check/Features/MainFeature.cs | 91 ++++++------ MPF.Frontend.Test/DumpEnvironmentTests.cs | 5 +- MPF.Frontend.Test/Tools/FrontendToolTests.cs | 14 +- MPF.Frontend/DumpEnvironment.cs | 52 +++---- MPF.Frontend/EnumExtensions.cs | 27 ++++ MPF.Frontend/Features/ListConfigFeature.cs | 133 ++++++++++-------- MPF.Frontend/ProcessUserInfoDelegate.cs | 4 +- MPF.Frontend/SegmentedOptions.cs | 94 +++++++++++++ MPF.Frontend/Tools/FrontendTool.cs | 20 +-- MPF.Frontend/Tools/OptionsLoader.cs | 10 +- MPF.Frontend/Tools/ProtectionTool.cs | 18 +-- MPF.Frontend/Tools/SubmissionGenerator.cs | 36 ++--- MPF.Frontend/ViewModels/CheckDumpViewModel.cs | 6 +- MPF.Frontend/ViewModels/CreateIRDViewModel.cs | 7 +- MPF.Frontend/ViewModels/MainViewModel.cs | 38 ++--- .../ViewModels/MediaInformationViewModel.cs | 6 +- MPF.Frontend/ViewModels/OptionsViewModel.cs | 14 +- MPF.UI/Windows/CheckDumpWindow.xaml.cs | 8 +- MPF.UI/Windows/CreateIRDWindow.xaml.cs | 20 +-- MPF.UI/Windows/MainWindow.xaml.cs | 32 ++--- MPF.UI/Windows/MediaInformationWindow.xaml.cs | 10 +- MPF.UI/Windows/OptionsWindow.xaml.cs | 12 +- 28 files changed, 529 insertions(+), 394 deletions(-) diff --git a/CHANGELIST.md b/CHANGELIST.md index fdf29705..f80d2ba6 100644 --- a/CHANGELIST.md +++ b/CHANGELIST.md @@ -22,6 +22,7 @@ - Check should not default to update checking - Add save and load for new options type - Add conversion method from new options type +- Replace Options with SegmentedOptions in most places ### 3.6.0 (2025-11-28) diff --git a/MPF.CLI/Features/BaseFeature.cs b/MPF.CLI/Features/BaseFeature.cs index 9e868d5d..a9a80de0 100644 --- a/MPF.CLI/Features/BaseFeature.cs +++ b/MPF.CLI/Features/BaseFeature.cs @@ -19,7 +19,7 @@ namespace MPF.CLI.Features /// /// User-defined options /// - public Options Options { get; protected set; } + public SegmentedOptions Options { get; protected set; } /// /// Currently-selected system @@ -65,33 +65,35 @@ namespace MPF.CLI.Features protected BaseFeature(string name, string[] flags, string description, string? detailed = null) : base(name, flags, description, detailed) { - Options = new Options() - { - // Internal Program - InternalProgram = InternalProgram.NONE, + Options = new SegmentedOptions(); - // Extra Dumping Options - ScanForProtection = false, - AddPlaceholders = true, - PullAllInformation = false, - AddFilenameSuffix = false, - OutputSubmissionJSON = false, - IncludeArtifacts = false, - CompressLogFiles = false, - LogCompression = LogCompression.DeflateMaximum, - DeleteUnnecessaryFiles = false, - CreateIRDAfterDumping = false, + // Internal Program + Options.Dumping.InternalProgram = InternalProgram.NONE; - // Protection Scanning Options - ScanArchivesForProtection = true, - IncludeDebugProtectionInformation = false, - HideDriveLetters = false, + // Protection Scanning Options + Options.Processing.ProtectionScanning.ScanForProtection = false; + Options.Processing.ProtectionScanning.ScanArchivesForProtection = true; + Options.Processing.ProtectionScanning.IncludeDebugProtectionInformation = false; + Options.Processing.ProtectionScanning.HideDriveLetters = false; + + // Redump Login Information + Options.Processing.Login.RetrieveMatchInformation = true; + Options.Processing.Login.RedumpUsername = null; + Options.Processing.Login.RedumpPassword = null; + + // Media Information + Options.Processing.MediaInformation.AddPlaceholders = true; + Options.Processing.MediaInformation.PullAllInformation = false; + + // Post-Information Options + Options.Processing.AddFilenameSuffix = false; + Options.Processing.CreateIRDAfterDumping = false; + Options.Processing.OutputSubmissionJSON = false; + Options.Processing.IncludeArtifacts = false; + Options.Processing.CompressLogFiles = false; + Options.Processing.LogCompression = LogCompression.DeflateMaximum; + Options.Processing.DeleteUnnecessaryFiles = false; - // Redump Login Information - RetrieveMatchInformation = true, - RedumpUsername = null, - RedumpPassword = null, - }; } /// @@ -108,11 +110,11 @@ namespace MPF.CLI.Features Console.WriteLine($"Using system: {System.LongName()}"); // Validate the supplied credentials - if (Options.RetrieveMatchInformation - && !string.IsNullOrEmpty(Options.RedumpUsername) - && !string.IsNullOrEmpty(Options.RedumpPassword)) + if (Options.Processing.Login.RetrieveMatchInformation + && !string.IsNullOrEmpty(Options.Processing.Login.RedumpUsername) + && !string.IsNullOrEmpty(Options.Processing.Login.RedumpPassword)) { - bool? validated = RedumpClient.ValidateCredentials(Options.RedumpUsername!, Options.RedumpPassword!).GetAwaiter().GetResult(); + bool? validated = RedumpClient.ValidateCredentials(Options.Processing.Login.RedumpUsername!, Options.Processing.Login.RedumpPassword!).GetAwaiter().GetResult(); string message = validated switch { true => "Redump username and password accepted!", @@ -125,10 +127,10 @@ namespace MPF.CLI.Features // Validate the internal program #pragma warning disable IDE0010 - switch (Options.InternalProgram) + switch (Options.Dumping.InternalProgram) { case InternalProgram.Aaru: - if (!File.Exists(Options.AaruPath)) + if (!File.Exists(Options.Dumping.AaruPath)) { Console.Error.WriteLine("A path needs to be supplied in config.json for Aaru, exiting..."); return false; @@ -137,7 +139,7 @@ namespace MPF.CLI.Features break; case InternalProgram.DiscImageCreator: - if (!File.Exists(Options.DiscImageCreatorPath)) + if (!File.Exists(Options.Dumping.DiscImageCreatorPath)) { Console.Error.WriteLine("A path needs to be supplied in config.json for DIC, exiting..."); return false; @@ -146,7 +148,7 @@ namespace MPF.CLI.Features break; // case InternalProgram.Dreamdump: - // if (!File.Exists(Options.DreamdumpPath)) + // if (!File.Exists(Options.Dumping.DreamdumpPath)) // { // Console.Error.WriteLine("A path needs to be supplied in config.json for Dreamdump, exiting..."); // return false; @@ -155,7 +157,7 @@ namespace MPF.CLI.Features // break; case InternalProgram.Redumper: - if (!File.Exists(Options.RedumperPath)) + if (!File.Exists(Options.Dumping.RedumperPath)) { Console.Error.WriteLine("A path needs to be supplied in config.json for Redumper, exiting..."); return false; @@ -164,7 +166,7 @@ namespace MPF.CLI.Features break; default: - Console.Error.WriteLine($"{Options.InternalProgram} is not a supported dumping program, exiting..."); + Console.Error.WriteLine($"{Options.Dumping.InternalProgram} is not a supported dumping program, exiting..."); break; } #pragma warning restore IDE0010 @@ -176,7 +178,7 @@ namespace MPF.CLI.Features return false; } - if (Options.InternalProgram == InternalProgram.DiscImageCreator + if (Options.Dumping.InternalProgram == InternalProgram.DiscImageCreator && CustomParams is null && (MediaType is null || MediaType == SabreTools.RedumpLib.Data.MediaType.NONE)) { @@ -201,8 +203,8 @@ namespace MPF.CLI.Features { string defaultFileName = $"track_{DateTime.Now:yyyyMMdd-HHmm}"; FilePath = Path.Combine(defaultFileName, $"{defaultFileName}.bin"); - if (Options.DefaultOutputPath is not null) - FilePath = Path.Combine(Options.DefaultOutputPath, FilePath); + if (Options.Dumping.DefaultOutputPath is not null) + FilePath = Path.Combine(Options.Dumping.DefaultOutputPath, FilePath); } if (FilePath is not null) @@ -217,7 +219,7 @@ namespace MPF.CLI.Features FilePath, drive, System, - Options.InternalProgram); + Options.Dumping.InternalProgram); env.SetExecutionContext(MediaType, null); env.SetProcessor(); @@ -232,7 +234,7 @@ namespace MPF.CLI.Features env.SetExecutionContext(MediaType, paramStr); // Invoke the dumping program - Console.WriteLine($"Invoking {Options.InternalProgram} using '{paramStr}'"); + Console.WriteLine($"Invoking {Options.Dumping.InternalProgram} using '{paramStr}'"); var dumpResult = env.Run(MediaType).GetAwaiter().GetResult(); Console.WriteLine(dumpResult.Message); if (dumpResult == false) diff --git a/MPF.CLI/Features/InteractiveFeature.cs b/MPF.CLI/Features/InteractiveFeature.cs index 1d3dcca4..4f8dd53e 100644 --- a/MPF.CLI/Features/InteractiveFeature.cs +++ b/MPF.CLI/Features/InteractiveFeature.cs @@ -40,11 +40,11 @@ namespace MPF.CLI.Features MediaType = SabreTools.RedumpLib.Data.MediaType.NONE; string defaultFileName = $"track_{DateTime.Now:yyyyMMdd-HHmm}"; #if NET20 || NET35 - FilePath = Path.Combine(Options.DefaultOutputPath ?? "ISO", Path.Combine(defaultFileName, $"{defaultFileName}.bin")); + FilePath = Path.Combine(Options.Dumping.DefaultOutputPath ?? "ISO", Path.Combine(defaultFileName, $"{defaultFileName}.bin")); #else - FilePath = Path.Combine(Options.DefaultOutputPath ?? "ISO", defaultFileName, $"{defaultFileName}.bin"); + FilePath = Path.Combine(Options.Dumping.DefaultOutputPath ?? "ISO", defaultFileName, $"{defaultFileName}.bin"); #endif - System = Options.DefaultSystem; + System = Options.Dumping.DefaultSystem; // Create state values string? result; @@ -55,7 +55,7 @@ namespace MPF.CLI.Features Console.WriteLine("-------------------------"); Console.WriteLine(); Console.WriteLine($"1) Set system (Currently '{System}')"); - Console.WriteLine($"2) Set dumping program (Currently '{Options.InternalProgram}')"); + Console.WriteLine($"2) Set dumping program (Currently '{Options.Dumping.InternalProgram}')"); Console.WriteLine($"3) Set media type (Currently '{MediaType}')"); Console.WriteLine($"4) Set device path (Currently '{DevicePath}')"); Console.WriteLine($"5) Set mounted path (Currently '{MountedPath}')"); @@ -128,7 +128,7 @@ namespace MPF.CLI.Features Console.WriteLine("Input the dumping program and press Enter:"); Console.Write("> "); result = Console.ReadLine(); - Options.InternalProgram = result.ToInternalProgram(); + Options.Dumping.InternalProgram = result.ToInternalProgram(); goto root; mediaType: diff --git a/MPF.CLI/Features/MainFeature.cs b/MPF.CLI/Features/MainFeature.cs index af3d78b9..62755472 100644 --- a/MPF.CLI/Features/MainFeature.cs +++ b/MPF.CLI/Features/MainFeature.cs @@ -75,7 +75,7 @@ namespace MPF.CLI.Features { // Use specific program if (UseInput.ProcessInput(args, ref index)) - Options.InternalProgram = UseInput.Value.ToInternalProgram(); + Options.Dumping.InternalProgram = UseInput.Value.ToInternalProgram(); // Set a media type else if (MediaTypeInput.ProcessInput(args, ref index)) diff --git a/MPF.Check/Features/BaseFeature.cs b/MPF.Check/Features/BaseFeature.cs index a1380f15..55ad8d7c 100644 --- a/MPF.Check/Features/BaseFeature.cs +++ b/MPF.Check/Features/BaseFeature.cs @@ -18,7 +18,7 @@ namespace MPF.Check.Features /// /// User-defined options /// - public Options Options { get; protected set; } + public SegmentedOptions Options { get; protected set; } /// /// Currently-selected system @@ -40,36 +40,34 @@ namespace MPF.Check.Features protected BaseFeature(string name, string[] flags, string description, string? detailed = null) : base(name, flags, description, detailed) { - Options = new Options() - { - // Internal Program - InternalProgram = InternalProgram.NONE, + Options = new SegmentedOptions(); - // UI Defaults - CheckForUpdatesOnStartup = false, + // Internal Program + Options.Dumping.InternalProgram = InternalProgram.NONE; - // Extra Dumping Options - ScanForProtection = false, - AddPlaceholders = true, - PullAllInformation = false, - AddFilenameSuffix = false, - OutputSubmissionJSON = false, - IncludeArtifacts = false, - CompressLogFiles = false, - LogCompression = LogCompression.DeflateMaximum, - DeleteUnnecessaryFiles = false, - CreateIRDAfterDumping = false, + // Protection Scanning Options + Options.Processing.ProtectionScanning.ScanForProtection = false; + Options.Processing.ProtectionScanning.ScanArchivesForProtection = true; + Options.Processing.ProtectionScanning.IncludeDebugProtectionInformation = false; + Options.Processing.ProtectionScanning.HideDriveLetters = false; - // Protection Scanning Options - ScanArchivesForProtection = true, - IncludeDebugProtectionInformation = false, - HideDriveLetters = false, + // Redump Login Information + Options.Processing.Login.RetrieveMatchInformation = true; + Options.Processing.Login.RedumpUsername = null; + Options.Processing.Login.RedumpPassword = null; - // Redump Login Information - RetrieveMatchInformation = true, - RedumpUsername = null, - RedumpPassword = null, - }; + // Media Information + Options.Processing.MediaInformation.AddPlaceholders = true; + Options.Processing.MediaInformation.PullAllInformation = false; + + // Post-Information Options + Options.Processing.AddFilenameSuffix = false; + Options.Processing.CreateIRDAfterDumping = false; + Options.Processing.OutputSubmissionJSON = false; + Options.Processing.IncludeArtifacts = false; + Options.Processing.CompressLogFiles = false; + Options.Processing.LogCompression = LogCompression.DeflateMaximum; + Options.Processing.DeleteUnnecessaryFiles = false; } /// @@ -86,18 +84,18 @@ namespace MPF.Check.Features Console.WriteLine($"Using system: {System.LongName()}"); // Validate a program is provided - if (Options.InternalProgram == InternalProgram.NONE) + if (Options.Dumping.InternalProgram == InternalProgram.NONE) { Console.Error.WriteLine("A program name needs to be provided"); return false; } // Validate the supplied credentials - if (Options.RetrieveMatchInformation - && !string.IsNullOrEmpty(Options.RedumpUsername) - && !string.IsNullOrEmpty(Options.RedumpPassword)) + if (Options.Processing.Login.RetrieveMatchInformation + && !string.IsNullOrEmpty(Options.Processing.Login.RedumpUsername) + && !string.IsNullOrEmpty(Options.Processing.Login.RedumpPassword)) { - bool? validated = RedumpClient.ValidateCredentials(Options.RedumpUsername!, Options.RedumpPassword!).GetAwaiter().GetResult(); + bool? validated = RedumpClient.ValidateCredentials(Options.Processing.Login.RedumpUsername!, Options.Processing.Login.RedumpPassword!).GetAwaiter().GetResult(); string message = validated switch { true => "Redump username and password accepted!", diff --git a/MPF.Check/Features/InteractiveFeature.cs b/MPF.Check/Features/InteractiveFeature.cs index d615381d..60e31f32 100644 --- a/MPF.Check/Features/InteractiveFeature.cs +++ b/MPF.Check/Features/InteractiveFeature.cs @@ -38,33 +38,34 @@ namespace MPF.Check.Features Options = OptionsLoader.LoadFromConfig(); if (Options.FirstRun) { - Options = new Options() - { - // Internal Program - InternalProgram = InternalProgram.NONE, + Options = new SegmentedOptions(); - // Extra Dumping Options - ScanForProtection = false, - AddPlaceholders = true, - PullAllInformation = false, - AddFilenameSuffix = false, - OutputSubmissionJSON = false, - IncludeArtifacts = false, - CompressLogFiles = false, - LogCompression = LogCompression.DeflateMaximum, - DeleteUnnecessaryFiles = false, - CreateIRDAfterDumping = false, + // Internal Program + Options.Dumping.InternalProgram = InternalProgram.NONE; - // Protection Scanning Options - ScanArchivesForProtection = true, - IncludeDebugProtectionInformation = false, - HideDriveLetters = false, + // Protection Scanning Options + Options.Processing.ProtectionScanning.ScanForProtection = false; + Options.Processing.ProtectionScanning.ScanArchivesForProtection = true; + Options.Processing.ProtectionScanning.IncludeDebugProtectionInformation = false; + Options.Processing.ProtectionScanning.HideDriveLetters = false; - // Redump Login Information - RetrieveMatchInformation = true, - RedumpUsername = null, - RedumpPassword = null, - }; + // Redump Login Information + Options.Processing.Login.RetrieveMatchInformation = true; + Options.Processing.Login.RedumpUsername = null; + Options.Processing.Login.RedumpPassword = null; + + // Media Information + Options.Processing.MediaInformation.AddPlaceholders = true; + Options.Processing.MediaInformation.PullAllInformation = false; + + // Post-Information Options + Options.Processing.AddFilenameSuffix = false; + Options.Processing.CreateIRDAfterDumping = false; + Options.Processing.OutputSubmissionJSON = false; + Options.Processing.IncludeArtifacts = false; + Options.Processing.CompressLogFiles = false; + Options.Processing.LogCompression = LogCompression.DeflateMaximum; + Options.Processing.DeleteUnnecessaryFiles = false; } // Create return values @@ -85,24 +86,24 @@ namespace MPF.Check.Features Console.WriteLine("-------------------------"); Console.WriteLine(); Console.WriteLine($"1) Set system (Currently '{System}')"); - Console.WriteLine($"2) Set dumping program (Currently '{Options.InternalProgram}')"); + Console.WriteLine($"2) Set dumping program (Currently '{Options.Dumping.InternalProgram}')"); Console.WriteLine($"3) Set seed path (Currently '{Seed}')"); - Console.WriteLine($"4) Add placeholders (Currently '{Options.AddPlaceholders}')"); - Console.WriteLine($"5) Create IRD (Currently '{Options.CreateIRDAfterDumping}')"); - Console.WriteLine($"6) Attempt Redump matches (Currently '{Options.RetrieveMatchInformation}')"); - Console.WriteLine($"7) Redump credentials (Currently '{Options.RedumpUsername}')"); - Console.WriteLine($"8) Pull all information (Currently '{Options.PullAllInformation}')"); + Console.WriteLine($"4) Add placeholders (Currently '{Options.Processing.MediaInformation.AddPlaceholders}')"); + Console.WriteLine($"5) Create IRD (Currently '{Options.Processing.CreateIRDAfterDumping}')"); + Console.WriteLine($"6) Attempt Redump matches (Currently '{Options.Processing.Login.RetrieveMatchInformation}')"); + Console.WriteLine($"7) Redump credentials (Currently '{Options.Processing.Login.RedumpUsername}')"); + Console.WriteLine($"8) Pull all information (Currently '{Options.Processing.MediaInformation.PullAllInformation}')"); Console.WriteLine($"9) Set device path (Currently '{DevicePath}')"); Console.WriteLine($"A) Scan for protection (Currently '{scan}')"); Console.WriteLine($"B) Scan archives for protection (Currently '{enableArchives}')"); Console.WriteLine($"C) Debug protection scan output (Currently '{enableDebug}')"); Console.WriteLine($"D) Hide drive letters in protection output (Currently '{hideDriveLetters}')"); - Console.WriteLine($"E) Hide filename suffix (Currently '{Options.AddFilenameSuffix}')"); - Console.WriteLine($"F) Output submission JSON (Currently '{Options.OutputSubmissionJSON}')"); - Console.WriteLine($"G) Include JSON artifacts (Currently '{Options.IncludeArtifacts}')"); - Console.WriteLine($"H) Compress logs (Currently '{Options.CompressLogFiles}')"); - Console.WriteLine($"I) Log compression (Currently '{Options.LogCompression.LongName()}')"); - Console.WriteLine($"J) Delete unnecessary files (Currently '{Options.DeleteUnnecessaryFiles}')"); + Console.WriteLine($"E) Hide filename suffix (Currently '{Options.Processing.AddFilenameSuffix}')"); + Console.WriteLine($"F) Output submission JSON (Currently '{Options.Processing.OutputSubmissionJSON}')"); + Console.WriteLine($"G) Include JSON artifacts (Currently '{Options.Processing.IncludeArtifacts}')"); + Console.WriteLine($"H) Compress logs (Currently '{Options.Processing.CompressLogFiles}')"); + Console.WriteLine($"I) Log compression (Currently '{Options.Processing.LogCompression.LongName()}')"); + Console.WriteLine($"J) Delete unnecessary files (Currently '{Options.Processing.DeleteUnnecessaryFiles}')"); Console.WriteLine(); Console.WriteLine($"Q) Exit the program"); Console.WriteLine($"X) Start checking"); @@ -118,18 +119,18 @@ namespace MPF.Check.Features case "3": goto seedPath; case "4": - Options.AddPlaceholders = !Options.AddPlaceholders; + Options.Processing.MediaInformation.AddPlaceholders = !Options.Processing.MediaInformation.AddPlaceholders; goto root; case "5": - Options.CreateIRDAfterDumping = !Options.CreateIRDAfterDumping; + Options.Processing.CreateIRDAfterDumping = !Options.Processing.CreateIRDAfterDumping; goto root; case "6": - Options.RetrieveMatchInformation = !Options.RetrieveMatchInformation; + Options.Processing.Login.RetrieveMatchInformation = !Options.Processing.Login.RetrieveMatchInformation; goto root; case "7": goto redumpCredentials; case "8": - Options.PullAllInformation = !Options.PullAllInformation; + Options.Processing.MediaInformation.PullAllInformation = !Options.Processing.MediaInformation.PullAllInformation; goto root; case "9": goto devicePath; @@ -151,26 +152,26 @@ namespace MPF.Check.Features goto root; case "e": case "E": - Options.AddFilenameSuffix = !Options.AddFilenameSuffix; + Options.Processing.AddFilenameSuffix = !Options.Processing.AddFilenameSuffix; goto root; case "f": case "F": - Options.OutputSubmissionJSON = !Options.OutputSubmissionJSON; + Options.Processing.OutputSubmissionJSON = !Options.Processing.OutputSubmissionJSON; goto root; case "g": case "G": - Options.IncludeArtifacts = !Options.IncludeArtifacts; + Options.Processing.IncludeArtifacts = !Options.Processing.IncludeArtifacts; goto root; case "h": case "H": - Options.CompressLogFiles = !Options.CompressLogFiles; + Options.Processing.CompressLogFiles = !Options.Processing.CompressLogFiles; goto root; case "i": case "I": goto logCompression; case "j": case "J": - Options.DeleteUnnecessaryFiles = !Options.DeleteUnnecessaryFiles; + Options.Processing.DeleteUnnecessaryFiles = !Options.Processing.DeleteUnnecessaryFiles; goto root; case "q": @@ -219,7 +220,7 @@ namespace MPF.Check.Features Console.WriteLine("Input the dumping program and press Enter:"); Console.Write("> "); result = Console.ReadLine(); - Options.InternalProgram = result.ToInternalProgram(); + Options.Dumping.InternalProgram = result.ToInternalProgram(); goto root; seedPath: @@ -234,18 +235,18 @@ namespace MPF.Check.Features Console.WriteLine(); Console.WriteLine("Enter your Redump username and press Enter:"); Console.Write("> "); - Options.RedumpUsername = Console.ReadLine(); + Options.Processing.Login.RedumpUsername = Console.ReadLine(); Console.WriteLine("Enter your Redump password (hidden) and press Enter:"); Console.Write("> "); - Options.RedumpPassword = string.Empty; + Options.Processing.Login.RedumpPassword = string.Empty; while (true) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.Enter) break; - Options.RedumpPassword += key.KeyChar; + Options.Processing.Login.RedumpPassword += key.KeyChar; } goto root; @@ -269,15 +270,15 @@ namespace MPF.Check.Features Console.WriteLine("Input the log compression type and press Enter:"); Console.Write("> "); result = Console.ReadLine(); - Options.LogCompression = result.ToLogCompression(); + Options.Processing.LogCompression = result.ToLogCompression(); goto root; exit: // Now deal with the complex options - Options.ScanForProtection = scan && !string.IsNullOrEmpty(DevicePath); - Options.ScanArchivesForProtection = enableArchives && scan && !string.IsNullOrEmpty(DevicePath); - Options.IncludeDebugProtectionInformation = enableDebug && scan && !string.IsNullOrEmpty(DevicePath); - Options.HideDriveLetters = hideDriveLetters && scan && !string.IsNullOrEmpty(DevicePath); + Options.Processing.ProtectionScanning.ScanForProtection = scan && !string.IsNullOrEmpty(DevicePath); + Options.Processing.ProtectionScanning.ScanArchivesForProtection = enableArchives && scan && !string.IsNullOrEmpty(DevicePath); + Options.Processing.ProtectionScanning.IncludeDebugProtectionInformation = enableDebug && scan && !string.IsNullOrEmpty(DevicePath); + Options.Processing.ProtectionScanning.HideDriveLetters = hideDriveLetters && scan && !string.IsNullOrEmpty(DevicePath); return true; } diff --git a/MPF.Check/Features/MainFeature.cs b/MPF.Check/Features/MainFeature.cs index ba0e120f..08124320 100644 --- a/MPF.Check/Features/MainFeature.cs +++ b/MPF.Check/Features/MainFeature.cs @@ -123,33 +123,34 @@ namespace MPF.Check.Features Options = OptionsLoader.LoadFromConfig(); if (Options.FirstRun) { - Options = new Options() - { - // Internal Program - InternalProgram = InternalProgram.NONE, + Options = new SegmentedOptions(); - // Extra Dumping Options - ScanForProtection = false, - AddPlaceholders = true, - PullAllInformation = false, - AddFilenameSuffix = false, - OutputSubmissionJSON = false, - IncludeArtifacts = false, - CompressLogFiles = false, - LogCompression = LogCompression.DeflateMaximum, - DeleteUnnecessaryFiles = false, - CreateIRDAfterDumping = false, + // Internal Program + Options.Dumping.InternalProgram = InternalProgram.NONE; - // Protection Scanning Options - ScanArchivesForProtection = true, - IncludeDebugProtectionInformation = false, - HideDriveLetters = false, + // Protection Scanning Options + Options.Processing.ProtectionScanning.ScanForProtection = false; + Options.Processing.ProtectionScanning.ScanArchivesForProtection = true; + Options.Processing.ProtectionScanning.IncludeDebugProtectionInformation = false; + Options.Processing.ProtectionScanning.HideDriveLetters = false; - // Redump Login Information - RetrieveMatchInformation = true, - RedumpUsername = null, - RedumpPassword = null, - }; + // Redump Login Information + Options.Processing.Login.RetrieveMatchInformation = true; + Options.Processing.Login.RedumpUsername = null; + Options.Processing.Login.RedumpPassword = null; + + // Media Information + Options.Processing.MediaInformation.AddPlaceholders = true; + Options.Processing.MediaInformation.PullAllInformation = false; + + // Post-Information Options + Options.Processing.AddFilenameSuffix = false; + Options.Processing.CreateIRDAfterDumping = false; + Options.Processing.OutputSubmissionJSON = false; + Options.Processing.IncludeArtifacts = false; + Options.Processing.CompressLogFiles = false; + Options.Processing.LogCompression = LogCompression.DeflateMaximum; + Options.Processing.DeleteUnnecessaryFiles = false; } else { @@ -164,7 +165,7 @@ namespace MPF.Check.Features { // Use specific program if (UseInput.ProcessInput(args, ref index)) - Options.InternalProgram = UseInput.Value.ToInternalProgram(); + Options.Dumping.InternalProgram = UseInput.Value.ToInternalProgram(); // Include seed info file else if (LoadSeedInput.ProcessInput(args, ref index)) @@ -172,45 +173,45 @@ namespace MPF.Check.Features // Disable placeholder values in submission info else if (NoPlaceholdersInput.ProcessInput(args, ref index)) - Options.AddPlaceholders = !Options.AddPlaceholders; + Options.Processing.MediaInformation.AddPlaceholders = !Options.Processing.MediaInformation.AddPlaceholders; // Create IRD from output files (PS3 only) else if (CreateIrdInput.ProcessInput(args, ref index)) - Options.CreateIRDAfterDumping = !Options.CreateIRDAfterDumping; + Options.Processing.CreateIRDAfterDumping = !Options.Processing.CreateIRDAfterDumping; // Set the log compression type (requires compression enabled) else if (LogCompressionInput.ProcessInput(args, ref index)) - Options.LogCompression = LogCompressionInput.Value.ToLogCompression(); + Options.Processing.LogCompression = LogCompressionInput.Value.ToLogCompression(); // Retrieve Redump match information else if (NoRetrieveInput.ProcessInput(args, ref index)) - Options.RetrieveMatchInformation = !Options.RetrieveMatchInformation; + Options.Processing.Login.RetrieveMatchInformation = !Options.Processing.Login.RetrieveMatchInformation; // Redump login else if (args[index].StartsWith("-c=") || args[index].StartsWith("--credentials=")) { string[] credentials = args[index].Split('=')[1].Split(';'); - Options.RedumpUsername = credentials[0]; - Options.RedumpPassword = credentials[1]; + Options.Processing.Login.RedumpUsername = credentials[0]; + Options.Processing.Login.RedumpPassword = credentials[1]; } else if (args[index] == "-c" || args[index] == "--credentials") { - Options.RedumpUsername = args[index + 1]; - Options.RedumpPassword = args[index + 2]; + Options.Processing.Login.RedumpUsername = args[index + 1]; + Options.Processing.Login.RedumpPassword = args[index + 2]; index += 2; } // Redump username else if (UsernameInput.ProcessInput(args, ref index)) - Options.RedumpUsername = UsernameInput.Value; + Options.Processing.Login.RedumpUsername = UsernameInput.Value; // Redump password else if (PasswordInput.ProcessInput(args, ref index)) - Options.RedumpPassword = PasswordInput.Value; + Options.Processing.Login.RedumpPassword = PasswordInput.Value; // Pull all information (requires Redump login) else if (PullAllInput.ProcessInput(args, ref index)) - Options.PullAllInformation = !Options.PullAllInformation; + Options.Processing.MediaInformation.PullAllInformation = !Options.Processing.MediaInformation.PullAllInformation; // Use a device path for physical checks else if (PathInput.ProcessInput(args, ref index)) @@ -234,23 +235,23 @@ namespace MPF.Check.Features // Add filename suffix else if (SuffixInput.ProcessInput(args, ref index)) - Options.AddFilenameSuffix = !Options.AddFilenameSuffix; + Options.Processing.AddFilenameSuffix = !Options.Processing.AddFilenameSuffix; // Output submission JSON else if (JsonInput.ProcessInput(args, ref index)) - Options.OutputSubmissionJSON = !Options.OutputSubmissionJSON; + Options.Processing.OutputSubmissionJSON = !Options.Processing.OutputSubmissionJSON; // Include JSON artifacts else if (IncludeArtifactsInput.ProcessInput(args, ref index)) - Options.IncludeArtifacts = !Options.IncludeArtifacts; + Options.Processing.IncludeArtifacts = !Options.Processing.IncludeArtifacts; // Compress log and extraneous files else if (ZipInput.ProcessInput(args, ref index)) - Options.CompressLogFiles = !Options.CompressLogFiles; + Options.Processing.CompressLogFiles = !Options.Processing.CompressLogFiles; // Delete unnecessary files else if (DeleteInput.ProcessInput(args, ref index)) - Options.DeleteUnnecessaryFiles = !Options.DeleteUnnecessaryFiles; + Options.Processing.DeleteUnnecessaryFiles = !Options.Processing.DeleteUnnecessaryFiles; // Default, add to inputs else @@ -258,10 +259,10 @@ namespace MPF.Check.Features } // Now deal with the complex options - Options.ScanForProtection = scan && !string.IsNullOrEmpty(DevicePath); - Options.ScanArchivesForProtection = enableArchives && scan && !string.IsNullOrEmpty(DevicePath); - Options.IncludeDebugProtectionInformation = enableDebug && scan && !string.IsNullOrEmpty(DevicePath); - Options.HideDriveLetters = hideDriveLetters && scan && !string.IsNullOrEmpty(DevicePath); + Options.Processing.ProtectionScanning.ScanForProtection = scan && !string.IsNullOrEmpty(DevicePath); + Options.Processing.ProtectionScanning.ScanArchivesForProtection = enableArchives && scan && !string.IsNullOrEmpty(DevicePath); + Options.Processing.ProtectionScanning.IncludeDebugProtectionInformation = enableDebug && scan && !string.IsNullOrEmpty(DevicePath); + Options.Processing.ProtectionScanning.HideDriveLetters = hideDriveLetters && scan && !string.IsNullOrEmpty(DevicePath); return true; } diff --git a/MPF.Frontend.Test/DumpEnvironmentTests.cs b/MPF.Frontend.Test/DumpEnvironmentTests.cs index 44569def..7efb19a4 100644 --- a/MPF.Frontend.Test/DumpEnvironmentTests.cs +++ b/MPF.Frontend.Test/DumpEnvironmentTests.cs @@ -13,9 +13,10 @@ namespace MPF.Frontend.Test [InlineData("fd A test.img", 'A', true, MediaType.FloppyDisk, true)] [InlineData("dvd X test.iso 8 /raw", 'X', false, MediaType.FloppyDisk, false)] [InlineData("stop D", 'D', false, MediaType.DVD, true)] - public void ParametersValidTest(string? parameters, char letter, bool isFloppy, MediaType? mediaType, bool expected) + public void ParametersValidSegmentedTest(string? parameters, char letter, bool isFloppy, MediaType? mediaType, bool expected) { - var options = new Options() { InternalProgram = InternalProgram.DiscImageCreator }; + var options = new SegmentedOptions(); + options.Dumping.InternalProgram = InternalProgram.DiscImageCreator; // TODO: This relies on creating real objects for the drive. Can we mock this out instead? var drive = isFloppy diff --git a/MPF.Frontend.Test/Tools/FrontendToolTests.cs b/MPF.Frontend.Test/Tools/FrontendToolTests.cs index b0b2e889..2f7c0004 100644 --- a/MPF.Frontend.Test/Tools/FrontendToolTests.cs +++ b/MPF.Frontend.Test/Tools/FrontendToolTests.cs @@ -19,15 +19,13 @@ namespace MPF.Frontend.Test.Tools [InlineData(MediaType.HDDVD, 24)] [InlineData(MediaType.BluRay, 16)] [InlineData(MediaType.NintendoWiiUOpticalDisc, 16)] - public void GetDefaultSpeedForMediaTypeTest(MediaType? mediaType, int expected) + public void GetDefaultSpeedForMediaTypeSegmentedTest(MediaType? mediaType, int expected) { - var options = new Options - { - PreferredDumpSpeedCD = 72, - PreferredDumpSpeedDVD = 24, - PreferredDumpSpeedHDDVD = 24, - PreferredDumpSpeedBD = 16, - }; + var options = new SegmentedOptions(); + options.Dumping.PreferredDumpSpeedCD = 72; + options.Dumping.PreferredDumpSpeedDVD = 24; + options.Dumping.PreferredDumpSpeedHDDVD = 24; + options.Dumping.PreferredDumpSpeedBD = 16; int actual = FrontendTool.GetDefaultSpeedForMediaType(mediaType, options); Assert.Equal(expected, actual); diff --git a/MPF.Frontend/DumpEnvironment.cs b/MPF.Frontend/DumpEnvironment.cs index a3193337..6c570ee1 100644 --- a/MPF.Frontend/DumpEnvironment.cs +++ b/MPF.Frontend/DumpEnvironment.cs @@ -47,9 +47,9 @@ namespace MPF.Frontend private readonly InternalProgram _internalProgram; /// - /// Options object representing user-defined options + /// SegmentedOptions object representing user-defined options /// - private readonly Options _options; + private readonly SegmentedOptions _options; /// /// Processor object representing how to process the outputs @@ -106,22 +106,22 @@ namespace MPF.Frontend /// /// /// - public DumpEnvironment(Options options, + public DumpEnvironment(SegmentedOptions options, string? outputPath, Drive? drive, RedumpSystem? system, InternalProgram? internalProgram) { // Set options object - _options = options; + _options = new SegmentedOptions(options); // Output paths OutputPath = FrontendTool.NormalizeOutputPaths(outputPath, false); // UI information _drive = drive; - _system = system ?? options.DefaultSystem; - _internalProgram = internalProgram ?? options.InternalProgram; + _system = system ?? options.Dumping.DefaultSystem; + _internalProgram = internalProgram ?? options.Dumping.InternalProgram; } #region Internal Program Management @@ -216,10 +216,10 @@ namespace MPF.Frontend #pragma warning disable IDE0072 _executionContext = _internalProgram switch { - InternalProgram.Aaru => new ExecutionContexts.Aaru.ExecutionContext(parameters) { ExecutablePath = _options.AaruPath }, - InternalProgram.DiscImageCreator => new ExecutionContexts.DiscImageCreator.ExecutionContext(parameters) { ExecutablePath = _options.DiscImageCreatorPath }, - // InternalProgram.Dreamdump => new ExecutionContexts.Dreamdump.ExecutionContext(parameters) { ExecutablePath = _options.DreamdumpPath }, - InternalProgram.Redumper => new ExecutionContexts.Redumper.ExecutionContext(parameters) { ExecutablePath = _options.RedumperPath }, + InternalProgram.Aaru => new ExecutionContexts.Aaru.ExecutionContext(parameters) { ExecutablePath = _options.Dumping.AaruPath }, + InternalProgram.DiscImageCreator => new ExecutionContexts.DiscImageCreator.ExecutionContext(parameters) { ExecutablePath = _options.Dumping.DiscImageCreatorPath }, + // InternalProgram.Dreamdump => new ExecutionContexts.Dreamdump.ExecutionContext(parameters) { ExecutablePath = _options.Dumping.DreamdumpPath }, + InternalProgram.Redumper => new ExecutionContexts.Redumper.ExecutionContext(parameters) { ExecutablePath = _options.Dumping.RedumperPath }, // If no dumping program found, set to null InternalProgram.NONE => null, @@ -284,10 +284,10 @@ namespace MPF.Frontend // Set the proper parameters _executionContext = _internalProgram switch { - InternalProgram.Aaru => new ExecutionContexts.Aaru.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings), - InternalProgram.DiscImageCreator => new ExecutionContexts.DiscImageCreator.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings), - // InternalProgram.Dreamdump => new ExecutionContexts.Dreamdump.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings), - InternalProgram.Redumper => new ExecutionContexts.Redumper.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings), + InternalProgram.Aaru => new ExecutionContexts.Aaru.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.ConvertToOptions().Settings), + InternalProgram.DiscImageCreator => new ExecutionContexts.DiscImageCreator.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.ConvertToOptions().Settings), + // InternalProgram.Dreamdump => new ExecutionContexts.Dreamdump.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.ConvertToOptions().Settings), + InternalProgram.Redumper => new ExecutionContexts.Redumper.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.ConvertToOptions().Settings), // If no dumping program found, set to null InternalProgram.NONE => null, @@ -554,7 +554,7 @@ namespace MPF.Frontend } // Get user-modifiable information if configured to - if (_options.PromptForDiscInformation && processUserInfo is not null) + if (_options.Processing.MediaInformation.PromptForDiscInformation && processUserInfo is not null) { resultProgress.Report(ResultEventArgs.Neutral("Waiting for additional media information...")); bool? filledInfo = processUserInfo.Invoke(_options, ref submissionInfo); @@ -571,14 +571,14 @@ namespace MPF.Frontend // Format the information for the text output resultProgress.Report(ResultEventArgs.Neutral("Formatting information...")); - var formattedValues = Formatter.FormatOutputData(submissionInfo, _options.EnableRedumpCompatibility, out string? formatResult); + var formattedValues = Formatter.FormatOutputData(submissionInfo, _options.Processing.MediaInformation.EnableRedumpCompatibility, out string? formatResult); if (formattedValues is null) resultProgress.Report(ResultEventArgs.Failure(formatResult)); else resultProgress.Report(ResultEventArgs.Success(formatResult)); // Get the filename suffix for auto-generated files - var filenameSuffix = _options.AddFilenameSuffix ? Path.GetFileNameWithoutExtension(outputFilename) : null; + var filenameSuffix = _options.Processing.AddFilenameSuffix ? Path.GetFileNameWithoutExtension(outputFilename) : null; // Write the text output resultProgress.Report(ResultEventArgs.Neutral("Writing submission information file...")); @@ -591,10 +591,10 @@ namespace MPF.Frontend // Write the copy protection output if (submissionInfo?.CopyProtection?.FullProtections is not null && submissionInfo.CopyProtection.FullProtections.Count > 0) { - if (_options.ScanForProtection) + if (_options.Processing.ProtectionScanning.ScanForProtection) { resultProgress.Report(ResultEventArgs.Neutral("Writing protection information file...")); - bool scanSuccess = WriteProtectionData(outputDirectory, filenameSuffix, submissionInfo, _options.HideDriveLetters); + bool scanSuccess = WriteProtectionData(outputDirectory, filenameSuffix, submissionInfo, _options.Processing.ProtectionScanning.HideDriveLetters); if (scanSuccess) resultProgress.Report(ResultEventArgs.Success("Writing complete!")); else @@ -603,10 +603,10 @@ namespace MPF.Frontend } // Write the JSON output, if required - if (_options.OutputSubmissionJSON) + if (_options.Processing.OutputSubmissionJSON) { - resultProgress.Report(ResultEventArgs.Neutral($"Writing submission information JSON file{(_options.IncludeArtifacts ? " with artifacts" : string.Empty)}...")); - bool jsonSuccess = WriteOutputData(outputDirectory, filenameSuffix, submissionInfo, _options.IncludeArtifacts); + resultProgress.Report(ResultEventArgs.Neutral($"Writing submission information JSON file{(_options.Processing.IncludeArtifacts ? " with artifacts" : string.Empty)}...")); + bool jsonSuccess = WriteOutputData(outputDirectory, filenameSuffix, submissionInfo, _options.Processing.IncludeArtifacts); if (jsonSuccess) resultProgress.Report(ResultEventArgs.Success("Writing complete!")); else @@ -614,7 +614,7 @@ namespace MPF.Frontend } // Compress the logs, if required - if (_options.CompressLogFiles) + if (_options.Processing.CompressLogFiles) { resultProgress.Report(ResultEventArgs.Neutral("Compressing log files...")); #if NET40 @@ -623,7 +623,7 @@ namespace MPF.Frontend await Task.Run(() => #endif { - bool compressSuccess = _processor.CompressLogFiles(mediaType, _options.LogCompression, outputDirectory, outputFilename, filenameSuffix, out string compressResult); + bool compressSuccess = _processor.CompressLogFiles(mediaType, _options.Processing.LogCompression, outputDirectory, outputFilename, filenameSuffix, out string compressResult); if (compressSuccess) resultProgress.Report(ResultEventArgs.Success(compressResult)); else @@ -634,7 +634,7 @@ namespace MPF.Frontend } // Delete unnecessary files, if required - if (_options.DeleteUnnecessaryFiles) + if (_options.Processing.DeleteUnnecessaryFiles) { resultProgress.Report(ResultEventArgs.Neutral("Deleting unnecessary files...")); bool deleteSuccess = _processor.DeleteUnnecessaryFiles(mediaType, outputDirectory, outputFilename, out string deleteResult); @@ -645,7 +645,7 @@ namespace MPF.Frontend } // Create PS3 IRD, if required - if (_options.CreateIRDAfterDumping && _system == RedumpSystem.SonyPlayStation3 && mediaType == MediaType.BluRay) + if (_options.Processing.CreateIRDAfterDumping && _system == RedumpSystem.SonyPlayStation3 && mediaType == MediaType.BluRay) { resultProgress.Report(ResultEventArgs.Neutral("Creating IRD... please wait!")); bool deleteSuccess = await IRDTool.WriteIRD(OutputPath, submissionInfo?.Extras?.DiscKey, submissionInfo?.Extras?.DiscID, submissionInfo?.Extras?.PIC, submissionInfo?.SizeAndChecksums.Layerbreak, submissionInfo?.SizeAndChecksums.CRC32); diff --git a/MPF.Frontend/EnumExtensions.cs b/MPF.Frontend/EnumExtensions.cs index 26446b6a..a98e4c0a 100644 --- a/MPF.Frontend/EnumExtensions.cs +++ b/MPF.Frontend/EnumExtensions.cs @@ -63,7 +63,34 @@ namespace MPF.Frontend } } + /// + /// Get the string representation of the DreamdumpSectorOrder enum values + /// + /// DreamdumpSectorOrder value to convert + /// String representing the value, if possible + public static string LongName(this DreamdumpSectorOrder order) + => ((DreamdumpSectorOrder?)order).LongName(); + /// + /// Get the string representation of the DreamdumpSectorOrder enum values + /// + /// DreamdumpSectorOrder value to convert + /// String representing the value, if possible + public static string LongName(this DreamdumpSectorOrder? order) + { + return order switch + { + DreamdumpSectorOrder.DATA_C2_SUB => "DATA_C2_SUB", + DreamdumpSectorOrder.DATA_SUB_C2 => "DATA_SUB_C2", + DreamdumpSectorOrder.DATA_SUB => "DATA_SUB", + DreamdumpSectorOrder.DATA_C2 => "DATA_C2", + + DreamdumpSectorOrder.NONE => "Default", + _ => "Unknown", + }; + } + + /// /// Get the string representation of the InterfaceLanguage enum values /// /// InterfaceLanguage value to convert diff --git a/MPF.Frontend/Features/ListConfigFeature.cs b/MPF.Frontend/Features/ListConfigFeature.cs index a9821e30..791861de 100644 --- a/MPF.Frontend/Features/ListConfigFeature.cs +++ b/MPF.Frontend/Features/ListConfigFeature.cs @@ -23,6 +23,7 @@ namespace MPF.Frontend.Features } /// + /// TODO: Restructure this to fit SegmentedOptions public override bool Execute() { // Try to load the current config @@ -35,110 +36,118 @@ namespace MPF.Frontend.Features // Paths Console.WriteLine("Paths:"); - Console.WriteLine($" Aaru Path = {options.AaruPath}"); - Console.WriteLine($" DiscImageCreator Path = {options.DiscImageCreatorPath}"); - Console.WriteLine($" Redumper Path = {options.RedumperPath}"); - Console.WriteLine($" Default Program = {options.InternalProgram.LongName()}"); + Console.WriteLine($" Aaru Path = {options.Dumping.AaruPath}"); + Console.WriteLine($" DiscImageCreator Path = {options.Dumping.DiscImageCreatorPath}"); + Console.WriteLine($" Dreamdump Path = {options.Dumping.DreamdumpPath}"); + Console.WriteLine($" Redumper Path = {options.Dumping.RedumperPath}"); + Console.WriteLine($" Default Program = {options.Dumping.InternalProgram.LongName()}"); Console.WriteLine(); // UI Defaults Console.WriteLine("UI Defaults:"); - Console.WriteLine($" Dark Mode = {options.EnableDarkMode}"); - Console.WriteLine($" Purp Mode = {options.EnablePurpMode}"); - Console.WriteLine($" Custom Background Color = {options.CustomBackgroundColor}"); - Console.WriteLine($" Custom Text Color = {options.CustomTextColor}"); + Console.WriteLine($" Dark Mode = {options.GUI.Theming.EnableDarkMode}"); + Console.WriteLine($" Purp Mode = {options.GUI.Theming.EnablePurpMode}"); + Console.WriteLine($" Custom Background Color = {options.GUI.Theming.CustomBackgroundColor}"); + Console.WriteLine($" Custom Text Color = {options.GUI.Theming.CustomTextColor}"); Console.WriteLine($" Check for Updates on Startup = {options.CheckForUpdatesOnStartup}"); - Console.WriteLine($" Copy Update URL to Clipboard = {options.CopyUpdateUrlToClipboard}"); - Console.WriteLine($" Fast Label Update = {options.FastUpdateLabel}"); - Console.WriteLine($" Default Interface Language = {options.DefaultInterfaceLanguage.LongName()}"); - Console.WriteLine($" Default Output Path = {options.DefaultOutputPath}"); - Console.WriteLine($" Default System = {options.DefaultSystem.LongName()}"); - Console.WriteLine($" Show Debug Menu Item = {options.ShowDebugViewMenuItem}"); + Console.WriteLine($" Copy Update URL to Clipboard = {options.GUI.CopyUpdateUrlToClipboard}"); + Console.WriteLine($" Fast Label Update = {options.GUI.FastUpdateLabel}"); + Console.WriteLine($" Default Interface Language = {options.GUI.DefaultInterfaceLanguage.LongName()}"); + Console.WriteLine($" Default Output Path = {options.Dumping.DefaultOutputPath}"); + Console.WriteLine($" Default System = {options.Dumping.DefaultSystem.LongName()}"); + Console.WriteLine($" Show Debug Menu Item = {options.GUI.ShowDebugViewMenuItem}"); Console.WriteLine(); // Dumping Speeds Console.WriteLine("Dumping Speeds:"); - Console.WriteLine($" Default CD Speed = {options.PreferredDumpSpeedCD}"); - Console.WriteLine($" Default DVD Speed = {options.PreferredDumpSpeedDVD}"); - Console.WriteLine($" Default HD-DVD Speed = {options.PreferredDumpSpeedHDDVD}"); - Console.WriteLine($" Default Blu-ray Speed = {options.PreferredDumpSpeedBD}"); + Console.WriteLine($" Default CD Speed = {options.Dumping.PreferredDumpSpeedCD}"); + Console.WriteLine($" Default DVD Speed = {options.Dumping.PreferredDumpSpeedDVD}"); + Console.WriteLine($" Default HD-DVD Speed = {options.Dumping.PreferredDumpSpeedHDDVD}"); + Console.WriteLine($" Default Blu-ray Speed = {options.Dumping.PreferredDumpSpeedBD}"); Console.WriteLine(); // Aaru Console.WriteLine("Aaru-Specific Options:"); - Console.WriteLine($" Enable Debug = {options.AaruEnableDebug}"); - Console.WriteLine($" Enable Verbose = {options.AaruEnableVerbose}"); - Console.WriteLine($" Force Dumping = {options.AaruForceDumping}"); - Console.WriteLine($" Reread Count = {options.AaruRereadCount}"); - Console.WriteLine($" Strip Personal Data = {options.AaruStripPersonalData}"); + Console.WriteLine($" Enable Debug = {options.Dumping.Aaru.EnableDebug}"); + Console.WriteLine($" Enable Verbose = {options.Dumping.Aaru.EnableVerbose}"); + Console.WriteLine($" Force Dumping = {options.Dumping.Aaru.ForceDumping}"); + Console.WriteLine($" Reread Count = {options.Dumping.Aaru.RereadCount}"); + Console.WriteLine($" Strip Personal Data = {options.Dumping.Aaru.StripPersonalData}"); Console.WriteLine(); // DiscImageCreator Console.WriteLine("DiscImageCreator-Specific Options:"); - Console.WriteLine($" Multi-Sector Read Flag = {options.DICMultiSectorRead}"); - Console.WriteLine($" Multi-Sector Read Value = {options.DICMultiSectorReadValue}"); - Console.WriteLine($" Overly-Secure Flags = {options.DICParanoidMode}"); - Console.WriteLine($" Quiet Flag = {options.DICQuietMode}"); - Console.WriteLine($" CD Reread Count = {options.DICRereadCount}"); - Console.WriteLine($" DVD Reread Count = {options.DICDVDRereadCount}"); - Console.WriteLine($" Use CMI Flag = {options.DICUseCMIFlag}"); + Console.WriteLine($" Multi-Sector Read Flag = {options.Dumping.DIC.MultiSectorRead}"); + Console.WriteLine($" Multi-Sector Read Value = {options.Dumping.DIC.MultiSectorReadValue}"); + Console.WriteLine($" Overly-Secure Flags = {options.Dumping.DIC.ParanoidMode}"); + Console.WriteLine($" Quiet Flag = {options.Dumping.DIC.QuietMode}"); + Console.WriteLine($" CD Reread Count = {options.Dumping.DIC.RereadCount}"); + Console.WriteLine($" DVD Reread Count = {options.Dumping.DIC.DVDRereadCount}"); + Console.WriteLine($" Use CMI Flag = {options.Dumping.DIC.UseCMIFlag}"); + Console.WriteLine(); + + // Dreamdump + Console.WriteLine("Dreamdump-Specific Options:"); + Console.WriteLine($" Non-Redump Mode = {options.Dumping.Dreamdump.NonRedumpMode}"); + Console.WriteLine($" Sector Order = {options.Dumping.Dreamdump.SectorOrder.LongName()}"); + Console.WriteLine($" Reread Count = {options.Dumping.Dreamdump.RereadCount}"); Console.WriteLine(); // Redumper Console.WriteLine("Redumper-Specific Options:"); - Console.WriteLine($" Enable Skeleton = {options.RedumperEnableSkeleton}"); - Console.WriteLine($" Enable Verbose = {options.RedumperEnableVerbose}"); - Console.WriteLine($" Lead-in Retry Count = {options.RedumperLeadinRetryCount}"); - Console.WriteLine($" Non-Redump Mode = {options.RedumperNonRedumpMode}"); - Console.WriteLine($" Drive Type = {options.RedumperDriveType.LongName()}"); - Console.WriteLine($" Read Method = {options.RedumperReadMethod.LongName()}"); - Console.WriteLine($" Sector Order = {options.RedumperSectorOrder.LongName()}"); - Console.WriteLine($" Reread Count = {options.RedumperRereadCount}"); - Console.WriteLine($" Refine Sector Mode = {options.RedumperRefineSectorMode}"); + Console.WriteLine($" Enable Skeleton = {options.Dumping.Redumper.EnableSkeleton}"); + Console.WriteLine($" Enable Verbose = {options.Dumping.Redumper.EnableVerbose}"); + Console.WriteLine($" Lead-in Retry Count = {options.Dumping.Redumper.LeadinRetryCount}"); + Console.WriteLine($" Non-Redump Mode = {options.Dumping.Redumper.NonRedumpMode}"); + Console.WriteLine($" Drive Type = {options.Dumping.Redumper.DriveType.LongName()}"); + Console.WriteLine($" Read Method = {options.Dumping.Redumper.ReadMethod.LongName()}"); + Console.WriteLine($" Sector Order = {options.Dumping.Redumper.SectorOrder.LongName()}"); + Console.WriteLine($" Reread Count = {options.Dumping.Redumper.RereadCount}"); + Console.WriteLine($" Refine Sector Mode = {options.Dumping.Redumper.RefineSectorMode}"); Console.WriteLine(); // Extra Dumping Options Console.WriteLine("Extra Dumping Options:"); - Console.WriteLine($" Scan for Protection = {options.ScanForProtection}"); - Console.WriteLine($" Add Placeholders = {options.AddPlaceholders}"); - Console.WriteLine($" Prompt for Media Information = {options.PromptForDiscInformation}"); - Console.WriteLine($" Pull All Information = {options.PullAllInformation}"); - Console.WriteLine($" Enable Tabs in Input Fields = {options.EnableTabsInInputFields}"); - Console.WriteLine($" Enable Redump Compatibility = {options.EnableRedumpCompatibility}"); - Console.WriteLine($" Show Disc Eject Reminder = {options.ShowDiscEjectReminder}"); - Console.WriteLine($" Ignore Fixed Drives = {options.IgnoreFixedDrives}"); - Console.WriteLine($" Add Filename Suffix = {options.AddFilenameSuffix}"); - Console.WriteLine($" Output Submission JSON = {options.OutputSubmissionJSON}"); - Console.WriteLine($" Include Artifacts = {options.IncludeArtifacts}"); - Console.WriteLine($" Compress Log Files = {options.CompressLogFiles}"); - Console.WriteLine($" Log Compression = {options.LogCompression.LongName()}"); - Console.WriteLine($" Delete Unnecessary Files = {options.DeleteUnnecessaryFiles}"); - Console.WriteLine($" Create IRD After Dumping = {options.CreateIRDAfterDumping}"); + Console.WriteLine($" Scan for Protection = {options.Processing.ProtectionScanning.ScanForProtection}"); + Console.WriteLine($" Add Placeholders = {options.Processing.MediaInformation.AddPlaceholders}"); + Console.WriteLine($" Prompt for Media Information = {options.Processing.MediaInformation.PromptForDiscInformation}"); + Console.WriteLine($" Pull All Information = {options.Processing.MediaInformation.PullAllInformation}"); + Console.WriteLine($" Enable Tabs in Input Fields = {options.Processing.MediaInformation.EnableTabsInInputFields}"); + Console.WriteLine($" Enable Redump Compatibility = {options.Processing.MediaInformation.EnableRedumpCompatibility}"); + Console.WriteLine($" Show Disc Eject Reminder = {options.Processing.ShowDiscEjectReminder}"); + Console.WriteLine($" Ignore Fixed Drives = {options.GUI.IgnoreFixedDrives}"); + Console.WriteLine($" Add Filename Suffix = {options.Processing.AddFilenameSuffix}"); + Console.WriteLine($" Output Submission JSON = {options.Processing.OutputSubmissionJSON}"); + Console.WriteLine($" Include Artifacts = {options.Processing.IncludeArtifacts}"); + Console.WriteLine($" Compress Log Files = {options.Processing.CompressLogFiles}"); + Console.WriteLine($" Log Compression = {options.Processing.LogCompression.LongName()}"); + Console.WriteLine($" Delete Unnecessary Files = {options.Processing.DeleteUnnecessaryFiles}"); + Console.WriteLine($" Create IRD After Dumping = {options.Processing.CreateIRDAfterDumping}"); Console.WriteLine(); // Skip Options Console.WriteLine("Skip Options:"); - Console.WriteLine($" Skip System Detection = {options.SkipSystemDetection}"); + Console.WriteLine($" Skip System Detection = {options.GUI.SkipSystemDetection}"); Console.WriteLine(); // Protection Scanning Options Console.WriteLine("Protection Scanning Options:"); - Console.WriteLine($" Scan Archives for Protection = {options.ScanArchivesForProtection}"); - Console.WriteLine($" Include Debug Protection Information = {options.IncludeDebugProtectionInformation}"); - Console.WriteLine($" Hide Drive Letters = {options.HideDriveLetters}"); + Console.WriteLine($" Scan Archives for Protection = {options.Processing.ProtectionScanning.ScanArchivesForProtection}"); + Console.WriteLine($" Include Debug Protection Information = {options.Processing.ProtectionScanning.IncludeDebugProtectionInformation}"); + Console.WriteLine($" Hide Drive Letters = {options.Processing.ProtectionScanning.HideDriveLetters}"); Console.WriteLine(); // Logging Options Console.WriteLine("Logging Options:"); Console.WriteLine($" Verbose Logging = {options.VerboseLogging}"); - Console.WriteLine($" Open Log Window at Startup = {options.OpenLogWindowAtStartup}"); + Console.WriteLine($" Open Log Window at Startup = {options.GUI.OpenLogWindowAtStartup}"); Console.WriteLine(); // Redump Login Information Console.WriteLine("Redump Login Information:"); - Console.WriteLine($" Retrieve Match Information = {options.RetrieveMatchInformation}"); - Console.WriteLine($" Redump Username = {options.RedumpUsername}"); - Console.WriteLine($" Redump Password = {(string.IsNullOrEmpty(options.RedumpPassword) ? "[UNSET]" : "[SET]")}"); + Console.WriteLine($" Retrieve Match Information = {options.Processing.Login.RetrieveMatchInformation}"); + Console.WriteLine($" Redump Username = {options.Processing.Login.RedumpUsername}"); + Console.WriteLine($" Redump Password = {(string.IsNullOrEmpty(options.Processing.Login.RedumpPassword) ? "[UNSET]" : "[SET]")}"); Console.WriteLine(); return true; diff --git a/MPF.Frontend/ProcessUserInfoDelegate.cs b/MPF.Frontend/ProcessUserInfoDelegate.cs index aa448e5f..e01254a8 100644 --- a/MPF.Frontend/ProcessUserInfoDelegate.cs +++ b/MPF.Frontend/ProcessUserInfoDelegate.cs @@ -5,8 +5,8 @@ namespace MPF.Frontend /// /// Determines how user information is processed, if at all /// - /// Options set that may impact processing + /// SegmentedOptions set that may impact processing /// Submission info that may be overwritten /// True for successful updating, false or null otherwise - public delegate bool? ProcessUserInfoDelegate(Options? options, ref SubmissionInfo? info); + public delegate bool? ProcessUserInfoDelegate(SegmentedOptions? options, ref SubmissionInfo? info); } diff --git a/MPF.Frontend/SegmentedOptions.cs b/MPF.Frontend/SegmentedOptions.cs index 127a5f25..9eb9e021 100644 --- a/MPF.Frontend/SegmentedOptions.cs +++ b/MPF.Frontend/SegmentedOptions.cs @@ -154,6 +154,100 @@ namespace MPF.Frontend Processing.DeleteUnnecessaryFiles = source.DeleteUnnecessaryFiles; } + /// + /// Constructor that converts from an existing SegmentedOptions object + /// + /// SegmentedOptions object to read from + public SegmentedOptions(SegmentedOptions? source) + { + source ??= new SegmentedOptions(); + + FirstRun = source.FirstRun; + CheckForUpdatesOnStartup = source.CheckForUpdatesOnStartup; + VerboseLogging = source.VerboseLogging; + + GUI.CopyUpdateUrlToClipboard = source.GUI.CopyUpdateUrlToClipboard; + + GUI.DefaultInterfaceLanguage = source.GUI.DefaultInterfaceLanguage; + GUI.ShowDebugViewMenuItem = source.GUI.ShowDebugViewMenuItem; + GUI.OpenLogWindowAtStartup = source.GUI.OpenLogWindowAtStartup; + GUI.Theming.EnableDarkMode = source.GUI.Theming.EnableDarkMode; + GUI.Theming.EnablePurpMode = source.GUI.Theming.EnablePurpMode; + GUI.Theming.CustomBackgroundColor = source.GUI.Theming.CustomBackgroundColor; + GUI.Theming.CustomTextColor = source.GUI.Theming.CustomTextColor; + + GUI.FastUpdateLabel = source.GUI.FastUpdateLabel; + GUI.IgnoreFixedDrives = source.GUI.IgnoreFixedDrives; + GUI.SkipSystemDetection = source.GUI.SkipSystemDetection; + + Dumping.AaruPath = source.Dumping.AaruPath; + Dumping.DiscImageCreatorPath = source.Dumping.DiscImageCreatorPath; + Dumping.DreamdumpPath = source.Dumping.DreamdumpPath; + Dumping.RedumperPath = source.Dumping.RedumperPath; + Dumping.InternalProgram = source.Dumping.InternalProgram; + + Dumping.DefaultOutputPath = source.Dumping.DefaultOutputPath; + Dumping.DefaultSystem = source.Dumping.DefaultSystem; + + Dumping.PreferredDumpSpeedCD = source.Dumping.PreferredDumpSpeedCD; + Dumping.PreferredDumpSpeedDVD = source.Dumping.PreferredDumpSpeedDVD; + Dumping.PreferredDumpSpeedHDDVD = source.Dumping.PreferredDumpSpeedHDDVD; + Dumping.PreferredDumpSpeedBD = source.Dumping.PreferredDumpSpeedBD; + + Dumping.Aaru.EnableDebug = source.Dumping.Aaru.EnableDebug; + Dumping.Aaru.EnableVerbose = source.Dumping.Aaru.EnableVerbose; + Dumping.Aaru.ForceDumping = source.Dumping.Aaru.ForceDumping; + Dumping.Aaru.RereadCount = source.Dumping.Aaru.RereadCount; + Dumping.Aaru.StripPersonalData = source.Dumping.Aaru.StripPersonalData; + + Dumping.DIC.MultiSectorRead = source.Dumping.DIC.MultiSectorRead; + Dumping.DIC.MultiSectorReadValue = source.Dumping.DIC.MultiSectorReadValue; + Dumping.DIC.ParanoidMode = source.Dumping.DIC.ParanoidMode; + Dumping.DIC.QuietMode = source.Dumping.DIC.QuietMode; + Dumping.DIC.RereadCount = source.Dumping.DIC.RereadCount; + Dumping.DIC.DVDRereadCount = source.Dumping.DIC.DVDRereadCount; + Dumping.DIC.UseCMIFlag = source.Dumping.DIC.UseCMIFlag; + + Dumping.Dreamdump.NonRedumpMode = source.Dumping.Dreamdump.NonRedumpMode; + Dumping.Dreamdump.SectorOrder = source.Dumping.Dreamdump.SectorOrder; + Dumping.Dreamdump.RereadCount = source.Dumping.Dreamdump.RereadCount; + + Dumping.Redumper.EnableSkeleton = source.Dumping.Redumper.EnableSkeleton; + Dumping.Redumper.EnableVerbose = source.Dumping.Redumper.EnableVerbose; + Dumping.Redumper.LeadinRetryCount = source.Dumping.Redumper.LeadinRetryCount; + Dumping.Redumper.NonRedumpMode = source.Dumping.Redumper.NonRedumpMode; + Dumping.Redumper.DriveType = source.Dumping.Redumper.DriveType; + Dumping.Redumper.DrivePregapStart = source.Dumping.Redumper.DrivePregapStart; + Dumping.Redumper.ReadMethod = source.Dumping.Redumper.ReadMethod; + Dumping.Redumper.SectorOrder = source.Dumping.Redumper.SectorOrder; + Dumping.Redumper.RereadCount = source.Dumping.Redumper.RereadCount; + Dumping.Redumper.RefineSectorMode = source.Dumping.Redumper.RefineSectorMode; + + Processing.ProtectionScanning.ScanForProtection = source.Processing.ProtectionScanning.ScanForProtection; + Processing.ProtectionScanning.ScanArchivesForProtection = source.Processing.ProtectionScanning.ScanArchivesForProtection; + Processing.ProtectionScanning.IncludeDebugProtectionInformation = source.Processing.ProtectionScanning.IncludeDebugProtectionInformation; + Processing.ProtectionScanning.HideDriveLetters = source.Processing.ProtectionScanning.HideDriveLetters; + + Processing.Login.RetrieveMatchInformation = source.Processing.Login.RetrieveMatchInformation; + Processing.Login.RedumpUsername = source.Processing.Login.RedumpUsername; + Processing.Login.RedumpPassword = source.Processing.Login.RedumpPassword; + + Processing.MediaInformation.AddPlaceholders = source.Processing.MediaInformation.AddPlaceholders; + Processing.MediaInformation.PromptForDiscInformation = source.Processing.MediaInformation.PromptForDiscInformation; + Processing.MediaInformation.PullAllInformation = source.Processing.MediaInformation.PullAllInformation; + Processing.MediaInformation.EnableTabsInInputFields = source.Processing.MediaInformation.EnableTabsInInputFields; + Processing.MediaInformation.EnableRedumpCompatibility = source.Processing.MediaInformation.EnableRedumpCompatibility; + + Processing.ShowDiscEjectReminder = source.Processing.ShowDiscEjectReminder; + Processing.AddFilenameSuffix = source.Processing.AddFilenameSuffix; + Processing.CreateIRDAfterDumping = source.Processing.CreateIRDAfterDumping; + Processing.OutputSubmissionJSON = source.Processing.OutputSubmissionJSON; + Processing.IncludeArtifacts = source.Processing.IncludeArtifacts; + Processing.CompressLogFiles = source.Processing.CompressLogFiles; + Processing.LogCompression = source.Processing.LogCompression; + Processing.DeleteUnnecessaryFiles = source.Processing.DeleteUnnecessaryFiles; + } + /// /// Convert to an Options object /// diff --git a/MPF.Frontend/Tools/FrontendTool.cs b/MPF.Frontend/Tools/FrontendTool.cs index 366056d4..62c33390 100644 --- a/MPF.Frontend/Tools/FrontendTool.cs +++ b/MPF.Frontend/Tools/FrontendTool.cs @@ -14,29 +14,29 @@ namespace MPF.Frontend.Tools /// /// Get the default speed for a given media type from the supplied options /// - public static int GetDefaultSpeedForMediaType(MediaType? mediaType, Options options) + public static int GetDefaultSpeedForMediaType(MediaType? mediaType, SegmentedOptions options) { #pragma warning disable IDE0072 return mediaType switch { // CD dump speed - MediaType.CDROM => options.PreferredDumpSpeedCD, - MediaType.GDROM => options.PreferredDumpSpeedCD, + MediaType.CDROM => options.Dumping.PreferredDumpSpeedCD, + MediaType.GDROM => options.Dumping.PreferredDumpSpeedCD, // DVD dump speed - MediaType.DVD => options.PreferredDumpSpeedDVD, - MediaType.NintendoGameCubeGameDisc => options.PreferredDumpSpeedDVD, - MediaType.NintendoWiiOpticalDisc => options.PreferredDumpSpeedDVD, + MediaType.DVD => options.Dumping.PreferredDumpSpeedDVD, + MediaType.NintendoGameCubeGameDisc => options.Dumping.PreferredDumpSpeedDVD, + MediaType.NintendoWiiOpticalDisc => options.Dumping.PreferredDumpSpeedDVD, // HD-DVD dump speed - MediaType.HDDVD => options.PreferredDumpSpeedHDDVD, + MediaType.HDDVD => options.Dumping.PreferredDumpSpeedHDDVD, // BD dump speed - MediaType.BluRay => options.PreferredDumpSpeedBD, - MediaType.NintendoWiiUOpticalDisc => options.PreferredDumpSpeedBD, + MediaType.BluRay => options.Dumping.PreferredDumpSpeedBD, + MediaType.NintendoWiiUOpticalDisc => options.Dumping.PreferredDumpSpeedBD, // Default - _ => options.PreferredDumpSpeedCD, + _ => options.Dumping.PreferredDumpSpeedCD, }; #pragma warning restore IDE0072 } diff --git a/MPF.Frontend/Tools/OptionsLoader.cs b/MPF.Frontend/Tools/OptionsLoader.cs index 8478343e..0ff27f84 100644 --- a/MPF.Frontend/Tools/OptionsLoader.cs +++ b/MPF.Frontend/Tools/OptionsLoader.cs @@ -182,28 +182,28 @@ namespace MPF.Frontend.Tools /// /// Load the current set of options from the application configuration /// - public static Options LoadFromConfig() + public static SegmentedOptions LoadFromConfig() { // If no options path can be found if (string.IsNullOrEmpty(ConfigurationPath)) - return new Options(); + return new SegmentedOptions(); // If the file does not exist if (!File.Exists(ConfigurationPath) || new FileInfo(ConfigurationPath).Length == 0) - return new Options(); + return new SegmentedOptions(); var serializer = JsonSerializer.Create(); var stream = File.Open(ConfigurationPath, FileMode.Open, FileAccess.Read, FileShare.None); using var reader = new StreamReader(stream); var settings = serializer.Deserialize(reader, typeof(Dictionary)) as Dictionary; - return new Options(settings); + return new SegmentedOptions(new Options(settings)); } /// /// Load the current set of options from the application configuration /// - public static SegmentedOptions LoadFromConfigSegmented() + public static SegmentedOptions LoadFromConfigNative() { // If no options path can be found if (string.IsNullOrEmpty(ConfigurationPath)) diff --git a/MPF.Frontend/Tools/ProtectionTool.cs b/MPF.Frontend/Tools/ProtectionTool.cs index 6119e4d8..735422fe 100644 --- a/MPF.Frontend/Tools/ProtectionTool.cs +++ b/MPF.Frontend/Tools/ProtectionTool.cs @@ -73,11 +73,11 @@ namespace MPF.Frontend.Tools /// /// Base output image path /// Drive object representing the current drive - /// Options object that determines what to scan + /// SegmentedOptions object that determines what to scan /// Optional progress callback public static async Task>> RunCombinedProtectionScans(string basePath, Drive? drive, - Options options, + SegmentedOptions options, IProgress? protectionProgress = null) { // Setup the output protections dictionary @@ -137,11 +137,11 @@ namespace MPF.Frontend.Tools /// Run protection scan on a given path /// /// Path to scan for protection - /// Options object that determines what to scan + /// SegmentedOptions object that determines what to scan /// Optional progress callback /// Set of all detected copy protections with an optional error string public static async Task>> RunProtectionScanOnPath(string path, - Options options, + SegmentedOptions options, IProgress? progress = null) { #if NET40 @@ -151,11 +151,11 @@ namespace MPF.Frontend.Tools #endif { var scanner = new Scanner( - options.ScanArchivesForProtection, + options.Processing.ProtectionScanning.ScanArchivesForProtection, scanContents: true, // Hardcoded value to avoid issues scanPaths: true, // Hardcoded value to avoid issues scanSubdirectories: true, // Hardcoded value to avoid issues - options.IncludeDebugProtectionInformation, + options.Processing.ProtectionScanning.IncludeDebugProtectionInformation, progress); return scanner.GetProtections(path); @@ -173,11 +173,11 @@ namespace MPF.Frontend.Tools /// Run protection scan on a disc image /// /// Image path to scan for protection - /// Options object that determines what to scan + /// SegmentedOptions object that determines what to scan /// Optional progress callback /// Set of all detected copy protections with an optional error string public static async Task>> RunProtectionScanOnImage(string image, - Options options, + SegmentedOptions options, IProgress? progress = null) { #if NET40 @@ -191,7 +191,7 @@ namespace MPF.Frontend.Tools scanContents: false, // Disabled for image scanning scanPaths: false, // Disabled for image scanning scanSubdirectories: false, // Disabled for image scanning - options.IncludeDebugProtectionInformation, + options.Processing.ProtectionScanning.IncludeDebugProtectionInformation, progress); return scanner.GetProtections(image); diff --git a/MPF.Frontend/Tools/SubmissionGenerator.cs b/MPF.Frontend/Tools/SubmissionGenerator.cs index 25d4c1fa..3ab404b6 100644 --- a/MPF.Frontend/Tools/SubmissionGenerator.cs +++ b/MPF.Frontend/Tools/SubmissionGenerator.cs @@ -37,7 +37,7 @@ namespace MPF.Frontend.Tools /// Drive object representing the current drive /// Currently selected system /// Currently selected media type - /// Options object representing user-defined options + /// SegmentedOptions object representing user-defined options /// Processor object representing how to process the outputs /// Optional result progress callback /// Optional protection progress callback @@ -47,7 +47,7 @@ namespace MPF.Frontend.Tools Drive? drive, RedumpSystem? system, MediaType? mediaType, - Options options, + SegmentedOptions options, BaseProcessor processor, IProgress? resultProgress = null, IProgress? protectionProgress = null) @@ -86,11 +86,11 @@ namespace MPF.Frontend.Tools basePath = Path.Combine(outputDirectory, basePath); // Create the default submission info - SubmissionInfo info = CreateDefaultSubmissionInfo(processor, system, mediaType, options.AddPlaceholders); + SubmissionInfo info = CreateDefaultSubmissionInfo(processor, system, mediaType, options.Processing.MediaInformation.AddPlaceholders); // Get specific tool output handling - processor.GenerateSubmissionInfo(info, mediaType, basePath, options.EnableRedumpCompatibility); - if (options.IncludeArtifacts) + processor.GenerateSubmissionInfo(info, mediaType, basePath, options.Processing.MediaInformation.EnableRedumpCompatibility); + if (options.Processing.IncludeArtifacts) info.Artifacts = processor.GenerateArtifacts(mediaType, outputDirectory, outputFilename); // Get a list of matching IDs for each line in the DAT @@ -113,10 +113,10 @@ namespace MPF.Frontend.Tools info.CommonDiscInfo.CommentsSpecialFields[SiteCode.VolumeLabel] = volLabels; // Extract info based generically on MediaType - ProcessMediaType(info, mediaType, options.AddPlaceholders); + ProcessMediaType(info, mediaType, options.Processing.MediaInformation.AddPlaceholders); // Extract info based specifically on RedumpSystem - ProcessSystem(info, system, drive, options.AddPlaceholders, processor is DiscImageCreator, basePath); + ProcessSystem(info, system, drive, options.Processing.MediaInformation.AddPlaceholders, processor is DiscImageCreator, basePath); // Run anti-modchip check, if necessary if (drive is not null && system.SupportsAntiModchipScans() && info.CopyProtection.AntiModchip == YesNo.NULL) @@ -134,7 +134,7 @@ namespace MPF.Frontend.Tools try { Dictionary>? protections = null; - if (options.ScanForProtection) + if (options.Processing.ProtectionScanning.ScanForProtection) { // Explicitly note missing/invalid device paths if (drive?.Name is null) @@ -157,13 +157,13 @@ namespace MPF.Frontend.Tools // Set fields that may have automatic filling otherwise info.CommonDiscInfo.Category ??= DiscCategory.Games; - info.VersionAndEditions.Version ??= options.AddPlaceholders ? RequiredIfExistsValue : string.Empty; + info.VersionAndEditions.Version ??= options.Processing.MediaInformation.AddPlaceholders ? RequiredIfExistsValue : string.Empty; // Comments and contents have odd handling if (string.IsNullOrEmpty(info.CommonDiscInfo.Comments)) - info.CommonDiscInfo.Comments = options.AddPlaceholders ? OptionalValue : string.Empty; + info.CommonDiscInfo.Comments = options.Processing.MediaInformation.AddPlaceholders ? OptionalValue : string.Empty; if (string.IsNullOrEmpty(info.CommonDiscInfo.Contents)) - info.CommonDiscInfo.Contents = options.AddPlaceholders ? OptionalValue : string.Empty; + info.CommonDiscInfo.Contents = options.Processing.MediaInformation.AddPlaceholders ? OptionalValue : string.Empty; // Normalize the disc type with all current information Validator.NormalizeDiscType(info); @@ -174,26 +174,26 @@ namespace MPF.Frontend.Tools /// /// Fill in a SubmissionInfo object from Redump, if possible /// - /// Options object representing user-defined options + /// SegmentedOptions object representing user-defined options /// Existing SubmissionInfo object to fill /// Optional result progress callback - public static async Task FillFromRedump(Options options, + public static async Task FillFromRedump(SegmentedOptions options, SubmissionInfo info, IProgress? resultProgress = null) { // If information should not be pulled at all - if (!options.RetrieveMatchInformation) + if (!options.Processing.Login.RetrieveMatchInformation) return false; // Set the current dumper based on username - info.DumpersAndStatus.Dumpers = [options.RedumpUsername ?? "Anonymous User"]; + info.DumpersAndStatus.Dumpers = [options.Processing.Login.RedumpUsername ?? "Anonymous User"]; info.PartiallyMatchedIDs = []; // Login to Redump, if possible var wc = new RedumpClient(); - if (!string.IsNullOrEmpty(options.RedumpUsername) && !string.IsNullOrEmpty(options.RedumpPassword)) + if (!string.IsNullOrEmpty(options.Processing.Login.RedumpUsername) && !string.IsNullOrEmpty(options.Processing.Login.RedumpPassword)) { - bool? loggedIn = await wc.Login(options.RedumpUsername!, options.RedumpPassword!); + bool? loggedIn = await wc.Login(options.Processing.Login.RedumpUsername!, options.Processing.Login.RedumpPassword!); if (loggedIn is null) { resultProgress?.Report(ResultEventArgs.Failure("There was an unknown error connecting to Redump, skipping...")); @@ -350,7 +350,7 @@ namespace MPF.Frontend.Tools // Fill in the fields from the existing ID resultProgress?.Report(ResultEventArgs.Neutral($"Filling fields from existing ID {fullyMatchedIdsList[i]}...")); - _ = await Builder.FillFromId(wc, info, fullyMatchedIdsList[i], options.PullAllInformation); + _ = await Builder.FillFromId(wc, info, fullyMatchedIdsList[i], options.Processing.MediaInformation.PullAllInformation); resultProgress?.Report(ResultEventArgs.Success("Information filling complete!")); // Set the fully matched ID to the current diff --git a/MPF.Frontend/ViewModels/CheckDumpViewModel.cs b/MPF.Frontend/ViewModels/CheckDumpViewModel.cs index 2ff51aa2..9a4603c6 100644 --- a/MPF.Frontend/ViewModels/CheckDumpViewModel.cs +++ b/MPF.Frontend/ViewModels/CheckDumpViewModel.cs @@ -22,11 +22,11 @@ namespace MPF.Frontend.ViewModels /// /// Access to the current options /// - public Options Options + public SegmentedOptions Options { get => _options; } - private readonly Options _options; + private readonly SegmentedOptions _options; /// /// Indicates if SelectionChanged events can be executed @@ -348,7 +348,7 @@ namespace MPF.Frontend.ViewModels DisableEventHandlers(); // Get the current internal program - InternalProgram internalProgram = Options.InternalProgram; + InternalProgram internalProgram = Options.Dumping.InternalProgram; // Create a static list of supported Check programs, not everything var internalPrograms = new List diff --git a/MPF.Frontend/ViewModels/CreateIRDViewModel.cs b/MPF.Frontend/ViewModels/CreateIRDViewModel.cs index c2bd5562..713d9807 100644 --- a/MPF.Frontend/ViewModels/CreateIRDViewModel.cs +++ b/MPF.Frontend/ViewModels/CreateIRDViewModel.cs @@ -16,11 +16,11 @@ namespace MPF.Frontend.ViewModels /// /// Access to the current options /// - public Options Options + public SegmentedOptions Options { get => _options; } - private readonly Options _options; + private readonly SegmentedOptions _options; /// /// Indicates if SelectionChanged events can be executed @@ -549,11 +549,13 @@ namespace MPF.Frontend.ViewModels CreateIRDStatus = "Please provide an ISO"; return false; } + if (string.IsNullOrEmpty(LogPath) && string.IsNullOrEmpty(HexKey) && string.IsNullOrEmpty(KeyPath)) { CreateIRDStatus = "Please provide a GetKey log or Disc Key"; return false; } + CreateIRDStatus = "Ready to create IRD"; return true; } @@ -654,6 +656,7 @@ namespace MPF.Frontend.ViewModels DiscIDStatus = "ERROR: Invalid *.getkey.log path"; PICStatus = "ERROR: Invalid *.getkey.log path"; } + CreateIRDButtonEnabled = false; } } diff --git a/MPF.Frontend/ViewModels/MainViewModel.cs b/MPF.Frontend/ViewModels/MainViewModel.cs index 6db8ea63..cd4a407d 100644 --- a/MPF.Frontend/ViewModels/MainViewModel.cs +++ b/MPF.Frontend/ViewModels/MainViewModel.cs @@ -20,16 +20,16 @@ namespace MPF.Frontend.ViewModels /// /// Access to the current options /// - public Options Options + public SegmentedOptions Options { get => _options; set { _options = value; - OptionsLoader.SaveToConfig(_options); + OptionsLoader.SaveToConfig(_options.ConvertToOptions()); } } - private Options _options; + private SegmentedOptions _options; /// /// Indicates if SelectionChanged events can be executed @@ -584,7 +584,7 @@ namespace MPF.Frontend.ViewModels MediaScanButtonEnabled = true; ParametersCheckBoxEnabled = true; EnableParametersCheckBoxEnabled = true; - LogPanelExpanded = _options.OpenLogWindowAtStartup; + LogPanelExpanded = _options.GUI.OpenLogWindowAtStartup; MediaTypes = []; Systems = RedumpSystemComboBoxItem.GenerateElements(); @@ -650,7 +650,7 @@ namespace MPF.Frontend.ViewModels char? lastSelectedDrive = CurrentDrive?.Name?[0] ?? null; // Populate the list of drives and add it to the combo box - Drives = Drive.CreateListOfDrives(Options.IgnoreFixedDrives); + Drives = Drive.CreateListOfDrives(Options.GUI.IgnoreFixedDrives); if (Drives.Count > 0) { @@ -747,7 +747,7 @@ namespace MPF.Frontend.ViewModels InternalPrograms = [.. Array.ConvertAll(ipArr, ip => new Element(ip))]; // Get the current internal program - InternalProgram internalProgram = Options.InternalProgram; + InternalProgram internalProgram = Options.Dumping.InternalProgram; // Select the current default dumping program if (InternalPrograms.Count == 0) @@ -983,14 +983,14 @@ namespace MPF.Frontend.ViewModels /// /// Indicates if the settings were saved or not /// Options representing the new, saved values - public void UpdateOptions(bool savedSettings, Options? newOptions) + public void UpdateOptions(bool savedSettings, SegmentedOptions? newOptions) { // Get which options to save var optionsToSave = savedSettings ? newOptions : Options; // Ensure the first run flag is unset - var continuingOptions = new Options(optionsToSave) { FirstRun = false }; - Options = continuingOptions; + var continuingOptions = new SegmentedOptions(optionsToSave) { FirstRun = false }; + Options = new SegmentedOptions(continuingOptions); // If settings were changed, reinitialize the UI if (savedSettings) @@ -1267,7 +1267,7 @@ namespace MPF.Frontend.ViewModels { VerboseLogLn("Skipping system type detection because no valid drives found!"); } - else if (!Options.SkipSystemDetection) + else if (!Options.GUI.SkipSystemDetection) { VerboseLog($"Trying to detect system for drive {CurrentDrive.Name}.. "); var currentSystem = GetRedumpSystem(CurrentDrive); @@ -1275,7 +1275,7 @@ namespace MPF.Frontend.ViewModels VerboseLogLn($"detected {currentSystem.LongName()}."); // If undetected system on inactive drive, and PC is the default system, check for potential Mac disc - if (currentSystem is null && !CurrentDrive.MarkedActive && Options.DefaultSystem == RedumpSystem.IBMPCcompatible) + if (currentSystem is null && !CurrentDrive.MarkedActive && Options.Dumping.DefaultSystem == RedumpSystem.IBMPCcompatible) { try { @@ -1292,7 +1292,7 @@ namespace MPF.Frontend.ViewModels // Fallback to default system only if drive is active if (currentSystem is null && CurrentDrive.MarkedActive) { - currentSystem = Options.DefaultSystem; + currentSystem = Options.Dumping.DefaultSystem; VerboseLogLn($"unable to detect, defaulting to {currentSystem.LongName()}."); } @@ -1302,9 +1302,9 @@ namespace MPF.Frontend.ViewModels CurrentSystem = Systems[sysIndex]; } } - else if (Options.SkipSystemDetection && Options.DefaultSystem is not null) + else if (Options.GUI.SkipSystemDetection && Options.Dumping.DefaultSystem is not null) { - var currentSystem = Options.DefaultSystem; + var currentSystem = Options.Dumping.DefaultSystem; VerboseLogLn($"System detection disabled, defaulting to {currentSystem.LongName()}."); int sysIndex = Systems.FindIndex(s => s == currentSystem); CurrentSystem = Systems[sysIndex]; @@ -1446,7 +1446,7 @@ namespace MPF.Frontend.ViewModels } // Get path pieces that are used in all branches - string defaultOutputPath = Options.DefaultOutputPath ?? "ISO"; + string defaultOutputPath = Options.Dumping.DefaultOutputPath ?? "ISO"; string extension = _environment?.GetDefaultExtension(CurrentMediaType) ?? ".bin"; string label = GetFormattedVolumeLabel(CurrentDrive) ?? CurrentSystem.LongName() ?? $"track_{DateTime.Now:yyyyMMdd-HHmm}"; string defaultFilename = $"{label}{extension}"; @@ -2462,10 +2462,10 @@ namespace MPF.Frontend.ViewModels #pragma warning disable IDE0072 return program switch { - InternalProgram.Aaru => File.Exists(Options.AaruPath), - InternalProgram.DiscImageCreator => File.Exists(Options.DiscImageCreatorPath), - // InternalProgram.Dreamdump => File.Exists(Options.DreamdumpPath), - InternalProgram.Redumper => File.Exists(Options.RedumperPath), + InternalProgram.Aaru => File.Exists(Options.Dumping.AaruPath), + InternalProgram.DiscImageCreator => File.Exists(Options.Dumping.DiscImageCreatorPath), + // InternalProgram.Dreamdump => File.Exists(Options.Dumping.DreamdumpPath), + InternalProgram.Redumper => File.Exists(Options.Dumping.RedumperPath), _ => false, }; #pragma warning restore IDE0072 diff --git a/MPF.Frontend/ViewModels/MediaInformationViewModel.cs b/MPF.Frontend/ViewModels/MediaInformationViewModel.cs index ee143765..6065c214 100644 --- a/MPF.Frontend/ViewModels/MediaInformationViewModel.cs +++ b/MPF.Frontend/ViewModels/MediaInformationViewModel.cs @@ -12,9 +12,9 @@ namespace MPF.Frontend.ViewModels #region Fields /// - /// Application-level Options object + /// Application-level SegmentedOptions object /// - public Options Options { get; private set; } + public SegmentedOptions Options { get; private set; } /// /// SubmissionInfo object to fill and save @@ -195,7 +195,7 @@ namespace MPF.Frontend.ViewModels /// /// Constructor /// - public MediaInformationViewModel(Options options, SubmissionInfo? submissionInfo) + public MediaInformationViewModel(SegmentedOptions options, SubmissionInfo? submissionInfo) { Options = options; SubmissionInfo = submissionInfo?.Clone() as SubmissionInfo ?? new SubmissionInfo(); diff --git a/MPF.Frontend/ViewModels/OptionsViewModel.cs b/MPF.Frontend/ViewModels/OptionsViewModel.cs index 05c220d2..a5d715bf 100644 --- a/MPF.Frontend/ViewModels/OptionsViewModel.cs +++ b/MPF.Frontend/ViewModels/OptionsViewModel.cs @@ -32,7 +32,7 @@ namespace MPF.Frontend.ViewModels /// /// Current set of options /// - public Options Options { get; } + public SegmentedOptions Options { get; } /// /// Flag for if settings were saved or not @@ -88,15 +88,15 @@ namespace MPF.Frontend.ViewModels /// public OptionsViewModel() { - Options = new Options(); + Options = new SegmentedOptions(); } /// /// Constructor for in-code /// - public OptionsViewModel(Options baseOptions) + public OptionsViewModel(SegmentedOptions baseOptions) { - Options = new Options(baseOptions); + Options = new SegmentedOptions(baseOptions); } #region Population @@ -138,9 +138,9 @@ namespace MPF.Frontend.ViewModels /// public void NonRedumpModeUnChecked() { - Options.RedumperReadMethod = RedumperReadMethod.NONE; - Options.RedumperSectorOrder = RedumperSectorOrder.NONE; - Options.RedumperDriveType = RedumperDriveType.NONE; + Options.Dumping.Redumper.ReadMethod = RedumperReadMethod.NONE; + Options.Dumping.Redumper.SectorOrder = RedumperSectorOrder.NONE; + Options.Dumping.Redumper.DriveType = RedumperDriveType.NONE; TriggerPropertyChanged(nameof(Options)); } diff --git a/MPF.UI/Windows/CheckDumpWindow.xaml.cs b/MPF.UI/Windows/CheckDumpWindow.xaml.cs index 94dfc7e1..63f78d60 100644 --- a/MPF.UI/Windows/CheckDumpWindow.xaml.cs +++ b/MPF.UI/Windows/CheckDumpWindow.xaml.cs @@ -101,8 +101,8 @@ namespace MPF.UI.Windows { // Get the current path, if possible string? currentPath = CheckDumpViewModel.InputPath; - if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CheckDumpViewModel.Options.DefaultOutputPath)) - currentPath = CheckDumpViewModel.Options.DefaultOutputPath!; + if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CheckDumpViewModel.Options.Dumping.DefaultOutputPath)) + currentPath = CheckDumpViewModel.Options.Dumping.DefaultOutputPath!; if (string.IsNullOrEmpty(currentPath)) currentPath = AppDomain.CurrentDomain.BaseDirectory!; @@ -128,9 +128,9 @@ namespace MPF.UI.Windows /// Options set to pass to the information window /// SubmissionInfo object to display and possibly change /// Dialog open result - public bool? ShowMediaInformationWindow(Options? options, ref SubmissionInfo? submissionInfo) + public bool? ShowMediaInformationWindow(SegmentedOptions? options, ref SubmissionInfo? submissionInfo) { - var mediaInformationWindow = new MediaInformationWindow(options ?? new Options(), submissionInfo) + var mediaInformationWindow = new MediaInformationWindow(options ?? new SegmentedOptions(), submissionInfo) { Focusable = true, Owner = this, diff --git a/MPF.UI/Windows/CreateIRDWindow.xaml.cs b/MPF.UI/Windows/CreateIRDWindow.xaml.cs index 8745b76f..b4479496 100644 --- a/MPF.UI/Windows/CreateIRDWindow.xaml.cs +++ b/MPF.UI/Windows/CreateIRDWindow.xaml.cs @@ -119,8 +119,8 @@ namespace MPF.UI.Windows { // Get the current path, if possible string? currentPath = CreateIRDViewModel.InputPath; - if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.DefaultOutputPath)) - currentPath = CreateIRDViewModel.Options.DefaultOutputPath!; + if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.Dumping.DefaultOutputPath)) + currentPath = CreateIRDViewModel.Options.Dumping.DefaultOutputPath!; if (string.IsNullOrEmpty(currentPath)) currentPath = AppDomain.CurrentDomain.BaseDirectory!; @@ -147,8 +147,8 @@ namespace MPF.UI.Windows { // Get the current path, if possible string? currentPath = CreateIRDViewModel.LogPath; - if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.DefaultOutputPath)) - currentPath = CreateIRDViewModel.Options.DefaultOutputPath!; + if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.Dumping.DefaultOutputPath)) + currentPath = CreateIRDViewModel.Options.Dumping.DefaultOutputPath!; if (string.IsNullOrEmpty(currentPath)) currentPath = AppDomain.CurrentDomain.BaseDirectory!; @@ -175,8 +175,8 @@ namespace MPF.UI.Windows { // Get the current path, if possible string? currentPath = CreateIRDViewModel.LogPath; - if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.DefaultOutputPath)) - currentPath = CreateIRDViewModel.Options.DefaultOutputPath!; + if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.Dumping.DefaultOutputPath)) + currentPath = CreateIRDViewModel.Options.Dumping.DefaultOutputPath!; if (string.IsNullOrEmpty(currentPath)) currentPath = AppDomain.CurrentDomain.BaseDirectory!; @@ -204,8 +204,8 @@ namespace MPF.UI.Windows { // Get the current path, if possible string? currentPath = CreateIRDViewModel.InputPath; - if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.DefaultOutputPath)) - currentPath = Path.Combine(CreateIRDViewModel.Options.DefaultOutputPath, "game.ird"); + if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.Dumping.DefaultOutputPath)) + currentPath = Path.Combine(CreateIRDViewModel.Options.Dumping.DefaultOutputPath, "game.ird"); else if (string.IsNullOrEmpty(currentPath)) currentPath = "game.ird"; if (string.IsNullOrEmpty(currentPath)) @@ -240,8 +240,8 @@ namespace MPF.UI.Windows { // Get the current path, if possible string? currentPath = CreateIRDViewModel.LogPath; - if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.DefaultOutputPath)) - currentPath = CreateIRDViewModel.Options.DefaultOutputPath!; + if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(CreateIRDViewModel.Options.Dumping.DefaultOutputPath)) + currentPath = CreateIRDViewModel.Options.Dumping.DefaultOutputPath!; if (string.IsNullOrEmpty(currentPath)) currentPath = AppDomain.CurrentDomain.BaseDirectory!; diff --git a/MPF.UI/Windows/MainWindow.xaml.cs b/MPF.UI/Windows/MainWindow.xaml.cs index 6a26e967..cc28e9b5 100644 --- a/MPF.UI/Windows/MainWindow.xaml.cs +++ b/MPF.UI/Windows/MainWindow.xaml.cs @@ -125,7 +125,7 @@ namespace MPF.UI.Windows AddEventHandlers(); // Display the debug option in the menu, if necessary - if (MainViewModel.Options.ShowDebugViewMenuItem) + if (MainViewModel.Options.GUI.ShowDebugViewMenuItem) DebugViewMenuItem!.Visibility = Visibility.Visible; MainViewModel.Init(LogOutput!.EnqueueLog, DisplayUserMessage, ShowMediaInformationWindow); @@ -139,7 +139,7 @@ namespace MPF.UI.Windows MainViewModel.TranslateStrings(translationStrings); // Set interface language according to the options - SetInterfaceLanguage(MainViewModel.Options.DefaultInterfaceLanguage); + SetInterfaceLanguage(MainViewModel.Options.GUI.DefaultInterfaceLanguage); // Set the UI color scheme according to the options ApplyTheme(); @@ -321,8 +321,8 @@ namespace MPF.UI.Windows { // Get the current path, if possible string currentPath = MainViewModel.OutputPath; - if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(MainViewModel.Options.DefaultOutputPath)) - currentPath = Path.Combine(MainViewModel.Options.DefaultOutputPath, $"track_{DateTime.Now:yyyyMMdd-HHmm}.bin"); + if (string.IsNullOrEmpty(currentPath) && !string.IsNullOrEmpty(MainViewModel.Options.Dumping.DefaultOutputPath)) + currentPath = Path.Combine(MainViewModel.Options.Dumping.DefaultOutputPath, $"track_{DateTime.Now:yyyyMMdd-HHmm}.bin"); else if (string.IsNullOrEmpty(currentPath)) currentPath = $"track_{DateTime.Now:yyyyMMdd-HHmm}.bin"; if (string.IsNullOrEmpty(currentPath)) @@ -363,7 +363,7 @@ namespace MPF.UI.Windows message += $"{Environment.NewLine}You have the newest version!"; // If we have a new version, put it in the clipboard - if (MainViewModel.Options.CopyUpdateUrlToClipboard && different && !string.IsNullOrEmpty(url)) + if (MainViewModel.Options.GUI.CopyUpdateUrlToClipboard && different && !string.IsNullOrEmpty(url)) { try { @@ -406,13 +406,13 @@ namespace MPF.UI.Windows /// Options set to pass to the information window /// SubmissionInfo object to display and possibly change /// Dialog open result - public bool? ShowMediaInformationWindow(Options? options, ref SubmissionInfo? submissionInfo) + public bool? ShowMediaInformationWindow(SegmentedOptions? options, ref SubmissionInfo? submissionInfo) { - if (options?.ShowDiscEjectReminder == true) + if (options?.Processing?.ShowDiscEjectReminder == true) CustomMessageBox.Show(this, (string)Application.Current.FindResource("EjectMessageString"), (string)Application.Current.FindResource("EjectTitleString"), MessageBoxButton.OK, MessageBoxImage.Information); - var mediaInformationWindow = new MediaInformationWindow(options ?? new Options(), submissionInfo) + var mediaInformationWindow = new MediaInformationWindow(options ?? new SegmentedOptions(), submissionInfo) { Focusable = true, Owner = this, @@ -540,12 +540,12 @@ namespace MPF.UI.Windows private void ApplyTheme() { Theme theme; - if (MainViewModel.Options.EnableDarkMode) + if (MainViewModel.Options.GUI.Theming.EnableDarkMode) theme = new DarkModeTheme(); - else if (MainViewModel.Options.EnablePurpMode) + else if (MainViewModel.Options.GUI.Theming.EnablePurpMode) theme = new CustomTheme("111111", "9A5EC0"); - else if (IsHexColor(MainViewModel.Options.CustomBackgroundColor) && IsHexColor(MainViewModel.Options.CustomTextColor)) - theme = new CustomTheme(MainViewModel.Options.CustomBackgroundColor, MainViewModel.Options.CustomTextColor); + else if (IsHexColor(MainViewModel.Options.GUI.Theming.CustomBackgroundColor) && IsHexColor(MainViewModel.Options.GUI.Theming.CustomTextColor)) + theme = new CustomTheme(MainViewModel.Options.GUI.Theming.CustomBackgroundColor, MainViewModel.Options.GUI.Theming.CustomTextColor); else theme = new LightModeTheme(); @@ -643,14 +643,14 @@ namespace MPF.UI.Windows var options = optionsWindow.OptionsViewModel.Options; // Force a refresh of the path, if necessary - if (MainViewModel.Options.DefaultOutputPath != options.DefaultOutputPath) + if (MainViewModel.Options.Dumping.DefaultOutputPath != options.Dumping.DefaultOutputPath) MainViewModel.OutputPath = string.Empty; // Set the language according to the settings if (savedSettings) { - var oldDefaultLang = MainViewModel.Options.DefaultInterfaceLanguage; - var newDefaultLang = options.DefaultInterfaceLanguage; + var oldDefaultLang = MainViewModel.Options.GUI.DefaultInterfaceLanguage; + var newDefaultLang = options.GUI.DefaultInterfaceLanguage; if (oldDefaultLang != newDefaultLang) { SetInterfaceLanguage(newDefaultLang); @@ -869,7 +869,7 @@ namespace MPF.UI.Windows { if (MainViewModel.CanExecuteSelectionChanged) { - if (MainViewModel.Options.FastUpdateLabel) + if (MainViewModel.Options.GUI.FastUpdateLabel) MainViewModel.FastUpdateLabel(removeEventHandlers: true); else MainViewModel.InitializeUIValues(removeEventHandlers: true, rebuildPrograms: false, rescanDrives: false); diff --git a/MPF.UI/Windows/MediaInformationWindow.xaml.cs b/MPF.UI/Windows/MediaInformationWindow.xaml.cs index 0c82141e..e33a1307 100644 --- a/MPF.UI/Windows/MediaInformationWindow.xaml.cs +++ b/MPF.UI/Windows/MediaInformationWindow.xaml.cs @@ -112,12 +112,12 @@ namespace MPF.UI.Windows /// /// Read-only access to the current media information view model /// - public MediaInformationViewModel MediaInformationViewModel => DataContext as MediaInformationViewModel ?? new MediaInformationViewModel(new Options(), new SubmissionInfo()); + public MediaInformationViewModel MediaInformationViewModel => DataContext as MediaInformationViewModel ?? new MediaInformationViewModel(new SegmentedOptions(), new SubmissionInfo()); /// /// Constructor /// - public MediaInformationWindow(Options options, SubmissionInfo? submissionInfo) + public MediaInformationWindow(SegmentedOptions options, SubmissionInfo? submissionInfo) { #if NET40_OR_GREATER || NETCOREAPP InitializeComponent(); @@ -136,7 +136,7 @@ namespace MPF.UI.Windows MediaInformationViewModel.Load(); // Limit lists, if necessary - if (options.EnableRedumpCompatibility) + if (options.Processing.MediaInformation.EnableRedumpCompatibility) { MediaInformationViewModel.SetRedumpRegions(); MediaInformationViewModel.SetRedumpLanguages(); @@ -156,10 +156,10 @@ namespace MPF.UI.Windows /// /// Manipulate fields based on the current disc /// - private void ManipulateFields(Options options, SubmissionInfo? submissionInfo) + private void ManipulateFields(SegmentedOptions options, SubmissionInfo? submissionInfo) { // Enable tabs in all fields, if required - if (options.EnableTabsInInputFields) + if (options.Processing.MediaInformation.EnableTabsInInputFields) EnableTabsInInputFields(); // Hide read-only fields that don't have values set diff --git a/MPF.UI/Windows/OptionsWindow.xaml.cs b/MPF.UI/Windows/OptionsWindow.xaml.cs index 9afe716c..75ad5e89 100644 --- a/MPF.UI/Windows/OptionsWindow.xaml.cs +++ b/MPF.UI/Windows/OptionsWindow.xaml.cs @@ -18,7 +18,7 @@ namespace MPF.UI.Windows /// /// Read-only access to the current options view model /// - public OptionsViewModel OptionsViewModel => DataContext as OptionsViewModel ?? new OptionsViewModel(new Options()); + public OptionsViewModel OptionsViewModel => DataContext as OptionsViewModel ?? new OptionsViewModel(); #if NET35 @@ -37,7 +37,7 @@ namespace MPF.UI.Windows /// /// Constructor /// - public OptionsWindow(Options options) + public OptionsWindow(SegmentedOptions options) { #if NET40_OR_GREATER || NETCOREAPP InitializeComponent(); @@ -61,7 +61,7 @@ namespace MPF.UI.Windows DataContext = new OptionsViewModel(options); // Set initial value for binding - RedumpPasswordBox!.Password = options.RedumpPassword; + RedumpPasswordBox!.Password = options.Processing.Login.RedumpPassword; // Add handlers AaruPathButton!.Click += BrowseForPathClick; @@ -136,7 +136,7 @@ namespace MPF.UI.Windows if (exists) { - OptionsViewModel.Options[pathSettingName] = path; + OptionsViewModel.Options.ConvertToOptions()[pathSettingName] = path; var textBox = TextBoxForPathSetting(parent, pathSettingName); textBox?.Text = path; } @@ -213,7 +213,7 @@ namespace MPF.UI.Windows /// private void NonRedumpModeClicked(object sender, EventArgs e) { - if (OptionsViewModel.Options.RedumperNonRedumpMode) + if (OptionsViewModel.Options.Dumping.Redumper.NonRedumpMode) CustomMessageBox.Show(this, "All logs generated with these options will not be acceptable for Redump submission", (string)System.Windows.Application.Current.FindResource("WarningMessageString"), MessageBoxButton.OK, MessageBoxImage.Warning); else @@ -243,7 +243,7 @@ namespace MPF.UI.Windows /// private void OnPasswordChanged(object sender, EventArgs e) { - OptionsViewModel.Options.RedumpPassword = RedumpPasswordBox!.Password; + OptionsViewModel.Options.Processing.Login.RedumpPassword = RedumpPasswordBox!.Password; } ///