// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // The Subtitles Defaults View Model // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrakeWPF.ViewModels { using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using HandBrake.App.Core.Utilities; using HandBrake.Interop.Interop; using HandBrake.Interop.Interop.Interfaces.Model; using HandBrake.Interop.Utilities; using HandBrakeWPF.Model.Subtitles; using HandBrakeWPF.Properties; using HandBrakeWPF.Services.Interfaces; using HandBrakeWPF.Services.Presets.Model; using HandBrakeWPF.ViewModels.Interfaces; using HandBrakeWPF.Views; /// /// The Subtitles View Model /// public class SubtitlesDefaultsViewModel : ViewModelBase, ISubtitlesDefaultsViewModel { private readonly IWindowManager windowManager; private SubtitleBehaviours subtitleBehaviours; private BindingList availableLanguages; /// /// Initializes a new instance of the class. /// public SubtitlesDefaultsViewModel(IWindowManager windowManager) { this.windowManager = windowManager; this.Languages = HandBrakeLanguagesHelper.AllLanguagesWithAny; this.CharacterCodes = CharCodesUtilities.GetCharacterCodes(); this.SubtitleBehaviours = new SubtitleBehaviours(); this.SelectedAvailableToMove = new BindingList(); this.SelectedLanguagesToMove = new BindingList(); this.availableLanguages = new BindingList(); this.SetupPreset((Preset)null); this.Title = Resources.SubtitlesViewModel_SubDefaults; } public bool IsApplied { get; set; } /// /// Gets CharacterCodes. /// public IEnumerable CharacterCodes { get; private set; } /// /// Gets Languages. /// public IEnumerable Languages { get; private set; } /// /// Gets or sets the subtitle behaviours. /// public SubtitleBehaviours SubtitleBehaviours { get { return this.subtitleBehaviours; } set { if (Equals(value, this.subtitleBehaviours)) { return; } this.subtitleBehaviours = value; this.NotifyOfPropertyChange(() => this.SubtitleBehaviours); } } /// /// Gets the subtitle behaviour modes. /// public BindingList SubtitleBehaviourModeList { get { return new BindingList(EnumHelper.GetEnumList().ToList()); } } /// /// Gets the subtitle burn in behaviour mode list. /// public BindingList SubtitleBurnInBehaviourModeList { get { return new BindingList(EnumHelper.GetEnumList().ToList()); } } /// /// Gets AvailableLanguages. /// public BindingList AvailableLanguages { get { return this.availableLanguages; } private set { this.availableLanguages = value; this.NotifyOfPropertyChange(() => this.AvailableLanguages); } } /// /// Gets SelectedLanguages. /// public BindingList SelectedAvailableToMove { get; private set; } /// /// Gets SelectedLanguages. /// public BindingList SelectedLanguagesToMove { get; private set; } /// /// Audio List Move Left /// public void LanguageMoveRight() { if (this.SelectedAvailableToMove.Count > 0) { List copiedList = SelectedAvailableToMove.ToList(); foreach (Language item in copiedList) { this.SubtitleBehaviours.SelectedLanguages.Add(item); } this.UpdateAvailableLanguages(); } } /// /// Audio List Move Right /// public void LanguageMoveLeft() { if (this.SelectedLanguagesToMove.Count > 0) { List copiedList = SelectedLanguagesToMove.ToList(); foreach (Language item in copiedList) { this.SubtitleBehaviours.SelectedLanguages.Remove(item); } } this.UpdateAvailableLanguages(); } /// /// Language List Clear all selected languages /// public void LanguageClearAll() { this.SubtitleBehaviours.SelectedLanguages.Clear(); this.UpdateAvailableLanguages(); } public void LaunchHelp() { Process.Start("explorer.exe", "https://handbrake.fr/docs/en/latest/advanced/audio-subtitle-defaults.html"); } /// /// The setup languages. /// /// /// The preset. /// public void SetupPreset(Preset preset) { if (preset != null) { this.SetupPreset(preset.SubtitleTrackBehaviours); } } /// /// The setup languages. /// /// /// The behaviours. /// public void SetupPreset(SubtitleBehaviours behaviours) { // Reset this.IsApplied = false; // Step 1, Set the behaviour mode this.SubtitleBehaviours.SelectedBehaviour = SubtitleBehaviourModes.None; this.SubtitleBehaviours.SelectedBurnInBehaviour = SubtitleBurnInBehaviourModes.None; this.SubtitleBehaviours.AddClosedCaptions = false; this.SubtitleBehaviours.AddForeignAudioScanTrack = false; this.SubtitleBehaviours.SelectedLanguages.Clear(); // Step 2, Setup Available Languages this.AvailableLanguages.Clear(); foreach (Language item in HandBrakeLanguagesHelper.AllLanguagesWithAny) { this.AvailableLanguages.Add(item); } // Step 3, Set the Selected Languages if (behaviours != null) { this.SubtitleBehaviours.SelectedBehaviour = behaviours.SelectedBehaviour; this.SubtitleBehaviours.SelectedBurnInBehaviour = behaviours.SelectedBurnInBehaviour; this.SubtitleBehaviours.AddClosedCaptions = behaviours.AddClosedCaptions; this.SubtitleBehaviours.AddForeignAudioScanTrack = behaviours.AddForeignAudioScanTrack; this.SubtitleBehaviours.SubtitleTrackNamePassthru = behaviours.SubtitleTrackNamePassthru; foreach (Language selectedItem in behaviours.SelectedLanguages) { this.SubtitleBehaviours.SelectedLanguages.Add(selectedItem); } this.UpdateAvailableLanguages(); } } public bool ShowWindow() { this.IsApplied = false; this.windowManager.ShowDialog(this); return this.IsApplied; } public void Cancel() { this.IsApplied = false; this.TryClose(); } public void Save() { this.IsApplied = true; this.TryClose(); } private void UpdateAvailableLanguages() { List copiedList = this.SubtitleBehaviours.SelectedLanguages.ToList(); BindingList newAvailable = new BindingList(); foreach (Language lang in HandBrakeLanguagesHelper.AllLanguagesWithAny) { if (!copiedList.Contains(lang)) { newAvailable.Add(lang); } } this.AvailableLanguages = newAvailable; } } }