<Compile Include="Isolation\BackgroundServiceConnector.cs" />\r
<Compile Include="Isolation\IsolatedEncodeService.cs" />\r
<Compile Include="LibHb\AudioVideoHelpers.cs" />\r
+ <Compile Include="Model\Audio\AudioBehaviourModes.cs" />\r
+ <Compile Include="Model\Audio\AudioBehaviours.cs" />\r
<Compile Include="Model\HBConfiguration.cs" />\r
+ <Compile Include="Model\Subtitle\SubtitleBehaviourModes.cs" />\r
+ <Compile Include="Model\Subtitle\SubtitleBehaviours.cs" />\r
<Compile Include="Model\VideoScaler.cs" />\r
<Compile Include="Services\Interfaces\IEncodeServiceWrapper.cs" />\r
<Compile Include="Services\Interfaces\IHbServiceCallback.cs" />\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="AudioBehaviourModes.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// The audio behaviours.\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.ApplicationServices.Model.Audio\r
+{\r
+ using System.ComponentModel.DataAnnotations;\r
+\r
+ /// <summary>\r
+ /// The audio behaviours.\r
+ /// </summary>\r
+ public enum AudioBehaviourModes\r
+ {\r
+ [Display(Name = "None")]\r
+ None = 0,\r
+\r
+ [Display(Name = "First Matching Selected Language")]\r
+ FirstMatch,\r
+\r
+ [Display(Name = "All Matching Selected Languages")]\r
+ AllMatching,\r
+ }\r
+}\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="AudioBehaviours.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// Audio Behaviours\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.ApplicationServices.Model.Audio\r
+{\r
+ using System.ComponentModel;\r
+\r
+ using Caliburn.Micro;\r
+\r
+ /// <summary>\r
+ /// Audio Behaviours\r
+ /// </summary>\r
+ public class AudioBehaviours : PropertyChangedBase\r
+ {\r
+ /// <summary>\r
+ /// The selected behaviour.\r
+ /// </summary>\r
+ private AudioBehaviourModes selectedBehaviour;\r
+\r
+ /// <summary>\r
+ /// The selected langauges.\r
+ /// </summary>\r
+ private BindingList<string> selectedLangauges;\r
+\r
+ /// <summary>\r
+ /// Initializes a new instance of the <see cref="AudioBehaviours"/> class.\r
+ /// </summary>\r
+ public AudioBehaviours()\r
+ {\r
+ this.SelectedBehaviour = AudioBehaviourModes.None;\r
+ this.SelectedLangauges = new BindingList<string>();\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets the selected behaviour.\r
+ /// </summary>\r
+ public AudioBehaviourModes SelectedBehaviour\r
+ {\r
+ get\r
+ {\r
+ return this.selectedBehaviour;\r
+ }\r
+ \r
+ set\r
+ {\r
+ if (value == this.selectedBehaviour)\r
+ {\r
+ return;\r
+ }\r
+ this.selectedBehaviour = value;\r
+ this.NotifyOfPropertyChange(() => this.SelectedBehaviour);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets the selected langauges.\r
+ /// </summary>\r
+ public BindingList<string> SelectedLangauges\r
+ {\r
+ get\r
+ {\r
+ return this.selectedLangauges;\r
+ }\r
+ set\r
+ {\r
+ if (Equals(value, this.selectedLangauges))\r
+ {\r
+ return;\r
+ }\r
+ this.selectedLangauges = value;\r
+ this.NotifyOfPropertyChange(() => this.SelectedLangauges);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Clone this object\r
+ /// </summary>\r
+ /// <returns>\r
+ /// The <see cref="object"/>.\r
+ /// </returns>\r
+ public AudioBehaviours Clone()\r
+ {\r
+ AudioBehaviours cloned = new AudioBehaviours\r
+ {\r
+ SelectedBehaviour = this.selectedBehaviour,\r
+ SelectedLangauges = new BindingList<string>()\r
+ };\r
+\r
+ foreach (var item in this.SelectedLangauges)\r
+ {\r
+ cloned.SelectedLangauges.Add(item);\r
+ }\r
+\r
+ return cloned;\r
+ }\r
+ }\r
+}\r
{\r
using Caliburn.Micro;\r
\r
+ using HandBrake.ApplicationServices.Model.Audio;\r
+ using HandBrake.ApplicationServices.Model.Subtitle;\r
+\r
/// <summary>\r
/// A Preset for encoding with.\r
/// </summary>\r
\r
#endregion\r
\r
+\r
#region Properties\r
\r
/// <summary>\r
/// </summary>\r
public string Version { get; set; }\r
\r
+ /// <summary>\r
+ /// Gets or sets the audio track behaviours.\r
+ /// </summary>\r
+ public AudioBehaviours AudioTrackBehaviours { get; set; }\r
+\r
+ /// <summary>\r
+ /// Gets or sets the subtitle track behaviours.\r
+ /// </summary>\r
+ public SubtitleBehaviours SubtitleTrackBehaviours { get; set; }\r
+\r
#endregion\r
\r
#region Public Methods\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="SubtitleBehaviourModes.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// The subtitle behaviours modes.\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.ApplicationServices.Model.Subtitle\r
+{\r
+ using System.ComponentModel.DataAnnotations;\r
+\r
+ /// <summary>\r
+ /// The subtitle behaviours modes.\r
+ /// </summary>\r
+ public enum SubtitleBehaviourModes\r
+ {\r
+ [Display(Name = "None")]\r
+ None = 0,\r
+\r
+ [Display(Name = "First Matching Selected Language")]\r
+ FirstMatch,\r
+\r
+ [Display(Name = "All Matching Selected Languages")]\r
+ AllMatching,\r
+ }\r
+}\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="SubtitleBehaviours.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// A class to track the behaviours of audio track selection\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.ApplicationServices.Model.Subtitle\r
+{\r
+ using System.ComponentModel;\r
+\r
+ using Caliburn.Micro;\r
+\r
+ /// <summary>\r
+ /// A class to track the behaviours of audio track selection\r
+ /// </summary>\r
+ public class SubtitleBehaviours : PropertyChangedBase\r
+ {\r
+ /// <summary>\r
+ /// The selected behaviour.\r
+ /// </summary>\r
+ private SubtitleBehaviourModes selectedBehaviour;\r
+\r
+ /// <summary>\r
+ /// The selected langauges.\r
+ /// </summary>\r
+ private BindingList<string> selectedLangauges;\r
+\r
+ /// <summary>\r
+ /// The add foreign audio scan track.\r
+ /// </summary>\r
+ private bool addForeignAudioScanTrack;\r
+\r
+ /// <summary>\r
+ /// The add closed captions.\r
+ /// </summary>\r
+ private bool addClosedCaptions;\r
+\r
+ /// <summary>\r
+ /// Initializes a new instance of the <see cref="SubtitleBehaviours"/> class.\r
+ /// </summary>\r
+ public SubtitleBehaviours()\r
+ {\r
+ this.SelectedBehaviour = SubtitleBehaviourModes.None;\r
+ this.SelectedLangauges = new BindingList<string>();\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets the selected behaviour.\r
+ /// </summary>\r
+ public SubtitleBehaviourModes SelectedBehaviour\r
+ {\r
+ get\r
+ {\r
+ return this.selectedBehaviour;\r
+ }\r
+ set\r
+ {\r
+ if (value == this.selectedBehaviour)\r
+ {\r
+ return;\r
+ }\r
+ this.selectedBehaviour = value;\r
+ this.NotifyOfPropertyChange(() => this.SelectedBehaviour);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets the selected langages.\r
+ /// </summary>\r
+ public BindingList<string> SelectedLangauges\r
+ {\r
+ get\r
+ {\r
+ return this.selectedLangauges;\r
+ }\r
+ set\r
+ {\r
+ if (Equals(value, this.selectedLangauges))\r
+ {\r
+ return;\r
+ }\r
+ this.selectedLangauges = value;\r
+ this.NotifyOfPropertyChange(() => this.SelectedLangauges);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets a value indicating whether add foreign audio scan track.\r
+ /// </summary>\r
+ public bool AddForeignAudioScanTrack\r
+ {\r
+ get\r
+ {\r
+ return this.addForeignAudioScanTrack;\r
+ }\r
+ set\r
+ {\r
+ if (value.Equals(this.addForeignAudioScanTrack))\r
+ {\r
+ return;\r
+ }\r
+ this.addForeignAudioScanTrack = value;\r
+ this.NotifyOfPropertyChange(() => this.AddForeignAudioScanTrack);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets a value indicating whether add closed captions.\r
+ /// </summary>\r
+ public bool AddClosedCaptions\r
+ {\r
+ get\r
+ {\r
+ return this.addClosedCaptions;\r
+ }\r
+ set\r
+ {\r
+ if (value.Equals(this.addClosedCaptions))\r
+ {\r
+ return;\r
+ }\r
+ this.addClosedCaptions = value;\r
+ this.NotifyOfPropertyChange(() => this.AddClosedCaptions);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Clone this object\r
+ /// </summary>\r
+ /// <returns>\r
+ /// The <see cref="object"/>.\r
+ /// </returns>\r
+ public SubtitleBehaviours Clone()\r
+ {\r
+ SubtitleBehaviours cloned = new SubtitleBehaviours\r
+ {\r
+ SelectedBehaviour = this.selectedBehaviour,\r
+ SelectedLangauges = new BindingList<string>(),\r
+ AddClosedCaptions = this.addClosedCaptions,\r
+ AddForeignAudioScanTrack = this.addForeignAudioScanTrack,\r
+ };\r
+\r
+ foreach (var item in this.SelectedLangauges)\r
+ {\r
+ cloned.SelectedLangauges.Add(item);\r
+ }\r
+\r
+ return cloned;\r
+ }\r
+ }\r
+}\r
{\r
case Mixdown.Auto:\r
case Mixdown.None:\r
- return "auto";\r
+ return "none";\r
case Mixdown.Mono:\r
return "mono";\r
case Mixdown.LeftOnly:\r
{\r
using System.Collections.Generic;\r
using System.Collections.Specialized;\r
+ using System.Linq;\r
\r
/// <summary>\r
/// Language Utilities\r
}\r
\r
return iso6392Codes;\r
- } \r
+ }\r
+\r
+ /// <summary>\r
+ /// The get language codes.\r
+ /// </summary>\r
+ /// <param name="userLanguages">\r
+ /// The user languages.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="List"/>.\r
+ /// </returns>\r
+ public static List<string> GetLanguageCodes(IList<string> userLanguages)\r
+ {\r
+ // Translate to Iso Codes\r
+ List<string> iso6392Codes = new List<string>();\r
+ foreach (var item in userLanguages)\r
+ {\r
+ string isoCode;\r
+ if (LanguageUtilities.MapLanguages().TryGetValue(item, out isoCode))\r
+ {\r
+ iso6392Codes.Add(isoCode);\r
+ }\r
+ }\r
+\r
+ return iso6392Codes;\r
+ }\r
+\r
+ /// <summary>\r
+ /// The get iso codes.\r
+ /// </summary>\r
+ /// <returns>\r
+ /// The <see cref="List"/>.\r
+ /// </returns>\r
+ public static List<string> GetIsoCodes()\r
+ {\r
+ return MapLanguages().Values.ToList();\r
+ }\r
}\r
}\r
HBFunctions.hb_scan_stop(this.hbHandle);\r
}\r
\r
-\r
-\r
/// <summary>\r
/// Gets an image for the given job and preview\r
/// </summary>\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="AudioBehaviourConverter.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// Audio Behaviour Converter\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrakeWPF.Converters.Audio\r
+{\r
+ using System;\r
+ using System.ComponentModel;\r
+ using System.Globalization;\r
+ using System.Linq;\r
+ using System.Windows.Data;\r
+\r
+ using HandBrake.ApplicationServices.Model.Audio;\r
+ using HandBrake.ApplicationServices.Utilities;\r
+\r
+ /// <summary>\r
+ /// Audio Behaviour Converter\r
+ /// </summary>\r
+ public class AudioBehaviourConverter : IValueConverter\r
+ {\r
+ /// <summary>\r
+ /// The convert.\r
+ /// </summary>\r
+ /// <param name="value">\r
+ /// The value.\r
+ /// </param>\r
+ /// <param name="targetType">\r
+ /// The target type.\r
+ /// </param>\r
+ /// <param name="parameter">\r
+ /// The parameter.\r
+ /// </param>\r
+ /// <param name="culture">\r
+ /// The culture.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="object"/>.\r
+ /// </returns>\r
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r
+ {\r
+ if (value != null && value.GetType() == typeof(BindingList<AudioBehaviourModes>))\r
+ {\r
+ return\r
+ new BindingList<string>(\r
+ EnumHelper<AudioBehaviourModes>.GetEnumDisplayValues(typeof(AudioBehaviourModes)).ToList());\r
+ }\r
+\r
+ if (value != null && value.GetType() == typeof(AudioBehaviourModes))\r
+ {\r
+ return EnumHelper<AudioBehaviourModes>.GetDisplay((AudioBehaviourModes)value);\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /// <summary>\r
+ /// The convert back.\r
+ /// </summary>\r
+ /// <param name="value">\r
+ /// The value.\r
+ /// </param>\r
+ /// <param name="targetType">\r
+ /// The target type.\r
+ /// </param>\r
+ /// <param name="parameter">\r
+ /// The parameter.\r
+ /// </param>\r
+ /// <param name="culture">\r
+ /// The culture.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="object"/>.\r
+ /// </returns>\r
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r
+ {\r
+ string name = value as string;\r
+ if (!string.IsNullOrEmpty(name))\r
+ {\r
+ return EnumHelper<AudioBehaviourModes>.GetValue(name);\r
+ }\r
+\r
+ return null;\r
+ }\r
+ }\r
+}\r
using HandBrake.Interop.Model.Encoding;\r
using HandBrake.Interop.Model.Encoding.x264;\r
\r
- using HandBrakeWPF.Model;\r
-\r
/// <summary>\r
/// Enum Combo Converter\r
/// </summary>\r
case OptionsTab.OutputFiles:\r
if ((OptionsTab)parameter == OptionsTab.OutputFiles) return Visibility.Visible;\r
break;\r
- case OptionsTab.AudioAndSubtitles:\r
- if ((OptionsTab)parameter == OptionsTab.AudioAndSubtitles) return Visibility.Visible;\r
- break;\r
+\r
case OptionsTab.Advanced:\r
if ((OptionsTab)parameter == OptionsTab.Advanced) return Visibility.Visible;\r
break;\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="SubtitleBehaviourConverter.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// Subtitle Behaviour Converter\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrakeWPF.Converters.Subtitles\r
+{\r
+ using System;\r
+ using System.ComponentModel;\r
+ using System.Globalization;\r
+ using System.Linq;\r
+ using System.Windows.Data;\r
+\r
+ using HandBrake.ApplicationServices.Model.Subtitle;\r
+ using HandBrake.ApplicationServices.Utilities;\r
+\r
+ /// <summary>\r
+ /// Subtitle Behaviour Converter\r
+ /// </summary>\r
+ public class SubtitleBehaviourConverter : IValueConverter\r
+ {\r
+ /// <summary>\r
+ /// The convert.\r
+ /// </summary>\r
+ /// <param name="value">\r
+ /// The value.\r
+ /// </param>\r
+ /// <param name="targetType">\r
+ /// The target type.\r
+ /// </param>\r
+ /// <param name="parameter">\r
+ /// The parameter.\r
+ /// </param>\r
+ /// <param name="culture">\r
+ /// The culture.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="object"/>.\r
+ /// </returns>\r
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r
+ {\r
+ if (value != null && value.GetType() == typeof(BindingList<SubtitleBehaviourModes>))\r
+ {\r
+ return\r
+ new BindingList<string>(\r
+ EnumHelper<SubtitleBehaviourModes>.GetEnumDisplayValues(typeof(SubtitleBehaviourModes)).ToList());\r
+ }\r
+\r
+ if (value != null && value.GetType() == typeof(SubtitleBehaviourModes))\r
+ {\r
+ return EnumHelper<SubtitleBehaviourModes>.GetDisplay((SubtitleBehaviourModes)value);\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /// <summary>\r
+ /// The convert back.\r
+ /// </summary>\r
+ /// <param name="value">\r
+ /// The value.\r
+ /// </param>\r
+ /// <param name="targetType">\r
+ /// The target type.\r
+ /// </param>\r
+ /// <param name="parameter">\r
+ /// The parameter.\r
+ /// </param>\r
+ /// <param name="culture">\r
+ /// The culture.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="object"/>.\r
+ /// </returns>\r
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r
+ {\r
+ string name = value as string;\r
+ if (!string.IsNullOrEmpty(name))\r
+ {\r
+ return EnumHelper<SubtitleBehaviourModes>.GetValue(name);\r
+ }\r
+\r
+ return null;\r
+ }\r
+ }\r
+}\r
<Compile Include="Commands\AdvancedEncoderOptionsCommand.cs" />\r
<Compile Include="Constants.cs" />\r
<Compile Include="Controls\SplitButton\SplitMenuButton.cs" />\r
+ <Compile Include="Converters\Audio\AudioBehaviourConverter.cs" />\r
+ <Compile Include="Converters\Subtitles\SubtitleBehaviourConverter.cs" />\r
<Compile Include="Converters\Video\ScalingConverter.cs" />\r
<Compile Include="Model\ScanMode.cs" />\r
<Compile Include="Factories\HBConfigurationFactory.cs" />\r
[Display(Name = "Output Files")]\r
OutputFiles,\r
\r
- [Display(Name = "Audio and Subtitles")]\r
- AudioAndSubtitles,\r
-\r
[Display(Name = "Video")]\r
Video,\r
\r
/// </summary>\r
public const string HandBrakeBuild = "HandBrakeBuild";\r
\r
- /// <summary>\r
- /// Add Only One Per Langage\r
- /// </summary>\r
- public const string AddOnlyOneAudioPerLanguage = "addOnlyOneAudioPerLanguage";\r
-\r
/// <summary>\r
/// Auto name format\r
/// </summary>\r
/// </summary>\r
public const string DefaultPlayer = "defaultPlayer";\r
\r
- /// <summary>\r
- /// Dub mode\r
- /// </summary>\r
- public const string DubMode = "DubMode";\r
-\r
- /// <summary>\r
- /// Dub Mode Audio\r
- /// </summary>\r
- public const string DubModeAudio = "DubModeAudio";\r
-\r
- /// <summary>\r
- /// Dub Mode Subs\r
- /// </summary>\r
- public const string DubModeSubtitle = "DubModeSubtitle";\r
-\r
/// <summary>\r
/// Last Update Check\r
/// </summary>\r
/// </summary>\r
public const string MinTitleLength = "MinTitleLength";\r
\r
- /// <summary>\r
- /// Native Language Audio\r
- /// </summary>\r
- public const string NativeLanguage = "NativeLanguage";\r
-\r
- /// <summary>\r
- /// Native Language Subs\r
- /// </summary>\r
- public const string NativeLanguageForSubtitles = "NativeLanguageSubtitles";\r
-\r
/// <summary>\r
/// Preset Notification\r
/// </summary>\r
public const string PresetNotification = "presetNotification";\r
\r
- /// <summary>\r
- /// Selected Languages\r
- /// </summary>\r
- public const string SelectedLanguages = "SelectedLanguages";\r
-\r
- /// <summary>\r
- /// AUudio Passthru\r
- /// </summary>\r
- public const string ShowAdvancedAudioPassthruOpts = "ShowAdvancedAudioPassthruOpts";\r
-\r
/// <summary>\r
/// Skip Version\r
/// </summary>\r
/// </summary>\r
public const string UpdateStatus = "updateStatus";\r
\r
- /// <summary>\r
- /// Closed Captions\r
- /// </summary>\r
- public const string UseClosedCaption = "useClosedCaption";\r
-\r
/// <summary>\r
/// Use m4v\r
/// </summary>\r
/// </summary>\r
public const string ResetWhenDoneAction = "ResetWhenDoneAction";\r
\r
- /// <summary>\r
- /// The add foreign audio scan track.\r
- /// </summary>\r
- public const string AddForeignAudioScanTrack = "AddForeignAudioScanTrack";\r
-\r
/// <summary>\r
/// The disable lib dvd nav.\r
/// </summary>\r
using System.Windows;\r
\r
using HandBrake.ApplicationServices.Model;\r
+ using HandBrake.ApplicationServices.Model.Audio;\r
+ using HandBrake.ApplicationServices.Model.Subtitle;\r
using HandBrake.ApplicationServices.Parsing;\r
using HandBrake.ApplicationServices.Services;\r
using HandBrake.ApplicationServices.Services.Interfaces;\r
/// <param name="title">\r
/// The title.\r
/// </param>\r
- public void Setup(EncodeTask task, Title title)\r
+ /// <param name="audioBehaviours">\r
+ /// The audio Behaviours.\r
+ /// </param>\r
+ /// <param name="subtitleBehaviours">\r
+ /// The subtitle Behaviours.\r
+ /// </param>\r
+ public void Setup(EncodeTask task, Title title, AudioBehaviours audioBehaviours, SubtitleBehaviours subtitleBehaviours)\r
{\r
this.Preset.Task = new EncodeTask(task);\r
+ this.Preset.AudioTrackBehaviours = audioBehaviours.Clone();\r
+ this.Preset.SubtitleTrackBehaviours = subtitleBehaviours.Clone();\r
this.selectedTitle = title;\r
\r
switch (task.Anamorphic)\r
\r
namespace HandBrakeWPF.ViewModels\r
{\r
+ using System;\r
using System.Collections.Generic;\r
using System.Collections.ObjectModel;\r
- using System.Collections.Specialized;\r
+ using System.ComponentModel;\r
using System.Linq;\r
\r
using Caliburn.Micro;\r
\r
using HandBrake.ApplicationServices.Model;\r
+ using HandBrake.ApplicationServices.Model.Audio;\r
using HandBrake.ApplicationServices.Model.Encoding;\r
using HandBrake.ApplicationServices.Parsing;\r
using HandBrake.ApplicationServices.Utilities;\r
using HandBrake.Interop.Model.Encoding;\r
\r
- using HandBrakeWPF.Commands;\r
- using HandBrakeWPF.Model;\r
using HandBrakeWPF.Services.Interfaces;\r
using HandBrakeWPF.ViewModels.Interfaces;\r
\r
/// </summary>\r
private Preset currentPreset;\r
\r
+ /// <summary>\r
+ /// The show audio defaults panel.\r
+ /// </summary>\r
+ private bool showAudioDefaultsPanel;\r
+\r
+ /// <summary>\r
+ /// The available languages.\r
+ /// </summary>\r
+ private BindingList<string> availableLanguages;\r
+\r
+ /// <summary>\r
+ /// The audio behaviours.\r
+ /// </summary>\r
+ private AudioBehaviours audioBehaviours;\r
+\r
#region Constructors and Destructors\r
\r
/// <summary>\r
this.AudioEncoders = EnumHelper<AudioEncoder>.GetEnumList();\r
this.AudioMixdowns = EnumHelper<Mixdown>.GetEnumList();\r
this.SourceTracks = new List<Audio>();\r
+\r
+ this.AudioBehaviours = new AudioBehaviours();\r
+ this.SelectedAvailableToMove = new BindingList<string>();\r
+ this.SelectedLangaugesToMove = new BindingList<string>();\r
+ this.AvailableLanguages = new BindingList<string>();\r
+ this.SetupLanguages(null);\r
}\r
\r
#endregion\r
\r
#region Properties\r
\r
+ /// <summary>\r
+ /// Gets or sets the audio behaviours.\r
+ /// </summary>\r
+ public AudioBehaviours AudioBehaviours\r
+ {\r
+ get\r
+ {\r
+ return this.audioBehaviours;\r
+ }\r
+ set\r
+ {\r
+ if (Equals(value, this.audioBehaviours))\r
+ {\r
+ return;\r
+ }\r
+ this.audioBehaviours = value;\r
+ this.NotifyOfPropertyChange(() => this.AudioBehaviours);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets the audio behaviour modes.\r
+ /// </summary>\r
+ public BindingList<AudioBehaviourModes> AudioBehaviourModeList\r
+ {\r
+ get\r
+ {\r
+ return new BindingList<AudioBehaviourModes>(EnumHelper<AudioBehaviourModes>.GetEnumList().ToList());\r
+ }\r
+ }\r
+\r
/// <summary>\r
/// Gets or sets AudioBitrates.\r
/// </summary>\r
public EncodeTask Task { get; set; }\r
\r
/// <summary>\r
- /// Gets a value indicating whether ShowPassthruOptions.\r
+ /// Gets or sets a value indicating whether show audio defaults panel.\r
+ /// </summary>\r
+ public bool ShowAudioDefaultsPanel\r
+ {\r
+ get\r
+ {\r
+ return this.showAudioDefaultsPanel;\r
+ }\r
+ set\r
+ {\r
+ if (value.Equals(this.showAudioDefaultsPanel))\r
+ {\r
+ return;\r
+ }\r
+ this.showAudioDefaultsPanel = value;\r
+ this.NotifyOfPropertyChange(() => this.ShowAudioDefaultsPanel);\r
+ this.NotifyOfPropertyChange(() => this.PanelTitle);\r
+ this.NotifyOfPropertyChange(() => this.SwitchDisplayTitle);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets the panel title.\r
+ /// </summary>\r
+ public string PanelTitle\r
+ {\r
+ get\r
+ {\r
+ return this.ShowAudioDefaultsPanel ? "Audio Defaults" : "Audio Tracks";\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets the switch display title.\r
+ /// </summary>\r
+ public string SwitchDisplayTitle\r
+ {\r
+ get\r
+ {\r
+ return this.ShowAudioDefaultsPanel ? "Switch to Tracks" : "Switch to Defaults";\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets AvailableLanguages.\r
/// </summary>\r
- public bool ShowPassthruOptions\r
+ public BindingList<string> AvailableLanguages\r
{\r
get\r
{\r
- return this.UserSettingService.GetUserSetting<bool>(UserSettingConstants.ShowAdvancedAudioPassthruOpts);\r
+ return this.availableLanguages;\r
+ }\r
+\r
+ set\r
+ {\r
+ this.availableLanguages = value;\r
+ this.NotifyOfPropertyChange("AvailableLanguages");\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Gets or sets SelectedLangauges.\r
+ /// </summary>\r
+ public BindingList<string> SelectedAvailableToMove { get; set; }\r
+\r
+ /// <summary>\r
+ /// Gets or sets SelectedLangauges.\r
+ /// </summary>\r
+ public BindingList<string> SelectedLangaugesToMove { get; set; }\r
+\r
#endregion\r
\r
#region Public Methods\r
/// </summary>\r
public void SetDefaultBehaviour()\r
{\r
- OpenOptionsScreenCommand command = new OpenOptionsScreenCommand();\r
- command.Execute(OptionsTab.AudioAndSubtitles);\r
+ this.ShowAudioDefaultsPanel = true;\r
+ }\r
+\r
+ /// <summary>\r
+ /// The show audio defaults.\r
+ /// </summary>\r
+ public void ShowAudioDefaults()\r
+ {\r
+ this.ShowAudioDefaultsPanel = !this.ShowAudioDefaultsPanel;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Audio List Move Left\r
+ /// </summary>\r
+ public void LanguageMoveRight()\r
+ {\r
+ if (this.SelectedAvailableToMove.Count > 0)\r
+ {\r
+ List<string> copiedList = SelectedAvailableToMove.ToList();\r
+ foreach (string item in copiedList)\r
+ {\r
+ this.AvailableLanguages.Remove(item);\r
+ this.AudioBehaviours.SelectedLangauges.Add(item);\r
+ }\r
+\r
+ this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Audio List Move Right\r
+ /// </summary>\r
+ public void LanguageMoveLeft()\r
+ {\r
+ if (this.SelectedLangaugesToMove.Count > 0)\r
+ {\r
+ List<string> copiedList = SelectedLangaugesToMove.ToList();\r
+ foreach (string item in copiedList)\r
+ {\r
+ this.AudioBehaviours.SelectedLangauges.Remove(item);\r
+ this.AvailableLanguages.Add(item);\r
+ }\r
+ }\r
+\r
+ this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
+ }\r
+\r
+ /// <summary>\r
+ /// Audio List Clear all selected languages\r
+ /// </summary>\r
+ public void LanguageClearAll()\r
+ {\r
+ foreach (string item in this.AudioBehaviours.SelectedLangauges)\r
+ {\r
+ this.AvailableLanguages.Add(item);\r
+ }\r
+ this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
+\r
+ this.AudioBehaviours.SelectedLangauges.Clear();\r
}\r
\r
#endregion\r
this.Task = task;\r
this.currentPreset = preset;\r
\r
+ // Audio Behaviours\r
+ this.SetupLanguages(preset);\r
+\r
if (preset != null && preset.Task != null)\r
{\r
- int mode = this.UserSettingService.GetUserSetting<int>(UserSettingConstants.DubModeAudio);\r
- if (mode >= 1)\r
+ if (this.AudioBehaviours.SelectedBehaviour != AudioBehaviourModes.None)\r
{\r
this.AutomaticTrackSelection();\r
}\r
else\r
{\r
- this.AddTracksFromPreset(preset); \r
+ this.AddTracksFromPreset(preset);\r
}\r
\r
this.AutomaticTrackSelection();\r
// For all the source audio tracks\r
foreach (Audio sourceTrack in this.SourceTracks)\r
{\r
- // Step 1: If "Add only One per language" is turned on, check to see if this language is already added.\r
- if (this.CanSkipSourceTrack(sourceTrack))\r
- {\r
- continue;\r
- }\r
-\r
// Step 2: Check if the track list already contrains this track\r
bool found = this.Task.AudioTracks.Any(audioTrack => Equals(audioTrack.ScannedTrack, sourceTrack));\r
if (!found)\r
// Add them if they are not already added.\r
foreach (Audio sourceTrack in this.GetSelectedLanguagesTracks())\r
{\r
- // Step 1: If "Add only One per language" is turned on, check to see if this language is already added.\r
- if (this.CanSkipSourceTrack(sourceTrack))\r
- {\r
- continue;\r
- }\r
-\r
// Step 2: Check if the track list already contrains this track\r
bool found = this.Task.AudioTracks.Any(audioTrack => Equals(audioTrack.ScannedTrack, sourceTrack));\r
if (!found)\r
}\r
}\r
\r
+ /// <summary>\r
+ /// The add first for selected languages.\r
+ /// </summary>\r
+ private void AddFirstForSelectedLanguages()\r
+ {\r
+ foreach (Audio sourceTrack in this.GetSelectedLanguagesTracks())\r
+ {\r
+ // Step 2: Check if the track list already contrains this track\r
+ bool found = this.Task.AudioTracks.Any(audioTrack => Equals(audioTrack.ScannedTrack, sourceTrack));\r
+ if (!found)\r
+ {\r
+ // Check if we are already using this language\r
+ bool foundLanguage = false;\r
+ foreach (var item in this.Task.AudioTracks.Where(item => item.ScannedTrack != null && sourceTrack.LanguageCode.Contains(item.ScannedTrack.LanguageCode)))\r
+ {\r
+ foundLanguage = true;\r
+ }\r
+\r
+ if (foundLanguage)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ // If it doesn't, add it.\r
+ this.Add(sourceTrack);\r
+ }\r
+ }\r
+ }\r
+\r
/// <summary>\r
/// Attempt to automatically select the correct audio tracks based on the users settings.\r
/// </summary>\r
}\r
\r
// Handle the default selection behaviour.\r
- int mode = this.UserSettingService.GetUserSetting<int>(UserSettingConstants.DubModeAudio);\r
- if (mode == 1 || mode == 2)\r
+ if (this.AudioBehaviours.SelectedBehaviour != AudioBehaviourModes.None)\r
{\r
// First, we'll clear out all current tracks and go back to what the current preset has.\r
// This will alteast provide a consistent behavior when switching tracks.\r
this.AddTracksFromPreset(this.currentPreset);\r
}\r
\r
- switch (mode)\r
+ switch (this.AudioBehaviours.SelectedBehaviour)\r
{\r
- case 1: // Adding all remaining audio tracks\r
- this.AddAllRemaining();\r
+ case AudioBehaviourModes.FirstMatch: // Adding all remaining audio tracks\r
+ this.AddFirstForSelectedLanguages();\r
break;\r
- case 2: // Add Langauges tracks for the additional languages selected, in-order.\r
+ case AudioBehaviourModes.AllMatching: // Add Langauges tracks for the additional languages selected, in-order.\r
this.AddAllRemainingForSelectedLanguages();\r
break;\r
}\r
/// </returns>\r
private Audio GetPreferredAudioTrack()\r
{\r
- // Get the preferred Language\r
- IEnumerable<Audio> preferredAudioTracks =\r
- this.SourceTracks.Where(\r
- item =>\r
- item.Language.Contains(\r
- this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage)));\r
+ // The first track in the selected languages list is considered the preferred language.\r
+ // So, try match tracks on this.\r
+ IEnumerable<Audio> preferredAudioTracks = new List<Audio>();\r
+ if (this.AudioBehaviours.SelectedLangauges.Count > 0)\r
+ {\r
+ string langName = this.AudioBehaviours.SelectedLangauges.FirstOrDefault(w => !w.Equals(Constants.Any));\r
+ if (!string.IsNullOrEmpty(langName))\r
+ {\r
+ preferredAudioTracks = this.SourceTracks.Where(item => item.Language.Contains(langName));\r
+ }\r
+ }\r
+\r
return preferredAudioTracks.FirstOrDefault() ?? this.SourceTracks.FirstOrDefault();\r
}\r
\r
{\r
List<Audio> trackList = new List<Audio>();\r
\r
- List<string> isoCodes =\r
- LanguageUtilities.GetLanguageCodes(\r
- this.UserSettingService.GetUserSetting<StringCollection>(UserSettingConstants.SelectedLanguages));\r
+ List<string> isoCodes = this.AudioBehaviours.SelectedLangauges.Contains(Constants.Any)\r
+ ? LanguageUtilities.GetIsoCodes()\r
+ : LanguageUtilities.GetLanguageCodes(\r
+ this.AudioBehaviours.SelectedLangauges.ToArray());\r
\r
foreach (string code in isoCodes)\r
{\r
}\r
\r
/// <summary>\r
- /// Checks to see if we can skip over the given source audio track.\r
- /// True when the user has set "Add only one per language" feature AND the language is contained in the track list.\r
+ /// The setup languages.\r
/// </summary>\r
- /// <param name="sourceTrack">\r
- /// The source track.\r
+ /// <param name="preset">\r
+ /// The preset.\r
/// </param>\r
- /// <returns>\r
- /// True when the user has set "Add only one per language" feature AND the language is contained in the track list\r
- /// </returns>\r
- private bool CanSkipSourceTrack(Audio sourceTrack)\r
+ private void SetupLanguages(Preset preset)\r
{\r
- bool addOnlyOnePerLanguage = this.UserSettingService.GetUserSetting<bool>(UserSettingConstants.AddOnlyOneAudioPerLanguage);\r
- bool sourceTrackLanguageFound = this.Task.AudioTracks.Any(audioTrack => audioTrack.ScannedTrack != null && sourceTrack.Language == audioTrack.ScannedTrack.Language);\r
- if (addOnlyOnePerLanguage && sourceTrackLanguageFound)\r
+ // Step 1, Set the behaviour mode\r
+ this.AudioBehaviours.SelectedBehaviour = AudioBehaviourModes.None;\r
+ this.AudioBehaviours.SelectedLangauges.Clear();\r
+\r
+ // Step 2, Get all the languages\r
+ IDictionary<string, string> langList = LanguageUtilities.MapLanguages();\r
+ langList = (from entry in langList orderby entry.Key ascending select entry).ToDictionary(pair => pair.Key, pair => pair.Value);\r
+\r
+ // Step 3, Setup Available Languages\r
+ this.AvailableLanguages.Clear();\r
+ foreach (string item in langList.Keys)\r
{\r
- return true; // This track can be skipped.\r
+ this.AvailableLanguages.Add(item);\r
}\r
\r
- return false;\r
+ // Step 4, Set the Selected Languages \r
+ if (preset != null && preset.AudioTrackBehaviours != null)\r
+ {\r
+ this.AudioBehaviours.SelectedBehaviour = preset.AudioTrackBehaviours.SelectedBehaviour;\r
+\r
+ foreach (string selectedItem in preset.AudioTrackBehaviours.SelectedLangauges)\r
+ {\r
+ this.AvailableLanguages.Remove(selectedItem);\r
+ this.AudioBehaviours.SelectedLangauges.Add(selectedItem);\r
+ }\r
+ }\r
}\r
\r
#endregion\r
namespace HandBrakeWPF.ViewModels.Interfaces\r
{\r
using HandBrake.ApplicationServices.Model;\r
+ using HandBrake.ApplicationServices.Model.Audio;\r
+ using HandBrake.ApplicationServices.Model.Subtitle;\r
using HandBrake.ApplicationServices.Parsing;\r
\r
/// <summary>\r
/// <param name="title">\r
/// The title.\r
/// </param>\r
- void Setup(EncodeTask task, Title title);\r
+ /// <param name="audioBehaviours">\r
+ /// The audio Behaviours.\r
+ /// </param>\r
+ /// <param name="subtitleBehaviours">\r
+ /// The subtitle Behaviours.\r
+ /// </param>\r
+ void Setup(EncodeTask task, Title title, AudioBehaviours audioBehaviours, SubtitleBehaviours subtitleBehaviours);\r
}\r
}\r
\r
namespace HandBrakeWPF.ViewModels.Interfaces\r
{\r
+ using HandBrake.ApplicationServices.Model.Audio;\r
+\r
/// <summary>\r
/// The Audio View Model Interface\r
/// </summary>\r
public interface IAudioViewModel : ITabInterface\r
{\r
+ /// <summary>\r
+ /// Gets the audio behaviours.\r
+ /// </summary>\r
+ AudioBehaviours AudioBehaviours { get; }\r
+\r
/// <summary>\r
/// Trigger a Notify Property Changed on the Task to force various UI elements to update.\r
/// </summary>\r
\r
namespace HandBrakeWPF.ViewModels.Interfaces\r
{\r
+ using HandBrake.ApplicationServices.Model.Subtitle;\r
+\r
/// <summary>\r
/// The Subtiles View Model Interface\r
/// </summary>\r
public interface ISubtitlesViewModel : ITabInterface\r
{\r
+ /// <summary>\r
+ /// Gets the subtitle behaviours.\r
+ /// </summary>\r
+ SubtitleBehaviours SubtitleBehaviours { get; }\r
}\r
}\r
public void PresetAdd()\r
{\r
IAddPresetViewModel presetViewModel = IoC.Get<IAddPresetViewModel>();\r
- presetViewModel.Setup(this.CurrentTask, this.SelectedTitle);\r
+ presetViewModel.Setup(this.CurrentTask, this.SelectedTitle, this.AudioViewModel.AudioBehaviours, this.SubtitleViewModel.SubtitleBehaviours);\r
this.WindowManager.ShowWindow(presetViewModel);\r
}\r
\r
namespace HandBrakeWPF.ViewModels\r
{\r
using System;\r
- using System.Collections.Generic;\r
- using System.Collections.Specialized;\r
using System.ComponentModel;\r
using System.Diagnostics;\r
using System.Globalization;\r
\r
using Caliburn.Micro;\r
\r
- using HandBrake.ApplicationServices;\r
using HandBrake.ApplicationServices.Model;\r
- using HandBrake.ApplicationServices.Services.Interfaces;\r
using HandBrake.ApplicationServices.Utilities;\r
\r
using HandBrakeWPF.Model;\r
/// </summary>\r
private readonly IUpdateService updateService;\r
\r
- /// <summary>\r
- /// The add audio mode options.\r
- /// </summary>\r
- private BindingList<string> addAudioModeOptions = new BindingList<string>();\r
-\r
- /// <summary>\r
- /// The add closed captions.\r
- /// </summary>\r
- private bool addClosedCaptions;\r
-\r
- /// <summary>\r
- /// The add only one audio track per language.\r
- /// </summary>\r
- private bool addOnlyOneAudioTrackPerLanguage;\r
-\r
- /// <summary>\r
- /// The add subtitle mode options.\r
- /// </summary>\r
- private BindingList<string> addSubtitleModeOptions = new BindingList<string>();\r
-\r
/// <summary>\r
/// The arguments.\r
/// </summary>\r
/// </summary>\r
private string autonameFormat;\r
\r
- /// <summary>\r
- /// The available languages.\r
- /// </summary>\r
- private BindingList<string> availableLanguages = new BindingList<string>();\r
-\r
/// <summary>\r
/// The change to title case.\r
/// </summary>\r
/// </summary>\r
private bool removeUnderscores;\r
\r
- /// <summary>\r
- /// The selected add audio mode.\r
- /// </summary>\r
- private int selectedAddAudioMode;\r
-\r
- /// <summary>\r
- /// The selected add subtitle mode.\r
- /// </summary>\r
- private int selectedAddSubtitleMode;\r
-\r
/// <summary>\r
/// The selected granulairty.\r
/// </summary>\r
/// </summary>\r
private int selectedMp4Extension;\r
\r
- /// <summary>\r
- /// The selected preferred languages.\r
- /// </summary>\r
- private BindingList<string> preferredLanguages = new BindingList<string>();\r
-\r
- /// <summary>\r
- /// The selected preferred langauge.\r
- /// </summary>\r
- private string selectedPreferredLangauge;\r
-\r
- /// <summary>\r
- /// The selected preferred subtitle language\r
- /// </summary>\r
- private string selectedPreferredSubtitleLangauge;\r
-\r
/// <summary>\r
/// The selected preview count.\r
/// </summary>\r
/// </summary>\r
private BindingList<string> whenDoneOptions = new BindingList<string>();\r
\r
- /// <summary>\r
- /// Selected Langauges\r
- /// </summary>\r
- private BindingList<string> selectedLangauges = new BindingList<string>();\r
-\r
- /// <summary>\r
- /// The backing field for show advanced passthru options for Audio\r
- /// </summary>\r
- private bool showAdvancedPassthruOpts;\r
-\r
/// <summary>\r
/// Backing field for clear queue on encode completed.\r
/// </summary>\r
/// </summary>\r
private bool disableQuickSyncDecoding;\r
\r
- /// <summary>\r
- /// The add foreign audio scan track.\r
- /// </summary>\r
- private bool addForeignAudioScanTrack;\r
-\r
/// <summary>\r
/// The is cl scaling.\r
/// </summary>\r
}\r
#endregion\r
\r
- #region Audio and Subtitles\r
-\r
- /// <summary>\r
- /// Gets or sets preferredLanguages.\r
- /// </summary>\r
- public BindingList<string> PreferredLanguages\r
- {\r
- get\r
- {\r
- return this.preferredLanguages;\r
- }\r
-\r
- set\r
- {\r
- this.preferredLanguages = value;\r
- this.NotifyOfPropertyChange("PreferredLanguages");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets SelectedPreferreedLangauge.\r
- /// </summary>\r
- public string SelectedPreferredLangauge\r
- {\r
- get\r
- {\r
- return this.selectedPreferredLangauge;\r
- }\r
-\r
- set\r
- {\r
- this.selectedPreferredLangauge = value;\r
- this.NotifyOfPropertyChange(() => SelectedPreferredLangauge);\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets SelectedPreferredSubtitleLangauge.\r
- /// </summary>\r
- public string SelectedPreferredSubtitleLangauge\r
- {\r
- get\r
- {\r
- return this.selectedPreferredSubtitleLangauge;\r
- }\r
-\r
- set\r
- {\r
- this.selectedPreferredSubtitleLangauge = value;\r
- this.NotifyOfPropertyChange(() => SelectedPreferredSubtitleLangauge);\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets AvailableLanguages.\r
- /// </summary>\r
- public BindingList<string> AvailableLanguages\r
- {\r
- get\r
- {\r
- return this.availableLanguages;\r
- }\r
-\r
- set\r
- {\r
- this.availableLanguages = value;\r
- this.NotifyOfPropertyChange("AvailableLanguages");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets SelectedLangauges.\r
- /// </summary>\r
- public BindingList<string> SelectedLangauges\r
- {\r
- get\r
- {\r
- return this.selectedLangauges;\r
- }\r
- set\r
- {\r
- this.selectedLangauges = value;\r
- this.NotifyOfPropertyChange("SelectedLangauges");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets SelectedLangauges.\r
- /// </summary>\r
- public BindingList<string> SelectedAvailableToMove { get; set; }\r
-\r
- /// <summary>\r
- /// Gets or sets SelectedLangauges.\r
- /// </summary>\r
- public BindingList<string> SelectedLangaugesToMove { get; set; }\r
-\r
- /// <summary>\r
- /// Gets or sets AddAudioModeOptions.\r
- /// </summary>\r
- public BindingList<string> AddAudioModeOptions\r
- {\r
- get\r
- {\r
- return this.addAudioModeOptions;\r
- }\r
-\r
- set\r
- {\r
- this.addAudioModeOptions = value;\r
- this.NotifyOfPropertyChange("AddAudioModeOptions");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets a value indicating whether AddClosedCaptions.\r
- /// </summary>\r
- public bool AddClosedCaptions\r
- {\r
- get\r
- {\r
- return this.addClosedCaptions;\r
- }\r
-\r
- set\r
- {\r
- this.addClosedCaptions = value;\r
- this.NotifyOfPropertyChange("AddClosedCaptions");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets a value indicating whether AddOnlyOneAudioTrackPerLanguage.\r
- /// </summary>\r
- public bool AddOnlyOneAudioTrackPerLanguage\r
- {\r
- get\r
- {\r
- return this.addOnlyOneAudioTrackPerLanguage;\r
- }\r
-\r
- set\r
- {\r
- this.addOnlyOneAudioTrackPerLanguage = value;\r
- this.NotifyOfPropertyChange("AddOnlyOneAudioTrackPerLanguage");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets AddSubtitleModeOptions.\r
- /// </summary>\r
- public BindingList<string> AddSubtitleModeOptions\r
- {\r
- get\r
- {\r
- return this.addSubtitleModeOptions;\r
- }\r
-\r
- set\r
- {\r
- this.addSubtitleModeOptions = value;\r
- this.NotifyOfPropertyChange("AddSubtitleModeOptions");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets SelectedAddAudioMode.\r
- /// </summary>\r
- public int SelectedAddAudioMode\r
- {\r
- get\r
- {\r
- return this.selectedAddAudioMode;\r
- }\r
-\r
- set\r
- {\r
- this.selectedAddAudioMode = value;\r
- this.NotifyOfPropertyChange("SelectedAddAudioMode");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets SelectedAddSubtitleMode.\r
- /// </summary>\r
- public int SelectedAddSubtitleMode\r
- {\r
- get\r
- {\r
- return this.selectedAddSubtitleMode;\r
- }\r
-\r
- set\r
- {\r
- this.selectedAddSubtitleMode = value;\r
- this.NotifyOfPropertyChange("SelectedAddSubtitleMode");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets a value indicating whether ShowAdvancedPassthruOpts.\r
- /// </summary>\r
- public bool ShowAdvancedPassthruOpts\r
- {\r
- get\r
- {\r
- return this.showAdvancedPassthruOpts;\r
- }\r
- set\r
- {\r
- this.showAdvancedPassthruOpts = value;\r
- this.NotifyOfPropertyChange(() => this.ShowAdvancedPassthruOpts);\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Gets or sets a value indicating whether add foreign audio scan track.\r
- /// </summary>\r
- public bool AddForeignAudioScanTrack\r
- {\r
- get\r
- {\r
- return this.addForeignAudioScanTrack;\r
- }\r
- set\r
- {\r
- if (value.Equals(this.addForeignAudioScanTrack))\r
- {\r
- return;\r
- }\r
- this.addForeignAudioScanTrack = value;\r
- this.NotifyOfPropertyChange(() => this.AddForeignAudioScanTrack);\r
- }\r
- }\r
-\r
- #endregion\r
-\r
#region System and Logging\r
\r
/// <summary>\r
this.VLCPath = dialog.FileName;\r
}\r
\r
- /// <summary>\r
- /// Audio List Move Left\r
- /// </summary>\r
- public void LanguageMoveRight()\r
- {\r
- if (this.SelectedAvailableToMove.Count > 0)\r
- {\r
- List<string> copiedList = SelectedAvailableToMove.ToList();\r
- foreach (string item in copiedList)\r
- {\r
- this.AvailableLanguages.Remove(item);\r
- this.SelectedLangauges.Add(item);\r
- }\r
-\r
- this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Audio List Move Right\r
- /// </summary>\r
- public void LanguageMoveLeft()\r
- {\r
- if (this.SelectedLangaugesToMove.Count > 0)\r
- {\r
- List<string> copiedList = SelectedLangaugesToMove.ToList();\r
- foreach (string item in copiedList)\r
- {\r
- this.SelectedLangauges.Remove(item);\r
- this.AvailableLanguages.Add(item);\r
- }\r
- }\r
-\r
- this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
- }\r
-\r
- /// <summary>\r
- /// Audio List Clear all selected languages\r
- /// </summary>\r
- public void LanguageClearAll()\r
- {\r
- foreach (string item in this.SelectedLangauges)\r
- {\r
- this.AvailableLanguages.Add(item);\r
- }\r
- this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
-\r
- this.SelectedLangauges.Clear();\r
- }\r
-\r
/// <summary>\r
/// Browse - Log Path\r
/// </summary>\r
// VLC Path\r
this.VLCPath = this.userSettingService.GetUserSetting<string>(UserSettingConstants.VLCPath) ?? string.Empty;\r
\r
- // #############################\r
- // Audio and Subtitles Tab\r
- // #############################\r
-\r
- this.SelectedAvailableToMove = new BindingList<string>();\r
- this.SelectedLangaugesToMove = new BindingList<string>();\r
-\r
- IDictionary<string, string> langList = LanguageUtilities.MapLanguages();\r
- langList = (from entry in langList orderby entry.Key ascending select entry).ToDictionary(pair => pair.Key, pair => pair.Value);\r
-\r
- this.selectedLangauges.Clear();\r
- foreach (string selectedItem in this.userSettingService.GetUserSetting<StringCollection>(UserSettingConstants.SelectedLanguages))\r
- {\r
- // removing wrong keys when a new Language list comes out.\r
- if (langList.ContainsKey(selectedItem))\r
- {\r
- this.selectedLangauges.Add(selectedItem);\r
- }\r
- }\r
-\r
- this.preferredLanguages.Clear();\r
- this.availableLanguages.Clear();\r
- foreach (string item in langList.Keys)\r
- {\r
- this.preferredLanguages.Add(item);\r
-\r
- // In the available languages should be no "Any" and no selected language.\r
- if ((item != Constants.Any) && (!this.userSettingService.GetUserSetting<StringCollection>(UserSettingConstants.SelectedLanguages).Contains(item)))\r
- {\r
- this.availableLanguages.Add(item);\r
- }\r
- }\r
-\r
- this.SelectedPreferredLangauge = this.userSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage) ?? string.Empty;\r
- this.SelectedPreferredSubtitleLangauge = this.userSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguageForSubtitles) ?? string.Empty;\r
-\r
- this.AddAudioModeOptions.Clear();\r
- this.AddAudioModeOptions.Add("None");\r
- this.AddAudioModeOptions.Add("Add All Remaining Tracks");\r
- this.AddAudioModeOptions.Add("Add All for Selected Languages");\r
-\r
- this.AddSubtitleModeOptions.Clear();\r
- this.AddSubtitleModeOptions.Add("None");\r
- this.AddSubtitleModeOptions.Add("Add All (Where possible)");\r
- this.AddSubtitleModeOptions.Add("Add First");\r
- this.AddSubtitleModeOptions.Add("Add all for Selected Languages");\r
- this.AddSubtitleModeOptions.Add("Add only for Prefered Language (First)");\r
- this.AddSubtitleModeOptions.Add("Add all for Prefered Language");\r
-\r
- this.SelectedAddAudioMode = this.userSettingService.GetUserSetting<int>(UserSettingConstants.DubModeAudio);\r
- this.SelectedAddSubtitleMode = this.userSettingService.GetUserSetting<int>(UserSettingConstants.DubModeSubtitle);\r
-\r
- this.AddOnlyOneAudioTrackPerLanguage = this.userSettingService.GetUserSetting<bool>(UserSettingConstants.AddOnlyOneAudioPerLanguage);\r
-\r
- this.AddClosedCaptions = this.userSettingService.GetUserSetting<bool>(UserSettingConstants.UseClosedCaption);\r
- this.ShowAdvancedPassthruOpts = this.userSettingService.GetUserSetting<bool>(UserSettingConstants.ShowAdvancedAudioPassthruOpts);\r
- this.AddForeignAudioScanTrack = this.userSettingService.GetUserSetting<bool>(UserSettingConstants.AddForeignAudioScanTrack);\r
-\r
// #############################\r
// Video\r
// #############################\r
\r
/* Previews */\r
this.userSettingService.SetUserSetting(UserSettingConstants.VLCPath, this.VLCPath);\r
-\r
- /* Audio and Subtitles */\r
- this.userSettingService.SetUserSetting(UserSettingConstants.NativeLanguage, this.SelectedPreferredLangauge);\r
- this.userSettingService.SetUserSetting(UserSettingConstants.NativeLanguageForSubtitles, this.SelectedPreferredSubtitleLangauge);\r
- StringCollection collection = new StringCollection();\r
- collection.AddRange(this.SelectedLangauges.ToArray());\r
- this.userSettingService.SetUserSetting(UserSettingConstants.SelectedLanguages, collection);\r
- this.userSettingService.SetUserSetting(UserSettingConstants.AddOnlyOneAudioPerLanguage, this.AddOnlyOneAudioTrackPerLanguage);\r
- this.userSettingService.SetUserSetting(UserSettingConstants.UseClosedCaption, this.AddClosedCaptions);\r
- this.userSettingService.SetUserSetting(UserSettingConstants.DubModeAudio, this.SelectedAddAudioMode);\r
- this.userSettingService.SetUserSetting(UserSettingConstants.DubModeSubtitle, this.SelectedAddSubtitleMode);\r
- this.userSettingService.SetUserSetting(UserSettingConstants.ShowAdvancedAudioPassthruOpts, this.ShowAdvancedPassthruOpts);\r
- this.userSettingService.SetUserSetting(UserSettingConstants.AddForeignAudioScanTrack, this.AddForeignAudioScanTrack);\r
\r
/* Video */\r
this.userSettingService.SetUserSetting(UserSettingConstants.DisableQuickSyncDecoding, this.DisableQuickSyncDecoding);\r
get\r
{\r
// TODO decide what is the minimal requirement to hide the warning message.\r
- if (this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage) != Constants.Any ||\r
- this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguageForSubtitles) !=\r
- Constants.Any)\r
- {\r
- return true;\r
- }\r
+ //if (this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage) != Constants.Any ||\r
+ // this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguageForSubtitles) !=\r
+ // Constants.Any)\r
+ //{\r
+ // return true;\r
+ //}\r
\r
return false;\r
}\r
namespace HandBrakeWPF.ViewModels\r
{\r
using System.Collections.Generic;\r
- using System.Collections.Specialized;\r
+ using System.ComponentModel;\r
using System.IO;\r
using System.Linq;\r
\r
using HandBrake.ApplicationServices.Model;\r
using HandBrake.ApplicationServices.Model.Encoding;\r
+ using HandBrake.ApplicationServices.Model.Subtitle;\r
using HandBrake.ApplicationServices.Parsing;\r
using HandBrake.ApplicationServices.Utilities;\r
\r
- using HandBrakeWPF.Commands;\r
- using HandBrakeWPF.Model;\r
using HandBrakeWPF.ViewModels.Interfaces;\r
\r
using Ookii.Dialogs.Wpf;\r
/// </summary>\r
private IList<Subtitle> sourceTracks;\r
\r
+ /// <summary>\r
+ /// The show defaults panel.\r
+ /// </summary>\r
+ private bool showDefaultsPanel;\r
+\r
+ /// <summary>\r
+ /// The audio behaviours.\r
+ /// </summary>\r
+ private SubtitleBehaviours subtitleBehaviours;\r
+\r
+ /// <summary>\r
+ /// The available languages.\r
+ /// </summary>\r
+ private BindingList<string> availableLanguages;\r
+\r
#endregion\r
\r
#region Constructors and Destructors\r
\r
this.ForeignAudioSearchTrack = new Subtitle { SubtitleType = SubtitleType.ForeignAudioSearch, Language = "Foreign Audio Search (Bitmap)" };\r
this.SourceTracks = new List<Subtitle> { this.ForeignAudioSearchTrack };\r
+\r
+ this.SubtitleBehaviours = new SubtitleBehaviours();\r
+ this.SelectedAvailableToMove = new BindingList<string>();\r
+ this.SelectedLangaugesToMove = new BindingList<string>();\r
+ this.availableLanguages = new BindingList<string>();\r
+ this.SetupLanguages(null);\r
}\r
\r
#endregion\r
/// </summary>\r
public EncodeTask Task { get; set; }\r
\r
+ /// <summary>\r
+ /// Gets or sets a value indicating whether show defaults panel.\r
+ /// </summary>\r
+ public bool ShowDefaultsPanel\r
+ {\r
+ get\r
+ {\r
+ return this.showDefaultsPanel;\r
+ }\r
+ set\r
+ {\r
+ if (value.Equals(this.showDefaultsPanel))\r
+ {\r
+ return;\r
+ }\r
+ this.showDefaultsPanel = value;\r
+ this.NotifyOfPropertyChange(() => this.ShowDefaultsPanel);\r
+ this.NotifyOfPropertyChange(() => this.PanelTitle);\r
+ this.NotifyOfPropertyChange(() => this.SwitchDisplayTitle);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets the panel title.\r
+ /// </summary>\r
+ public string PanelTitle\r
+ {\r
+ get\r
+ {\r
+ return this.ShowDefaultsPanel ? "Subtitle Defaults" : "Subtitle Tracks";\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets the switch display title.\r
+ /// </summary>\r
+ public string SwitchDisplayTitle\r
+ {\r
+ get\r
+ {\r
+ return this.ShowDefaultsPanel ? "Switch to Tracks" : "Switch to Defaults";\r
+ }\r
+ }\r
+\r
+\r
+ /// <summary>\r
+ /// Gets or sets the subtitle behaviours.\r
+ /// </summary>\r
+ public SubtitleBehaviours SubtitleBehaviours\r
+ {\r
+ get\r
+ {\r
+ return this.subtitleBehaviours;\r
+ }\r
+ set\r
+ {\r
+ if (Equals(value, this.subtitleBehaviours))\r
+ {\r
+ return;\r
+ }\r
+ this.subtitleBehaviours = value;\r
+ this.NotifyOfPropertyChange(() => this.SubtitleBehaviours);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets the sbutitle behaviour modes.\r
+ /// </summary>\r
+ public BindingList<SubtitleBehaviourModes> SubtitleBehaviourModeList\r
+ {\r
+ get\r
+ {\r
+ return new BindingList<SubtitleBehaviourModes>(EnumHelper<SubtitleBehaviourModes>.GetEnumList().ToList());\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets AvailableLanguages.\r
+ /// </summary>\r
+ public BindingList<string> AvailableLanguages\r
+ {\r
+ get\r
+ {\r
+ return this.availableLanguages;\r
+ }\r
+\r
+ set\r
+ {\r
+ this.availableLanguages = value;\r
+ this.NotifyOfPropertyChange("AvailableLanguages");\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets SelectedLangauges.\r
+ /// </summary>\r
+ public BindingList<string> SelectedAvailableToMove { get; set; }\r
+\r
+ /// <summary>\r
+ /// Gets or sets SelectedLangauges.\r
+ /// </summary>\r
+ public BindingList<string> SelectedLangaugesToMove { get; set; }\r
+\r
#endregion\r
\r
#region Public Methods\r
/// </summary>\r
public void AddAllRemainingForSelectedLanguages()\r
{\r
- // Get a list of subtitle tracks that match the users lanaguages\r
- StringCollection userSelectedLanguages = this.UserSettingService.GetUserSetting<StringCollection>(UserSettingConstants.SelectedLanguages);\r
- userSelectedLanguages.Add(this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguageForSubtitles));\r
-\r
// Translate to Iso Codes\r
- List<string> iso6392Codes = LanguageUtilities.GetLanguageCodes(userSelectedLanguages);\r
+ List<string> iso6392Codes = this.SubtitleBehaviours.SelectedLangauges.Contains(Constants.Any)\r
+ ? LanguageUtilities.GetIsoCodes()\r
+ : LanguageUtilities.GetLanguageCodes(\r
+ this.SubtitleBehaviours.SelectedLangauges.ToArray());\r
+ \r
\r
List<Subtitle> availableTracks =\r
this.SourceTracks.Where(subtitle => iso6392Codes.Contains(subtitle.LanguageCodeClean)).ToList();\r
}\r
}\r
\r
+ /// <summary>\r
+ /// The add first for selected languages.\r
+ /// </summary>\r
+ private void AddFirstForSelectedLanguages()\r
+ {\r
+ foreach (Subtitle sourceTrack in this.GetSelectedLanguagesTracks())\r
+ {\r
+ // Step 2: Check if the track list already contrains this track\r
+ bool found = this.Task.SubtitleTracks.Any(track => Equals(track.SourceTrack, sourceTrack));\r
+ if (!found)\r
+ {\r
+ // Check if we are already using this language\r
+ bool foundLanguage = false;\r
+ Subtitle track = sourceTrack;\r
+\r
+\r
+ foreach (var item in this.Task.SubtitleTracks)\r
+ {\r
+ if (item.SourceTrack != null && item.SourceTrack.LanguageCode != null && track.LanguageCode.Contains(item.SourceTrack.LanguageCode))\r
+ {\r
+ foundLanguage = true;\r
+ } \r
+ }\r
+\r
+ if (foundLanguage)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ // If it doesn't, add it.\r
+ this.Add(sourceTrack);\r
+ }\r
+ }\r
+ }\r
+\r
/// <summary>\r
/// Import an SRT File.\r
/// </summary>\r
this.Task.SubtitleTracks.Clear();\r
\r
// Add Foreign Audio Scan\r
- if (this.UserSettingService.GetUserSetting<bool>(UserSettingConstants.AddForeignAudioScanTrack))\r
+ if (this.SubtitleBehaviours.AddForeignAudioScanTrack)\r
{\r
this.Add(ForeignAudioSearchTrack);\r
}\r
\r
- // New DUB Settings\r
- int mode = this.UserSettingService.GetUserSetting<int>(UserSettingConstants.DubModeSubtitle);\r
- switch (mode)\r
+ // Add Track Behaviours\r
+ switch (this.SubtitleBehaviours.SelectedBehaviour)\r
{\r
- case 1: // Adding all remaining subtitle tracks\r
- this.AddAllRemaining();\r
- break;\r
- case 2: // Adding only the first or preferred first subtitle track.\r
- this.Add();\r
+ case SubtitleBehaviourModes.FirstMatch: // Adding all remaining tracks\r
+ this.AddFirstForSelectedLanguages();\r
break;\r
- case 3: // Selected Languages Only\r
+ case SubtitleBehaviourModes.AllMatching: // Add Langauges tracks for the additional languages selected, in-order.\r
this.AddAllRemainingForSelectedLanguages();\r
break;\r
- case 4: // Prefered Only\r
- this.AddForPreferredLanaguages(true);\r
- break;\r
- case 5: // Prefered Only All\r
- this.AddForPreferredLanaguages(false);\r
- break;\r
}\r
\r
// Add all closed captions if enabled.\r
- if (this.UserSettingService.GetUserSetting<bool>(UserSettingConstants.UseClosedCaption))\r
+ if (this.SubtitleBehaviours.AddClosedCaptions)\r
{\r
this.AddAllClosedCaptions();\r
}\r
/// </summary>\r
public void SetDefaultBehaviour()\r
{\r
- OpenOptionsScreenCommand command = new OpenOptionsScreenCommand();\r
- command.Execute(OptionsTab.AudioAndSubtitles);\r
+ this.ShowDefaultsPanel = true;\r
+ }\r
+\r
+ /// <summary>\r
+ /// The show audio defaults.\r
+ /// </summary>\r
+ public void ShowSubtitleDefaultsPanel()\r
+ {\r
+ this.ShowDefaultsPanel = !this.ShowDefaultsPanel;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Audio List Move Left\r
+ /// </summary>\r
+ public void LanguageMoveRight()\r
+ {\r
+ if (this.SelectedAvailableToMove.Count > 0)\r
+ {\r
+ List<string> copiedList = SelectedAvailableToMove.ToList();\r
+ foreach (string item in copiedList)\r
+ {\r
+ this.AvailableLanguages.Remove(item);\r
+ this.SubtitleBehaviours.SelectedLangauges.Add(item);\r
+ }\r
+\r
+ this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Audio List Move Right\r
+ /// </summary>\r
+ public void LanguageMoveLeft()\r
+ {\r
+ if (this.SelectedLangaugesToMove.Count > 0)\r
+ {\r
+ List<string> copiedList = SelectedLangaugesToMove.ToList();\r
+ foreach (string item in copiedList)\r
+ {\r
+ this.SubtitleBehaviours.SelectedLangauges.Remove(item);\r
+ this.AvailableLanguages.Add(item);\r
+ }\r
+ }\r
+\r
+ this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
+ }\r
+\r
+ /// <summary>\r
+ /// Language List Clear all selected languages\r
+ /// </summary>\r
+ public void LanguageClearAll()\r
+ {\r
+ foreach (string item in this.SubtitleBehaviours.SelectedLangauges)\r
+ {\r
+ this.AvailableLanguages.Add(item);\r
+ }\r
+ this.AvailableLanguages = new BindingList<string>(this.AvailableLanguages.OrderBy(o => o).ToList());\r
+\r
+ this.SubtitleBehaviours.SelectedLangauges.Clear();\r
}\r
\r
#endregion\r
// Note, We don't support Subtitles in presets yet.\r
this.Task = task;\r
this.NotifyOfPropertyChange(() => this.Task);\r
+\r
+ this.SetupLanguages(preset);\r
+ this.AutomaticSubtitleSelection();\r
}\r
\r
/// <summary>\r
/// </param>\r
private void Add(Subtitle subtitle)\r
{\r
- string preferred =\r
- this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguageForSubtitles);\r
-\r
Subtitle source = subtitle\r
?? ((this.SourceTracks != null)\r
- ? (this.SourceTracks.FirstOrDefault(l => l.Language == preferred)\r
+ ? (this.SourceTracks.FirstOrDefault(l => l.Language == this.GetPreferredSubtitleTrackLanguage())\r
?? this.SourceTracks.FirstOrDefault(\r
s => s.SubtitleType != SubtitleType.ForeignAudioSearch))\r
: null);\r
}\r
\r
/// <summary>\r
- /// Add all tracks for the preferred languages settings.\r
+ /// Gets a list of source tracks for the users selected languages.\r
/// </summary>\r
- /// <param name="firstOnly">\r
- /// The first only.\r
- /// </param>\r
- private void AddForPreferredLanaguages(bool firstOnly)\r
+ /// <returns>\r
+ /// A list of source subtitle tracks.\r
+ /// </returns>\r
+ private IEnumerable<Subtitle> GetSelectedLanguagesTracks()\r
{\r
- string preferred =\r
- this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguageForSubtitles);\r
+ List<Subtitle> trackList = new List<Subtitle>();\r
\r
- foreach (Subtitle subtitle in this.SourceTitlesSubset(null))\r
+ List<string> isoCodes = this.SubtitleBehaviours.SelectedLangauges.Contains(Constants.Any)\r
+ ? LanguageUtilities.GetIsoCodes()\r
+ : LanguageUtilities.GetLanguageCodes(\r
+ this.SubtitleBehaviours.SelectedLangauges.ToArray());\r
+\r
+ foreach (string code in isoCodes)\r
{\r
- if (subtitle.Language == preferred)\r
- {\r
- this.Add(subtitle);\r
- if (firstOnly)\r
- {\r
- break;\r
- }\r
- }\r
+ trackList.AddRange(this.SourceTracks.Where(source => source.LanguageCode == code));\r
}\r
+\r
+ return trackList;\r
+ }\r
+\r
+ /// <summary>\r
+ /// The get preferred subtitle track, or the first if none available.\r
+ /// </summary>\r
+ /// <returns>\r
+ /// The users preferred language, or the first if none available.\r
+ /// </returns>\r
+ private string GetPreferredSubtitleTrackLanguage()\r
+ {\r
+ return this.SubtitleBehaviours.SelectedLangauges.FirstOrDefault(w => w != Constants.Any);\r
}\r
\r
/// <summary>\r
: this.SourceTracks.Where(subtitle => !this.Task.SubtitleTracks.Any(track => Equals(track.SourceTrack, subtitle))).ToList();\r
}\r
\r
+ /// <summary>\r
+ /// The setup languages.\r
+ /// </summary>\r
+ /// <param name="preset">\r
+ /// The preset.\r
+ /// </param>\r
+ private void SetupLanguages(Preset preset)\r
+ {\r
+ // Step 1, Set the behaviour mode\r
+ this.SubtitleBehaviours.SelectedBehaviour = SubtitleBehaviourModes.None;\r
+ this.SubtitleBehaviours.AddClosedCaptions = false;\r
+ this.SubtitleBehaviours.AddForeignAudioScanTrack = false;\r
+ this.SubtitleBehaviours.SelectedLangauges.Clear();\r
+\r
+ // Step 2, Get all the languages\r
+ IDictionary<string, string> langList = LanguageUtilities.MapLanguages();\r
+ langList = (from entry in langList orderby entry.Key ascending select entry).ToDictionary(pair => pair.Key, pair => pair.Value);\r
+\r
+ // Step 3, Setup Available Languages\r
+ this.AvailableLanguages.Clear();\r
+ foreach (string item in langList.Keys)\r
+ {\r
+ this.AvailableLanguages.Add(item);\r
+ }\r
+\r
+ // Step 4, Set the Selected Languages \r
+ if (preset != null && preset.SubtitleTrackBehaviours != null)\r
+ {\r
+ this.SubtitleBehaviours.SelectedBehaviour = preset.SubtitleTrackBehaviours.SelectedBehaviour;\r
+ this.SubtitleBehaviours.AddClosedCaptions = preset.SubtitleTrackBehaviours.AddClosedCaptions;\r
+ this.SubtitleBehaviours.AddForeignAudioScanTrack = preset.SubtitleTrackBehaviours.AddForeignAudioScanTrack;\r
+\r
+ foreach (string selectedItem in preset.SubtitleTrackBehaviours.SelectedLangauges)\r
+ {\r
+ this.AvailableLanguages.Remove(selectedItem);\r
+ this.SubtitleBehaviours.SelectedLangauges.Add(selectedItem);\r
+ }\r
+ }\r
+ }\r
#endregion\r
}\r
}
\ No newline at end of file
xmlns:dropButton="clr-namespace:HandBrakeWPF.Controls.DropButton"\r
xmlns:splitButton="clr-namespace:HandBrakeWPF.Controls.SplitButton"\r
xmlns:controls="clr-namespace:HandBrakeWPF.Controls"\r
+ xmlns:helpers="clr-namespace:HandBrakeWPF.Helpers"\r
d:DesignHeight="170"\r
d:DesignWidth="616"\r
mc:Ignorable="d"\r
<Conveters:BooleanToHiddenVisibilityConverter x:Key="boolToHiddenVisConverter" />\r
<Audio:AudioBitrateConverter x:Key="audioBitrateConverter" />\r
<Audio:AudioEncoderConverter x:Key="audioEncoderConverter" />\r
+ <Audio:AudioBehaviourConverter x:Key="audioBehaviourConverter" />\r
</UserControl.Resources>\r
- \r
+\r
<Grid>\r
<Grid.RowDefinitions>\r
<RowDefinition Height="Auto" />\r
<RowDefinition Height="*" />\r
</Grid.RowDefinitions>\r
\r
+ <Grid.ColumnDefinitions>\r
+ <ColumnDefinition Width="*" />\r
+ <ColumnDefinition Width="Auto" />\r
+ </Grid.ColumnDefinitions>\r
+\r
+\r
+ <!-- Row 0 -->\r
<TextBlock Grid.Row="0"\r
Margin="10,5,0,0"\r
FontWeight="Bold"\r
- Text="Audio Tracks" />\r
+ VerticalAlignment="Top"\r
+ Text="{Binding PanelTitle}" />\r
\r
- <Grid Grid.Row="1" Margin="10,5,10,0">\r
+ <Grid Grid.Row="0" Grid.Column="1" Margin="0,5,10,0">\r
+ <Border cal:Message.Attach="[Event MouseDown] = [Action ShowAudioDefaults]">\r
+ <StackPanel Orientation="Horizontal">\r
+ <Image Source="../Views/Images/Advanced.png" Width="20" />\r
+ <TextBlock Text="{Binding SwitchDisplayTitle}" VerticalAlignment="Center" Margin="5,0,0,0" />\r
+ </StackPanel>\r
+ </Border>\r
+ </Grid>\r
+\r
+ <!-- Row 1 -->\r
+\r
+ <Grid Grid.Row="1" Margin="10,5,10,0" Grid.Column="0"\r
+ Visibility="{Binding ShowAudioDefaultsPanel, Converter={StaticResource boolToVisConverter}, ConverterParameter=true}">\r
<Grid.ColumnDefinitions>\r
<ColumnDefinition Width="Auto" />\r
<ColumnDefinition Width="*" />\r
<ColumnDefinition Width="Auto" />\r
</Grid.ColumnDefinitions>\r
- \r
+\r
<StackPanel Orientation="Horizontal" Grid.Row="0">\r
<splitButton:SplitMenuButton Content="Add Track" cal:Message.Attach="[Event Click] = [Action Add]" FontWeight="Bold" Margin="0,0,10,0">\r
<splitButton:SplitMenuButton.ItemSource>\r
<MenuItem Header="Add All Remaining Selected Languages" cal:Message.Attach="[Event Click] = [Action AddAllRemainingForSelectedLanguages]" />\r
</splitButton:SplitMenuButton.ItemSource>\r
</splitButton:SplitMenuButton>\r
- \r
+\r
<Button MinWidth="65"\r
Margin="0,0,10,0"\r
cal:Message.Attach="[Event Click] = [Action Clear]"\r
\r
\r
</StackPanel>\r
-\r
- <StackPanel Grid.Column="2"\r
- Orientation="Horizontal"\r
- Visibility="{Binding ShowPassthruOptions,\r
- Converter={StaticResource boolToVisConverter}}">\r
- <TextBlock Margin="5,0,5,0" Text="Auto Passthru:" VerticalAlignment="Center" />\r
- <CheckBox Margin="0,0,5,0"\r
- Content="MP3" VerticalAlignment="Center" \r
- IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowMP3Pass}" />\r
- <CheckBox Margin="0,0,5,0"\r
- Content="AAC" VerticalAlignment="Center"\r
- IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowAACPass}" />\r
- <CheckBox Margin="0,0,5,0"\r
- Content="AC3" VerticalAlignment="Center"\r
- IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowAC3Pass}" />\r
- <CheckBox Margin="0,0,5,0"\r
- Content="DTS" VerticalAlignment="Center"\r
- IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowDTSPass}" />\r
- <CheckBox Margin="0,0,5,0"\r
- Content="DTSHD" VerticalAlignment="Center"\r
- IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowDTSHDPass}" />\r
- <TextBlock Margin="5,0,5,0" Text="Fallback:" />\r
-\r
- <ComboBox VerticalAlignment="Center"\r
- Width="100"\r
- Height="22"\r
- Margin="10,0,5,0">\r
- <ComboBox.SelectedItem>\r
- <MultiBinding Converter="{StaticResource audioEncoderConverter}">\r
- <Binding Path="Task.AllowedPassthruOptions.AudioEncoderFallback" />\r
- </MultiBinding>\r
- </ComboBox.SelectedItem>\r
- <ComboBox.ItemsSource>\r
- <MultiBinding Converter="{StaticResource audioEncoderConverter}" ConverterParameter="True">\r
- <Binding Path="DataContext.AudioEncoders" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />\r
- <Binding Path="DataContext.Task" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />\r
- </MultiBinding>\r
- </ComboBox.ItemsSource>\r
- </ComboBox>\r
-\r
- </StackPanel>\r
-\r
</Grid>\r
\r
- <ListBox Grid.Row="2"\r
+ <!-- Row 2 -->\r
+\r
+ <ListBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"\r
+ Visibility="{Binding ShowAudioDefaultsPanel, Converter={StaticResource boolToVisConverter}, ConverterParameter=true}"\r
Margin="10,10,10,10"\r
dd:DragDrop.DropHandler="{Binding}"\r
dd:DragDrop.IsDragSource="True"\r
</Style.Triggers>\r
</Style>\r
</ListBox.Style>\r
- \r
+\r
<ListBox.ItemContainerStyle>\r
<Style TargetType="ListBoxItem">\r
<Setter Property="HorizontalContentAlignment" Value="Stretch" />\r
\r
<ListBox.ItemTemplate>\r
<DataTemplate>\r
- \r
+\r
<Grid HorizontalAlignment="Stretch">\r
<Grid.RowDefinitions>\r
<RowDefinition Height="Auto" />\r
<ComboBox Grid.Column="1" Height="22" Width="100" Margin="5,0,5,0" HorizontalAlignment="Stretch"\r
ItemsSource="{Binding DataContext.SourceTracks, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"\r
SelectedItem="{Binding ScannedTrack}" />\r
- \r
+\r
<TextBlock Grid.Column="2" VerticalAlignment="Center" FontWeight="Bold" Text="Codec" />\r
<ComboBox Grid.Column="3" Width="100" Height="22" Margin="5,0,5,0">\r
<ComboBox.SelectedItem>\r
SelectedItem="{Binding Bitrate}"\r
Visibility="{Binding CannotSetBitrate, Converter={StaticResource boolToVisConverter}, ConverterParameter=true}" />\r
\r
- \r
+\r
<!-- Row 2 -->\r
<TextBlock Grid.Row="0" Grid.Column="6" VerticalAlignment="Center" FontWeight="Bold" Text="Mixdown"\r
Visibility="{Binding IsPassthru, Converter={StaticResource boolToVisConverter}, ConverterParameter=true}" />\r
SelectedItem="{Binding MixDown, Converter={StaticResource enumComboConverter}}"\r
Visibility="{Binding IsPassthru, Converter={StaticResource boolToVisConverter}, ConverterParameter=true}" />\r
\r
- \r
+\r
\r
<ToggleButton Name="advancedOptionsToggle" VerticalAlignment="Center" Grid.Column="8" Grid.Row="0" Grid.ColumnSpan="2"\r
Padding="3,0" Height="22" HorizontalAlignment="Left" >\r
</Style>\r
</ToggleButton.Style>\r
</ToggleButton>\r
- \r
+\r
</Grid>\r
\r
<!-- Delete -->\r
<TextBlock Text="Track Name:" VerticalAlignment="Center" FontWeight="Bold" Margin="5,0,5,0" />\r
<TextBox Text="{Binding TrackName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="138" Height="22" />\r
\r
- </StackPanel> \r
+ </StackPanel>\r
</Grid>\r
</Grid>\r
\r
</ListBox.ItemTemplate>\r
</ListBox>\r
\r
+ <StackPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="10,10,10,10"\r
+ Visibility="{Binding ShowAudioDefaultsPanel, Converter={StaticResource boolToVisConverter}, ConverterParameter=false}">\r
+\r
+ <Grid Margin="5,0,0,0" >\r
+ <Grid.RowDefinitions>\r
+ <RowDefinition Height="Auto" />\r
+ <RowDefinition Height="Auto" />\r
+ <RowDefinition Height="Auto" />\r
+ </Grid.RowDefinitions>\r
+\r
+ <Grid.ColumnDefinitions>\r
+ <ColumnDefinition Width="Auto" />\r
+ <ColumnDefinition Width="Auto" />\r
+ <ColumnDefinition Width="Auto" />\r
+ <ColumnDefinition Width="Auto" />\r
+ <ColumnDefinition Width="*" />\r
+ </Grid.ColumnDefinitions>\r
+\r
+ <!-- Audio -->\r
+ <TextBlock Text="Track Selection Behaviour:" Grid.Column="0" Grid.Row="0" Margin="0,0,5,0" HorizontalAlignment="Left" VerticalAlignment="Center" />\r
+ <ComboBox Name="autoAudioMode" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left"\r
+ ItemsSource="{Binding AudioBehaviourModeList, Converter={StaticResource audioBehaviourConverter}}" \r
+ SelectedItem="{Binding AudioBehaviours.SelectedBehaviour, Converter={StaticResource audioBehaviourConverter}}" Width="210" Margin="0,0,5,0" />\r
+ </Grid>\r
+\r
+ <TextBlock Text="Choose Languages:" Margin="5,15,0,5" />\r
+\r
+ <Grid Margin="20,5,0,0">\r
+ <Grid.ColumnDefinitions>\r
+ <ColumnDefinition Width="*" />\r
+ </Grid.ColumnDefinitions>\r
+\r
+ <StackPanel Orientation="Horizontal">\r
+ <Grid>\r
+ <Grid.ColumnDefinitions>\r
+ <ColumnDefinition Width="*" />\r
+ <ColumnDefinition Width="*" />\r
+ <ColumnDefinition Width="*" />\r
+ </Grid.ColumnDefinitions>\r
+\r
+ <StackPanel Orientation="Vertical" Grid.Column="0">\r
+ <TextBlock Text="Available Languages:" Margin="0,0,0,5"/>\r
+ <ListBox Name="availableLanguages" ItemsSource="{Binding AvailableLanguages}" \r
+ helpers:ListBoxHelper.SelectedItems="{Binding SelectedAvailableToMove}" \r
+ SelectionMode="Extended" Width="140" Height="120" />\r
+ </StackPanel>\r
+\r
+ <DockPanel Grid.Column="1" Margin="10,0,10,0">\r
+ <StackPanel Orientation="Vertical" VerticalAlignment="Center">\r
+ <Button Content="Move Right" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveRight]" MaxWidth="90" />\r
+ <Button Content="Move Left" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveLeft]" MaxWidth="90" />\r
+ <Button Content="Clear" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageClearAll]" Width="80"/>\r
+ </StackPanel>\r
+ </DockPanel>\r
+\r
+ <StackPanel Orientation="Vertical" Grid.Column="2">\r
+ <TextBlock Text="Chosen Languages:" Margin="0,0,0,5"/>\r
+ <ListBox Name="selectedLangauges" ItemsSource="{Binding AudioBehaviours.SelectedLangauges}" \r
+ helpers:ListBoxHelper.SelectedItems="{Binding SelectedLangaugesToMove}" \r
+ SelectionMode="Extended" Width="140" Height="120"\r
+ dd:DragDrop.DropHandler="{Binding}"\r
+ dd:DragDrop.IsDragSource="True"\r
+ dd:DragDrop.IsDropTarget="True"/>\r
+ </StackPanel>\r
+ </Grid>\r
+ </StackPanel>\r
+ </Grid>\r
+\r
+ <TextBlock Text="Automatic Passthru Behaviours:" FontWeight="Bold" Margin="0,20,0,5" />\r
+ <StackPanel Margin="10,5,0,0"\r
+ Orientation="Horizontal">\r
+ <TextBlock Margin="5,0,5,0" Text="Allow passthrough of:" VerticalAlignment="Center" />\r
+ <CheckBox Margin="0,0,5,0"\r
+ Content="MP3" VerticalAlignment="Center" \r
+ IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowMP3Pass}" />\r
+ <CheckBox Margin="0,0,5,0"\r
+ Content="AAC" VerticalAlignment="Center"\r
+ IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowAACPass}" />\r
+ <CheckBox Margin="0,0,5,0"\r
+ Content="AC3" VerticalAlignment="Center"\r
+ IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowAC3Pass}" />\r
+ <CheckBox Margin="0,0,5,0"\r
+ Content="DTS" VerticalAlignment="Center"\r
+ IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowDTSPass}" />\r
+ <CheckBox Margin="0,0,5,0"\r
+ Content="DTSHD" VerticalAlignment="Center"\r
+ IsChecked="{Binding Task.AllowedPassthruOptions.AudioAllowDTSHDPass}" />\r
+ \r
+ <TextBlock Margin="15,0,5,0" Text="Fallback Encoder:" />\r
+\r
+ <ComboBox VerticalAlignment="Center" Width="100" Height="22" Margin="10,0,5,0">\r
+ <ComboBox.SelectedItem>\r
+ <MultiBinding Converter="{StaticResource audioEncoderConverter}">\r
+ <Binding Path="Task.AllowedPassthruOptions.AudioEncoderFallback" />\r
+ </MultiBinding>\r
+ </ComboBox.SelectedItem>\r
+ <ComboBox.ItemsSource>\r
+ <MultiBinding Converter="{StaticResource audioEncoderConverter}" ConverterParameter="True">\r
+ <Binding Path="DataContext.AudioEncoders" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />\r
+ <Binding Path="DataContext.Task" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />\r
+ </MultiBinding>\r
+ </ComboBox.ItemsSource>\r
+ </ComboBox>\r
+\r
+ </StackPanel>\r
+\r
+ </StackPanel>\r
+\r
+\r
</Grid>\r
</UserControl>\r
</StackPanel>\r
</StackPanel>\r
\r
- <StackPanel Name="Audio" Orientation="Vertical" Margin="10,10,0,0"\r
- Visibility="{Binding SelectedTab, Converter={StaticResource tabConverter}, ConverterParameter={x:Static local:OptionsTab.AudioAndSubtitles}}">\r
-\r
-\r
- <Border BorderThickness="0 0 0 1" BorderBrush="LightGray">\r
- <TextBlock Text="Audio and Subtitle Language Handling" FontSize="16" />\r
- </Border>\r
- <TextBlock Text="Control the default selection behaviour for audio and subtitle tracks" Margin="0,10,0,10" />\r
-\r
- <TextBlock Text="Select your preferred languages" Grid.Column="0" Margin="10,10,0,0" FontSize="14"/>\r
-\r
- <Grid Margin="20,10,0,0" >\r
- <StackPanel Orientation="Horizontal">\r
- <TextBlock VerticalAlignment="Center" Text="Audio: " />\r
- <ComboBox Name="primaryAudioLanguage" VerticalAlignment="Center" ItemsSource="{Binding PreferredLanguages}" \r
- SelectedItem="{Binding SelectedPreferredLangauge}" Width="120" />\r
- <TextBlock VerticalAlignment="Center" Text="Subtitles: " Margin="10,0,0,0" />\r
- <ComboBox Name="primarySubtitleLanguage" VerticalAlignment="Center" ItemsSource="{Binding PreferredLanguages}" \r
- SelectedItem="{Binding SelectedPreferredSubtitleLangauge}" Width="120" />\r
- </StackPanel>\r
- </Grid>\r
-\r
- <TextBlock Text="Automatic language selection behaviour" Margin="10,20,0,0" FontSize="14"/>\r
-\r
- <Grid Margin="20,10,0,0" >\r
- <Grid.RowDefinitions>\r
- <RowDefinition Height="Auto" />\r
- <RowDefinition Height="Auto" />\r
- <RowDefinition Height="Auto" />\r
- </Grid.RowDefinitions>\r
-\r
- <Grid.ColumnDefinitions>\r
- <ColumnDefinition Width="Auto" />\r
- <ColumnDefinition Width="Auto" />\r
- <ColumnDefinition Width="Auto" />\r
- <ColumnDefinition Width="Auto" />\r
- <ColumnDefinition Width="*" />\r
- </Grid.ColumnDefinitions>\r
-\r
- <!-- Audio -->\r
- <TextBlock Text="Audio:" Grid.Column="0" Grid.Row="0" Margin="0,0,5,0" HorizontalAlignment="Left" VerticalAlignment="Center" />\r
- <ComboBox Name="autoAudioMode" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left"\r
- ItemsSource="{Binding AddAudioModeOptions}" SelectedIndex="{Binding SelectedAddAudioMode}" Width="120" Margin="0,0,5,0" />\r
- <CheckBox Content="Add only one audio track per language" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Left"\r
- IsChecked="{Binding AddOnlyOneAudioTrackPerLanguage}" Margin="0,5,0,0" />\r
-\r
- <!-- Subtitles -->\r
- <TextBlock Text="Subtitle:" Grid.Column="2" Grid.Row="0" Margin="0,0,5,0" HorizontalAlignment="Left" VerticalAlignment="Center" />\r
- <ComboBox Name="autoSubtitleMode" Grid.Column="3" Grid.Row="0" HorizontalAlignment="Left"\r
- ItemsSource="{Binding AddSubtitleModeOptions}" SelectedIndex="{Binding SelectedAddSubtitleMode}" Width="120" Margin="0,0,5,0" />\r
- <CheckBox Content="Add Closed Captions when available" Grid.Column="3" Grid.Row="1" Margin="0,5,0,0" \r
- HorizontalAlignment="Left" IsChecked="{Binding AddClosedCaptions}"/>\r
- <CheckBox Content="Add 'Foreign Audio Scan'" Grid.Column="3" Grid.Row="2" Margin="0,5,0,0" \r
- HorizontalAlignment="Left" IsChecked="{Binding AddForeignAudioScanTrack}"/>\r
- </Grid>\r
-\r
- <TextBlock Text="Additional languages for possible selection" Margin="10,20,0,0" FontSize="14"/>\r
-\r
- <Grid Margin="20,20,0,0">\r
- <Grid.ColumnDefinitions>\r
- <ColumnDefinition Width="*" />\r
- </Grid.ColumnDefinitions>\r
-\r
- <StackPanel Orientation="Horizontal">\r
- <Grid>\r
- <Grid.ColumnDefinitions>\r
- <ColumnDefinition Width="*" />\r
- <ColumnDefinition Width="*" />\r
- <ColumnDefinition Width="*" />\r
- </Grid.ColumnDefinitions>\r
-\r
- <StackPanel Orientation="Vertical" Grid.Column="0">\r
- <TextBlock Text="Available Languages" Margin="0,0,0,5"/>\r
- <ListBox Name="availableLanguages" ItemsSource="{Binding AvailableLanguages}" Helpers:ListBoxHelper.SelectedItems="{Binding SelectedAvailableToMove}" \r
- SelectionMode="Extended" Width="140" Height="140"></ListBox>\r
- </StackPanel>\r
-\r
- <DockPanel Grid.Column="1" Margin="10,0,10,0">\r
- <StackPanel Orientation="Vertical" VerticalAlignment="Center">\r
- <Button Content="Move Right" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveRight]" MaxWidth="90" />\r
- <Button Content="Move Left" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveLeft]" MaxWidth="90" />\r
- <Button Content="Clear" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageClearAll]" Width="80"/>\r
- </StackPanel>\r
- </DockPanel>\r
-\r
- <StackPanel Orientation="Vertical" Grid.Column="2">\r
- <TextBlock Text="Chosen Selected Languages" Margin="0,0,0,5"/>\r
- <ListBox Name="selectedLangauges" ItemsSource="{Binding SelectedLangauges}" Helpers:ListBoxHelper.SelectedItems="{Binding SelectedLangaugesToMove}" \r
- SelectionMode="Extended" Width="140" Height="140"\r
- dd:DragDrop.DropHandler="{Binding}"\r
- dd:DragDrop.IsDragSource="True"\r
- dd:DragDrop.IsDropTarget="True"/>\r
- </StackPanel>\r
- </Grid>\r
- </StackPanel>\r
- </Grid>\r
-\r
- <StackPanel Orientation="Vertical" Margin="0,10,0,0">\r
- <Label Content="Audio Tab Options" FontSize="14"/>\r
- <CheckBox IsChecked="{Binding ShowAdvancedPassthruOpts}" Content="Show advanced audio passthru options. (Requires Restart)"\r
- Margin="20,0,0,0" />\r
- </StackPanel>\r
-\r
- </StackPanel>\r
-\r
<StackPanel Name="Hardware" Orientation="Vertical" Margin="10,10,0,0"\r
Visibility="{Binding SelectedTab, Converter={StaticResource tabConverter}, ConverterParameter={x:Static local:OptionsTab.Video}}">\r
\r
xmlns:controls="clr-namespace:HandBrakeWPF.Controls"\r
xmlns:dropButton="clr-namespace:HandBrakeWPF.Controls.DropButton"\r
xmlns:splitButton="clr-namespace:HandBrakeWPF.Controls.SplitButton"\r
+ xmlns:helpers="clr-namespace:HandBrakeWPF.Helpers"\r
+ xmlns:subtitles="clr-namespace:HandBrakeWPF.Converters.Subtitles"\r
d:DesignHeight="153"\r
d:DesignWidth="319"\r
mc:Ignorable="d"\r
x:Name="subTab">\r
<UserControl.Resources>\r
<Converters:BooleanToVisibilityConverter x:Key="booleanToVisConverter" />\r
+ <subtitles:SubtitleBehaviourConverter x:Key="subtitleBehaviourConverter" />\r
</UserControl.Resources>\r
\r
<Grid>\r
<RowDefinition Height="*" />\r
</Grid.RowDefinitions>\r
\r
- <TextBlock Grid.Row="0"\r
+ <Grid.ColumnDefinitions>\r
+ <ColumnDefinition Width="*" />\r
+ <ColumnDefinition Width="Auto" />\r
+ </Grid.ColumnDefinitions>\r
+\r
+ <!-- Row 0 -->\r
+ <TextBlock Grid.Row="0" Grid.Column="0"\r
Margin="10,5,0,0"\r
FontWeight="Bold"\r
- Text="Subtitles" />\r
+ VerticalAlignment="Top"\r
+ Text="{Binding PanelTitle}" />\r
+\r
+ <Grid Grid.Row="0" Grid.Column="1" Margin="0,5,10,0">\r
+ <Border cal:Message.Attach="[Event MouseDown] = [Action ShowSubtitleDefaultsPanel]">\r
+ <StackPanel Orientation="Horizontal">\r
+ <Image Source="../Views/Images/Advanced.png" Width="20" />\r
+ <TextBlock Text="{Binding SwitchDisplayTitle}" VerticalAlignment="Center" Margin="5,0,0,0" />\r
+ </StackPanel>\r
+ </Border> \r
+ </Grid>\r
\r
- <StackPanel Grid.Row="1" Margin="10,5,10,0" Orientation="Horizontal">\r
+ <!-- Row 1 -->\r
+ <StackPanel Grid.Row="1" Margin="10,5,10,0" Orientation="Horizontal"\r
+ Visibility="{Binding ShowDefaultsPanel, Converter={StaticResource booleanToVisConverter}, ConverterParameter=true}" >\r
<splitButton:SplitMenuButton Content="Add Track" cal:Message.Attach="[Event Click] = [Action Add]" FontWeight="Bold" Margin="0,0,10,0">\r
<splitButton:SplitMenuButton.ItemSource>\r
<MenuItem Header="Add New Track" cal:Message.Attach="[Event Click] = [Action Add]" />\r
Content="Clear" />\r
</StackPanel>\r
\r
- <ListBox Grid.Row="2"\r
+\r
+ <!-- Row 2 -->\r
+ <ListBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"\r
+ Visibility="{Binding ShowDefaultsPanel, Converter={StaticResource booleanToVisConverter}, ConverterParameter=true}"\r
Margin="10,10,10,10"\r
dd:DragDrop.DropHandler="{Binding}"\r
dd:DragDrop.IsDragSource="True"\r
</ListBox.ItemTemplate>\r
</ListBox>\r
\r
+ <StackPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="10,10,10,10"\r
+ Visibility="{Binding ShowDefaultsPanel, Converter={StaticResource booleanToVisConverter}, ConverterParameter=false}">\r
+\r
+ <Grid Margin="5,0,0,0" >\r
+ <Grid.RowDefinitions>\r
+ <RowDefinition Height="Auto" />\r
+ <RowDefinition Height="Auto" />\r
+ <RowDefinition Height="Auto" />\r
+ </Grid.RowDefinitions>\r
+\r
+ <Grid.ColumnDefinitions>\r
+ <ColumnDefinition Width="Auto" />\r
+ <ColumnDefinition Width="Auto" />\r
+ <ColumnDefinition Width="Auto" />\r
+ <ColumnDefinition Width="Auto" />\r
+ <ColumnDefinition Width="*" />\r
+ </Grid.ColumnDefinitions>\r
+\r
+ <!-- Subtitles -->\r
+ <TextBlock Text="Track Selection Behaviour:" Grid.Column="2" Grid.Row="0" Margin="0,0,5,0" HorizontalAlignment="Left" VerticalAlignment="Center" />\r
+ <ComboBox Name="autoSubtitleMode" Grid.Column="3" Grid.Row="0" HorizontalAlignment="Left"\r
+ ItemsSource="{Binding SubtitleBehaviourModeList, Converter={StaticResource subtitleBehaviourConverter}}" \r
+ SelectedItem="{Binding SubtitleBehaviours.SelectedBehaviour, Converter={StaticResource subtitleBehaviourConverter}}" Width="210" Margin="0,0,5,0" />\r
+ <CheckBox Content="Add Closed Captions when available" Grid.Column="3" Grid.Row="1" Margin="0,5,0,0" \r
+ HorizontalAlignment="Left" IsChecked="{Binding SubtitleBehaviours.AddClosedCaptions}"/>\r
+ <CheckBox Content="Add 'Foreign Audio Scan'" Grid.Column="3" Grid.Row="2" Margin="0,5,0,0" \r
+ HorizontalAlignment="Left" IsChecked="{Binding SubtitleBehaviours.AddForeignAudioScanTrack}"/>\r
+ </Grid>\r
+\r
+ <TextBlock Text="Choose Languages:" Margin="5,15,0,0"/>\r
+\r
+ <Grid Margin="20,5,0,0">\r
+ <Grid.ColumnDefinitions>\r
+ <ColumnDefinition Width="*" />\r
+ </Grid.ColumnDefinitions>\r
+\r
+ <StackPanel Orientation="Horizontal">\r
+ <Grid>\r
+ <Grid.ColumnDefinitions>\r
+ <ColumnDefinition Width="*" />\r
+ <ColumnDefinition Width="*" />\r
+ <ColumnDefinition Width="*" />\r
+ </Grid.ColumnDefinitions>\r
+\r
+ <StackPanel Orientation="Vertical" Grid.Column="0">\r
+ <TextBlock Text="Available Languages:" Margin="0,0,0,5"/>\r
+ <ListBox Name="availableLanguages" ItemsSource="{Binding AvailableLanguages}" \r
+ helpers:ListBoxHelper.SelectedItems="{Binding SelectedAvailableToMove}" \r
+ SelectionMode="Extended" Width="140" Height="120" />\r
+ </StackPanel>\r
+\r
+ <DockPanel Grid.Column="1" Margin="10,0,10,0">\r
+ <StackPanel Orientation="Vertical" VerticalAlignment="Center">\r
+ <Button Content="Move Right" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveRight]" MaxWidth="90" />\r
+ <Button Content="Move Left" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveLeft]" MaxWidth="90" />\r
+ <Button Content="Clear" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageClearAll]" Width="80"/>\r
+ </StackPanel>\r
+ </DockPanel>\r
+\r
+ <StackPanel Orientation="Vertical" Grid.Column="2">\r
+ <TextBlock Text="Chosen Languages:" Margin="0,0,0,5"/>\r
+ <ListBox Name="selectedLangauges" ItemsSource="{Binding SubtitleBehaviours.SelectedLangauges}" \r
+ helpers:ListBoxHelper.SelectedItems="{Binding SelectedLangaugesToMove}" \r
+ SelectionMode="Extended" Width="140" Height="120"\r
+ dd:DragDrop.DropHandler="{Binding}"\r
+ dd:DragDrop.IsDragSource="True"\r
+ dd:DragDrop.IsDropTarget="True"/>\r
+ </StackPanel>\r
+ </Grid>\r
+ </StackPanel>\r
+ </Grid>\r
+\r
+ </StackPanel>\r
+\r
\r
</Grid>\r
</UserControl>\r