// --------------------------------------------------------------------------------------------------------------------
//
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
//
//
// The Options View Model
//
// --------------------------------------------------------------------------------------------------------------------
namespace HandBrakeWPF.ViewModels
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Media;
using System.Threading;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
using HandBrake.App.Core.Utilities;
using HandBrake.Interop.Interop;
using HandBrakeWPF.Commands;
using HandBrakeWPF.Helpers;
using HandBrakeWPF.Model;
using HandBrakeWPF.Model.Options;
using HandBrakeWPF.Model.Video;
using HandBrakeWPF.Properties;
using HandBrakeWPF.Services;
using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.Services.Presets.Interfaces;
using HandBrakeWPF.Utilities;
using HandBrakeWPF.Utilities.FileDialogs;
using HandBrakeWPF.ViewModels.Interfaces;
using ILog = HandBrakeWPF.Services.Logging.Interfaces.ILog;
public class OptionsViewModel : ViewModelBase, IOptionsViewModel
{
private readonly IUserSettingService userSettingService;
private readonly IUpdateService updateService;
private readonly IErrorService errorService;
private readonly IPresetService presetService;
private readonly INotificationService notificationService;
private readonly ILog logService;
private string arguments;
private string autoNameDefaultPath;
private bool automaticallyNameFiles;
private string autonameFormat;
private bool changeToTitleCase;
private bool checkForUpdates;
private UpdateCheck checkForUpdatesFrequency;
private bool clearOldLogs;
private BindingList constantQualityGranularity = new BindingList();
private bool copyLogToEncodeDirectory;
private bool copyLogToSpecifiedLocation;
private bool disableLibdvdNav;
private string logDirectory;
private BindingList logVerbosityOptions = new BindingList();
private long minLength;
private long maxLength;
private bool minimiseToTray;
private bool preventSleep;
private BindingList previewPicturesToScan = new BindingList();
private bool removeUnderscores;
private string selectedGranularity;
private Mp4Behaviour selectedMp4Extension;
private int selectedPreviewCount;
private ProcessPriority selectedPriority;
private LogLevel selectedVerbosity;
private bool sendFileAfterEncode;
private string sendFileTo;
private string sendFileToPath;
private string vlcPath;
private WhenDone whenDone;
private bool clearQueueOnEncodeCompleted;
private OptionsTab selectedTab;
private string updateMessage;
private bool updateAvailable;
private int downloadProgressPercentage;
private UpdateCheckInformation updateInfo;
private bool removePunctuation;
private bool resetWhenDoneAction;
private bool enableQuickSyncDecoding;
private bool pauseOnLowDiskspace;
private long pauseOnLowDiskspaceLevel;
private bool useQsvDecodeForNonQsvEnc;
private bool showStatusInTitleBar;
private bool showPreviewOnSummaryTab;
private string whenDoneAudioFile;
private bool playSoundWhenDone;
private bool playSoundWhenQueueDone;
private bool enableDirectXDecoding;
private InterfaceLanguage selectedLanguage;
private bool showAddSelectionToQueue;
private bool showAddAllToQueue;
private int selectedOverwriteBehaviour;
private int selectedCollisionBehaviour;
private string prePostFilenameText;
private bool showPrePostFilenameBox;
private bool whenDonePerformActionImmediately;
private AppThemeMode appThemeMode;
private bool alwaysUseDefaultPath;
private bool pauseOnLowBattery;
private int lowBatteryLevel;
private string whenDoneAudioFileFullPath;
private PresetDisplayMode selectedPresetDisplayMode;
private int remoteServicePort;
private bool remoteServiceEnabled;
private bool enableQuickSyncLowPower;
private int simultaneousEncodes;
private bool enableQuickSyncHyperEncode;
private bool enableNvDecSupport;
private bool useIsoDateFormat;
private BindingList excludedFileExtensions;
private bool recursiveFolderScan;
private bool keepDuplicateTitles;
private bool maxDurationEnabled;
private DefaultRangeMode selectedDefaultRangeMode;
private string queueDoneAction;
private string queueDoneArguments;
private bool queueDoneCustomActionEnabled;
private PresetUiType selectedPresetUiType;
public OptionsViewModel(
IUserSettingService userSettingService,
IUpdateService updateService,
IAboutViewModel aboutViewModel,
IErrorService errorService,
IPresetService presetService,
INotificationService notificationService,
ILog logService)
{
this.Title = "Options";
this.userSettingService = userSettingService;
this.updateService = updateService;
this.errorService = errorService;
this.presetService = presetService;
this.notificationService = notificationService;
this.logService = logService;
this.AboutViewModel = aboutViewModel;
this.OnLoad();
this.SelectedTab = OptionsTab.General;
// this.UpdateMessage = Resources.OptionsViewModel_CheckForUpdatesMsg;
this.RemoveExtensionCommand = new SimpleRelayCommand(this.RemoveExcludedExtension);
}
public OptionsTab SelectedTab
{
get => this.selectedTab;
set
{
this.selectedTab = value;
this.NotifyOfPropertyChange(() => this.SelectedTab);
}
}
public IAboutViewModel AboutViewModel { get; set; }
public bool IsNightly { get; } = HandBrakeVersionHelper.IsNightly();
public bool HasSystemBattery => PowerService.HasBattery();
/* General */
public BindingList InterfaceLanguages { get; } = new BindingList(InterfaceLanguageUtilities.GetUserInterfaceLanguages());
public InterfaceLanguage SelectedLanguage
{
get => this.selectedLanguage;
set
{
if (Equals(value, this.selectedLanguage)) return;
this.selectedLanguage = value;
this.NotifyOfPropertyChange(() => this.SelectedLanguage);
}
}
public BindingList RightToLeftModes { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public RightToLeftMode SelectedRightToLeftMode { get;set; }
public bool CheckForUpdates
{
get => this.checkForUpdates;
set
{
this.checkForUpdates = value;
this.NotifyOfPropertyChange(() => this.CheckForUpdates);
}
}
public bool CheckForUpdatesAllowed { get; set; }
public bool IsUpdateFound { get; set; }
public bool ResetWhenDoneAction
{
get => this.resetWhenDoneAction;
set
{
this.resetWhenDoneAction = value;
this.NotifyOfPropertyChange(() => this.ResetWhenDoneAction);
}
}
public BindingList CheckForUpdatesFrequencies { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public UpdateCheck CheckForUpdatesFrequency
{
get => this.checkForUpdatesFrequency;
set
{
this.checkForUpdatesFrequency = value;
this.NotifyOfPropertyChange(() => this.CheckForUpdatesFrequency);
}
}
public bool WhenDonePerformActionImmediately
{
get => this.whenDonePerformActionImmediately;
set
{
if (value == this.whenDonePerformActionImmediately) return;
this.whenDonePerformActionImmediately = value;
this.NotifyOfPropertyChange(() => this.WhenDonePerformActionImmediately);
}
}
public bool ShowStatusInTitleBar
{
get => this.showStatusInTitleBar;
set
{
if (value == this.showStatusInTitleBar) return;
this.showStatusInTitleBar = value;
this.NotifyOfPropertyChange(() => this.ShowStatusInTitleBar);
}
}
public bool ShowPreviewOnSummaryTab
{
get => this.showPreviewOnSummaryTab;
set
{
if (value == this.showPreviewOnSummaryTab) return;
this.showPreviewOnSummaryTab = value;
this.NotifyOfPropertyChange(() => this.ShowPreviewOnSummaryTab);
}
}
public bool ShowAddSelectionToQueue
{
get => this.showAddSelectionToQueue;
set
{
if (value == this.showAddSelectionToQueue) return;
this.showAddSelectionToQueue = value;
this.NotifyOfPropertyChange(() => this.ShowAddSelectionToQueue);
}
}
public bool ShowAddAllToQueue
{
get => this.showAddAllToQueue;
set
{
if (value == this.showAddAllToQueue) return;
this.showAddAllToQueue = value;
this.NotifyOfPropertyChange(() => this.ShowAddAllToQueue);
}
}
public BindingList DarkThemeModes { get; } = new BindingList()
{
AppThemeMode.System,
AppThemeMode.Light,
AppThemeMode.Dark,
AppThemeMode.None
};
public AppThemeMode AppThemeMode
{
get => this.appThemeMode;
set
{
if (value == this.appThemeMode) return;
this.appThemeMode = value;
this.NotifyOfPropertyChange(() => this.AppThemeMode);
}
}
public BindingList PresetDisplayModes { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public PresetDisplayMode SelectedPresetDisplayMode
{
get => this.selectedPresetDisplayMode;
set
{
if (value == this.selectedPresetDisplayMode) return;
this.selectedPresetDisplayMode = value;
this.NotifyOfPropertyChange(() => this.SelectedPresetDisplayMode);
}
}
public BindingList PresetUiTypes { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public PresetUiType SelectedPresetUiType
{
get => this.selectedPresetUiType;
set
{
if (value == this.selectedPresetUiType)
{
return;
}
this.selectedPresetUiType = value;
this.NotifyOfPropertyChange(() => this.SelectedPresetUiType);
}
}
/* When Done */
public string SendFileTo
{
get => this.sendFileTo;
set
{
this.sendFileTo = value;
this.NotifyOfPropertyChange(() => this.SendFileTo);
}
}
public string SendFileToPath
{
get => this.sendFileToPath;
set
{
this.sendFileToPath = value;
this.NotifyOfPropertyChange(() => this.SendFileToPath);
}
}
public string Arguments
{
get => this.arguments;
set
{
this.arguments = value;
this.NotifyOfPropertyChange(() => this.Arguments);
}
}
public bool PlaySoundWhenDone
{
get => this.playSoundWhenDone;
set
{
if (value == this.playSoundWhenDone) return;
this.playSoundWhenDone = value;
this.NotifyOfPropertyChange(() => this.PlaySoundWhenDone);
}
}
public bool PlaySoundWhenQueueDone
{
get => this.playSoundWhenQueueDone;
set
{
if (value == this.playSoundWhenQueueDone) return;
this.playSoundWhenQueueDone = value;
this.NotifyOfPropertyChange(() => this.PlaySoundWhenQueueDone);
}
}
public string WhenDoneAudioFile
{
get => this.whenDoneAudioFile;
set
{
if (value == this.whenDoneAudioFile) return;
this.whenDoneAudioFile = value;
this.NotifyOfPropertyChange(() => this.WhenDoneAudioFile);
}
}
public string WhenDoneAudioFileFullPath
{
get => this.whenDoneAudioFileFullPath;
set
{
if (value == this.whenDoneAudioFileFullPath) return;
this.whenDoneAudioFileFullPath = value;
this.NotifyOfPropertyChange(() => this.WhenDoneAudioFileFullPath);
}
}
public bool SendFileAfterEncode
{
get => this.sendFileAfterEncode;
set
{
this.sendFileAfterEncode = value;
this.NotifyOfPropertyChange(() => this.SendFileAfterEncode);
}
}
public WhenDone WhenDone
{
get => this.whenDone;
set
{
this.whenDone = value;
this.NotifyOfPropertyChange(() => this.WhenDone);
this.NotifyOfPropertyChange(() => this.IsQueueDoneCustomActionEnabled);
}
}
public BindingList WhenDoneOptions { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public bool SendSystemNotificationOnEncodeDone { get; set; }
public bool SendSystemNotificationOnQueueDone { get; set; }
public bool IsQueueDoneCustomActionEnabled => this.WhenDone == WhenDone.CustomAction;
public bool QueueDoneCustomActionEnabled
{
get => this.queueDoneCustomActionEnabled;
set
{
if (value == this.queueDoneCustomActionEnabled)
{
return;
}
this.queueDoneCustomActionEnabled = value;
this.NotifyOfPropertyChange(() => this.QueueDoneCustomActionEnabled);
}
}
public string QueueDoneAction
{
get => this.queueDoneAction;
set
{
if (value == this.queueDoneAction)
{
return;
}
this.queueDoneAction = value;
this.NotifyOfPropertyChange(() => this.QueueDoneAction);
}
}
public string QueueDoneActionFullPath { get; set; }
public string QueueDoneArguments
{
get => this.queueDoneArguments;
set
{
if (value == this.queueDoneArguments)
{
return;
}
this.queueDoneArguments = value;
this.NotifyOfPropertyChange(() => this.QueueDoneArguments);
}
}
public BindingList QueueDoneArgumentsOptions
{
get
{
return new BindingList
{
new PlaceHolderBucket { Name = Constants.AutonameOutputFolder },
};
}
}
/* Output Files */
public string AutoNameDefaultPath
{
get => this.autoNameDefaultPath;
set
{
if (this.IsAutonamePathValid(value))
{
this.autoNameDefaultPath = value;
this.NotifyOfPropertyChange(() => this.AutoNameDefaultPath);
}
}
}
public bool AutomaticallyNameFiles
{
get => this.automaticallyNameFiles;
set
{
this.automaticallyNameFiles = value;
this.NotifyOfPropertyChange(() => this.AutomaticallyNameFiles);
}
}
public string AutonameFormat
{
get => this.autonameFormat;
set
{
if (this.IsValidAutonameFormat(value, false))
{
this.autonameFormat = value;
}
this.NotifyOfPropertyChange(() => this.AutonameFormat);
}
}
public bool ChangeToTitleCase
{
get => this.changeToTitleCase;
set
{
this.changeToTitleCase = value;
this.NotifyOfPropertyChange(() => this.ChangeToTitleCase);
}
}
public bool RemoveUnderscores
{
get => this.removeUnderscores;
set
{
this.removeUnderscores = value;
this.NotifyOfPropertyChange(() => this.RemoveUnderscores);
}
}
public BindingList Mp4ExtensionOptions { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public Mp4Behaviour SelectedMp4Extension
{
get => this.selectedMp4Extension;
set
{
this.selectedMp4Extension = value;
this.NotifyOfPropertyChange(() => this.SelectedMp4Extension);
}
}
public bool RemovePunctuation
{
get => this.removePunctuation;
set
{
this.removePunctuation = value;
this.NotifyOfPropertyChange(() => RemovePunctuation);
}
}
public BindingList FileOverwriteBehaviourList { get; set; }
public int SelectedOverwriteBehaviour
{
get => this.selectedOverwriteBehaviour;
set
{
if (value == this.selectedOverwriteBehaviour) return;
this.selectedOverwriteBehaviour = value;
this.NotifyOfPropertyChange(() => this.SelectedOverwriteBehaviour);
}
}
public BindingList AutonameFileCollisionBehaviours { get; set; }
public int SelectedCollisionBehaviour
{
get => this.selectedCollisionBehaviour;
set
{
if (value == this.selectedCollisionBehaviour) return;
this.selectedCollisionBehaviour = value;
this.ShowPrePostFilenameBox = this.selectedCollisionBehaviour >= 1;
this.NotifyOfPropertyChange(() => this.SelectedCollisionBehaviour);
}
}
public string PrePostFilenameText
{
get => this.prePostFilenameText;
set
{
if (value == this.prePostFilenameText) return;
if (this.IsValidAutonameFormat(value, false))
{
this.prePostFilenameText = value;
}
this.NotifyOfPropertyChange(() => this.PrePostFilenameText);
}
}
public bool ShowPrePostFilenameBox
{
get => this.showPrePostFilenameBox;
set
{
if (value == this.showPrePostFilenameBox) return;
this.showPrePostFilenameBox = value;
this.NotifyOfPropertyChange(() => this.ShowPrePostFilenameBox);
}
}
public bool AlwaysUseDefaultPath
{
get => this.alwaysUseDefaultPath;
set
{
if (value == this.alwaysUseDefaultPath)
{
return;
}
this.alwaysUseDefaultPath = value;
this.NotifyOfPropertyChange(() => this.AlwaysUseDefaultPath);
}
}
public BindingList OutputFilenamePlaceholders
{
get
{
return new BindingList
{
new PlaceHolderBucket { Name = Constants.Source },
new PlaceHolderBucket { Name = Constants.Title },
new PlaceHolderBucket { Name = Constants.Angle },
new PlaceHolderBucket { Name = Constants.Chapters},
new PlaceHolderBucket { Name = Constants.CreationDate },
new PlaceHolderBucket { Name = Constants.CreationTime },
new PlaceHolderBucket { Name = Constants.ModificationDate },
new PlaceHolderBucket { Name = Constants.ModificationTime },
new PlaceHolderBucket { Name = Constants.Date },
new PlaceHolderBucket { Name = Constants.Time },
new PlaceHolderBucket { Name = Constants.QualityBitrate },
new PlaceHolderBucket { Name = Constants.QualityType },
new PlaceHolderBucket { Name = Constants.Preset },
new PlaceHolderBucket { Name = Constants.EncoderBitDepth },
new PlaceHolderBucket { Name = Constants.StorageWidth },
new PlaceHolderBucket { Name = Constants.StorageHeight },
new PlaceHolderBucket { Name = Constants.Codec },
new PlaceHolderBucket { Name = Constants.Encoder },
};
}
}
public BindingList PathFilenamePlaceholders
{
get
{
return new BindingList
{
new PlaceHolderBucket { Name = Constants.SourcePath },
new PlaceHolderBucket { Name = Constants.SourceFolderName },
new PlaceHolderBucket { Name = Constants.Source }
};
}
}
public BindingList WhenDoneArguments
{
get
{
return new BindingList
{
new PlaceHolderBucket { Name = Constants.SourceArg },
new PlaceHolderBucket { Name = Constants.DestinationArg },
new PlaceHolderBucket { Name = Constants.ExitCodeArg },
new PlaceHolderBucket { Name = Constants.DestinationFolder }
};
}
}
public bool UseIsoDateFormat
{
get => this.useIsoDateFormat;
set
{
if (value == this.useIsoDateFormat) return;
this.useIsoDateFormat = value;
this.OnPropertyChanged();
}
}
/* Preview */
public string VLCPath
{
get => this.vlcPath;
set
{
this.vlcPath = value;
this.NotifyOfPropertyChange(() => this.VLCPath);
}
}
/* System and Logging */
public bool CopyLogToEncodeDirectory
{
get => this.copyLogToEncodeDirectory;
set
{
this.copyLogToEncodeDirectory = value;
this.NotifyOfPropertyChange(() => this.CopyLogToEncodeDirectory);
}
}
public bool CopyLogToSpecifiedLocation
{
get => this.copyLogToSpecifiedLocation;
set
{
this.copyLogToSpecifiedLocation = value;
this.NotifyOfPropertyChange(() => this.CopyLogToSpecifiedLocation);
}
}
public bool ClearOldLogs
{
get => this.clearOldLogs;
set
{
this.clearOldLogs = value;
this.NotifyOfPropertyChange(() => this.ClearOldLogs);
}
}
public string LogDirectory
{
get => this.logDirectory;
set
{
this.logDirectory = value;
this.NotifyOfPropertyChange(() => this.LogDirectory);
}
}
public bool PreventSleep
{
get => this.preventSleep;
set
{
this.preventSleep = value;
this.NotifyOfPropertyChange(() => this.PreventSleep);
}
}
public bool PauseOnLowDiskspace
{
get => this.pauseOnLowDiskspace;
set
{
this.pauseOnLowDiskspace = value;
this.NotifyOfPropertyChange(() => this.PauseOnLowDiskspace);
}
}
public long PauseOnLowDiskspaceLevel
{
get => this.pauseOnLowDiskspaceLevel;
set
{
this.pauseOnLowDiskspaceLevel = value;
this.NotifyOfPropertyChange(() => this.pauseOnLowDiskspaceLevel);
}
}
public BindingList PriorityLevelOptions { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public string SelectedGranularity
{
get => this.selectedGranularity;
set
{
this.selectedGranularity = value;
this.NotifyOfPropertyChange(() => this.SelectedGranularity);
}
}
public ProcessPriority SelectedPriority
{
get => this.selectedPriority;
set
{
this.selectedPriority = value;
this.NotifyOfPropertyChange(() => this.SelectedPriority);
this.SetProcessPriority(value);
}
}
private void SetProcessPriority(ProcessPriority value)
{
if (this.RemoteServiceEnabled)
{
return; // We run as "Normal" in Remote mode.
}
// Set the Process Priority
switch (value)
{
case ProcessPriority.High:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
break;
case ProcessPriority.AboveNormal:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.AboveNormal;
break;
case ProcessPriority.Normal:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Normal;
break;
case ProcessPriority.BelowNormal:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal;
break;
case ProcessPriority.Low:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Idle;
break;
default:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal;
break;
}
}
/* Advanced */
public BindingList ConstantQualityGranularity
{
get => this.constantQualityGranularity;
set
{
this.constantQualityGranularity = value;
this.NotifyOfPropertyChange(() => this.ConstantQualityGranularity);
}
}
public bool DisableLibdvdNav
{
get => this.disableLibdvdNav;
set
{
this.disableLibdvdNav = value;
this.NotifyOfPropertyChange(() => this.DisableLibdvdNav);
}
}
public BindingList LogVerbosityOptions { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public long MinLength
{
get => this.minLength;
set
{
this.minLength = value;
this.NotifyOfPropertyChange(() => this.MinLength);
}
}
public long MaxLength
{
get => this.maxLength;
set
{
this.maxLength = value;
this.NotifyOfPropertyChange(() => this.MaxLength);
}
}
public bool MaxDurationEnabled
{
get => this.maxDurationEnabled;
set
{
if (value == this.maxDurationEnabled)
{
return;
}
if (!value)
{
MaxLength = 0;
}
this.maxDurationEnabled = value;
this.OnPropertyChanged();
}
}
public bool MinimiseToTray
{
get => this.minimiseToTray;
set
{
this.minimiseToTray = value;
this.NotifyOfPropertyChange(() => this.MinimiseToTray);
}
}
public BindingList PreviewPicturesToScan
{
get => this.previewPicturesToScan;
set
{
this.previewPicturesToScan = value;
this.NotifyOfPropertyChange(() => this.PreviewPicturesToScan);
}
}
public int SelectedPreviewCount
{
get => this.selectedPreviewCount;
set
{
this.selectedPreviewCount = value;
this.NotifyOfPropertyChange(() => this.SelectedPreviewCount);
}
}
public LogLevel SelectedVerbosity
{
get => this.selectedVerbosity;
set
{
this.selectedVerbosity = value;
this.NotifyOfPropertyChange(() => this.SelectedVerbosity);
}
}
public bool ClearQueueOnEncodeCompleted
{
get => this.clearQueueOnEncodeCompleted;
set
{
this.clearQueueOnEncodeCompleted = value;
this.NotifyOfPropertyChange(() => this.ClearQueueOnEncodeCompleted);
}
}
public bool PauseOnLowBattery
{
get => this.pauseOnLowBattery;
set
{
if (value == this.pauseOnLowBattery) return;
this.pauseOnLowBattery = value;
this.NotifyOfPropertyChange(() => this.PauseOnLowBattery);
}
}
public int LowBatteryLevel
{
get => this.lowBatteryLevel;
set
{
if (value == this.lowBatteryLevel) return;
this.lowBatteryLevel = value;
this.NotifyOfPropertyChange(() => this.LowBatteryLevel);
}
}
public BindingList ExcludedFileExtensions
{
get => this.excludedFileExtensions;
set
{
if (Equals(value, this.excludedFileExtensions)) return;
this.excludedFileExtensions = value;
this.OnPropertyChanged();
}
}
public string NewExtension { get; set; }
public SimpleRelayCommand RemoveExtensionCommand { get; set; }
public bool RecursiveFolderScan
{
get => this.recursiveFolderScan;
set
{
if (value == this.recursiveFolderScan) return;
this.recursiveFolderScan = value;
this.NotifyOfPropertyChange(() => this.RecursiveFolderScan);
}
}
public bool KeepDuplicateTitles
{
get => this.keepDuplicateTitles;
set
{
if (value == this.keepDuplicateTitles) return;
this.keepDuplicateTitles = value;
this.NotifyOfPropertyChange(() => this.KeepDuplicateTitles);
}
}
public BindingList DefaultRangeModes { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public DefaultRangeMode SelectedDefaultRangeMode
{
get => this.selectedDefaultRangeMode;
set
{
if (value == this.selectedDefaultRangeMode)
{
return;
}
this.selectedDefaultRangeMode = value;
this.NotifyOfPropertyChange(() => this.SelectedDefaultRangeMode);
}
}
/* Video */
public bool EnableDirectXDecoding
{
get => this.enableDirectXDecoding;
set
{
if (value == this.enableDirectXDecoding)
{
return;
}
this.enableDirectXDecoding = value;
this.NotifyOfPropertyChange(() => this.EnableDirectXDecoding);
}
}
public bool EnableQuickSyncDecoding
{
get => this.enableQuickSyncDecoding && IsQuickSyncAvailable;
set
{
if (value.Equals(this.enableQuickSyncDecoding))
{
return;
}
this.enableQuickSyncDecoding = value;
this.NotifyOfPropertyChange(() => this.EnableQuickSyncDecoding);
this.NotifyOfPropertyChange(() => this.IsUseQsvDecAvailable);
this.NotifyOfPropertyChange(() => this.CanSetQsvDecForOtherEncodes);
}
}
public bool EnableQuickSyncLowPower
{
get => this.enableQuickSyncLowPower;
set
{
if (value == this.enableQuickSyncLowPower)
{
return;
}
this.enableQuickSyncLowPower = value;
this.NotifyOfPropertyChange(() => this.EnableQuickSyncLowPower);
}
}
public bool EnableQuickSyncHyperEncode
{
get => this.enableQuickSyncHyperEncode;
set
{
if (value == this.enableQuickSyncHyperEncode)
{
return;
}
this.enableQuickSyncHyperEncode = value;
this.NotifyOfPropertyChange(() => this.EnableQuickSyncHyperEncode);
}
}
public bool DisplayIntelDriverWarning { get; set; }
public bool DisplayNvidiaDriverWarning { get; set; }
public VideoScaler SelectedScalingMode { get; set; }
public bool IsQuickSyncAvailable { get; } = HandBrakeHardwareEncoderHelper.IsQsvAvailable;
public bool IsQuickSyncHyperEncodeAvailable { get; } = HandBrakeHardwareEncoderHelper.IsQsvHyperEncodeAvailable;
public bool IsVceAvailable { get; } = HandBrakeHardwareEncoderHelper.IsVceH264Available;
public bool IsNvencAvailable { get; } = HandBrakeHardwareEncoderHelper.IsNVEncH264Available;
public bool IsDirectXAvailable { get; } = HandBrakeHardwareEncoderHelper.IsDirectXAvailable;
public bool IsUseQsvDecAvailable => this.IsQuickSyncAvailable && this.EnableQuickSyncDecoding;
public bool IsNvdecAvailable => HandBrakeHardwareEncoderHelper.IsNVDecAvailable;
public bool UseQSVDecodeForNonQSVEnc
{
get => this.useQsvDecodeForNonQsvEnc;
set
{
if (value == this.useQsvDecodeForNonQsvEnc) return;
this.useQsvDecodeForNonQsvEnc = value;
this.NotifyOfPropertyChange(() => this.UseQSVDecodeForNonQSVEnc);
}
}
public bool CanSetQsvDecForOtherEncodes => this.EnableQuickSyncDecoding && this.IsQuickSyncAvailable;
public BindingList ScalingOptions { get; } = new BindingList(EnumHelper.GetEnumList().ToList());
public bool IsHardwareFallbackMode => HandBrakeUtils.IsInitNoHardware();
public bool IsSafeMode => HandBrakeHardwareEncoderHelper.IsSafeMode;
public bool IsHardwareOptionsVisible => !IsSafeMode && !IsHardwareFallbackMode;
public bool IsAutomaticSafeMode { get; private set; }
public bool IsARMDevice => SystemInfo.IsArmDevice;
public bool EnableNvDecSupport
{
get => this.enableNvDecSupport;
set
{
if (value == this.enableNvDecSupport) return;
this.enableNvDecSupport = value;
this.NotifyOfPropertyChange(() => this.EnableNvDecSupport);
}
}
/* About HandBrake */
public string Version { get; } = string.Format("{0}", HandBrakeVersionHelper.GetVersion());
public string UpdateMessage
{
get => this.updateMessage;
set
{
this.updateMessage = value;
this.NotifyOfPropertyChange(() => this.UpdateMessage);
if (!string.IsNullOrEmpty(this.updateMessage))
{
IsUpdateMessageSet = true;
}
else
{
this.IsUpdateMessageSet = false;
}
this.NotifyOfPropertyChange(() => this.IsUpdateMessageSet);
}
}
public bool IsUpdateMessageSet { get; set; }
public bool UpdateAvailable
{
get => this.updateAvailable;
set
{
this.updateAvailable = value;
this.NotifyOfPropertyChange(() => this.UpdateAvailable);
this.NotifyOfPropertyChange(() => this.IsPortableModeUpdateAvailable);
this.NotifyOfPropertyChange(() => this.DownloadAvailable);
}
}
public bool DownloadAvailable
{
get => !Portable.IsPortable() && UpdateAvailable;
}
public bool IsPortableModeUpdateAvailable
{
get => Portable.IsPortable() && UpdateAvailable;
}
public int DownloadProgressPercentage
{
get => this.downloadProgressPercentage;
set
{
this.downloadProgressPercentage = value;
this.NotifyOfPropertyChange(() => this.DownloadProgressPercentage);
}
}
public bool RemoteServiceEnabled
{
get => this.remoteServiceEnabled;
set
{
if (value == this.remoteServiceEnabled)
{
return;
}
this.remoteServiceEnabled = value;
this.NotifyOfPropertyChange(() => this.RemoteServiceEnabled);
}
}
public int RemoteServicePort
{
get => this.remoteServicePort;
set
{
if (value == this.remoteServicePort)
{
return;
}
if (value > 32767 || value < 5000)
{
this.errorService.ShowMessageBox(
Resources.OptionsView_RemotePortLimit,
Resources.Error,
MessageBoxButton.OK,
MessageBoxImage.Error);
return; // Allow only valid ports, not in the ephemeral range
}
this.remoteServicePort = value;
this.NotifyOfPropertyChange(() => this.RemoteServicePort);
}
}
public bool IsProcessIsolationAllowed { get; } = Portable.IsProcessIsolationEnabled();
public int SimultaneousEncodes
{
get => this.simultaneousEncodes;
set
{
if (value == this.simultaneousEncodes) return;
this.simultaneousEncodes = value;
this.NotifyOfPropertyChange(() => this.SimultaneousEncodes);
}
}
public BindingList SimultaneousEncodesList
{
get
{
BindingList list = new BindingList();
for (int i = 1; i <= SystemInfo.MaximumSimultaneousInstancesSupported; i++)
{
list.Add(i);
}
return list;
}
}
public bool IsSimultaneousEncodesSupported => SystemInfo.MaximumSimultaneousInstancesSupported > 1;
#region Public Methods
public void Close()
{
this.Save();
IShellViewModel shellViewModel = IoCHelper.Get();
shellViewModel.DisplayWindow(ShellWindow.MainWindow);
}
public void BrowseSendFileTo()
{
OpenFileDialog dialog = new OpenFileDialog { Filter = "All files (*.*)|*.*", FileName = this.sendFileToPath };
bool? dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
this.SendFileTo = Path.GetFileNameWithoutExtension(dialog.FileName);
this.sendFileToPath = dialog.FileName;
}
}
public void BrowseQueueDoneAction()
{
OpenFileDialog dialog = new OpenFileDialog { Filter = "All files (*.*)|*.*", FileName = this.sendFileToPath };
bool? dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
this.QueueDoneAction = Path.GetFileNameWithoutExtension(dialog.FileName);
this.QueueDoneActionFullPath = dialog.FileName;
}
}
public void ClearQueueDoneAction()
{
this.QueueDoneAction = null;
this.QueueDoneActionFullPath = null;
}
public void ClearSendFileToAction()
{
this.SendFileTo = null;
this.SendFileToPath = null;
}
public void BrowseAutoNamePath()
{
FolderBrowserDialog dialog = new FolderBrowserDialog { Description = Resources.OptionsView_SelectFolder, SelectedPath = this.AutoNameDefaultPath };
bool? dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
this.AutoNameDefaultPath = dialog.SelectedPath;
}
}
public void BrowseVlcPath()
{
OpenFileDialog dialog = new OpenFileDialog { Filter = "All files (*.exe)|*.exe", FileName = this.VLCPath };
bool? dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
this.VLCPath = dialog.FileName;
}
}
public void BrowseLogPath()
{
FolderBrowserDialog dialog = new FolderBrowserDialog { Description = Resources.OptionsView_SelectFolder, SelectedPath = this.LogDirectory };
bool? dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
this.LogDirectory = dialog.SelectedPath;
}
}
public void ViewLogDirectory()
{
string logDir = DirectoryUtilities.GetLogDirectory();
string windir = Environment.GetEnvironmentVariable("WINDIR");
Process prc = new Process { StartInfo = { FileName = windir + @"\explorer.exe", Arguments = logDir } };
prc.Start();
}
public void ClearLogHistory()
{
MessageBoxResult result = this.errorService.ShowMessageBox(Resources.OptionsView_ClearLogDirConfirm, Resources.OptionsView_ClearLogs,
MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
GeneralUtilities.ClearLogFiles(0);
this.errorService.ShowMessageBox(Resources.OptionsView_LogsCleared, Resources.OptionsView_Notice, MessageBoxButton.OK, MessageBoxImage.Information);
}
}
public void DownloadUpdate()
{
this.UpdateMessage = Resources.OptionsView_PreparingUpdate;
this.updateService.DownloadFile(this.updateInfo, this.DownloadComplete, this.DownloadProgress);
}
public void PerformUpdateCheck()
{
this.UpdateMessage = Resources.OptionsView_CheckingForUpdates;
this.updateService.CheckForUpdates(this.UpdateCheckComplete);
this.IsUpdateFound = true;
this.NotifyOfPropertyChange(() =>this.IsUpdateFound);
}
public void BrowseWhenDoneAudioFile()
{
OpenFileDialog dialog = new OpenFileDialog() { Filter = "All Files|*.wav;*.mp3", FileName = this.WhenDoneAudioFileFullPath };
bool? dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
this.WhenDoneAudioFile = Path.GetFileNameWithoutExtension(dialog.FileName);
this.WhenDoneAudioFileFullPath = dialog.FileName;
}
else
{
this.WhenDoneAudioFile = null;
this.WhenDoneAudioFileFullPath = null;
}
}
public void PlayWhenDoneFile()
{
if (!string.IsNullOrEmpty(this.WhenDoneAudioFileFullPath) && File.Exists(this.WhenDoneAudioFileFullPath))
{
try
{
var player = new SoundPlayer(this.WhenDoneAudioFileFullPath);
player.Play();
}
catch (Exception exc)
{
this.logService.LogMessage(string.Format("{1} # {0}{1}", exc, Environment.NewLine));
}
}
else
{
this.errorService.ShowMessageBox(
Resources.OptionsView_MediaFileNotSet,
Resources.Error,
MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
public void ResetAutomaticSafeMode()
{
userSettingService.SetUserSetting(UserSettingConstants.ForceDisableHardwareSupport, false);
this.errorService.ShowMessageBox(
Resources.OptionsView_ResetSafeModeMessage,
Resources.Notice,
MessageBoxButton.OK,
MessageBoxImage.Information);
this.IsAutomaticSafeMode = false;
this.NotifyOfPropertyChange(() => this.IsAutomaticSafeMode);
}
public void ResetAutoNameFormat()
{
this.AutonameFormat = "{source}-{title}";
}
public void AddExcludedExtension()
{
if (!string.IsNullOrEmpty(NewExtension))
{
NewExtension = NewExtension.Replace(".", string.Empty);
if (this.ExcludedFileExtensions.Contains(NewExtension, StringComparer.OrdinalIgnoreCase))
{
this.errorService.ShowMessageBox(Resources.Options_ExtensionExists, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
this.ExcludedFileExtensions.Add(this.NewExtension);
this.NewExtension = null;
this.NotifyOfPropertyChange(() => this.NewExtension);
}
}
public void RemoveExcludedExtension(string extension)
{
if (!string.IsNullOrEmpty(extension))
{
if (this.ExcludedFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase))
{
this.ExcludedFileExtensions.Remove(extension);
}
}
}
#endregion
public override void OnLoad()
{
// #############################
// General
// #############################
string culture = this.userSettingService.GetUserSetting(UserSettingConstants.UiLanguage);
this.SelectedLanguage = InterfaceLanguageUtilities.FindInterfaceLanguage(culture);
this.SelectedRightToLeftMode = (RightToLeftMode)this.userSettingService.GetUserSetting(UserSettingConstants.RightToLeftUi);
this.CheckForUpdatesAllowed = true;
this.CheckForUpdates = this.userSettingService.GetUserSetting(UserSettingConstants.UpdateStatus);
this.CheckForUpdatesFrequency = (UpdateCheck)this.userSettingService.GetUserSetting(UserSettingConstants.DaysBetweenUpdateCheck);
if (Portable.IsPortable() && !Portable.IsUpdateCheckEnabled())
{
this.CheckForUpdates = false;
this.CheckForUpdatesAllowed = false;
}
this.ShowStatusInTitleBar = this.userSettingService.GetUserSetting(UserSettingConstants.ShowStatusInTitleBar);
this.ShowPreviewOnSummaryTab = this.userSettingService.GetUserSetting(UserSettingConstants.ShowPreviewOnSummaryTab);
this.ShowAddAllToQueue = this.userSettingService.GetUserSetting(UserSettingConstants.ShowAddAllToQueue);
this.ShowAddSelectionToQueue = this.userSettingService.GetUserSetting(UserSettingConstants.ShowAddSelectionToQueue);
this.AppThemeMode = (AppThemeMode)this.userSettingService.GetUserSetting(UserSettingConstants.DarkThemeMode);
this.SelectedPresetDisplayMode = (PresetDisplayMode)this.userSettingService.GetUserSetting(UserSettingConstants.PresetMenuDisplayMode);
this.SelectedPresetUiType = (PresetUiType)this.userSettingService.GetUserSetting(UserSettingConstants.PresetUiType);
// #############################
// When Done
// #############################
this.WhenDone = (WhenDone)this.userSettingService.GetUserSetting(UserSettingConstants.WhenCompleteAction);
if (this.userSettingService.GetUserSetting(UserSettingConstants.ResetWhenDoneAction))
{
this.WhenDone = WhenDone.DoNothing;
}
this.SendFileAfterEncode = this.userSettingService.GetUserSetting(UserSettingConstants.SendFile);
this.SendFileTo = Path.GetFileNameWithoutExtension(this.userSettingService.GetUserSetting(UserSettingConstants.SendFileTo)) ?? string.Empty;
this.SendFileToPath = this.userSettingService.GetUserSetting(UserSettingConstants.SendFileTo) ?? string.Empty;
this.Arguments = this.userSettingService.GetUserSetting(UserSettingConstants.SendFileToArgs) ?? string.Empty;
this.ResetWhenDoneAction = this.userSettingService.GetUserSetting(UserSettingConstants.ResetWhenDoneAction);
this.WhenDonePerformActionImmediately = this.userSettingService.GetUserSetting(UserSettingConstants.WhenDonePerformActionImmediately);
this.WhenDoneAudioFile = Path.GetFileNameWithoutExtension(this.userSettingService.GetUserSetting(UserSettingConstants.WhenDoneAudioFile)) ?? string.Empty;
this.WhenDoneAudioFileFullPath = this.userSettingService.GetUserSetting(UserSettingConstants.WhenDoneAudioFile);
this.PlaySoundWhenDone = this.userSettingService.GetUserSetting(UserSettingConstants.PlaySoundWhenDone);
this.PlaySoundWhenQueueDone = this.userSettingService.GetUserSetting(UserSettingConstants.PlaySoundWhenQueueDone);
this.SendSystemNotificationOnEncodeDone = this.userSettingService.GetUserSetting(UserSettingConstants.NotifyOnEncodeDone);
this.SendSystemNotificationOnQueueDone = this.userSettingService.GetUserSetting(UserSettingConstants.NotifyOnQueueDone);
this.QueueDoneCustomActionEnabled = this.userSettingService.GetUserSetting(UserSettingConstants.QueueDoneCustomActionEnabled);
this.QueueDoneAction = Path.GetFileNameWithoutExtension(this.userSettingService.GetUserSetting(UserSettingConstants.QueueDoneAction)) ?? string.Empty;
this.QueueDoneActionFullPath = this.userSettingService.GetUserSetting(UserSettingConstants.QueueDoneAction) ?? string.Empty;
this.QueueDoneArguments = this.userSettingService.GetUserSetting(UserSettingConstants.QueueDoneArguments);
// #############################
// Output Settings
// #############################
// Enable auto naming feature.)
this.AutomaticallyNameFiles = this.userSettingService.GetUserSetting(UserSettingConstants.AutoNaming);
// Store the auto name path
this.AutoNameDefaultPath = this.userSettingService.GetUserSetting(UserSettingConstants.AutoNamePath) ?? string.Empty;
if (string.IsNullOrEmpty(this.autoNameDefaultPath))
this.AutoNameDefaultPath = Resources.OptionsView_SetDefaultLocationOutputFIle;
// Store auto name format
string anf = this.userSettingService.GetUserSetting(UserSettingConstants.AutoNameFormat) ?? string.Empty;
this.AutonameFormat = this.IsValidAutonameFormat(anf, true) ? anf : "{source}-{title}";
// Use iPod/iTunes friendly .m4v extension for MP4 files.
this.SelectedMp4Extension = (Mp4Behaviour)this.userSettingService.GetUserSetting(UserSettingConstants.UseM4v);
// Remove Underscores
this.RemoveUnderscores = this.userSettingService.GetUserSetting(UserSettingConstants.AutoNameRemoveUnderscore);
// Title case
this.ChangeToTitleCase = this.userSettingService.GetUserSetting(UserSettingConstants.AutoNameTitleCase);
this.RemovePunctuation = this.userSettingService.GetUserSetting(UserSettingConstants.RemovePunctuation);
// File Overwrite
this.FileOverwriteBehaviourList = new BindingList();
this.FileOverwriteBehaviourList.Add(FileOverwriteBehaviour.Ask);
this.FileOverwriteBehaviourList.Add(FileOverwriteBehaviour.ForceOverwrite);
this.SelectedOverwriteBehaviour = this.userSettingService.GetUserSetting(UserSettingConstants.FileOverwriteBehaviour);
// Collision behaviour
this.AutonameFileCollisionBehaviours = new BindingList() { AutonameFileCollisionBehaviour.AppendNumber, AutonameFileCollisionBehaviour.Prefix, AutonameFileCollisionBehaviour.Postfix };
this.SelectedCollisionBehaviour = this.userSettingService.GetUserSetting(UserSettingConstants.AutonameFileCollisionBehaviour);
this.PrePostFilenameText = this.userSettingService.GetUserSetting(UserSettingConstants.AutonameFilePrePostString);
this.AlwaysUseDefaultPath = this.userSettingService.GetUserSetting(UserSettingConstants.AlwaysUseDefaultPath);
this.UseIsoDateFormat = this.userSettingService.GetUserSetting(UserSettingConstants.UseIsoDateFormat);
// #############################
// Picture Tab
// #############################
// VLC Path
this.VLCPath = this.userSettingService.GetUserSetting(UserSettingConstants.MediaPlayerPath) ?? string.Empty;
// #############################
// Video
// #############################
this.EnableQuickSyncDecoding = this.userSettingService.GetUserSetting(UserSettingConstants.EnableQuickSyncDecoding);
this.SelectedScalingMode = this.userSettingService.GetUserSetting(UserSettingConstants.ScalingMode);
this.UseQSVDecodeForNonQSVEnc = this.userSettingService.GetUserSetting(UserSettingConstants.UseQSVDecodeForNonQSVEnc);
this.EnableQuickSyncLowPower = this.userSettingService.GetUserSetting(UserSettingConstants.EnableQuickSyncLowPower);
this.EnableQuickSyncHyperEncode = this.userSettingService.GetUserSetting(UserSettingConstants.EnableQuickSyncHyperEncode);
this.EnableNvDecSupport = this.userSettingService.GetUserSetting(UserSettingConstants.EnableNvDecSupport);
this.EnableDirectXDecoding = this.userSettingService.GetUserSetting(UserSettingConstants.EnableDirectXDecoding);
// #############################
// Process
// #############################
this.RemoteServiceEnabled = this.userSettingService.GetUserSetting(UserSettingConstants.ProcessIsolationEnabled);
this.RemoteServicePort = userSettingService.GetUserSetting(UserSettingConstants.ProcessIsolationPort);
this.SimultaneousEncodes = userSettingService.GetUserSetting(UserSettingConstants.SimultaneousEncodes);
if (this.SimultaneousEncodes > 8)
{
this.SimultaneousEncodes = 8;
}
this.SelectedPriority = (ProcessPriority)userSettingService.GetUserSetting(UserSettingConstants.ProcessPriorityInt);
this.PreventSleep = userSettingService.GetUserSetting(UserSettingConstants.PreventSleep);
this.PauseOnLowDiskspace = userSettingService.GetUserSetting(UserSettingConstants.PauseOnLowDiskspace);
this.PauseOnLowDiskspaceLevel = this.userSettingService.GetUserSetting(UserSettingConstants.PauseQueueOnLowDiskspaceLevel);
// Log Verbosity Level
this.logVerbosityOptions.Clear();
this.logVerbosityOptions.Add(0);
this.logVerbosityOptions.Add(1);
this.logVerbosityOptions.Add(2);
this.SelectedVerbosity = (LogLevel)userSettingService.GetUserSetting(UserSettingConstants.Verbosity);
// Logs
this.CopyLogToEncodeDirectory = userSettingService.GetUserSetting(UserSettingConstants.SaveLogWithVideo);
this.CopyLogToSpecifiedLocation = userSettingService.GetUserSetting(UserSettingConstants.SaveLogToCopyDirectory);
// The saved log path
this.LogDirectory = userSettingService.GetUserSetting(UserSettingConstants.SaveLogCopyDirectory) ?? string.Empty;
this.ClearOldLogs = this.userSettingService.GetUserSetting(UserSettingConstants.ClearOldLogs);
// #############################
// Advanced
// #############################
// Minimise to Tray
this.MinimiseToTray = this.userSettingService.GetUserSetting(UserSettingConstants.MainWindowMinimize);
this.ClearQueueOnEncodeCompleted = userSettingService.GetUserSetting(UserSettingConstants.ClearCompletedFromQueue);
// Set the preview count
this.PreviewPicturesToScan.Clear();
this.PreviewPicturesToScan.Add(10);
this.PreviewPicturesToScan.Add(15);
this.PreviewPicturesToScan.Add(20);
this.PreviewPicturesToScan.Add(25);
this.PreviewPicturesToScan.Add(30);
this.PreviewPicturesToScan.Add(35);
this.PreviewPicturesToScan.Add(40);
this.PreviewPicturesToScan.Add(45);
this.PreviewPicturesToScan.Add(50);
this.PreviewPicturesToScan.Add(55);
this.PreviewPicturesToScan.Add(60);
this.SelectedPreviewCount = this.userSettingService.GetUserSetting(UserSettingConstants.PreviewScanCount);
this.KeepDuplicateTitles = this.userSettingService.GetUserSetting(UserSettingConstants.KeepDuplicateTitles);
// x264 step
this.ConstantQualityGranularity.Clear();
this.ConstantQualityGranularity.Add("1.00");
this.ConstantQualityGranularity.Add("0.50");
this.ConstantQualityGranularity.Add("0.25");
this.SelectedGranularity = userSettingService.GetUserSetting(UserSettingConstants.X264Step).ToString("0.00", CultureInfo.InvariantCulture);
// Min Title Length
this.MinLength = this.userSettingService.GetUserSetting(UserSettingConstants.MinScanDuration);
this.MaxLength = this.userSettingService.GetUserSetting(UserSettingConstants.MaxScanDuration);
if (this.MaxLength > 0)
{
this.MaxDurationEnabled = true;
}
// Use dvdnav
this.DisableLibdvdNav = userSettingService.GetUserSetting(UserSettingConstants.DisableLibDvdNav);
this.PauseOnLowBattery = userSettingService.GetUserSetting(UserSettingConstants.PauseEncodingOnLowBattery);
this.LowBatteryLevel = userSettingService.GetUserSetting(UserSettingConstants.LowBatteryLevel);
this.ExcludedFileExtensions = new BindingList(userSettingService.GetUserSetting>(UserSettingConstants.ExcludedExtensions));
this.RecursiveFolderScan = userSettingService.GetUserSetting(UserSettingConstants.RecursiveFolderScan);
this.SelectedDefaultRangeMode = userSettingService.GetUserSetting(UserSettingConstants.DefaultRangeMode);
// #############################
// Safe Mode
// #############################
this.IsAutomaticSafeMode = userSettingService.GetUserSetting(UserSettingConstants.ForceDisableHardwareSupport);
this.NotifyOfPropertyChange(() => this.IsAutomaticSafeMode);
// Warnings
// Reset Settings where incompatible drivers are found
ThreadPool.QueueUserWorkItem(
delegate
{
try
{
GpuInfo info = SystemInfo.GetGPUInfo.FirstOrDefault(s => s.IsIntel);
if (info != null)
{
if (!info.IsIntelDriverSupported)
{
this.DisplayIntelDriverWarning = !info.IsIntelDriverSupported;
this.EnableQuickSyncDecoding = false;
this.UseQSVDecodeForNonQSVEnc = false;
this.Save();
}
}
info = SystemInfo.GetGPUInfo.FirstOrDefault(s => s.IsNvidia);
if (info != null)
{
if (!info.IsNvidiaDriverSupported)
{
this.DisplayNvidiaDriverWarning = true;
this.EnableNvDecSupport = false;
this.Save();
}
}
this.NotifyOfPropertyChange(() => this.DisplayIntelDriverWarning);
this.NotifyOfPropertyChange(() => this.DisplayNvidiaDriverWarning);
}
catch (Exception exc)
{
// Nothing to do. Just don't display the warnings.
Debug.WriteLine(exc);
}
});
}
public void UpdateSettings()
{
this.WhenDone = (WhenDone)this.userSettingService.GetUserSetting(UserSettingConstants.WhenCompleteAction);
this.ShowAddAllToQueue = this.userSettingService.GetUserSetting(UserSettingConstants.ShowAddAllToQueue);
this.ShowAddSelectionToQueue = this.userSettingService.GetUserSetting(UserSettingConstants.ShowAddSelectionToQueue);
}
public void GotoTab(OptionsTab tab)
{
this.SelectedTab = tab;
}
public void ResetHandBrake()
{
MessageBoxResult result = this.errorService.ShowMessageBox(
Resources.OptionsViewModel_ResetHandBrakeQuestion,
Resources.OptionsViewModel_ResetHandBrake,
MessageBoxButton.YesNo,
MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
this.userSettingService.ResetSettingsToDefaults();
this.OnLoad();
}
}
public void ResetBuiltInPresets()
{
MessageBoxResult result = this.errorService.ShowMessageBox(
Resources.OptionsViewModel_ResetHandBrakePresetsQuestion,
Resources.OptionsViewModel_ResetHandBrake,
MessageBoxButton.YesNo,
MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
this.presetService.UpdateBuiltInPresets();
this.errorService.ShowMessageBox(Resources.Presets_ResetComplete, Resources.Presets_ResetHeader, MessageBoxButton.OK, MessageBoxImage.Information);
}
}
public void UninstallNotifications()
{
this.SendSystemNotificationOnQueueDone = false;
this.SendSystemNotificationOnEncodeDone = false;
this.NotifyOfPropertyChange(() => SendSystemNotificationOnQueueDone);
this.NotifyOfPropertyChange(() => SendSystemNotificationOnEncodeDone);
this.notificationService.Uninstall();
this.errorService.ShowMessageBox(Resources.OptionsView_UninstallMessageBoxText, Resources.OptionsView_UninstallMessageBoxHeader, MessageBoxButton.OK, MessageBoxImage.Information);
}
private void Save()
{
/* General */
this.userSettingService.SetUserSetting(UserSettingConstants.UpdateStatus, this.CheckForUpdates);
this.userSettingService.SetUserSetting(UserSettingConstants.DaysBetweenUpdateCheck, this.CheckForUpdatesFrequency);
this.userSettingService.SetUserSetting(UserSettingConstants.ShowStatusInTitleBar, this.ShowStatusInTitleBar);
this.userSettingService.SetUserSetting(UserSettingConstants.ShowPreviewOnSummaryTab, this.ShowPreviewOnSummaryTab);
this.userSettingService.SetUserSetting(UserSettingConstants.DarkThemeMode, this.AppThemeMode);
this.userSettingService.SetUserSetting(UserSettingConstants.UiLanguage, this.SelectedLanguage?.Culture);
this.userSettingService.SetUserSetting(UserSettingConstants.RightToLeftUi, this.SelectedRightToLeftMode);
this.userSettingService.SetUserSetting(UserSettingConstants.ShowAddAllToQueue, this.ShowAddAllToQueue);
this.userSettingService.SetUserSetting(UserSettingConstants.ShowAddSelectionToQueue, this.ShowAddSelectionToQueue);
this.userSettingService.SetUserSetting(UserSettingConstants.PresetMenuDisplayMode, this.SelectedPresetDisplayMode);
this.userSettingService.SetUserSetting(UserSettingConstants.PresetUiType, this.SelectedPresetUiType);
/* When Done */
this.userSettingService.SetUserSetting(UserSettingConstants.WhenCompleteAction, (int)this.WhenDone);
this.userSettingService.SetUserSetting(UserSettingConstants.ResetWhenDoneAction, this.ResetWhenDoneAction);
this.userSettingService.SetUserSetting(UserSettingConstants.WhenDonePerformActionImmediately, this.WhenDonePerformActionImmediately);
this.userSettingService.SetUserSetting(UserSettingConstants.PlaySoundWhenDone, this.PlaySoundWhenDone);
this.userSettingService.SetUserSetting(UserSettingConstants.PlaySoundWhenQueueDone, this.PlaySoundWhenQueueDone);
this.userSettingService.SetUserSetting(UserSettingConstants.WhenDoneAudioFile, this.WhenDoneAudioFileFullPath);
this.userSettingService.SetUserSetting(UserSettingConstants.NotifyOnEncodeDone, this.SendSystemNotificationOnEncodeDone);
this.userSettingService.SetUserSetting(UserSettingConstants.NotifyOnQueueDone, this.SendSystemNotificationOnQueueDone);
this.userSettingService.SetUserSetting(UserSettingConstants.SendFileTo, this.SendFileToPath);
this.userSettingService.SetUserSetting(UserSettingConstants.SendFile, this.SendFileAfterEncode);
this.userSettingService.SetUserSetting(UserSettingConstants.SendFileToArgs, this.Arguments);
this.userSettingService.SetUserSetting(UserSettingConstants.QueueDoneCustomActionEnabled, this.QueueDoneCustomActionEnabled);
this.userSettingService.SetUserSetting(UserSettingConstants.QueueDoneAction, this.QueueDoneActionFullPath);
this.userSettingService.SetUserSetting(UserSettingConstants.QueueDoneArguments, this.QueueDoneArguments);
/* Output Files */
this.userSettingService.SetUserSetting(UserSettingConstants.AutoNaming, this.AutomaticallyNameFiles);
this.userSettingService.SetUserSetting(UserSettingConstants.AutoNameFormat, this.AutonameFormat);
this.userSettingService.SetUserSetting(UserSettingConstants.AutoNamePath, this.AutoNameDefaultPath);
this.userSettingService.SetUserSetting(UserSettingConstants.UseM4v, (int)this.SelectedMp4Extension);
this.userSettingService.SetUserSetting(UserSettingConstants.AutoNameRemoveUnderscore, this.RemoveUnderscores);
this.userSettingService.SetUserSetting(UserSettingConstants.AutoNameTitleCase, this.ChangeToTitleCase);
this.userSettingService.SetUserSetting(UserSettingConstants.RemovePunctuation, this.RemovePunctuation);
this.userSettingService.SetUserSetting(UserSettingConstants.FileOverwriteBehaviour, this.SelectedOverwriteBehaviour);
this.userSettingService.SetUserSetting(UserSettingConstants.AutonameFileCollisionBehaviour, this.SelectedCollisionBehaviour);
this.userSettingService.SetUserSetting(UserSettingConstants.AutonameFilePrePostString, this.PrePostFilenameText);
this.userSettingService.SetUserSetting(UserSettingConstants.AlwaysUseDefaultPath, this.AlwaysUseDefaultPath);
this.userSettingService.SetUserSetting(UserSettingConstants.UseIsoDateFormat, this.UseIsoDateFormat);
/* Previews */
this.userSettingService.SetUserSetting(UserSettingConstants.MediaPlayerPath, this.VLCPath);
/* Video */
this.userSettingService.SetUserSetting(UserSettingConstants.EnableQuickSyncDecoding, this.EnableQuickSyncDecoding);
this.userSettingService.SetUserSetting(UserSettingConstants.ScalingMode, this.SelectedScalingMode);
this.userSettingService.SetUserSetting(UserSettingConstants.UseQSVDecodeForNonQSVEnc, this.UseQSVDecodeForNonQSVEnc);
this.userSettingService.SetUserSetting(UserSettingConstants.EnableQuickSyncHyperEncode, this.EnableQuickSyncHyperEncode);
this.userSettingService.SetUserSetting(UserSettingConstants.EnableNvDecSupport, this.EnableNvDecSupport);
this.userSettingService.SetUserSetting(UserSettingConstants.EnableDirectXDecoding, this.EnableDirectXDecoding);
this.userSettingService.SetUserSetting(UserSettingConstants.EnableQuickSyncLowPower, this.EnableQuickSyncLowPower);
/* System and Logging */
this.userSettingService.SetUserSetting(UserSettingConstants.ProcessPriorityInt, (int)this.SelectedPriority);
this.userSettingService.SetUserSetting(UserSettingConstants.PreventSleep, this.PreventSleep);
this.userSettingService.SetUserSetting(UserSettingConstants.PauseOnLowDiskspace, this.PauseOnLowDiskspace);
this.userSettingService.SetUserSetting(UserSettingConstants.PauseQueueOnLowDiskspaceLevel, this.PauseOnLowDiskspaceLevel);
this.userSettingService.SetUserSetting(UserSettingConstants.Verbosity, this.SelectedVerbosity);
this.userSettingService.SetUserSetting(UserSettingConstants.SaveLogWithVideo, this.CopyLogToEncodeDirectory);
this.userSettingService.SetUserSetting(UserSettingConstants.SaveLogToCopyDirectory, this.CopyLogToSpecifiedLocation);
this.userSettingService.SetUserSetting(UserSettingConstants.SaveLogCopyDirectory, this.LogDirectory);
this.userSettingService.SetUserSetting(UserSettingConstants.ClearOldLogs, this.ClearOldLogs);
/* Advanced */
this.userSettingService.SetUserSetting(UserSettingConstants.MainWindowMinimize, this.MinimiseToTray);
this.userSettingService.SetUserSetting(UserSettingConstants.ClearCompletedFromQueue, this.ClearQueueOnEncodeCompleted);
this.userSettingService.SetUserSetting(UserSettingConstants.PreviewScanCount, this.SelectedPreviewCount);
this.userSettingService.SetUserSetting(UserSettingConstants.KeepDuplicateTitles, this.KeepDuplicateTitles);
this.userSettingService.SetUserSetting(UserSettingConstants.X264Step, double.Parse(this.SelectedGranularity, CultureInfo.InvariantCulture));
this.userSettingService.SetUserSetting(UserSettingConstants.ExcludedExtensions, new List(this.ExcludedFileExtensions));
this.userSettingService.SetUserSetting(UserSettingConstants.RecursiveFolderScan, this.RecursiveFolderScan);
int value;
if (int.TryParse(this.MinLength.ToString(CultureInfo.InvariantCulture), out value))
{
this.userSettingService.SetUserSetting(UserSettingConstants.MinScanDuration, value);
}
int maxValue;
if (int.TryParse(this.MaxLength.ToString(CultureInfo.InvariantCulture), out maxValue))
{
this.userSettingService.SetUserSetting(UserSettingConstants.MaxScanDuration, maxValue);
}
this.userSettingService.SetUserSetting(UserSettingConstants.DisableLibDvdNav, this.DisableLibdvdNav);
this.userSettingService.SetUserSetting(UserSettingConstants.PauseEncodingOnLowBattery, this.PauseOnLowBattery);
this.userSettingService.SetUserSetting(UserSettingConstants.LowBatteryLevel, this.LowBatteryLevel);
this.userSettingService.SetUserSetting(UserSettingConstants.ProcessIsolationEnabled, this.RemoteServiceEnabled);
this.userSettingService.SetUserSetting(UserSettingConstants.ProcessIsolationPort, this.RemoteServicePort);
this.userSettingService.SetUserSetting(UserSettingConstants.SimultaneousEncodes, this.SimultaneousEncodes);
this.userSettingService.SetUserSetting(UserSettingConstants.DefaultRangeMode, this.SelectedDefaultRangeMode);
}
public void LaunchHelp()
{
Process.Start("explorer.exe", "https://handbrake.fr/docs/en/latest/technical/preferences.html");
}
private void UpdateCheckComplete(UpdateCheckInformation info)
{
this.updateInfo = info;
if (info.NewVersionAvailable)
{
this.UpdateMessage = string.Format(Resources.OptionsViewModel_NewUpdate, info.Version);
this.UpdateAvailable = true;
}
else
{
this.UpdateMessage = Resources.OptionsViewModel_NoNewUpdates;
this.UpdateAvailable = false;
}
}
private void DownloadProgress(DownloadStatus info)
{
if (info.TotalBytes == 0 || info.BytesRead == 0)
{
this.UpdateAvailable = false;
this.UpdateMessage = info.WasSuccessful ? Resources.OptionsViewModel_UpdateDownloaded : Resources.OptionsViewModel_UpdateServiceUnavailable;
return;
}
long p = (info.BytesRead * 100) / info.TotalBytes;
int progress;
int.TryParse(p.ToString(CultureInfo.InvariantCulture), out progress);
this.DownloadProgressPercentage = progress;
this.UpdateMessage = string.Format(
"{0} {1}% - {2}k of {3}k", Resources.OptionsView_Downloading, this.DownloadProgressPercentage, (info.BytesRead / 1024), (info.TotalBytes / 1024));
}
private void DownloadComplete(DownloadStatus info)
{
this.UpdateAvailable = false;
this.UpdateMessage = info.WasSuccessful ? Resources.OptionsViewModel_UpdateDownloaded : info.Message;
if (info.WasSuccessful)
{
try
{
// Elevation required to run the installer.
Process installer = new Process();
installer = new Process
{
StartInfo =
{
FileName = Path.Combine(Path.GetTempPath(), "handbrake-setup.exe"),
UseShellExecute = true,
Verb = "runas"
}
};
installer.Start();
ThreadHelper.OnUIThread(() => Application.Current.Shutdown());
}
catch (Exception exc)
{
this.IsUpdateFound = false;
this.UpdateMessage = Resources.Options_UpdateNotComplete;
this.DownloadProgressPercentage = 0;
this.NotifyOfPropertyChange(() => this.IsUpdateFound);
Console.WriteLine(exc);
}
}
}
private bool IsValidAutonameFormat(string input, bool isSilent)
{
if (string.IsNullOrEmpty(input))
{
return true;
}
char[] invalidchars = Path.GetInvalidFileNameChars();
Array.Sort(invalidchars);
foreach (var characterToTest in input)
{
if (Array.BinarySearch(invalidchars, characterToTest) >= 0)
{
if (!isSilent)
{
this.errorService.ShowMessageBox(
Resources.OptionsView_InvalidFileFormatChars,
Resources.Error,
MessageBoxButton.OK,
MessageBoxImage.Error);
}
return false;
}
}
return true;
}
private bool IsAutonamePathValid(string path)
{
if (string.IsNullOrEmpty(path))
{
return true;
}
if (path.Contains(Constants.SourcePath) && path.Contains(Constants.SourceFolderName))
{
int indexOfSourcePath = path.IndexOf(Constants.SourcePath, StringComparison.Ordinal);
int indexOfSourceFolderName = path.IndexOf(Constants.SourceFolderName, StringComparison.Ordinal);
if (indexOfSourceFolderName < indexOfSourcePath)
{
this.errorService.ShowMessageBox(
string.Format(Resources.OptionsViewModel_InvalidAutonamePath, Constants.SourceFolderName, Constants.SourcePath),
Resources.Error,
MessageBoxButton.OK,
MessageBoxImage.Error);
return false;
}
}
return true;
}
}
}