]> granicus.if.org Git - handbrake/commitdiff
WinGui: Initial ground work on code that will detect when the user modifies settings...
authorsr55 <sr55.hb@outlook.com>
Sun, 17 Sep 2017 14:43:47 +0000 (15:43 +0100)
committersr55 <sr55.hb@outlook.com>
Sun, 17 Sep 2017 14:44:02 +0000 (15:44 +0100)
13 files changed:
win/CS/HandBrakeWPF/EventArgs/TabStatusEventArgs.cs [new file with mode: 0644]
win/CS/HandBrakeWPF/HandBrakeWPF.csproj
win/CS/HandBrakeWPF/ViewModels/AudioViewModel.cs
win/CS/HandBrakeWPF/ViewModels/ChaptersViewModel.cs
win/CS/HandBrakeWPF/ViewModels/FiltersViewModel.cs
win/CS/HandBrakeWPF/ViewModels/Interfaces/ITabInterface.cs
win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
win/CS/HandBrakeWPF/ViewModels/MetaDataViewModel.cs
win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs
win/CS/HandBrakeWPF/ViewModels/SubtitlesViewModel.cs
win/CS/HandBrakeWPF/ViewModels/SummaryViewModel.cs
win/CS/HandBrakeWPF/ViewModels/VideoViewModel.cs
win/CS/HandBrakeWPF/ViewModels/X264ViewModel.cs

diff --git a/win/CS/HandBrakeWPF/EventArgs/TabStatusEventArgs.cs b/win/CS/HandBrakeWPF/EventArgs/TabStatusEventArgs.cs
new file mode 100644 (file)
index 0000000..5c2fae9
--- /dev/null
@@ -0,0 +1,20 @@
+// --------------------------------------------------------------------------------------------------------------------
+// <copyright file="TabStatusEventArgs.cs" company="HandBrake Project (http://handbrake.fr)">
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
+// </copyright>
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace HandBrakeWPF.EventArgs
+{
+    using System;
+
+    public class TabStatusEventArgs : EventArgs
+    {
+        public TabStatusEventArgs(string tabKey)
+        {
+            this.TabKey = tabKey;
+        }
+
+        public string TabKey { get; private set; }
+    }
+}
index b0db06436047e94e74912c4dada4800fafa5d2a1..7f2a7cbbda31a3dec228b2702334bea3e62040cb 100644 (file)
     <Compile Include="EventArgs\QueueCompletedEventArgs.cs" />\r
     <Compile Include="EventArgs\QueueProgressEventArgs.cs" />\r
     <Compile Include="EventArgs\SettingChangedEventArgs.cs" />\r
+    <Compile Include="EventArgs\TabStatusEventArgs.cs" />\r
     <Compile Include="Exceptions\GeneralApplicationException.cs" />\r
     <Compile Include="Extensions\StringExtensions.cs" />\r
     <Compile Include="Helpers\TreeViewHelper.cs" />\r
index 83f509269f1b1624f66b3e61b13ff755e75aacc5..9d04261b01bb649d11ef614e0f438f477facf8a3 100644 (file)
@@ -9,6 +9,7 @@
 \r
 namespace HandBrakeWPF.ViewModels\r
 {\r
+    using System;\r
     using System.Collections.Generic;\r
     using System.Collections.ObjectModel;\r
     using System.ComponentModel;\r
@@ -20,6 +21,7 @@ namespace HandBrakeWPF.ViewModels
     using HandBrake.ApplicationServices.Interop.Model.Encoding;\r
     using HandBrake.ApplicationServices.Utilities;\r
 \r
+    using HandBrakeWPF.EventArgs;\r
     using HandBrakeWPF.Model.Audio;\r
     using HandBrakeWPF.Properties;\r
     using HandBrakeWPF.Services.Interfaces;\r
@@ -71,6 +73,8 @@ namespace HandBrakeWPF.ViewModels
 \r
         #endregion\r
 \r
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;\r
+\r
         #region Properties\r
 \r
         /// <summary>\r
@@ -266,6 +270,81 @@ namespace HandBrakeWPF.ViewModels
             this.NotifyOfPropertyChange(() => this.Task);\r
         }\r
 \r
+        public bool MatchesPreset(Preset preset)\r
+        {\r
+            // Check the default behaviours still match the preset.\r
+            if (preset.AudioTrackBehaviours.SelectedBehaviour != this.AudioBehaviours.SelectedBehaviour)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.AudioTrackBehaviours.SelectedTrackDefaultBehaviour\r
+                != this.AudioBehaviours.SelectedTrackDefaultBehaviour)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            foreach (var item in this.AudioBehaviours.SelectedLangauges)\r
+            {\r
+                if (!preset.AudioTrackBehaviours.SelectedLangauges.Contains(item))\r
+                {\r
+                    return false;\r
+                }\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioAllowMP3Pass != this.Task.AllowedPassthruOptions.AudioAllowMP3Pass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioAllowAACPass != this.Task.AllowedPassthruOptions.AudioAllowAACPass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioAllowAC3Pass != this.Task.AllowedPassthruOptions.AudioAllowAC3Pass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioAllowEAC3Pass != this.Task.AllowedPassthruOptions.AudioAllowEAC3Pass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioAllowDTSPass != this.Task.AllowedPassthruOptions.AudioAllowDTSPass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioAllowDTSHDPass != this.Task.AllowedPassthruOptions.AudioAllowDTSHDPass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioAllowTrueHDPass != this.Task.AllowedPassthruOptions.AudioAllowTrueHDPass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioAllowFlacPass != this.Task.AllowedPassthruOptions.AudioAllowFlacPass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.AllowedPassthruOptions.AudioEncoderFallback != this.Task.AllowedPassthruOptions.AudioEncoderFallback)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.AudioTrackBehaviours.SelectedLangauges != this.AudioBehaviours.SelectedLangauges)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            return true;\r
+        }\r
+\r
         /// <summary>\r
         /// Set the Source Title\r
         /// </summary>\r
@@ -326,6 +405,10 @@ namespace HandBrakeWPF.ViewModels
         #endregion\r
 \r
         #region Methods\r
+        protected virtual void OnTabStatusChanged(TabStatusEventArgs e)\r
+        {\r
+            this.TabStatusChanged?.Invoke(this, e);\r
+        }\r
 \r
         /// <summary>\r
         /// Add the specified source track, or the first track in the SourceTracks collection if available.\r
index 0d1d3d1e1c90dec2fe8927de30a1d81bee79dec4..3939d786a9c655f4077787b396a5fb3c3f247ed8 100644 (file)
@@ -19,6 +19,7 @@ namespace HandBrakeWPF.ViewModels
 \r
     using Caliburn.Micro;\r
 \r
+    using HandBrakeWPF.EventArgs;\r
     using HandBrakeWPF.Properties;\r
     using HandBrakeWPF.Services.Interfaces;\r
     using HandBrakeWPF.Services.Presets.Model;\r
@@ -67,6 +68,8 @@ namespace HandBrakeWPF.ViewModels
             this.errorService = errorService;\r
         }\r
 \r
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;\r
+\r
         #endregion\r
 \r
         #region Public Properties\r
@@ -306,6 +309,16 @@ namespace HandBrakeWPF.ViewModels
             this.NotifyOfPropertyChange(() => this.Chapters);\r
         }\r
 \r
+        public bool MatchesPreset(Preset preset)\r
+        {\r
+            if (preset.Task.IncludeChapterMarkers != this.IncludeChapterMarkers)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            return true;\r
+        }\r
+\r
         /// <summary>\r
         /// Reset Chapter Names\r
         /// </summary>\r
@@ -346,6 +359,11 @@ namespace HandBrakeWPF.ViewModels
 \r
         #region Private Methods\r
 \r
+        protected virtual void OnTabStatusChanged(TabStatusEventArgs e)\r
+        {\r
+            this.TabStatusChanged?.Invoke(this, e);\r
+        }\r
+\r
         /// <summary>\r
         /// Validates any imported chapter information against the currently detected chapter information in the \r
         /// source media. If validation fails then an error message is returned via the out parameter <see cref="validationErrorMessage"/>\r
index cd6b29d031b1d0975d1fba3ed2f5e8dae1da5314..c1fff301507fece69c6acc39f2303f1b7ff26cec 100644 (file)
@@ -9,6 +9,7 @@
 \r
 namespace HandBrakeWPF.ViewModels\r
 {\r
+    using System;\r
     using System.Collections.Generic;\r
     using System.ComponentModel;\r
     using System.Globalization;\r
@@ -20,6 +21,7 @@ namespace HandBrakeWPF.ViewModels
     using HandBrake.ApplicationServices.Interop.HbLib;\r
     using HandBrake.ApplicationServices.Interop.Model.Encoding;\r
 \r
+    using HandBrakeWPF.EventArgs;\r
     using HandBrakeWPF.Model.Filters;\r
     using HandBrakeWPF.Services.Interfaces;\r
     using HandBrakeWPF.Services.Presets.Model;\r
@@ -58,6 +60,8 @@ namespace HandBrakeWPF.ViewModels
 \r
         #endregion\r
 \r
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;\r
+\r
         #region Properties\r
 \r
         /// <summary>\r
@@ -826,6 +830,106 @@ namespace HandBrakeWPF.ViewModels
             this.NotifyOfPropertyChange(() => this.SelectedRotation);\r
         }\r
 \r
+        public bool MatchesPreset(Preset preset)\r
+        {\r
+            if (preset.Task.Detelecine != this.SelectedDetelecine)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.CustomDetelecine != this.CustomDetelecine)\r
+            {\r
+                return false;\r
+            }\r
+            \r
+            if (preset.Task.DeinterlaceFilter != this.SelectedDeinterlaceFilter)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Deinterlace != this.SelectedDeInterlace)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Decomb != this.SelectedDecomb)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.CombDetect != this.SelectedCombDetectPreset)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.CustomDecomb != this.CustomDecomb)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.CustomDeinterlace != this.CustomDeinterlace)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.CustomCombDetect != this.CustomCombDetect)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Denoise != this.SelectedDenoise)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.DenoisePreset != this.SelectedDenoisePreset)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.DenoiseTune != this.SelectedDenoiseTune)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Sharpen != this.SelectedSharpen)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (!Equals(preset.Task.SharpenPreset, this.SelectedSharpenPreset))\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (!Equals(preset.Task.SharpenTune, this.SelectedSharpenTune))\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Deblock != this.DeblockValue)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Grayscale != this.Grayscale)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Rotation != this.SelectedRotation)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.FlipVideo != this.FlipVideo)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            return true;\r
+        }\r
+\r
         /// <summary>\r
         /// Setup this window for a new source\r
         /// </summary>\r
@@ -847,5 +951,12 @@ namespace HandBrakeWPF.ViewModels
         }\r
 \r
         #endregion\r
+\r
+        #region Private Methods\r
+        protected virtual void OnTabStatusChanged(TabStatusEventArgs e)\r
+        {\r
+            this.TabStatusChanged?.Invoke(this, e);\r
+        }\r
+        #endregion\r
     }\r
 }
\ No newline at end of file
index 3e3ca0466c955e334c66f27ff0282184aef39d2d..bdbeecf3aa15f1dce2f801e93bb2441a0ec4e1cb 100644 (file)
@@ -9,6 +9,9 @@
 \r
 namespace HandBrakeWPF.ViewModels.Interfaces\r
 {\r
+    using System;\r
+\r
+    using HandBrakeWPF.EventArgs;\r
     using HandBrakeWPF.Services.Presets.Model;\r
     using HandBrakeWPF.Services.Scan.Model;\r
 \r
@@ -19,6 +22,8 @@ namespace HandBrakeWPF.ViewModels.Interfaces
     /// </summary>\r
     public interface ITabInterface\r
     {\r
+        event EventHandler<TabStatusEventArgs> TabStatusChanged;\r
+\r
         /// <summary>\r
         /// Setup the window after a scan.\r
         /// </summary>\r
@@ -54,5 +59,7 @@ namespace HandBrakeWPF.ViewModels.Interfaces
         /// The task.\r
         /// </param>\r
         void UpdateTask(EncodeTask task);\r
+\r
+        bool MatchesPreset(Preset preset);\r
     }\r
 }\r
index c8cf354aca3e98e86b05d9b0ac8ae444b6dffa03..5d7d10027cdc183d7019b159c3e1609a11feb4f2 100644 (file)
@@ -96,8 +96,9 @@ namespace HandBrakeWPF.ViewModels
         private string alertWindowHeader;\r
         private string alertWindowText;\r
         private bool hasSource;\r
-\r
+        private bool isSettingPreset;\r
         private IPresetObject selectedPresetCategory;\r
+        private bool isModifiedPreset;\r
 \r
         #endregion\r
 \r
@@ -427,6 +428,20 @@ namespace HandBrakeWPF.ViewModels
             }\r
         }\r
 \r
+        public bool IsModifiedPreset\r
+        {\r
+            get\r
+            {\r
+                return this.isModifiedPreset;\r
+            }\r
+            set\r
+            {\r
+                if (value == this.isModifiedPreset) return;\r
+                this.isModifiedPreset = value;\r
+                this.NotifyOfPropertyChange();\r
+            }\r
+        }\r
+\r
         public void TrickPresetDisplayUpdate()\r
         {\r
             this.NotifyOfPropertyChange(() => this.SelectedPreset);\r
@@ -1235,6 +1250,16 @@ namespace HandBrakeWPF.ViewModels
                 Thread clearLog = new Thread(() => GeneralUtilities.ClearLogFiles(30));\r
                 clearLog.Start();\r
             }\r
+\r
+            this.PictureSettingsViewModel.TabStatusChanged += this.TabStatusChanged;\r
+            this.VideoViewModel.TabStatusChanged += this.TabStatusChanged;\r
+            this.FiltersViewModel.TabStatusChanged += this.TabStatusChanged;\r
+            this.AudioViewModel.TabStatusChanged += this.TabStatusChanged;\r
+            this.SubtitleViewModel.TabStatusChanged += this.TabStatusChanged;\r
+            this.ChaptersViewModel.TabStatusChanged += this.TabStatusChanged;\r
+            this.AdvancedViewModel.TabStatusChanged += this.TabStatusChanged;\r
+            this.MetaDataViewModel.TabStatusChanged += this.TabStatusChanged;\r
+            this.SummaryViewModel.TabStatusChanged += this.TabStatusChanged;\r
         }\r
 \r
         private void SummaryViewModel_OutputFormatChanged(object sender, OutputFormatChangedEventArgs e)\r
@@ -1270,6 +1295,17 @@ namespace HandBrakeWPF.ViewModels
             this.userSettingService.SettingChanged -= this.UserSettingServiceSettingChanged;\r
 \r
             this.SummaryViewModel.OutputFormatChanged -= this.SummaryViewModel_OutputFormatChanged;\r
+\r
+            // Tab status events\r
+            this.PictureSettingsViewModel.TabStatusChanged -= this.TabStatusChanged;\r
+            this.VideoViewModel.TabStatusChanged -= this.TabStatusChanged;\r
+            this.FiltersViewModel.TabStatusChanged -= this.TabStatusChanged;\r
+            this.AudioViewModel.TabStatusChanged -= this.TabStatusChanged;\r
+            this.SubtitleViewModel.TabStatusChanged -= this.TabStatusChanged;\r
+            this.ChaptersViewModel.TabStatusChanged -= this.TabStatusChanged;\r
+            this.AdvancedViewModel.TabStatusChanged -= this.TabStatusChanged;\r
+            this.MetaDataViewModel.TabStatusChanged -= this.TabStatusChanged;\r
+            this.SummaryViewModel.TabStatusChanged -= this.TabStatusChanged;\r
         }\r
 \r
         #endregion\r
@@ -2053,6 +2089,7 @@ namespace HandBrakeWPF.ViewModels
                 if (this.selectedPreset != null)\r
                 {\r
                     // Tab Settings\r
+                    this.isSettingPreset = true;\r
                     this.PictureSettingsViewModel.SetPreset(this.selectedPreset, this.CurrentTask);\r
                     this.VideoViewModel.SetPreset(this.selectedPreset, this.CurrentTask);\r
                     this.FiltersViewModel.SetPreset(this.selectedPreset, this.CurrentTask);\r
@@ -2062,6 +2099,7 @@ namespace HandBrakeWPF.ViewModels
                     this.AdvancedViewModel.SetPreset(this.selectedPreset, this.CurrentTask);\r
                     this.MetaDataViewModel.SetPreset(this.selectedPreset, this.CurrentTask);\r
                     this.SummaryViewModel.SetPreset(this.selectedPreset, this.CurrentTask);\r
+                    this.isSettingPreset = false;\r
                 }\r
             }\r
         }\r
@@ -2175,6 +2213,7 @@ namespace HandBrakeWPF.ViewModels
             // Setup the Tabs\r
             if (this.selectedTitle != null)\r
             {\r
+                this.isSettingPreset = true;\r
                 this.PictureSettingsViewModel.SetSource(this.ScannedSource, this.SelectedTitle, this.selectedPreset, this.CurrentTask);\r
                 this.VideoViewModel.SetSource(this.ScannedSource, this.SelectedTitle, this.selectedPreset, this.CurrentTask);\r
                 this.FiltersViewModel.SetSource(this.ScannedSource, this.SelectedTitle, this.selectedPreset, this.CurrentTask);\r
@@ -2184,7 +2223,60 @@ namespace HandBrakeWPF.ViewModels
                 this.AdvancedViewModel.SetSource(this.ScannedSource, this.SelectedTitle, this.selectedPreset, this.CurrentTask);\r
                 this.MetaDataViewModel.SetSource(this.ScannedSource, this.SelectedTitle, this.selectedPreset, this.CurrentTask);\r
                 this.SummaryViewModel.SetSource(this.ScannedSource, this.SelectedTitle, this.selectedPreset, this.CurrentTask);\r
+                this.isSettingPreset = false;\r
+            }\r
+        }\r
+\r
+        private void TabStatusChanged(object sender, TabStatusEventArgs e)\r
+        {\r
+            if (this.isSettingPreset)\r
+            {\r
+                return; // Don't process this when we are setting up.\r
             }\r
+\r
+            bool matchesPreset = this.PictureSettingsViewModel.MatchesPreset(this.selectedPreset);\r
+\r
+            if (!this.VideoViewModel.MatchesPreset(this.selectedPreset))\r
+            {\r
+                matchesPreset = false;\r
+            }\r
+\r
+            if (!this.FiltersViewModel.MatchesPreset(this.selectedPreset))\r
+            {\r
+                matchesPreset = false;\r
+            }\r
+\r
+            if (!this.AudioViewModel.MatchesPreset(this.selectedPreset))\r
+            {\r
+                matchesPreset = false;\r
+            }\r
+\r
+            if (!this.SubtitleViewModel.MatchesPreset(this.selectedPreset))\r
+            {\r
+                matchesPreset = false;\r
+            }\r
+\r
+            if (!this.ChaptersViewModel.MatchesPreset(this.selectedPreset))\r
+            {\r
+                matchesPreset = false;\r
+            }\r
+\r
+            if (!this.AdvancedViewModel.MatchesPreset(this.selectedPreset))\r
+            {\r
+                matchesPreset = false;\r
+            }\r
+\r
+            if (!this.MetaDataViewModel.MatchesPreset(this.selectedPreset))\r
+            {\r
+                matchesPreset = false;\r
+            }\r
+\r
+            if (!this.SummaryViewModel.MatchesPreset(this.selectedPreset))\r
+            {\r
+                matchesPreset = false;\r
+            }\r
+\r
+            this.IsModifiedPreset = matchesPreset;\r
         }\r
 \r
         /// <summary>\r
index e0bd332d1f5a431873c1c3908ce80673234588f4..ec4fa6d789134f1f5f79d2faffc6b48169197567 100644 (file)
@@ -9,8 +9,11 @@
 
 namespace HandBrakeWPF.ViewModels
 {
+    using System;
+
     using Caliburn.Micro;
 
+    using HandBrakeWPF.EventArgs;
     using HandBrakeWPF.Services.Encode.Model;
     using HandBrakeWPF.Services.Encode.Model.Models;
     using HandBrakeWPF.Services.Interfaces;
@@ -40,6 +43,8 @@ namespace HandBrakeWPF.ViewModels
             this.Task = new EncodeTask();
         }
 
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;
+
         /// <summary>
         /// The Current Job
         /// </summary>
@@ -122,5 +127,10 @@ namespace HandBrakeWPF.ViewModels
         {
             this.Task = encodeTask;
         }
+
+        public bool MatchesPreset(Preset preset)
+        {
+            return true;
+        }
     }
 }
index f4afb51095a0572d354ae432d452c9fd02e7b8a0..8d2635485777308232cb31a577e2479a1e2bbeb2 100644 (file)
@@ -17,6 +17,7 @@ namespace HandBrakeWPF.ViewModels
     using HandBrake.ApplicationServices.Interop.Model;\r
     using HandBrake.ApplicationServices.Interop.Model.Encoding;\r
 \r
+    using HandBrakeWPF.EventArgs;\r
     using HandBrakeWPF.Helpers;\r
     using HandBrakeWPF.Properties;\r
     using HandBrakeWPF.Services.Presets.Model;\r
@@ -134,6 +135,8 @@ namespace HandBrakeWPF.ViewModels
 \r
         #endregion\r
 \r
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;\r
+\r
         #region Properties\r
 \r
         /// <summary>\r
@@ -822,10 +825,30 @@ namespace HandBrakeWPF.ViewModels
             this.NotifyOfPropertyChange(() => this.Task);\r
         }\r
 \r
+        public bool MatchesPreset(Preset preset)\r
+        {\r
+            if (preset.Task.Anamorphic != this.SelectedAnamorphicMode)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Modulus != this.SelectedModulus)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            return true;\r
+        }\r
+\r
         #endregion\r
 \r
         #region Methods\r
 \r
+        protected virtual void OnTabStatusChanged(TabStatusEventArgs e)\r
+        {\r
+            this.TabStatusChanged?.Invoke(this, e);\r
+        }\r
+\r
         /// <summary>\r
         /// The init.\r
         /// </summary>\r
index d747c61120af8b72587a0b5aec1809cee6883b39..f1753aeed7f2aeb03e666e1f7ba69343f10ae87a 100644 (file)
@@ -9,8 +9,8 @@
 \r
 namespace HandBrakeWPF.ViewModels\r
 {\r
+    using System;\r
     using System.Collections.Generic;\r
-    using System.ComponentModel;\r
     using System.IO;\r
     using System.Linq;\r
 \r
@@ -18,11 +18,11 @@ namespace HandBrakeWPF.ViewModels
 \r
     using HandBrake.ApplicationServices.Utilities;\r
 \r
+    using HandBrakeWPF.EventArgs;\r
     using HandBrakeWPF.Model.Subtitles;\r
     using HandBrakeWPF.Properties;\r
     using HandBrakeWPF.Services.Presets.Model;\r
     using HandBrakeWPF.Services.Scan.Model;\r
-    using HandBrakeWPF.Utilities;\r
     using HandBrakeWPF.ViewModels.Interfaces;\r
 \r
     using Microsoft.Win32;\r
@@ -69,6 +69,8 @@ namespace HandBrakeWPF.ViewModels
 \r
         #endregion\r
 \r
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;\r
+\r
         #region Properties\r
 \r
         /// <summary>\r
@@ -478,6 +480,40 @@ namespace HandBrakeWPF.ViewModels
             this.NotifyOfPropertyChange(() => this.Task);\r
         }\r
 \r
+        public bool MatchesPreset(Preset preset)\r
+        {\r
+            // Check the default behaviours.\r
+            if (preset.SubtitleTrackBehaviours.AddClosedCaptions != this.SubtitleBehaviours.AddClosedCaptions)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.SubtitleTrackBehaviours.AddForeignAudioScanTrack != this.SubtitleBehaviours.AddForeignAudioScanTrack)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.SubtitleTrackBehaviours.SelectedBehaviour != this.SubtitleBehaviours.SelectedBehaviour)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.SubtitleTrackBehaviours.SelectedBurnInBehaviour != this.SubtitleBehaviours.SelectedBurnInBehaviour)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            foreach (var item in this.SubtitleBehaviours.SelectedLangauges)\r
+            {\r
+                if (!preset.SubtitleTrackBehaviours.SelectedLangauges.Contains(item))\r
+                {\r
+                    return false;\r
+                }\r
+            }\r
+\r
+            return true;\r
+        }\r
+\r
         /// <summary>\r
         /// Setup this window for a new source\r
         /// </summary>\r
@@ -512,6 +548,11 @@ namespace HandBrakeWPF.ViewModels
 \r
         #region Methods\r
 \r
+        protected virtual void OnTabStatusChanged(TabStatusEventArgs e)\r
+        {\r
+            this.TabStatusChanged?.Invoke(this, e);\r
+        }\r
+\r
         /// <summary>\r
         /// Add a subtitle track.\r
         /// The Source track is set based on the following order. If null, it will skip to the next option.\r
index a65fca5ebfae129979fd5018d7169827c4055890..5409e7502a631d3919a9bdb74a4f70624c61487b 100644 (file)
@@ -55,6 +55,7 @@ namespace HandBrakeWPF.ViewModels
             this.userSettingService = userSettingService;
         }
 
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;
         public event EventHandler<OutputFormatChangedEventArgs> OutputFormatChanged;
 
         public Preset Preset
@@ -309,6 +310,31 @@ namespace HandBrakeWPF.ViewModels
             this.NotifyOfPropertyChange(() => this.AlignAVStart);
         }
 
+        public bool MatchesPreset(Preset preset)
+        {
+            if (preset.Task.OutputFormat != this.SelectedOutputFormat)
+            {
+                return false;
+            }
+
+            if (preset.Task.OptimizeMP4 != this.OptimizeMP4)
+            {
+                return false;
+            }
+
+            if (preset.Task.AlignAVStart != this.AlignAVStart)
+            {
+                return false;
+            }
+
+            if (preset.Task.IPod5GSupport != this.IPod5GSupport)
+            {
+                return false;
+            }
+
+            return true;
+        }
+
         public void UpdateDisplayedInfo()
         {
             if (this.CurrentTitle == null)
@@ -377,6 +403,11 @@ namespace HandBrakeWPF.ViewModels
 
         #region Private Methods
 
+        protected virtual void OnTabStatusChanged(TabStatusEventArgs e)
+        {
+            this.TabStatusChanged?.Invoke(this, e);
+        }
+
         private void UpdateSettings(Preset selectedPreset)
         {
             // Main Window Settings
index 2b84f506ae6eb2e1867a7fe07723f27f972293ca..467d275c733453456954dbe53b0c35cf11232e1d 100644 (file)
@@ -20,6 +20,7 @@ namespace HandBrakeWPF.ViewModels
     using HandBrake.ApplicationServices.Interop;\r
     using HandBrake.ApplicationServices.Interop.Model.Encoding;\r
 \r
+    using HandBrakeWPF.EventArgs;\r
     using HandBrakeWPF.Properties;\r
     using HandBrakeWPF.Services.Interfaces;\r
     using HandBrakeWPF.Services.Presets.Model;\r
@@ -77,9 +78,6 @@ namespace HandBrakeWPF.ViewModels
         /// <param name="userSettingService">\r
         /// The user Setting Service.\r
         /// </param>\r
-        /// <param name="advancedEncoderOptionsCommand">\r
-        /// The advanced Encoder Options Command.\r
-        /// </param>\r
         public VideoViewModel(IUserSettingService userSettingService)\r
         {\r
             this.Task = new EncodeTask { VideoEncoder = VideoEncoder.X264 };\r
@@ -99,6 +97,8 @@ namespace HandBrakeWPF.ViewModels
 \r
         #endregion\r
 \r
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;\r
+\r
         #region Public Properties\r
 \r
         /// <summary>\r
@@ -1004,6 +1004,96 @@ namespace HandBrakeWPF.ViewModels
             }          \r
         }\r
 \r
+        public bool MatchesPreset(Preset preset)\r
+        {\r
+            if (preset.Task.VideoEncoder != this.Task.VideoEncoder)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.Framerate != this.Task.Framerate)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.FramerateMode != this.Task.FramerateMode)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.VideoEncodeRateType != this.Task.VideoEncodeRateType)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.VideoEncodeRateType == VideoEncodeRateType.AverageBitrate)\r
+            {\r
+                if (preset.Task.VideoBitrate != this.Task.VideoBitrate)\r
+                {\r
+                    return false;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                if (preset.Task.Quality != this.Task.Quality)\r
+                {\r
+                    return false;\r
+                }\r
+            }\r
+\r
+            if (preset.Task.TwoPass != this.Task.TwoPass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (preset.Task.TurboFirstPass != this.Task.TurboFirstPass)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            if (this.Task.VideoEncoder == VideoEncoder.X264 || this.Task.VideoEncoder == VideoEncoder.X264_10\r
+                || this.Task.VideoEncoder == VideoEncoder.X265 || this.Task.VideoEncoder == VideoEncoder.X265_10\r
+                || this.Task.VideoEncoder == VideoEncoder.X265_12 || this.Task.VideoEncoder == VideoEncoder.QuickSync\r
+                || this.Task.VideoEncoder == VideoEncoder.QuickSyncH265\r
+                || this.Task.VideoEncoder == VideoEncoder.QuickSyncH26510b)\r
+            {\r
+                if (!Equals(preset.Task.VideoPreset, this.Task.VideoPreset))\r
+                {\r
+                    return false;\r
+                }\r
+\r
+                foreach (VideoTune taskVideoTune in preset.Task.VideoTunes)\r
+                {\r
+                    if (!this.Task.VideoTunes.Contains(taskVideoTune))\r
+                    {\r
+                        return false;\r
+                    }\r
+                }\r
+\r
+                if (preset.Task.VideoTunes != this.Task.VideoTunes)\r
+                {\r
+                    return false;\r
+                }\r
+\r
+                if (!Equals(preset.Task.VideoProfile, this.Task.VideoProfile))\r
+                {\r
+                    return false;\r
+                }\r
+\r
+                if (!Equals(preset.Task.VideoLevel, this.Task.VideoLevel))\r
+                {\r
+                    return false;\r
+                }\r
+            }\r
+\r
+            if (!Equals(preset.Task.ExtraAdvancedArguments, this.Task.ExtraAdvancedArguments))\r
+            {\r
+                return false;\r
+            }\r
+\r
+            return true;\r
+        }\r
+\r
         /// <summary>\r
         /// Trigger a Notify Property Changed on the Task to force various UI elements to update.\r
         /// </summary>\r
@@ -1027,6 +1117,11 @@ namespace HandBrakeWPF.ViewModels
 \r
         #endregion\r
 \r
+        protected virtual void OnTabStatusChanged(TabStatusEventArgs e)\r
+        {\r
+            this.TabStatusChanged?.Invoke(this, e);\r
+        }\r
+\r
         /// <summary>\r
         /// Set the bounds of the Constant Quality Slider\r
         /// </summary>\r
index 9a9e905e00cd9e02f78f34aaf23f0b7b6f7c383e..806b763bedd0ec94526a81dd2b2ac9588578714f 100644 (file)
@@ -16,6 +16,7 @@ namespace HandBrakeWPF.ViewModels
 \r
     using HandBrake.ApplicationServices.Interop.Model.Encoding;\r
 \r
+    using HandBrakeWPF.EventArgs;\r
     using HandBrakeWPF.Helpers;\r
     using HandBrakeWPF.Model;\r
     using HandBrakeWPF.Services.Presets.Model;\r
@@ -190,6 +191,8 @@ namespace HandBrakeWPF.ViewModels
 \r
         #endregion\r
 \r
+        public event EventHandler<TabStatusEventArgs> TabStatusChanged;\r
+\r
         #region Properties\r
 \r
         /// <summary>\r
@@ -954,6 +957,11 @@ namespace HandBrakeWPF.ViewModels
             this.AdvancedOptionsString = task.AdvancedEncoderOptions;\r
         }\r
 \r
+        public bool MatchesPreset(Preset preset)\r
+        {\r
+            return false;\r
+        }\r
+\r
         /// <summary>\r
         /// Setup this window for a new source\r
         /// </summary>\r
@@ -981,6 +989,11 @@ namespace HandBrakeWPF.ViewModels
 \r
         #region Methods\r
 \r
+        protected virtual void OnTabStatusChanged(TabStatusEventArgs e)\r
+        {\r
+            this.TabStatusChanged?.Invoke(this, e);\r
+        }\r
+\r
         /// <summary>\r
         /// The set advanced to defaults.\r
         /// </summary>\r