// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // The Add Preset View Model // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrakeWPF.ViewModels { using System.Collections.Generic; using System.Windows; using Caliburn.Micro; using HandBrake.ApplicationServices.Interop.Model.Encoding; using HandBrakeWPF.Model.Audio; using HandBrakeWPF.Model.Subtitles; using HandBrakeWPF.Properties; using HandBrakeWPF.Services.Interfaces; using HandBrakeWPF.Services.Presets; using HandBrakeWPF.Services.Presets.Interfaces; using HandBrakeWPF.Services.Presets.Model; using HandBrakeWPF.Services.Scan.Model; using HandBrakeWPF.Utilities; using HandBrakeWPF.ViewModels.Interfaces; using EncodeTask = HandBrakeWPF.Services.Encode.Model.EncodeTask; using PresetPictureSettingsMode = HandBrakeWPF.Model.Picture.PresetPictureSettingsMode; /// /// The Add Preset View Model /// public class AddPresetViewModel : ViewModelBase, IAddPresetViewModel { /// /// Backing field for the Preset Service /// private readonly IPresetService presetService; /// /// Backing field for the error service /// private readonly IErrorService errorService; /// /// The window manager. /// private readonly IWindowManager windowManager; /// /// Backing fields for Selected Picture settings mode. /// private PresetPictureSettingsMode selectedPictureSettingMode; /// /// Backging field for show custom inputs /// private bool showCustomInputs; /// /// The source. /// private Title selectedTitle; private IAudioDefaultsViewModel audioDefaultsViewModel; private ISubtitlesDefaultsViewModel subtitlesDefaultsViewModel; /// /// Initializes a new instance of the class. /// /// /// The Preset Service /// /// /// The Error Service /// /// /// The window Manager. /// public AddPresetViewModel(IPresetService presetService, IErrorService errorService, IWindowManager windowManager) { this.presetService = presetService; this.errorService = errorService; this.windowManager = windowManager; this.Title = "Add Preset"; this.Preset = new Preset { IsBuildIn = false, IsDefault = false, Category = PresetService.UserPresetCatgoryName }; this.PictureSettingsModes = EnumHelper.GetEnumList(); } /// /// Gets the Preset /// public Preset Preset { get; private set; } /// /// Gets or sets PictureSettingsModes. /// public IEnumerable PictureSettingsModes { get; set; } /// /// Gets or sets CustomWidth. /// public int? CustomWidth { get; set; } /// /// Gets or sets CustomHeight. /// public int? CustomHeight { get; set; } /// /// Gets or sets a value indicating whether ShowCustomInputs. /// public bool ShowCustomInputs { get { return this.showCustomInputs; } set { this.showCustomInputs = value; this.NotifyOfPropertyChange(() => this.ShowCustomInputs); } } /// /// Gets or sets SelectedPictureSettingMode. /// public PresetPictureSettingsMode SelectedPictureSettingMode { get { return this.selectedPictureSettingMode; } set { this.selectedPictureSettingMode = value; this.ShowCustomInputs = value == PresetPictureSettingsMode.Custom; } } /// /// Prepare the Preset window to create a Preset Object later. /// /// /// The Encode Task. /// /// /// The title. /// /// /// The audio Behaviours. /// /// /// The subtitle Behaviours. /// public void Setup(EncodeTask task, Title title, AudioBehaviours audioBehaviours, SubtitleBehaviours subtitleBehaviours) { this.Preset.Task = new EncodeTask(task); this.Preset.AudioTrackBehaviours = audioBehaviours.Clone(); this.Preset.SubtitleTrackBehaviours = subtitleBehaviours.Clone(); this.audioDefaultsViewModel = new AudioDefaultsViewModel(this.Preset.Task); this.audioDefaultsViewModel.Setup(this.Preset, this.Preset.Task); this.subtitlesDefaultsViewModel = new SubtitlesDefaultsViewModel(); this.subtitlesDefaultsViewModel.SetupLanguages(subtitleBehaviours); this.selectedTitle = title; switch (task.Anamorphic) { default: this.SelectedPictureSettingMode = PresetPictureSettingsMode.Custom; if (title != null && title.Resolution != null) { this.CustomWidth = title.Resolution.Width; this.CustomHeight = title.Resolution.Height; } break; case Anamorphic.Automatic: this.SelectedPictureSettingMode = PresetPictureSettingsMode.SourceMaximum; break; } } /// /// Add a Preset /// public void Add() { if (string.IsNullOrEmpty(this.Preset.Name)) { this.errorService.ShowMessageBox(Resources.AddPresetViewModel_PresetMustProvideName, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); return; } if (this.presetService.CheckIfPresetExists(this.Preset.Name)) { MessageBoxResult result = this.errorService.ShowMessageBox(Resources.AddPresetViewModel_PresetWithSameNameOverwriteWarning, Resources.Error, MessageBoxButton.YesNo, MessageBoxImage.Error); if (result == MessageBoxResult.No) { return; } } if (this.SelectedPictureSettingMode == PresetPictureSettingsMode.SourceMaximum && this.selectedTitle == null) { this.errorService.ShowMessageBox(Resources.AddPresetViewModel_YouMustFirstScanSource, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); return; } if (this.CustomWidth == null && this.CustomHeight == null && this.SelectedPictureSettingMode == PresetPictureSettingsMode.Custom) { this.errorService.ShowMessageBox(Resources.AddPresetViewModel_CustomWidthHeightFieldsRequired, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); return; } this.Preset.PictureSettingsMode = this.SelectedPictureSettingMode; // Setting W, H, MW and MH if (this.SelectedPictureSettingMode == PresetPictureSettingsMode.None) { this.Preset.Task.MaxHeight = null; this.Preset.Task.MaxWidth = null; } if (this.SelectedPictureSettingMode == PresetPictureSettingsMode.Custom) { this.Preset.Task.MaxWidth = this.CustomWidth; this.Preset.Task.MaxHeight = this.CustomHeight; this.Preset.Task.Width = null; this.Preset.Task.Height = null; } if (this.SelectedPictureSettingMode == PresetPictureSettingsMode.SourceMaximum) { this.Preset.Task.MaxHeight = null; this.Preset.Task.MaxWidth = null; } // Add the Preset bool added = this.presetService.Add(this.Preset); if (!added) { this.errorService.ShowMessageBox(Resources.AddPresetViewModel_UnableToAddPreset, Resources.UnknownError, MessageBoxButton.OK, MessageBoxImage.Error); } else { this.Close(); } } /// /// The edit audio defaults. /// public void EditAudioDefaults() { IPopupWindowViewModel popup = new PopupWindowViewModel(this.audioDefaultsViewModel, ResourcesUI.Preset_AudioDefaults_Title, ResourcesUI.Preset_AudioDefaults_SubText); if (this.windowManager.ShowDialog(popup) == true) { this.Preset.AudioTrackBehaviours = this.audioDefaultsViewModel.AudioBehaviours.Clone(); } else { // Handle other case(s) } } /// /// The edit subtitle defaults. /// public void EditSubtitleDefaults() { IPopupWindowViewModel popup = new PopupWindowViewModel(this.subtitlesDefaultsViewModel, ResourcesUI.Preset_SubtitleDefaults_Title, ResourcesUI.Preset_SubtitleDefaults_SubText); if (this.windowManager.ShowDialog(popup) == true) { this.Preset.SubtitleTrackBehaviours = this.subtitlesDefaultsViewModel.SubtitleBehaviours.Clone(); } else { // Handle other case(s) } } /// /// Cancel adding a preset /// public void Cancel() { this.Close(); } /// /// Close this window. /// public void Close() { this.TryClose(); } } }