WinGui: Initial work to refactor the Audio and Subtitle behavioural based automatic...
authorsr55 <sr55.hb@outlook.com>
Sun, 16 Feb 2014 18:39:29 +0000 (18:39 +0000)
committersr55 <sr55.hb@outlook.com>
Sun, 16 Feb 2014 18:39:29 +0000 (18:39 +0000)
- Simplified UI design that's now available on the "Subtitle" and "Audio" tabs rather than the Options screen.
  The settings are no longer part of the app preferences. They are now per-preset. Build in presets default to None.
- Selected Languages can now be set independently for Audio and Video.
- Preferred Language is now part of the Selected Languages list.
- Warning: Import/Export of presets still to be implemented.  Design may yet change.

git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6036 b64f7644-9d1e-0410-96f1-a4d463321fa5

28 files changed:
win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj
win/CS/HandBrake.ApplicationServices/Model/Audio/AudioBehaviourModes.cs [new file with mode: 0644]
win/CS/HandBrake.ApplicationServices/Model/Audio/AudioBehaviours.cs [new file with mode: 0644]
win/CS/HandBrake.ApplicationServices/Model/Preset.cs
win/CS/HandBrake.ApplicationServices/Model/Subtitle/SubtitleBehaviourModes.cs [new file with mode: 0644]
win/CS/HandBrake.ApplicationServices/Model/Subtitle/SubtitleBehaviours.cs [new file with mode: 0644]
win/CS/HandBrake.ApplicationServices/Utilities/Converters.cs
win/CS/HandBrake.ApplicationServices/Utilities/LanguageUtilities.cs
win/CS/HandBrake.Interop/HandBrakeInterop/HandBrakeInstance.cs
win/CS/HandBrakeWPF/Converters/Audio/AudioBehaviourConverter.cs [new file with mode: 0644]
win/CS/HandBrakeWPF/Converters/EnumComboConverter.cs
win/CS/HandBrakeWPF/Converters/Options/OptionsTabConverter.cs
win/CS/HandBrakeWPF/Converters/Subtitles/SubtitleBehaviourConverter.cs [new file with mode: 0644]
win/CS/HandBrakeWPF/HandBrakeWPF.csproj
win/CS/HandBrakeWPF/Model/OptionsTab.cs
win/CS/HandBrakeWPF/UserSettingConstants.cs
win/CS/HandBrakeWPF/ViewModels/AddPresetViewModel.cs
win/CS/HandBrakeWPF/ViewModels/AudioViewModel.cs
win/CS/HandBrakeWPF/ViewModels/Interfaces/IAddPresetViewModel.cs
win/CS/HandBrakeWPF/ViewModels/Interfaces/IAudioViewModel.cs
win/CS/HandBrakeWPF/ViewModels/Interfaces/ISubtitlesViewModel.cs
win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs
win/CS/HandBrakeWPF/ViewModels/QueueSelectionViewModel.cs
win/CS/HandBrakeWPF/ViewModels/SubtitlesViewModel.cs
win/CS/HandBrakeWPF/Views/AudioView.xaml
win/CS/HandBrakeWPF/Views/OptionsView.xaml
win/CS/HandBrakeWPF/Views/SubtitlesView.xaml

index 6110c187de9a7103cdbd1b638b92004fefc0389e..6ba1e302db33b1e95027e588beb5ea07210e13fb 100644 (file)
     <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
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Audio/AudioBehaviourModes.cs b/win/CS/HandBrake.ApplicationServices/Model/Audio/AudioBehaviourModes.cs
new file mode 100644 (file)
index 0000000..0172b8b
--- /dev/null
@@ -0,0 +1,28 @@
+// --------------------------------------------------------------------------------------------------------------------\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
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Audio/AudioBehaviours.cs b/win/CS/HandBrake.ApplicationServices/Model/Audio/AudioBehaviours.cs
new file mode 100644 (file)
index 0000000..119c8d2
--- /dev/null
@@ -0,0 +1,103 @@
+// --------------------------------------------------------------------------------------------------------------------\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
index 7003ca2c7abffb076701321fea631e2ea53d2bbb..57faf29681423f060771f4c9bf684f26dbd2289f 100644 (file)
@@ -11,6 +11,9 @@ namespace HandBrake.ApplicationServices.Model
 {\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
@@ -25,6 +28,7 @@ namespace HandBrake.ApplicationServices.Model
 \r
         #endregion\r
 \r
+\r
         #region Properties\r
 \r
         /// <summary>\r
@@ -89,6 +93,16 @@ namespace HandBrake.ApplicationServices.Model
         /// </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
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Subtitle/SubtitleBehaviourModes.cs b/win/CS/HandBrake.ApplicationServices/Model/Subtitle/SubtitleBehaviourModes.cs
new file mode 100644 (file)
index 0000000..4094c40
--- /dev/null
@@ -0,0 +1,28 @@
+// --------------------------------------------------------------------------------------------------------------------\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
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Subtitle/SubtitleBehaviours.cs b/win/CS/HandBrake.ApplicationServices/Model/Subtitle/SubtitleBehaviours.cs
new file mode 100644 (file)
index 0000000..28f5176
--- /dev/null
@@ -0,0 +1,154 @@
+// --------------------------------------------------------------------------------------------------------------------\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
index 1c6b785bbfbcd6dd3d1b972bce4d0c75fa157c15..9651c6e71f7328234cc69327a30a5a7cdda1a5b0 100644 (file)
@@ -129,7 +129,7 @@ namespace HandBrake.ApplicationServices.Utilities
             {\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
index bbfe8f62c36ec871dddaca570e8b809674f5334d..94a1fb20112068c93a0574342be8446a0ce53813 100644 (file)
@@ -11,6 +11,7 @@ namespace HandBrake.ApplicationServices.Utilities
 {\r
     using System.Collections.Generic;\r
     using System.Collections.Specialized;\r
+    using System.Linq;\r
 \r
     /// <summary>\r
     /// Language Utilities\r
@@ -248,6 +249,42 @@ namespace HandBrake.ApplicationServices.Utilities
             }\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
index fb3cf1f51efa6e3a172ba8d99170c384ef9055e5..72a75c112f4ddf1dda203802c7219110e1f6c04a 100644 (file)
@@ -267,8 +267,6 @@ namespace HandBrake.Interop
             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
diff --git a/win/CS/HandBrakeWPF/Converters/Audio/AudioBehaviourConverter.cs b/win/CS/HandBrakeWPF/Converters/Audio/AudioBehaviourConverter.cs
new file mode 100644 (file)
index 0000000..a53c4e7
--- /dev/null
@@ -0,0 +1,90 @@
+// --------------------------------------------------------------------------------------------------------------------\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
index dd26399dba6560415b806ac1a84babdf3c4ebf74..9214745e8563fedb18f3f27ddfa2d2c2b1f6df12 100644 (file)
@@ -19,8 +19,6 @@ namespace HandBrakeWPF.Converters
     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
index bd1e4c8d0ce57b6fbdf1533ba2ef025939544fa7..54897e19c8d5635f4001877f011316b8ef006c3f 100644 (file)
@@ -40,9 +40,7 @@ namespace HandBrakeWPF.Converters.Options
                     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
diff --git a/win/CS/HandBrakeWPF/Converters/Subtitles/SubtitleBehaviourConverter.cs b/win/CS/HandBrakeWPF/Converters/Subtitles/SubtitleBehaviourConverter.cs
new file mode 100644 (file)
index 0000000..251565d
--- /dev/null
@@ -0,0 +1,90 @@
+// --------------------------------------------------------------------------------------------------------------------\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
index b7c27048f01b4d0e9e56e24b916bfa0f36c21f64..8e92b7115f6129309c43a7698377861d601ae350 100644 (file)
     <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
index e895b615977ace2074c868c7616b11885238367c..b22807e46f7b81b40a22dc1a1b0ab18717960026 100644 (file)
@@ -22,9 +22,6 @@ namespace HandBrakeWPF.Model
         [Display(Name = "Output Files")]\r
         OutputFiles,\r
 \r
-        [Display(Name = "Audio and Subtitles")]\r
-        AudioAndSubtitles,\r
-\r
         [Display(Name = "Video")]\r
         Video,\r
 \r
index 129f031b5e295b9a2d0051560484ed237ee24c18..80bebe4b3624f2789f047107f846884aca9b7a41 100644 (file)
@@ -21,11 +21,6 @@ namespace HandBrakeWPF
         /// </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
@@ -66,21 +61,6 @@ namespace HandBrakeWPF
         /// </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
@@ -96,31 +76,11 @@ namespace HandBrakeWPF
         /// </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
@@ -131,11 +91,6 @@ namespace HandBrakeWPF
         /// </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
@@ -241,11 +196,6 @@ namespace HandBrakeWPF
         /// </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
index 4235a67dca6c8417c1917568263643298a7380d8..bedfb838cf161de612a6e5ea50009c5e2649ee66 100644 (file)
@@ -13,6 +13,8 @@ namespace HandBrakeWPF.ViewModels
     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
@@ -132,9 +134,17 @@ namespace HandBrakeWPF.ViewModels
         /// <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
index ed619b010d49863f8f1a0c24ba434aebb4ca28b0..0e25b3f5892ee4fc25cd3697191f22af8c74be80 100644 (file)
@@ -9,21 +9,21 @@
 \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
@@ -42,6 +42,21 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -60,12 +75,49 @@ namespace HandBrakeWPF.ViewModels
             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
@@ -108,16 +160,76 @@ namespace HandBrakeWPF.ViewModels
         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
@@ -179,8 +291,65 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -203,16 +372,18 @@ namespace HandBrakeWPF.ViewModels
             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
@@ -303,12 +474,6 @@ namespace HandBrakeWPF.ViewModels
             // 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
@@ -327,12 +492,6 @@ namespace HandBrakeWPF.ViewModels
             // 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
@@ -361,6 +520,35 @@ namespace HandBrakeWPF.ViewModels
             }\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
@@ -381,8 +569,7 @@ namespace HandBrakeWPF.ViewModels
             }\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
@@ -390,12 +577,12 @@ namespace HandBrakeWPF.ViewModels
                 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
@@ -409,12 +596,18 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -428,9 +621,10 @@ namespace HandBrakeWPF.ViewModels
         {\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
@@ -441,25 +635,39 @@ namespace HandBrakeWPF.ViewModels
         }\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
index ac0ec160fc7a0910d9473d3af05e49e6119dd9e8..3ea543b1fce8a0aed8800c62bcc84ca3f1d1ffe2 100644 (file)
@@ -10,6 +10,8 @@
 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
@@ -26,6 +28,12 @@ namespace HandBrakeWPF.ViewModels.Interfaces
         /// <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
index 6f3edca2a067f7d8c1357815d1764d071db4c230..41d7f4940da39882c0b2d7d08aca9971bd04dd04 100644 (file)
@@ -9,11 +9,18 @@
 \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
index 2b10089dec24c4adda9c9718037e29240ffc1a9b..27d096fb5fd95b6b2af585561963efe02808ab72 100644 (file)
@@ -9,10 +9,16 @@
 \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
index a531b549c9a6866a94d69dada20354fdb87e3528..d5d02a0f8c3d1c51812a8207ea06503d0b30eff5 100644 (file)
@@ -1462,7 +1462,7 @@ namespace HandBrakeWPF.ViewModels
         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
index b6b301d2b74f31fd96d5cbed00a227dc079a0cb0..9cf6c694bf869ba20e32f18a6cd08493cfefcbf8 100644 (file)
@@ -10,8 +10,6 @@
 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
@@ -21,9 +19,7 @@ namespace HandBrakeWPF.ViewModels
 \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
@@ -54,26 +50,6 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -94,11 +70,6 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -204,16 +175,6 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -224,21 +185,6 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -284,16 +230,6 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -374,11 +310,6 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -824,242 +755,6 @@ namespace HandBrakeWPF.ViewModels
         }\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
@@ -1654,56 +1349,6 @@ namespace HandBrakeWPF.ViewModels
             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
@@ -1851,64 +1496,6 @@ namespace HandBrakeWPF.ViewModels
             // 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
@@ -2020,19 +1607,6 @@ namespace HandBrakeWPF.ViewModels
 \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
index 3cbe56feb2a53333a42eea88373b97ce83ebf298..0da603e0530dbe854254ff963703c141464e4c49 100644 (file)
@@ -122,12 +122,12 @@ namespace HandBrakeWPF.ViewModels
             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
index 467535bc3ab578da661e34191364d6e2f01ba02f..859763d3fcf29eb8b197b8221265e397310f3d72 100644 (file)
 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
@@ -42,6 +41,21 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -58,6 +72,12 @@ namespace HandBrakeWPF.ViewModels
 \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
@@ -96,6 +116,109 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -135,12 +258,12 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -151,6 +274,41 @@ namespace HandBrakeWPF.ViewModels
             }\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
@@ -246,34 +404,24 @@ namespace HandBrakeWPF.ViewModels
             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
@@ -284,8 +432,65 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -308,6 +513,9 @@ namespace HandBrakeWPF.ViewModels
             // 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
@@ -369,12 +577,9 @@ namespace HandBrakeWPF.ViewModels
         /// </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
@@ -405,27 +610,37 @@ namespace HandBrakeWPF.ViewModels
         }\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
@@ -444,6 +659,45 @@ namespace HandBrakeWPF.ViewModels
                        : 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
index 0b9dd5a8d562f65448b0b60d70475c3cd95049f2..a2d303ccab3cb2bc240c69f631cefdd7f675a7e0 100644 (file)
@@ -12,6 +12,7 @@
              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
@@ -23,8 +24,9 @@
         <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
@@ -52,7 +74,7 @@
                         <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
index ad1a20ca43f2127ab33a97d549869439adc9a66b..4f28678c9464353ba1444e594351674e0855f854 100644 (file)
                     </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
index d8e2052ca5bf7dedd4e3c5d0021b83c71f6a1ab7..3e1db6857f0552278ea15b081303553cfb466e90 100644 (file)
              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