// -------------------------------------------------------------------------------------------------------------------- // // 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.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Windows; using Caliburn.Micro; using HandBrake.ApplicationServices; using HandBrake.ApplicationServices.Model; using HandBrake.ApplicationServices.Services.Interfaces; using HandBrake.ApplicationServices.Utilities; using HandBrakeWPF.Model; using HandBrakeWPF.Services.Interfaces; using HandBrakeWPF.ViewModels.Interfaces; using Ookii.Dialogs.Wpf; /// /// The Options View Model /// public class OptionsViewModel : ViewModelBase, IOptionsViewModel { #region Constants and Fields /// /// Backing field for the user setting service. /// private readonly IUserSettingService userSettingService; /// /// The Shell View Model /// private readonly IShellViewModel shellViewModel; /// /// Backing field for the update service. /// private readonly IUpdateService updateService; /// /// The add audio mode options. /// private BindingList addAudioModeOptions = new BindingList(); /// /// The add closed captions. /// private bool addClosedCaptions; /// /// The add only one audio track per language. /// private bool addOnlyOneAudioTrackPerLanguage; /// /// The add subtitle mode options. /// private BindingList addSubtitleModeOptions = new BindingList(); /// /// The arguments. /// private string arguments; /// /// The auto name default path. /// private string autoNameDefaultPath; /// /// The automatically name files. /// private bool automaticallyNameFiles; /// /// The autoname format. /// private string autonameFormat; /// /// The available languages. /// private BindingList availableLanguages = new BindingList(); /// /// The change to title case. /// private bool changeToTitleCase; /// /// The check for updates. /// private bool checkForUpdates; /// /// The check for updates frequencies. /// private BindingList checkForUpdatesFrequencies = new BindingList(); /// /// The check for updates frequency. /// private int checkForUpdatesFrequency; /// /// The clear old olgs. /// private bool clearOldOlgs; /// /// The constant quality granularity. /// private BindingList constantQualityGranularity = new BindingList(); /// /// The copy log to encode directory. /// private bool copyLogToEncodeDirectory; /// /// The copy log to sepcficed location. /// private bool copyLogToSepcficedLocation; /// /// The disable libdvd nav. /// private bool disableLibdvdNav; /// /// The disable p reset update check notification. /// private bool disablePresetUpdateCheckNotification; /// /// The growl after encode. /// private bool growlAfterEncode; /// /// The growl after queue. /// private bool growlAfterQueue; /// /// The log directory. /// private string logDirectory; /// /// The log verbosity options. /// private BindingList logVerbosityOptions = new BindingList(); /// /// The min length. /// private long minLength; /// /// The minimise to tray. /// private bool minimiseToTray; /// /// The mp 4 extension options. /// private BindingList mp4ExtensionOptions = new BindingList(); /// /// The prevent sleep. /// private bool preventSleep; /// /// The preview pictures to scan. /// private BindingList previewPicturesToScan = new BindingList(); /// /// The priority level options. /// private BindingList priorityLevelOptions = new BindingList(); /// /// The remove underscores. /// private bool removeUnderscores; /// /// The selected add audio mode. /// private int selectedAddAudioMode; /// /// The selected add subtitle mode. /// private int selectedAddSubtitleMode; /// /// The selected granulairty. /// private string selectedGranulairty; /// /// The selected mp 4 extension. /// private int selectedMp4Extension; /// /// The selected preferred languages. /// private BindingList preferredLanguages = new BindingList(); /// /// The selected preferred langauge. /// private string selectedPreferredLangauge; /// /// The selected preferred subtitle language /// private string selectedPreferredSubtitleLangauge; /// /// The selected preview count. /// private int selectedPreviewCount; /// /// The selected priority. /// private string selectedPriority; /// /// The selected verbosity. /// private int selectedVerbosity; /// /// The send file after encode. /// private bool sendFileAfterEncode; /// /// The send file to. /// private string sendFileTo; /// /// The send file to Path. /// private string sendFileToPath; /// /// The vlc path. /// private string vlcPath; /// /// The when done. /// private string whenDone; /// /// The when done options. /// private BindingList whenDoneOptions = new BindingList(); /// /// Selected Langauges /// private BindingList selectedLangauges = new BindingList(); /// /// The backing field for show advanced passthru options for Audio /// private bool showAdvancedPassthruOpts; /// /// Backing field for clear queue on encode completed. /// private bool clearQueueOnEncodeCompleted; /// /// The options tab that is selected. /// private OptionsTab selectedTab; /// /// Update Message /// private string updateMessage; /// /// Update Available /// private bool updateAvailable; /// /// Download progress backing field. /// private int downloadProgressPercentage; /// /// Backing field for update info. /// private UpdateCheckInformation updateInfo; /// /// The enable process isolation. /// private bool enableProcessIsolation; /// /// The server port. /// private int serverPort; /// /// Backing field for EnableLibHb /// private bool enableLibHb; /// /// The show advanced tab backing field. /// private bool showAdvancedTab; /// /// The remove punctuation. /// private bool removePunctuation; /// /// The use system colours for styles. /// private bool useSystemColoursForStyles; /// /// The reset when done action. /// private bool resetWhenDoneAction; /// /// The selected scaling mode. /// private VideoScaler selectedScalingMode; /// /// The enable dxva decoding. /// private bool enableDxvaDecoding; /// /// The disable quick sync decoding. /// private bool disableQuickSyncDecoding; /// /// The enable quick sync. /// private bool enableQuickSync; /// /// The add foreign audio scan track. /// private bool addForeignAudioScanTrack; #endregion #region Constructors and Destructors /// /// Initializes a new instance of the class. /// /// /// The user Setting Service. /// /// /// The shell View Model. /// /// /// The update Service. /// public OptionsViewModel(IUserSettingService userSettingService, IShellViewModel shellViewModel, IUpdateService updateService) { this.Title = "Options"; this.userSettingService = userSettingService; this.shellViewModel = shellViewModel; this.updateService = updateService; this.OnLoad(); this.SelectedTab = OptionsTab.General; this.UpdateMessage = "Click 'Check for Updates' to check for new versions"; } #endregion #region Window Properties /// /// Gets or sets SelectedTab. /// public OptionsTab SelectedTab { get { return this.selectedTab; } set { this.selectedTab = value; this.NotifyOfPropertyChange(() => this.SelectedTab); } } /// /// Gets or sets the about view model. /// public IAboutViewModel AboutViewModel { get; set; } #endregion #region Properties #region General /// /// Gets or sets a value indicating whether CheckForUpdates. /// public bool CheckForUpdates { get { return this.checkForUpdates; } set { this.checkForUpdates = value; this.NotifyOfPropertyChange("CheckForUpdates"); } } /// /// Gets or sets a value indicating whether reset when done action. /// public bool ResetWhenDoneAction { get { return this.resetWhenDoneAction; } set { this.resetWhenDoneAction = value; this.NotifyOfPropertyChange("ResetWhenDoneAction"); } } /// /// Gets or sets CheckForUpdatesFrequencies. /// public BindingList CheckForUpdatesFrequencies { get { return this.checkForUpdatesFrequencies; } set { this.checkForUpdatesFrequencies = value; this.NotifyOfPropertyChange("CheckForUpdatesFrequencies"); } } /// /// Gets or sets a value indicating whether CheckForUpdatesFrequency. /// public int CheckForUpdatesFrequency { get { return this.checkForUpdatesFrequency; } set { this.checkForUpdatesFrequency = value; this.NotifyOfPropertyChange("CheckForUpdatesFrequency"); } } /// /// Gets or sets Arguments. /// public string Arguments { get { return this.arguments; } set { this.arguments = value; this.NotifyOfPropertyChange("Arguments"); } } /// /// Gets or sets a value indicating whether GrowlAfterEncode. /// public bool GrowlAfterEncode { get { return this.growlAfterEncode; } set { this.growlAfterEncode = value; this.NotifyOfPropertyChange("GrowlAfterEncode"); } } /// /// Gets or sets a value indicating whether GrowlAfterQueue. /// public bool GrowlAfterQueue { get { return this.growlAfterQueue; } set { this.growlAfterQueue = value; this.NotifyOfPropertyChange("GrowlAfterQueue"); } } /// /// Gets or sets a value indicating whether SendFileAfterEncode. /// public bool SendFileAfterEncode { get { return this.sendFileAfterEncode; } set { this.sendFileAfterEncode = value; this.NotifyOfPropertyChange("SendFileAfterEncode"); } } /// /// Gets or sets SendFileTo. /// public string SendFileTo { get { return this.sendFileTo; } set { this.sendFileTo = value; this.NotifyOfPropertyChange("SendFileTo"); } } /// /// Gets or sets SendFileToPath. /// public string SendFileToPath { get { return this.sendFileToPath; } set { this.sendFileToPath = value; this.NotifyOfPropertyChange("SendFileToPath"); } } /// /// Gets or sets WhenDone. /// public string WhenDone { get { return this.whenDone; } set { this.whenDone = value; this.NotifyOfPropertyChange("WhenDone"); } } /// /// Gets or sets WhenDoneOptions. /// public BindingList WhenDoneOptions { get { return this.whenDoneOptions; } set { this.whenDoneOptions = value; this.NotifyOfPropertyChange("WhenDoneOptions"); } } /// /// Gets or sets a value indicating whether use system colours. /// public bool UseSystemColoursForStylesForStyles { get { return this.useSystemColoursForStyles; } set { this.useSystemColoursForStyles = value; this.NotifyOfPropertyChange(() => UseSystemColoursForStylesForStyles); } } #endregion #region Output Files /// /// Gets or sets AutoNameDefaultPath. /// public string AutoNameDefaultPath { get { return this.autoNameDefaultPath; } set { this.autoNameDefaultPath = value; this.NotifyOfPropertyChange("AutoNameDefaultPath"); } } /// /// Gets or sets a value indicating whether AutomaticallyNameFiles. /// public bool AutomaticallyNameFiles { get { return this.automaticallyNameFiles; } set { this.automaticallyNameFiles = value; this.NotifyOfPropertyChange("AutomaticallyNameFiles"); } } /// /// Gets or sets AutonameFormat. /// public string AutonameFormat { get { return this.autonameFormat; } set { this.autonameFormat = value; this.NotifyOfPropertyChange("AutonameFormat"); } } /// /// Gets or sets a value indicating whether ChangeToTitleCase. /// public bool ChangeToTitleCase { get { return this.changeToTitleCase; } set { this.changeToTitleCase = value; this.NotifyOfPropertyChange("ChangeToTitleCase"); } } /// /// Gets or sets Mp4ExtensionOptions. /// public BindingList Mp4ExtensionOptions { get { return this.mp4ExtensionOptions; } set { this.mp4ExtensionOptions = value; this.NotifyOfPropertyChange("Mp4ExtensionOptions"); } } /// /// Gets or sets a value indicating whether RemoveUnderscores. /// public bool RemoveUnderscores { get { return this.removeUnderscores; } set { this.removeUnderscores = value; this.NotifyOfPropertyChange("RemoveUnderscores"); } } /// /// Gets or sets SelectedMp4Extension. /// public int SelectedMp4Extension { get { return this.selectedMp4Extension; } set { this.selectedMp4Extension = value; this.NotifyOfPropertyChange("SelectedMp4Extension"); } } /// /// Gets or sets a value indicating whether remove punctuation. /// public bool RemovePunctuation { get { return this.removePunctuation; } set { this.removePunctuation = value; this.NotifyOfPropertyChange(() => RemovePunctuation); } } #endregion #region Preview /// /// Gets or sets VLCPath. /// public string VLCPath { get { return this.vlcPath; } set { this.vlcPath = value; this.NotifyOfPropertyChange("VLCPath"); } } #endregion #region Audio and Subtitles /// /// Gets or sets preferredLanguages. /// public BindingList PreferredLanguages { get { return this.preferredLanguages; } set { this.preferredLanguages = value; this.NotifyOfPropertyChange("PreferredLanguages"); } } /// /// Gets or sets SelectedPreferreedLangauge. /// public string SelectedPreferredLangauge { get { return this.selectedPreferredLangauge; } set { this.selectedPreferredLangauge = value; this.NotifyOfPropertyChange(() => SelectedPreferredLangauge); } } /// /// Gets or sets SelectedPreferredSubtitleLangauge. /// public string SelectedPreferredSubtitleLangauge { get { return this.selectedPreferredSubtitleLangauge; } set { this.selectedPreferredSubtitleLangauge = value; this.NotifyOfPropertyChange(() => SelectedPreferredSubtitleLangauge); } } /// /// Gets or sets AvailableLanguages. /// public BindingList AvailableLanguages { get { return this.availableLanguages; } set { this.availableLanguages = value; this.NotifyOfPropertyChange("AvailableLanguages"); } } /// /// Gets or sets SelectedLangauges. /// public BindingList SelectedLangauges { get { return this.selectedLangauges; } set { this.selectedLangauges = value; this.NotifyOfPropertyChange("SelectedLangauges"); } } /// /// Gets or sets SelectedLangauges. /// public BindingList SelectedAvailableToMove { get; set; } /// /// Gets or sets SelectedLangauges. /// public BindingList SelectedLangaugesToMove { get; set; } /// /// Gets or sets AddAudioModeOptions. /// public BindingList AddAudioModeOptions { get { return this.addAudioModeOptions; } set { this.addAudioModeOptions = value; this.NotifyOfPropertyChange("AddAudioModeOptions"); } } /// /// Gets or sets a value indicating whether AddClosedCaptions. /// public bool AddClosedCaptions { get { return this.addClosedCaptions; } set { this.addClosedCaptions = value; this.NotifyOfPropertyChange("AddClosedCaptions"); } } /// /// Gets or sets a value indicating whether AddOnlyOneAudioTrackPerLanguage. /// public bool AddOnlyOneAudioTrackPerLanguage { get { return this.addOnlyOneAudioTrackPerLanguage; } set { this.addOnlyOneAudioTrackPerLanguage = value; this.NotifyOfPropertyChange("AddOnlyOneAudioTrackPerLanguage"); } } /// /// Gets or sets AddSubtitleModeOptions. /// public BindingList AddSubtitleModeOptions { get { return this.addSubtitleModeOptions; } set { this.addSubtitleModeOptions = value; this.NotifyOfPropertyChange("AddSubtitleModeOptions"); } } /// /// Gets or sets SelectedAddAudioMode. /// public int SelectedAddAudioMode { get { return this.selectedAddAudioMode; } set { this.selectedAddAudioMode = value; this.NotifyOfPropertyChange("SelectedAddAudioMode"); } } /// /// Gets or sets SelectedAddSubtitleMode. /// public int SelectedAddSubtitleMode { get { return this.selectedAddSubtitleMode; } set { this.selectedAddSubtitleMode = value; this.NotifyOfPropertyChange("SelectedAddSubtitleMode"); } } /// /// Gets or sets a value indicating whether ShowAdvancedPassthruOpts. /// public bool ShowAdvancedPassthruOpts { get { return this.showAdvancedPassthruOpts; } set { this.showAdvancedPassthruOpts = value; this.NotifyOfPropertyChange(() => this.ShowAdvancedPassthruOpts); } } /// /// Gets or sets a value indicating whether add foreign audio scan track. /// public bool AddForeignAudioScanTrack { get { return this.addForeignAudioScanTrack; } set { if (value.Equals(this.addForeignAudioScanTrack)) { return; } this.addForeignAudioScanTrack = value; this.NotifyOfPropertyChange(() => this.AddForeignAudioScanTrack); } } #endregion #region System and Logging /// /// Gets or sets a value indicating whether CopyLogToEncodeDirectory. /// public bool CopyLogToEncodeDirectory { get { return this.copyLogToEncodeDirectory; } set { this.copyLogToEncodeDirectory = value; this.NotifyOfPropertyChange("CopyLogToEncodeDirectory"); } } /// /// Gets or sets a value indicating whether CopyLogToSepcficedLocation. /// public bool CopyLogToSepcficedLocation { get { return this.copyLogToSepcficedLocation; } set { this.copyLogToSepcficedLocation = value; this.NotifyOfPropertyChange("CopyLogToSepcficedLocation"); } } /// /// Gets or sets a value indicating whether ClearOldOlgs. /// public bool ClearOldOlgs { get { return this.clearOldOlgs; } set { this.clearOldOlgs = value; this.NotifyOfPropertyChange("ClearOldOlgs"); } } /// /// Gets or sets LogDirectory. /// public string LogDirectory { get { return this.logDirectory; } set { this.logDirectory = value; this.NotifyOfPropertyChange("LogDirectory"); } } /// /// Gets or sets a value indicating whether PreventSleep. /// public bool PreventSleep { get { return this.preventSleep; } set { this.preventSleep = value; this.NotifyOfPropertyChange("PreventSleep"); } } /// /// Gets or sets PriorityLevelOptions. /// public BindingList PriorityLevelOptions { get { return this.priorityLevelOptions; } set { this.priorityLevelOptions = value; this.NotifyOfPropertyChange("PriorityLevelOptions"); } } /// /// Gets or sets a value indicating whether SelectedGranulairty. /// public string SelectedGranulairty { get { return this.selectedGranulairty; } set { this.selectedGranulairty = value; this.NotifyOfPropertyChange("SelectedGranulairty"); } } /// /// Gets or sets SelectedPriority. /// public string SelectedPriority { get { return this.selectedPriority; } set { this.selectedPriority = value; this.NotifyOfPropertyChange("SelectedPriority"); } } #endregion #region Advanced /// /// Gets or sets ConstantQualityGranularity. /// public BindingList ConstantQualityGranularity { get { return this.constantQualityGranularity; } set { this.constantQualityGranularity = value; this.NotifyOfPropertyChange("ConstantQualityGranularity"); } } /// /// Gets or sets a value indicating whether DisableLibdvdNav. /// public bool DisableLibdvdNav { get { return this.disableLibdvdNav; } set { this.disableLibdvdNav = value; this.NotifyOfPropertyChange("DisableLibdvdNav"); } } /// /// Gets or sets a value indicating whether disablePresetUpdateCheckNotification. /// public bool DisablePresetUpdateCheckNotification { get { return this.disablePresetUpdateCheckNotification; } set { this.disablePresetUpdateCheckNotification = value; this.NotifyOfPropertyChange("DisablePresetUpdateCheckNotification"); } } /// /// Gets or sets LogVerbosityOptions. /// public BindingList LogVerbosityOptions { get { return this.logVerbosityOptions; } set { this.logVerbosityOptions = value; this.NotifyOfPropertyChange("LogVerbosityOptions"); } } /// /// Gets or sets MinLength. /// public long MinLength { get { return this.minLength; } set { this.minLength = value; this.NotifyOfPropertyChange("MinLength"); } } /// /// Gets or sets a value indicating whether MinimiseToTray. /// public bool MinimiseToTray { get { return this.minimiseToTray; } set { this.minimiseToTray = value; this.NotifyOfPropertyChange("MinimiseToTray"); } } /// /// Gets or sets PreviewPicturesToScan. /// public BindingList PreviewPicturesToScan { get { return this.previewPicturesToScan; } set { this.previewPicturesToScan = value; this.NotifyOfPropertyChange("PreviewPicturesToScan"); } } /// /// Gets or sets SelectedPreviewCount. /// public int SelectedPreviewCount { get { return this.selectedPreviewCount; } set { this.selectedPreviewCount = value; this.NotifyOfPropertyChange("SelectedPreviewCount"); } } /// /// Gets or sets SelectedVerbosity. /// public int SelectedVerbosity { get { return this.selectedVerbosity; } set { this.selectedVerbosity = value; this.NotifyOfPropertyChange("SelectedVerbosity"); } } /// /// Gets or sets a value indicating whether ClearQueueOnEncodeCompleted. /// public bool ClearQueueOnEncodeCompleted { get { return this.clearQueueOnEncodeCompleted; } set { this.clearQueueOnEncodeCompleted = value; this.NotifyOfPropertyChange(() => this.ClearQueueOnEncodeCompleted); } } /// /// Gets or sets a value indicating whether ClearQueueOnEncodeCompleted. /// public bool EnableProcessIsolation { get { return this.enableProcessIsolation; } set { this.enableProcessIsolation = value; this.NotifyOfPropertyChange(() => this.EnableProcessIsolation); } } /// /// Gets or sets the server port. /// public int ServerPort { get { return this.serverPort; } set { this.serverPort = value; this.NotifyOfPropertyChange(() => this.ServerPort); } } /// /// Gets or sets a value indicating whether enable lib hb. /// public bool EnableLibHb { get { return this.enableLibHb; } set { this.enableLibHb = value; this.NotifyOfPropertyChange(() => this.EnableLibHb); } } /// /// Gets or sets a value indicating whether enable lib hb. /// public bool ShowAdvancedTab { get { return this.showAdvancedTab; } set { this.showAdvancedTab = value; this.NotifyOfPropertyChange(() => this.ShowAdvancedTab); } } #endregion #region Video /// /// Gets or sets a value indicating whether enable quick sync. /// public bool EnableQuickSync { get { return this.enableQuickSync && this.IsQuickSyncAvailable; } set { if (value.Equals(this.enableQuickSync)) { return; } this.enableQuickSync = value; this.NotifyOfPropertyChange(() => this.EnableQuickSync); } } /// /// Gets or sets a value indicating whether disable quick sync decoding. /// public bool DisableQuickSyncDecoding { get { return this.disableQuickSyncDecoding; } set { if (value.Equals(this.disableQuickSyncDecoding)) { return; } this.disableQuickSyncDecoding = value; this.NotifyOfPropertyChange(() => this.DisableQuickSyncDecoding); } } /// /// Gets or sets a value indicating whether enable dxva decoding. /// public bool EnableDxvaDecoding { get { return this.enableDxvaDecoding; } set { if (value.Equals(this.enableDxvaDecoding)) { return; } this.enableDxvaDecoding = value; this.NotifyOfPropertyChange(() => this.EnableDxvaDecoding); } } /// /// Gets or sets the selected scaling mode. /// public VideoScaler SelectedScalingMode { get { return this.selectedScalingMode; } set { this.selectedScalingMode = value; } } /// /// Gets a value indicating whether is quick sync available. /// public bool IsQuickSyncAvailable { get { return SystemInfo.IsQsvAvailable; } } /// /// Gets the scaling options. /// public BindingList ScalingOptions { get { return new BindingList(EnumHelper.GetEnumList().ToList()); } } #endregion #endregion #region About HandBrake /// /// Gets Version. /// public string Version { get { return string.Format("{0} - {1}", VersionHelper.GetVersion(), VersionHelper.GetPlatformBitnessVersion()); } } /// /// Gets or sets UpdateMessage. /// public string UpdateMessage { get { return this.updateMessage; } set { this.updateMessage = value; this.NotifyOfPropertyChange(() => this.UpdateMessage); } } /// /// Gets or sets a value indicating whether UpdateAvailable. /// public bool UpdateAvailable { get { return this.updateAvailable; } set { this.updateAvailable = value; this.NotifyOfPropertyChange(() => this.UpdateAvailable); } } /// /// Gets or sets DownloadProgressPercentage. /// public int DownloadProgressPercentage { get { return this.downloadProgressPercentage; } set { this.downloadProgressPercentage = value; this.NotifyOfPropertyChange(() => this.DownloadProgressPercentage); } } #endregion #region Public Methods /// /// Load / Update the user settings. /// protected override void OnActivate() { this.OnLoad(); base.OnActivate(); } /// /// Close this window. /// public void Close() { this.Save(); this.shellViewModel.DisplayWindow(ShellWindow.MainWindow); } /// /// Browse - Send File To /// public void BrowseSendFileTo() { VistaOpenFileDialog dialog = new VistaOpenFileDialog { Filter = "All files (*.*)|*.*" }; dialog.ShowDialog(); this.SendFileTo = Path.GetFileNameWithoutExtension(dialog.FileName); this.sendFileToPath = dialog.FileName; } /// /// Browse Auto Name Path /// public void BrowseAutoNamePath() { VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog { Description = "Please select a folder.", UseDescriptionForTitle = true }; dialog.ShowDialog(); this.AutoNameDefaultPath = dialog.SelectedPath; } /// /// Browse VLC Path /// public void BrowseVlcPath() { VistaOpenFileDialog dialog = new VistaOpenFileDialog { Filter = "All files (*.exe)|*.exe" }; dialog.ShowDialog(); this.VLCPath = dialog.FileName; } /// /// Audio List Move Left /// public void LanguageMoveRight() { if (this.SelectedAvailableToMove.Count > 0) { List copiedList = SelectedAvailableToMove.ToList(); foreach (string item in copiedList) { this.AvailableLanguages.Remove(item); this.SelectedLangauges.Add(item); } this.AvailableLanguages = new BindingList(this.AvailableLanguages.OrderBy(o => o).ToList()); } } /// /// Audio List Move Right /// public void LanguageMoveLeft() { if (this.SelectedLangaugesToMove.Count > 0) { List copiedList = SelectedLangaugesToMove.ToList(); foreach (string item in copiedList) { this.SelectedLangauges.Remove(item); this.AvailableLanguages.Add(item); } } this.AvailableLanguages = new BindingList(this.AvailableLanguages.OrderBy(o => o).ToList()); } /// /// Audio List Clear all selected languages /// public void LanguageClearAll() { foreach (string item in this.SelectedLangauges) { this.AvailableLanguages.Add(item); } this.AvailableLanguages = new BindingList(this.AvailableLanguages.OrderBy(o => o).ToList()); this.SelectedLangauges.Clear(); } /// /// Browse - Log Path /// public void BrowseLogPath() { VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog { Description = "Please select a folder.", UseDescriptionForTitle = true }; dialog.ShowDialog(); this.LogDirectory = dialog.SelectedPath; } /// /// View the Default Log Directory for HandBrake /// public void ViewLogDirectory() { string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs"; string windir = Environment.GetEnvironmentVariable("WINDIR"); Process prc = new Process { StartInfo = { FileName = windir + @"\explorer.exe", Arguments = logDir } }; prc.Start(); } /// /// Clear HandBrakes log directory. /// public void ClearLogHistory() { MessageBoxResult result = MessageBox.Show("Are you sure you wish to clear the log file directory?", "Clear Logs", MessageBoxButton.YesNoCancel, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { GeneralUtilities.ClearLogFiles(0); MessageBox.Show("HandBrake's Log file directory has been cleared!", "Notice", MessageBoxButton.OK, MessageBoxImage.Information); } } /// /// Download an Update /// public void DownloadUpdate() { this.UpdateMessage = "Preparing for Update ..."; this.updateService.DownloadFile(this.updateInfo.DownloadFile, this.DownloadComplete, this.DownloadProgress); } /// /// Check for updates /// public void PerformUpdateCheck() { this.UpdateMessage = "Checking for Updates ..."; this.updateService.CheckForUpdates(this.UpdateCheckComplete); } #endregion /// /// Load User Settings /// public override void OnLoad() { // ############################# // General // ############################# this.CheckForUpdates = this.userSettingService.GetUserSetting(UserSettingConstants.UpdateStatus); // Days between update checks this.checkForUpdatesFrequencies.Clear(); this.checkForUpdatesFrequencies.Add("Daily"); this.checkForUpdatesFrequencies.Add("Weekly"); this.checkForUpdatesFrequencies.Add("Monthly"); // TODO Refactor this. switch (this.userSettingService.GetUserSetting(UserSettingConstants.DaysBetweenUpdateCheck)) { case 1: this.CheckForUpdatesFrequency = 0; break; case 7: this.CheckForUpdatesFrequency = 1; break; default: this.CheckForUpdatesFrequency = 2; break; } // On Encode Completeion Action this.whenDoneOptions.Clear(); this.whenDoneOptions.Add("Do nothing"); this.whenDoneOptions.Add("Shutdown"); this.whenDoneOptions.Add("Suspend"); this.whenDoneOptions.Add("Hibernate"); this.whenDoneOptions.Add("Lock System"); this.whenDoneOptions.Add("Log off"); this.whenDoneOptions.Add("Quit HandBrake"); this.WhenDone = userSettingService.GetUserSetting("WhenCompleteAction"); if (this.userSettingService.GetUserSetting(UserSettingConstants.ResetWhenDoneAction)) { this.WhenDone = "Do nothing"; this.userSettingService.SetUserSetting(UserSettingConstants.WhenCompleteAction, "Do nothing"); } this.GrowlAfterEncode = userSettingService.GetUserSetting(UserSettingConstants.GrowlEncode); this.GrowlAfterQueue = userSettingService.GetUserSetting(UserSettingConstants.GrowlQueue); 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.UseSystemColoursForStylesForStyles = this.userSettingService.GetUserSetting(UserSettingConstants.UseSystemColours); this.ResetWhenDoneAction = this.userSettingService.GetUserSetting(UserSettingConstants.ResetWhenDoneAction); // ############################# // 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 = "Click 'Browse' to set the default location"; // Store auto name format this.AutonameFormat = this.userSettingService.GetUserSetting(UserSettingConstants.AutoNameFormat) ?? string.Empty; // Use iPod/iTunes friendly .m4v extension for MP4 files. this.mp4ExtensionOptions.Clear(); this.mp4ExtensionOptions.Add("Automatic"); this.mp4ExtensionOptions.Add("Always use MP4"); this.mp4ExtensionOptions.Add("Always use M4V"); this.SelectedMp4Extension = 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); // ############################# // Picture Tab // ############################# // VLC Path this.VLCPath = this.userSettingService.GetUserSetting(UserSettingConstants.VLC_Path) ?? string.Empty; // ############################# // Audio and Subtitles Tab // ############################# this.SelectedAvailableToMove = new BindingList(); this.SelectedLangaugesToMove = new BindingList(); IDictionary langList = LanguageUtilities.MapLanguages(); langList = (from entry in langList orderby entry.Key ascending select entry).ToDictionary(pair => pair.Key, pair => pair.Value); this.selectedLangauges.Clear(); foreach (string selectedItem in this.userSettingService.GetUserSetting(UserSettingConstants.SelectedLanguages)) { // removing wrong keys when a new Language list comes out. if (langList.ContainsKey(selectedItem)) { this.selectedLangauges.Add(selectedItem); } } this.preferredLanguages.Clear(); this.availableLanguages.Clear(); foreach (string item in langList.Keys) { this.preferredLanguages.Add(item); // In the available languages should be no "Any" and no selected language. if ((item != Constants.Any) && (!this.userSettingService.GetUserSetting(UserSettingConstants.SelectedLanguages).Contains(item))) { this.availableLanguages.Add(item); } } this.SelectedPreferredLangauge = this.userSettingService.GetUserSetting(UserSettingConstants.NativeLanguage) ?? string.Empty; this.SelectedPreferredSubtitleLangauge = this.userSettingService.GetUserSetting(UserSettingConstants.NativeLanguageForSubtitles) ?? string.Empty; this.AddAudioModeOptions.Clear(); this.AddAudioModeOptions.Add("None"); this.AddAudioModeOptions.Add("Add All Remaining Tracks"); this.AddAudioModeOptions.Add("Add All for Selected Languages"); this.AddSubtitleModeOptions.Clear(); this.AddSubtitleModeOptions.Add("None"); this.AddSubtitleModeOptions.Add("Add All (Where possible)"); this.AddSubtitleModeOptions.Add("Add First"); this.AddSubtitleModeOptions.Add("Add all for Selected Languages"); this.AddSubtitleModeOptions.Add("Add only for Prefered Language (First)"); this.AddSubtitleModeOptions.Add("Add all for Prefered Language"); this.SelectedAddAudioMode = this.userSettingService.GetUserSetting(UserSettingConstants.DubModeAudio); this.SelectedAddSubtitleMode = this.userSettingService.GetUserSetting(UserSettingConstants.DubModeSubtitle); this.AddOnlyOneAudioTrackPerLanguage = this.userSettingService.GetUserSetting(UserSettingConstants.AddOnlyOneAudioPerLanguage); this.AddClosedCaptions = this.userSettingService.GetUserSetting(UserSettingConstants.UseClosedCaption); this.ShowAdvancedPassthruOpts = this.userSettingService.GetUserSetting(UserSettingConstants.ShowAdvancedAudioPassthruOpts); this.AddForeignAudioScanTrack = this.userSettingService.GetUserSetting(UserSettingConstants.AddForeignAudioScanTrack); // ############################# // Video // ############################# this.EnableQuickSync = this.userSettingService.GetUserSetting(UserSettingConstants.EnableQuickSync); this.DisableQuickSyncDecoding = this.userSettingService.GetUserSetting(UserSettingConstants.DisableQuickSyncDecoding); this.EnableDxvaDecoding = this.userSettingService.GetUserSetting(UserSettingConstants.EnableDxva); this.SelectedScalingMode = this.userSettingService.GetUserSetting(UserSettingConstants.ScalingMode); // ############################# // CLI // ############################# // Priority level for encodes this.priorityLevelOptions.Clear(); this.priorityLevelOptions.Add("High"); this.priorityLevelOptions.Add("Above Normal"); this.priorityLevelOptions.Add("Normal"); this.priorityLevelOptions.Add("Below Normal"); this.priorityLevelOptions.Add("Low"); this.SelectedPriority = userSettingService.GetUserSetting(UserSettingConstants.ProcessPriority); this.PreventSleep = userSettingService.GetUserSetting(UserSettingConstants.PreventSleep); // Log Verbosity Level this.logVerbosityOptions.Clear(); this.logVerbosityOptions.Add(0); this.logVerbosityOptions.Add(1); this.logVerbosityOptions.Add(2); this.SelectedVerbosity = userSettingService.GetUserSetting(UserSettingConstants.Verbosity); // Logs this.CopyLogToEncodeDirectory = userSettingService.GetUserSetting(UserSettingConstants.SaveLogWithVideo); this.CopyLogToSepcficedLocation = userSettingService.GetUserSetting(UserSettingConstants.SaveLogToCopyDirectory); // The saved log path this.LogDirectory = userSettingService.GetUserSetting(UserSettingConstants.SaveLogCopyDirectory) ?? string.Empty; this.ClearOldOlgs = this.userSettingService.GetUserSetting(UserSettingConstants.ClearOldLogs); // ############################# // Advanced // ############################# // Minimise to Tray this.MinimiseToTray = this.userSettingService.GetUserSetting(UserSettingConstants.MainWindowMinimize); this.DisablePresetUpdateCheckNotification = this.userSettingService.GetUserSetting(UserSettingConstants.PresetNotification); this.ClearQueueOnEncodeCompleted = userSettingService.GetUserSetting(UserSettingConstants.ClearCompletedFromQueue); this.ShowAdvancedTab = userSettingService.GetUserSetting(UserSettingConstants.ShowAdvancedTab); // 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); // x264 step this.ConstantQualityGranularity.Clear(); this.ConstantQualityGranularity.Add("1.00"); this.ConstantQualityGranularity.Add("0.50"); this.ConstantQualityGranularity.Add("0.25"); this.SelectedGranulairty = userSettingService.GetUserSetting(UserSettingConstants.X264Step).ToString("0.00", CultureInfo.InvariantCulture); // Min Title Length this.MinLength = this.userSettingService.GetUserSetting(UserSettingConstants.MinScanDuration); // Use dvdnav this.DisableLibdvdNav = userSettingService.GetUserSetting(UserSettingConstants.DisableLibDvdNav); int port; int.TryParse(userSettingService.GetUserSetting(UserSettingConstants.ServerPort), out port); this.ServerPort = port; this.EnableProcessIsolation = userSettingService.GetUserSetting(UserSettingConstants.EnableProcessIsolation); this.EnableLibHb = userSettingService.GetUserSetting(UserSettingConstants.EnableLibHb); } /// /// Save the settings selected /// private void Save() { /* General */ this.userSettingService.SetUserSetting(UserSettingConstants.UpdateStatus, this.CheckForUpdates); this.userSettingService.SetUserSetting(UserSettingConstants.DaysBetweenUpdateCheck, this.CheckForUpdatesFrequency); this.userSettingService.SetUserSetting(UserSettingConstants.WhenCompleteAction, this.WhenDone); this.userSettingService.SetUserSetting(UserSettingConstants.GrowlQueue, this.GrowlAfterQueue); this.userSettingService.SetUserSetting(UserSettingConstants.GrowlEncode, this.GrowlAfterEncode); 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.UseSystemColours, this.UseSystemColoursForStylesForStyles); this.userSettingService.SetUserSetting(UserSettingConstants.ResetWhenDoneAction, this.ResetWhenDoneAction); /* 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, this.SelectedMp4Extension); this.userSettingService.SetUserSetting(UserSettingConstants.AutoNameRemoveUnderscore, this.RemoveUnderscores); this.userSettingService.SetUserSetting(UserSettingConstants.AutoNameTitleCase, this.ChangeToTitleCase); this.userSettingService.SetUserSetting(UserSettingConstants.RemovePunctuation, this.RemovePunctuation); /* Previews */ this.userSettingService.SetUserSetting(UserSettingConstants.VLC_Path, this.VLCPath); /* Audio and Subtitles */ this.userSettingService.SetUserSetting(UserSettingConstants.NativeLanguage, this.SelectedPreferredLangauge); this.userSettingService.SetUserSetting(UserSettingConstants.NativeLanguageForSubtitles, this.SelectedPreferredSubtitleLangauge); StringCollection collection = new StringCollection(); collection.AddRange(this.SelectedLangauges.ToArray()); this.userSettingService.SetUserSetting(UserSettingConstants.SelectedLanguages, collection); this.userSettingService.SetUserSetting(UserSettingConstants.AddOnlyOneAudioPerLanguage, this.AddOnlyOneAudioTrackPerLanguage); this.userSettingService.SetUserSetting(UserSettingConstants.UseClosedCaption, this.AddClosedCaptions); this.userSettingService.SetUserSetting(UserSettingConstants.DubModeAudio, this.SelectedAddAudioMode); this.userSettingService.SetUserSetting(UserSettingConstants.DubModeSubtitle, this.SelectedAddSubtitleMode); this.userSettingService.SetUserSetting(UserSettingConstants.ShowAdvancedAudioPassthruOpts, this.ShowAdvancedPassthruOpts); this.userSettingService.SetUserSetting(UserSettingConstants.AddForeignAudioScanTrack, this.AddForeignAudioScanTrack); /* Video */ this.userSettingService.SetUserSetting(UserSettingConstants.EnableQuickSync, this.EnableQuickSync); this.userSettingService.SetUserSetting(UserSettingConstants.DisableQuickSyncDecoding, this.DisableQuickSyncDecoding); this.userSettingService.SetUserSetting(UserSettingConstants.EnableDxva, this.EnableDxvaDecoding); this.userSettingService.SetUserSetting(UserSettingConstants.ScalingMode, this.SelectedScalingMode); /* System and Logging */ userSettingService.SetUserSetting(UserSettingConstants.ProcessPriority, this.SelectedPriority); userSettingService.SetUserSetting(UserSettingConstants.PreventSleep, this.PreventSleep); userSettingService.SetUserSetting(UserSettingConstants.Verbosity, this.SelectedVerbosity); userSettingService.SetUserSetting(UserSettingConstants.SaveLogWithVideo, this.CopyLogToEncodeDirectory); userSettingService.SetUserSetting(UserSettingConstants.SaveLogToCopyDirectory, this.CopyLogToSepcficedLocation); userSettingService.SetUserSetting(UserSettingConstants.SaveLogCopyDirectory, this.LogDirectory); userSettingService.SetUserSetting(UserSettingConstants.ClearOldLogs, this.ClearOldOlgs); /* Advanced */ userSettingService.SetUserSetting(UserSettingConstants.MainWindowMinimize, this.MinimiseToTray); userSettingService.SetUserSetting(UserSettingConstants.PresetNotification, this.DisablePresetUpdateCheckNotification); userSettingService.SetUserSetting(UserSettingConstants.ClearCompletedFromQueue, this.ClearQueueOnEncodeCompleted); userSettingService.SetUserSetting(UserSettingConstants.PreviewScanCount, this.SelectedPreviewCount); userSettingService.SetUserSetting(UserSettingConstants.X264Step, double.Parse(this.SelectedGranulairty, CultureInfo.InvariantCulture)); userSettingService.SetUserSetting(UserSettingConstants.ShowAdvancedTab, this.ShowAdvancedTab); userSettingService.SetUserSetting(UserSettingConstants.ShowAdvancedTab, this.ShowAdvancedTab); int value; if (int.TryParse(this.MinLength.ToString(CultureInfo.InvariantCulture), out value)) { this.userSettingService.SetUserSetting(UserSettingConstants.MinScanDuration, value); } userSettingService.SetUserSetting(UserSettingConstants.DisableLibDvdNav, this.DisableLibdvdNav); userSettingService.SetUserSetting(UserSettingConstants.EnableProcessIsolation, this.EnableProcessIsolation); userSettingService.SetUserSetting(UserSettingConstants.ServerPort, this.ServerPort.ToString(CultureInfo.InvariantCulture)); userSettingService.SetUserSetting(UserSettingConstants.EnableLibHb, this.EnableLibHb); } /// /// Update Check Complete /// /// /// The info. /// private void UpdateCheckComplete(UpdateCheckInformation info) { this.updateInfo = info; if (info.NewVersionAvailable) { this.UpdateMessage = "A New Update is Available!"; this.UpdateAvailable = true; } else { this.UpdateMessage = "There are no new updates at this time."; this.UpdateAvailable = false; } } /// /// Download Progress Action /// /// /// The info. /// private void DownloadProgress(DownloadStatus info) { if (info.TotalBytes == 0 || info.BytesRead == 0) { 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( "Downloading... {0}% - {1}k of {2}k", this.DownloadProgressPercentage, (info.BytesRead / 1024), (info.TotalBytes / 1024)); } /// /// Download Complete Action /// /// /// The info. /// private void DownloadComplete(DownloadStatus info) { this.UpdateAvailable = false; this.UpdateMessage = info.WasSuccessful ? "Update Downloaded" : "Update Failed. You can try downloading the update from http://handbrake.fr"; Process.Start(Path.Combine(Path.GetTempPath(), "handbrake-setup.exe")); Execute.OnUIThread(() => Application.Current.Shutdown()); } /// /// The goto tab. /// /// /// The tab. /// public void GotoTab(OptionsTab tab) { this.SelectedTab = tab; } } }