using System.Collections.Generic;
using System.ComponentModel;
using MPF.Frontend.ComboBoxItems;
using RedumperDriveType = MPF.ExecutionContexts.Redumper.DriveType;
using RedumperReadMethod = MPF.ExecutionContexts.Redumper.ReadMethod;
using RedumperSectorOrder = MPF.ExecutionContexts.Redumper.SectorOrder;
namespace MPF.Frontend.ViewModels
{
///
/// Constructor
///
public class OptionsViewModel : INotifyPropertyChanged
{
#region Fields
///
/// Title for the window
///
public string? Title
{
get => _title;
set
{
_title = value;
TriggerPropertyChanged(nameof(Title));
}
}
private string? _title;
///
/// Current set of options
///
public Options Options { get; }
///
/// Flag for if settings were saved or not
///
public bool SavedSettings { get; set; }
///
public event PropertyChangedEventHandler? PropertyChanged;
#endregion
#region Lists
///
/// List of available internal programs
///
public static List> InternalPrograms => PopulateInternalPrograms();
///
/// Current list of supported Redumper read methods
///
public static List> RedumperReadMethods => PopulateRedumperReadMethods();
///
/// Current list of supported Redumper sector orders
///
public static List> RedumperSectorOrders => PopulateRedumperSectorOrders();
///
/// Current list of supported Redumper drive types
///
public static List> RedumperDriveTypes => PopulateRedumperDriveTypes();
///
/// Current list of supported system profiles
///
public static List Systems => RedumpSystemComboBoxItem.GenerateElements();
#endregion
///
/// Constructor for pure view model
///
public OptionsViewModel()
{
Options = new Options();
}
///
/// Constructor for in-code
///
public OptionsViewModel(Options baseOptions)
{
Options = new Options(baseOptions);
}
#region Population
///
/// Get a complete list of supported internal programs
///
private static List> PopulateInternalPrograms()
{
var internalPrograms = new List { InternalProgram.Redumper, InternalProgram.DiscImageCreator, InternalProgram.Aaru };
return internalPrograms.ConvertAll(ip => new Element(ip));
}
///
/// Get a complete list of supported redumper drive read methods
///
private static List> PopulateRedumperReadMethods()
{
var readMethods = new List { RedumperReadMethod.NONE, RedumperReadMethod.D8, RedumperReadMethod.BE };
return readMethods.ConvertAll(rm => new Element(rm));
}
///
/// Get a complete list of supported redumper drive sector orders
///
private static List> PopulateRedumperSectorOrders()
{
var sectorOrders = new List { RedumperSectorOrder.NONE, RedumperSectorOrder.DATA_C2_SUB, RedumperSectorOrder.DATA_SUB_C2, RedumperSectorOrder.DATA_SUB, RedumperSectorOrder.DATA_C2 };
return sectorOrders.ConvertAll(so => new Element(so));
}
///
/// Get a complete list of supported redumper drive types
///
private static List> PopulateRedumperDriveTypes()
{
var driveTypes = new List { RedumperDriveType.NONE, RedumperDriveType.GENERIC, RedumperDriveType.PLEXTOR, RedumperDriveType.LG_ASU8A, RedumperDriveType.LG_ASU8B, RedumperDriveType.LG_ASU8C, RedumperDriveType.LG_ASU3, RedumperDriveType.LG_ASU2 };
return driveTypes.ConvertAll(dt => new Element(dt));
}
#endregion
#region UI Commands
///
/// Get the human-readable result for a Redump login result
///
public static string GetRedumpLoginResult(bool? success)
{
return success switch
{
true => "Redump username and password accepted!",
false => "Redump username and password denied!",
null => "An error occurred validating your credentials!",
};
}
///
/// Reset Redumper non-redump options (Read Method, Sector Order, Drive Type)
///
public void NonRedumpModeUnChecked()
{
Options.RedumperReadMethod = RedumperReadMethod.NONE;
Options.RedumperSectorOrder = RedumperSectorOrder.NONE;
Options.RedumperDriveType = RedumperDriveType.NONE;
TriggerPropertyChanged(nameof(Options));
}
#endregion
#region Property Updates
///
/// Trigger a property changed event
///
private void TriggerPropertyChanged(string propertyName)
{
// If the property change event is initialized
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
}