From 054b9d9faf5334cb6c47b31784c87406b51e19fa Mon Sep 17 00:00:00 2001 From: Scott Date: Sat, 24 Oct 2015 22:34:31 +0100 Subject: [PATCH] Improving the Deinterlace / Decomb Filters Tab UI. Now uses the same "presets / custom" format that the other UI's do. --- .../HandBrake.ApplicationServices.csproj | 1 + .../Interop/Model/Encoding/Decomb.cs | 11 +- .../Interop/Model/Encoding/Deinterlace.cs | 13 +- .../Model/Encoding/DeinterlaceFilter.cs | 28 ++++ .../Converters/EnumComboConverter.cs | 16 +- .../Properties/ResourcesUI.Designer.cs | 2 +- .../HandBrakeWPF/Properties/ResourcesUI.resx | 2 +- .../Encode/Factories/EncodeFactory.cs | 4 +- .../Services/Encode/Model/EncodeTask.cs | 6 + .../Presets/Factories/JsonPresetFactory.cs | 27 ++-- .../ViewModels/FiltersViewModel.cs | 140 +++++++++++------- win/CS/HandBrakeWPF/Views/FiltersView.xaml | 46 +++--- 12 files changed, 197 insertions(+), 99 deletions(-) create mode 100644 win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/DeinterlaceFilter.cs diff --git a/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj b/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj index 1a99efd1d..16afa531b 100644 --- a/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj +++ b/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj @@ -135,6 +135,7 @@ + diff --git a/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/Decomb.cs b/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/Decomb.cs index 58e1003e3..eab94ef2a 100644 --- a/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/Decomb.cs +++ b/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/Decomb.cs @@ -16,19 +16,16 @@ namespace HandBrake.ApplicationServices.Interop.Model.Encoding /// public enum Decomb { - [ShortName("off")] - Off = 0, - [ShortName("default")] - Default = 2, + Default, [ShortName("fast")] - Fast = 3, + Fast, [ShortName("bob")] - Bob = 4, + Bob, [ShortName("custom")] - Custom = 1 + Custom } } diff --git a/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/Deinterlace.cs b/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/Deinterlace.cs index f7b8f0a42..e8da93043 100644 --- a/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/Deinterlace.cs +++ b/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/Deinterlace.cs @@ -16,22 +16,19 @@ namespace HandBrake.ApplicationServices.Interop.Model.Encoding /// public enum Deinterlace { - [ShortName("off")] - Off = 0, - [ShortName("fast")] - Fast = 2, + Fast, [ShortName("slow")] - Slow = 3, + Slow, [ShortName("slower")] - Slower = 4, + Slower, [ShortName("bob")] - Bob = 5, + Bob, [ShortName("custom")] - Custom = 1 + Custom } } diff --git a/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/DeinterlaceFilter.cs b/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/DeinterlaceFilter.cs new file mode 100644 index 000000000..27e8f4435 --- /dev/null +++ b/win/CS/HandBrake.ApplicationServices/Interop/Model/Encoding/DeinterlaceFilter.cs @@ -0,0 +1,28 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// +// +// Defines the Deinterlace type. +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrake.ApplicationServices.Interop.Model.Encoding +{ + using HandBrake.ApplicationServices.Attributes; + + /// + /// The deinterlace. + /// + public enum DeinterlaceFilter + { + [ShortName("off")] + Off = 0, + + [ShortName("Deinterlace")] + Deinterlace = 1, + + [ShortName("Decomb")] + Decomb = 2 + } +} diff --git a/win/CS/HandBrakeWPF/Converters/EnumComboConverter.cs b/win/CS/HandBrakeWPF/Converters/EnumComboConverter.cs index 2f92db92c..b154c4dce 100644 --- a/win/CS/HandBrakeWPF/Converters/EnumComboConverter.cs +++ b/win/CS/HandBrakeWPF/Converters/EnumComboConverter.cs @@ -91,6 +91,10 @@ namespace HandBrakeWPF.Converters { return EnumHelper.GetEnumDisplayValues(typeof(OutputFormat)); } + if (value is IEnumerable) + { + return EnumHelper.GetEnumDisplayValues(typeof(DeinterlaceFilter)); + } // Single Items if (targetType == typeof(VideoEncoder) || value.GetType() == typeof(VideoEncoder)) @@ -136,7 +140,12 @@ namespace HandBrakeWPF.Converters { return EnumHelper.GetDisplay((OutputFormat)value); } - + + if (targetType == typeof(DeinterlaceFilter) || value.GetType() == typeof(DeinterlaceFilter)) + { + return EnumHelper.GetDisplay((DeinterlaceFilter)value); + } + return null; } @@ -201,6 +210,11 @@ namespace HandBrakeWPF.Converters return EnumHelper.GetValue(value.ToString()); } + if (targetType == typeof(DeinterlaceFilter) || value.GetType() == typeof(DeinterlaceFilter)) + { + return EnumHelper.GetValue(value.ToString()); + } + return null; } } diff --git a/win/CS/HandBrakeWPF/Properties/ResourcesUI.Designer.cs b/win/CS/HandBrakeWPF/Properties/ResourcesUI.Designer.cs index 10afa9c83..3bfe5da97 100644 --- a/win/CS/HandBrakeWPF/Properties/ResourcesUI.Designer.cs +++ b/win/CS/HandBrakeWPF/Properties/ResourcesUI.Designer.cs @@ -412,7 +412,7 @@ namespace HandBrakeWPF.Properties { } /// - /// Looks up a localized string similar to Deinterlace. + /// Looks up a localized string similar to Deinterlace:. /// public static string FiltersView_Deinterlace { get { diff --git a/win/CS/HandBrakeWPF/Properties/ResourcesUI.resx b/win/CS/HandBrakeWPF/Properties/ResourcesUI.resx index 2d9793240..1a5da42c9 100644 --- a/win/CS/HandBrakeWPF/Properties/ResourcesUI.resx +++ b/win/CS/HandBrakeWPF/Properties/ResourcesUI.resx @@ -394,7 +394,7 @@ Decomb - Deinterlace + Deinterlace: Denoise: diff --git a/win/CS/HandBrakeWPF/Services/Encode/Factories/EncodeFactory.cs b/win/CS/HandBrakeWPF/Services/Encode/Factories/EncodeFactory.cs index 31688c334..80873c510 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/Factories/EncodeFactory.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/Factories/EncodeFactory.cs @@ -406,7 +406,7 @@ namespace HandBrakeWPF.Services.Encode.Factories } // Decomb - if (job.Decomb != Decomb.Off) + if (job.DeinterlaceFilter == DeinterlaceFilter.Decomb) { string options; if (job.Decomb == Decomb.Fast) @@ -427,7 +427,7 @@ namespace HandBrakeWPF.Services.Encode.Factories } // Deinterlace - if (job.Deinterlace != Deinterlace.Off) + if (job.DeinterlaceFilter == DeinterlaceFilter.Deinterlace) { string options; if (job.Deinterlace == Deinterlace.Fast) diff --git a/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs b/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs index f4d5a988e..8d7440f06 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs @@ -99,6 +99,7 @@ namespace HandBrakeWPF.Services.Encode.Model this.Deblock = task.Deblock; this.Decomb = task.Decomb; this.Deinterlace = task.Deinterlace; + this.DeinterlaceFilter = task.DeinterlaceFilter; this.Denoise = task.Denoise; this.DenoisePreset = task.DenoisePreset; this.DenoiseTune = task.DenoiseTune; @@ -277,6 +278,11 @@ namespace HandBrakeWPF.Services.Encode.Model #region Filters + /// + /// Gets or sets Deinterlace Filter Mode + /// + public DeinterlaceFilter DeinterlaceFilter { get; set; } + /// /// Gets or sets Deinterlace. /// diff --git a/win/CS/HandBrakeWPF/Services/Presets/Factories/JsonPresetFactory.cs b/win/CS/HandBrakeWPF/Services/Presets/Factories/JsonPresetFactory.cs index 2a5a8d4aa..52c0c6e99 100644 --- a/win/CS/HandBrakeWPF/Services/Presets/Factories/JsonPresetFactory.cs +++ b/win/CS/HandBrakeWPF/Services/Presets/Factories/JsonPresetFactory.cs @@ -101,19 +101,22 @@ namespace HandBrakeWPF.Services.Presets.Factories { case "decomb": preset.Task.Decomb = Decomb.Default; - preset.Task.Deinterlace = Deinterlace.Off; + preset.Task.Deinterlace = Deinterlace.Fast; + preset.Task.DeinterlaceFilter = DeinterlaceFilter.Decomb; break; case "deinterlace": - preset.Task.Decomb = Decomb.Off; + preset.Task.Decomb = Decomb.Default; preset.Task.Deinterlace = Deinterlace.Fast; + preset.Task.DeinterlaceFilter = DeinterlaceFilter.Deinterlace; break; default: - preset.Task.Decomb = Decomb.Off; - preset.Task.Deinterlace = Deinterlace.Off; + preset.Task.Decomb = Decomb.Default; + preset.Task.Deinterlace = Deinterlace.Fast; + preset.Task.DeinterlaceFilter = DeinterlaceFilter.Off; break; } - if (preset.Task.Decomb != Decomb.Off) + if (preset.Task.DeinterlaceFilter == DeinterlaceFilter.Decomb) { switch (importedPreset.PictureDeinterlaceFilter) { @@ -140,7 +143,7 @@ namespace HandBrakeWPF.Services.Presets.Factories } } - if (preset.Task.Deinterlace != Deinterlace.Off) + if (preset.Task.DeinterlaceFilter == DeinterlaceFilter.Deinterlace) { switch (importedPreset.PictureDeinterlaceFilter) { @@ -533,9 +536,15 @@ namespace HandBrakeWPF.Services.Presets.Factories // Filters preset.PictureDeblock = export.Task.Deblock; - preset.PictureDeinterlaceFilter = export.Task.Decomb != Decomb.Off ? "decomb" : export.Task.Deinterlace != Deinterlace.Off ? "deinterlace" : "off"; - preset.PictureDeinterlacePreset = export.Task.Decomb != Decomb.Off ? EnumHelper.GetShortName(export.Task.Decomb) : export.Task.Deinterlace != Deinterlace.Off ? EnumHelper.GetShortName(export.Task.Deinterlace) : string.Empty; - preset.PictureDeinterlaceCustom = export.Task.Decomb != Decomb.Off ? export.Task.CustomDecomb : export.Task.Deinterlace != Deinterlace.Off ? export.Task.CustomDeinterlace : string.Empty; + preset.PictureDeinterlaceFilter = export.Task.DeinterlaceFilter == DeinterlaceFilter.Decomb + ? "decomb" + : export.Task.DeinterlaceFilter == DeinterlaceFilter.Deinterlace ? "deinterlace" : "off"; + preset.PictureDeinterlacePreset = export.Task.DeinterlaceFilter == DeinterlaceFilter.Decomb + ? EnumHelper.GetShortName(export.Task.Decomb) + : export.Task.DeinterlaceFilter == DeinterlaceFilter.Deinterlace ? EnumHelper.GetShortName(export.Task.Deinterlace) : string.Empty; + preset.PictureDeinterlaceCustom = export.Task.DeinterlaceFilter == DeinterlaceFilter.Decomb + ? export.Task.CustomDecomb + : export.Task.DeinterlaceFilter == DeinterlaceFilter.Deinterlace ? export.Task.CustomDeinterlace : string.Empty; preset.PictureDeinterlaceCustom = export.Task.CustomDeinterlace; preset.PictureDenoiseCustom = export.Task.CustomDenoise; preset.PictureDenoiseFilter = EnumHelper.GetShortName(export.Task.Denoise); diff --git a/win/CS/HandBrakeWPF/ViewModels/FiltersViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/FiltersViewModel.cs index 8810c65d9..f136035ab 100644 --- a/win/CS/HandBrakeWPF/ViewModels/FiltersViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/FiltersViewModel.cs @@ -32,10 +32,7 @@ namespace HandBrakeWPF.ViewModels /// public class FiltersViewModel : ViewModelBase, IFiltersViewModel { - /// - /// The is deinterlace mode. - /// - private bool isDeinterlaceMode; + private DeinterlaceFilter deinterlaceFilter; #region Constructors and Destructors @@ -52,7 +49,7 @@ namespace HandBrakeWPF.ViewModels { this.CurrentTask = new EncodeTask(); this.DeblockValue = 4; // OFF - this.IsDeinterlaceMode = true; + this.SelectedDeinterlaceFilter = DeinterlaceFilter.Off; } #endregion @@ -205,6 +202,17 @@ namespace HandBrakeWPF.ViewModels } } + /// + /// Gets DeinterlaceFilterOptions. + /// + public IEnumerable DeinterlaceFilterOptions + { + get + { + return EnumHelper.GetEnumList(); + } + } + /// /// Gets or sets a value indicating whether Grayscale. /// @@ -235,23 +243,14 @@ namespace HandBrakeWPF.ViewModels set { this.CurrentTask.Deinterlace = value; - if (this.CurrentTask.Deinterlace != Deinterlace.Off) - { - this.SelectedDecomb = Decomb.Off; - } - this.NotifyOfPropertyChange(() => this.SelectedDeInterlace); if (value != Deinterlace.Custom) this.CustomDeinterlace = string.Empty; // Show / Hide the Custom Control - this.ShowDeinterlaceCustom = this.CurrentTask.Deinterlace == Deinterlace.Custom; + this.NotifyOfPropertyChange(() => this.ShowDecombCustom); this.NotifyOfPropertyChange(() => this.ShowDeinterlaceCustom); - - if (value != Deinterlace.Off) - { - this.IsDeinterlaceMode = true; - } + this.NotifyOfPropertyChange(() => this.ShowDeinterlaceDecombCustom); } } @@ -268,23 +267,14 @@ namespace HandBrakeWPF.ViewModels set { this.CurrentTask.Decomb = value; - if (this.CurrentTask.Decomb != Decomb.Off) - { - this.SelectedDeInterlace = Deinterlace.Off; - } - this.NotifyOfPropertyChange(() => this.SelectedDecomb); if (value != Decomb.Custom) this.CustomDecomb = string.Empty; // Show / Hide the Custom Control - this.ShowDecombCustom = this.CurrentTask.Decomb == Decomb.Custom; this.NotifyOfPropertyChange(() => this.ShowDecombCustom); - - if (value != Decomb.Off) - { - this.IsDeinterlaceMode = false; - } + this.NotifyOfPropertyChange(() => this.ShowDeinterlaceCustom); + this.NotifyOfPropertyChange(() => this.ShowDeinterlaceDecombCustom); } } @@ -339,12 +329,17 @@ namespace HandBrakeWPF.ViewModels /// /// Gets or sets a value indicating whether ShowDecombCustom. /// - public bool ShowDecombCustom { get; set; } + public bool ShowDecombCustom => this.SelectedDeinterlaceFilter == DeinterlaceFilter.Decomb && this.SelectedDecomb == Decomb.Custom; + + /// + /// Gets or sets a value indicating whether ShowDeinterlaceDecombCustom. + /// + public bool ShowDeinterlaceDecombCustom => (this.SelectedDeinterlaceFilter == DeinterlaceFilter.Decomb && this.SelectedDecomb == Decomb.Custom) || (this.SelectedDeinterlaceFilter == DeinterlaceFilter.Deinterlace && this.SelectedDeInterlace == Deinterlace.Custom); /// /// Gets or sets a value indicating whether ShowDelelecineCustom. /// - public bool ShowDeinterlaceCustom { get; set; } + public bool ShowDeinterlaceCustom => this.SelectedDeinterlaceFilter == DeinterlaceFilter.Deinterlace && this.SelectedDeInterlace == Deinterlace.Custom; /// /// Gets or sets a value indicating whether ShowDenoiseCustom. @@ -357,41 +352,64 @@ namespace HandBrakeWPF.ViewModels public bool ShowDetelecineCustom { get; set; } /// - /// Gets or sets a value indicating whether is deinterlace mode. + /// Gets or sets the selected deinterlace filter mode. /// - public bool IsDeinterlaceMode + public DeinterlaceFilter SelectedDeinterlaceFilter { get { - return this.isDeinterlaceMode; + return this.deinterlaceFilter; } set { - if (!Equals(this.isDeinterlaceMode, value)) + if (value == this.deinterlaceFilter) { - this.isDeinterlaceMode = value; - this.NotifyOfPropertyChange(() => this.IsDeinterlaceMode); - - this.DeinterlaceControlText = value ? "Deinterlace:" : "Decomb:"; + return; + } - if (value) - { - this.SelectedDecomb = Decomb.Off; - } - else - { - this.SelectedDeInterlace = Deinterlace.Off; - } + this.deinterlaceFilter = value; + this.CurrentTask.DeinterlaceFilter = value; - this.NotifyOfPropertyChange(() => this.DeinterlaceControlText); + if (this.deinterlaceFilter == DeinterlaceFilter.Deinterlace) + { + this.IsDeinterlaceMode = true; + this.IsDecombMode = false; + } + else if (this.deinterlaceFilter == DeinterlaceFilter.Decomb) + { + this.IsDeinterlaceMode = false; + this.IsDecombMode = true; + } + else + { + this.IsDeinterlaceMode = false; + this.IsDecombMode = false; } + + this.NotifyOfPropertyChange(() => this.SelectedDeinterlaceFilter); + this.NotifyOfPropertyChange(() => this.IsDeinterlaceMode); + this.NotifyOfPropertyChange(() => this.IsDecombMode); + this.NotifyOfPropertyChange(() => this.IsDeinterlaceDecomb); + this.NotifyOfPropertyChange(() => this.ShowDecombCustom); + this.NotifyOfPropertyChange(() => this.ShowDeinterlaceCustom); + this.NotifyOfPropertyChange(() => this.ShowDeinterlaceDecombCustom); } } /// - /// Gets or sets the deinterlace control text. + /// Gets or sets a value indicating whether is deinterlace mode. + /// + public bool IsDeinterlaceMode { get; set; } + + /// + /// Gets or sets a value indicating whether is decomb mode. /// - public string DeinterlaceControlText { get; set; } + public bool IsDecombMode { get; set; } + + /// + /// Gets or sets a value indicating whether is deinterlace or decomb mode. + /// + public bool IsDeinterlaceDecomb => this.SelectedDeinterlaceFilter != DeinterlaceFilter.Off; /// /// Gets or sets the selected denoise tune. @@ -501,9 +519,24 @@ namespace HandBrakeWPF.ViewModels { // Properties this.SelectedDenoise = preset.Task.Denoise; + this.SelectedDetelecine = preset.Task.Detelecine; + this.SelectedDecomb = preset.Task.Decomb; this.SelectedDeInterlace = preset.Task.Deinterlace; - this.SelectedDetelecine = preset.Task.Detelecine; + if (preset.Task.DeinterlaceFilter == DeinterlaceFilter.Deinterlace) + { + this.SelectedDeinterlaceFilter = DeinterlaceFilter.Deinterlace; + } + else if (preset.Task.DeinterlaceFilter == DeinterlaceFilter.Decomb) + { + this.SelectedDeinterlaceFilter = DeinterlaceFilter.Decomb; + } + else + { + this.SelectedDeinterlaceFilter = DeinterlaceFilter.Off; + } + + this.Grayscale = preset.Task.Grayscale; this.DeblockValue = preset.Task.Deblock == 0 ? 4 : preset.Task.Deblock; this.SelectedDenoisePreset = preset.Task.DenoisePreset; @@ -519,8 +552,8 @@ namespace HandBrakeWPF.ViewModels { // Default everything to off this.SelectedDenoise = Denoise.Off; - this.SelectedDecomb = Decomb.Off; - this.SelectedDeInterlace = Deinterlace.Off; + this.SelectedDecomb = Decomb.Default; + this.SelectedDeInterlace = Deinterlace.Fast; this.SelectedDetelecine = Detelecine.Off; this.Grayscale = false; this.DeblockValue = 0; @@ -548,6 +581,11 @@ namespace HandBrakeWPF.ViewModels this.NotifyOfPropertyChange(() => this.CustomDeinterlace); this.NotifyOfPropertyChange(() => this.CustomDetelecine); this.NotifyOfPropertyChange(() => this.CustomDenoise); + + this.NotifyOfPropertyChange(() => this.IsDeinterlaceMode); + this.NotifyOfPropertyChange(() => this.IsDecombMode); + this.NotifyOfPropertyChange(() => this.IsDeinterlaceDecomb); + } /// diff --git a/win/CS/HandBrakeWPF/Views/FiltersView.xaml b/win/CS/HandBrakeWPF/Views/FiltersView.xaml index 471d41049..edacca205 100644 --- a/win/CS/HandBrakeWPF/Views/FiltersView.xaml +++ b/win/CS/HandBrakeWPF/Views/FiltersView.xaml @@ -45,6 +45,7 @@ + - + + - - - - - - - + + - + + + + + + + + + + + - + + + - + -- 2.40.0