From: sr55 <sr55.hb@outlook.com> Date: Sun, 13 Jan 2013 16:50:49 +0000 (+0000) Subject: WinGui: Numerous bug fixes. Many around the automatic selection feature on the Audio... X-Git-Tag: 0.9.9~188 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b62992bfb1623ae6c0930c41e00c2b150ea780d9;p=handbrake WinGui: Numerous bug fixes. Many around the automatic selection feature on the Audio Panel. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@5168 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs index 051052e47..c8238927f 100644 --- a/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs +++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs @@ -260,7 +260,7 @@ namespace HandBrake.ApplicationServices.Model.Encoding } /// <summary> - /// Gets the The UI display value for sample rate + /// Gets or sets the The UI display value for sample rate /// </summary> public string SampleRateDisplayValue { diff --git a/win/CS/HandBrakeWPF/ViewModels/AudioViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/AudioViewModel.cs index 8f7cbbc01..eeb3def77 100644 --- a/win/CS/HandBrakeWPF/ViewModels/AudioViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/AudioViewModel.cs @@ -259,7 +259,7 @@ namespace HandBrakeWPF.ViewModels { if (this.SourceTracks != null) { - Audio track = sourceTrack ?? this.SourceTracks.FirstOrDefault(); + Audio track = sourceTrack ?? this.GetPreferredAudioTrack(); if (track != null) { this.Task.AudioTracks.Add(new AudioTrack { ScannedTrack = track }); @@ -272,11 +272,20 @@ namespace HandBrakeWPF.ViewModels /// </summary> private void AddAllRemainingTracks() { + // For all the source audio tracks foreach (Audio sourceTrack in this.SourceTracks) { - bool found = this.Task.AudioTracks.Any(audioTrack => audioTrack.ScannedTrack == sourceTrack); + // Step 1: If "Add only One per language" is turned on, check to see if this language is already added. + if (this.CanSkipSourceTrack(sourceTrack)) + { + continue; + } + + // Step 2: Check if the track list already contrains this track + bool found = this.Task.AudioTracks.Any(audioTrack => Equals(audioTrack.ScannedTrack, sourceTrack)); if (!found) { + // If it doesn't, add it. this.Add(sourceTrack); } } @@ -287,24 +296,20 @@ namespace HandBrakeWPF.ViewModels /// </summary> public void AddAllRemainingForSelectedLanguages() { - // Figure out the source tracks we want to add - List<Audio> trackList = new List<Audio>(); - foreach ( - string language in - this.UserSettingService.GetUserSetting<StringCollection>( - UserSettingConstants.SelectedLanguages)) - { - // TODO add support for "Add only 1 per language" - trackList.AddRange(this.SourceTracks.Where(source => source.Language.Trim() == language)); - } - // Add them if they are not already added. - foreach (Audio sourceTrack in trackList) + foreach (Audio sourceTrack in this.GetSelectedLanguagesTracks()) { - bool found = this.Task.AudioTracks.Any(audioTrack => audioTrack.ScannedTrack == sourceTrack); + // Step 1: If "Add only One per language" is turned on, check to see if this language is already added. + if (this.CanSkipSourceTrack(sourceTrack)) + { + continue; + } + // Step 2: Check if the track list already contrains this track + bool found = this.Task.AudioTracks.Any(audioTrack => Equals(audioTrack.ScannedTrack, sourceTrack)); if (!found) { + // If it doesn't, add it. this.Add(sourceTrack); } } @@ -321,18 +326,10 @@ namespace HandBrakeWPF.ViewModels // Clear out the old tracks this.Task.AudioTracks.Clear(); - // Get the preferred Language - IEnumerable<Audio> preferredAudioTracks = - this.SourceTracks.Where( - item => - item.Language.Contains( - this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage))); - Audio preferred = preferredAudioTracks.FirstOrDefault() ?? this.SourceTracks.FirstOrDefault(); - // Add the preset audio tracks with the preferred language foreach (AudioTrack track in preset.Task.AudioTracks) { - this.Task.AudioTracks.Add(new AudioTrack(track) { ScannedTrack = preferred }); + this.Task.AudioTracks.Add(new AudioTrack(track) { ScannedTrack = this.GetPreferredAudioTrack() }); } } @@ -341,44 +338,24 @@ namespace HandBrakeWPF.ViewModels /// </summary> private void AutomaticTrackSelection() { - List<Audio> trackList = new List<Audio>(); if (!this.SourceTracks.Any()) { + // Clear out the old tracks + this.Task.AudioTracks.Clear(); + return; } - // Step 1: Fetch all the Preferred Language settings - if (this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage) == "Any") + // Default all the language tracks to the preferred or first language of this source. + foreach (AudioTrack track in this.Task.AudioTracks) { - // If we have Any as the preferred Language, just set the first track to all audio tracks. - trackList.Add(this.SourceTracks.FirstOrDefault()); - } - else - { - // Otherwise, fetch the preferred language. - foreach ( - Audio item in - this.SourceTracks.Where( - item => - item.Language.Contains( - this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage)))) - { - trackList.Add(item); - break; - } + track.ScannedTrack = this.GetPreferredAudioTrack(); } - // Step 2: Handle "All Remaining Tracks" and "All for Selected Languages" or use the default behaviour + // Handle the default selection behaviour. int mode = this.UserSettingService.GetUserSetting<int>(UserSettingConstants.DubModeAudio); - switch (mode) { - default: // Default by setting all existing tracks to a preferred or first source track. - foreach (AudioTrack track in this.Task.AudioTracks) - { - track.ScannedTrack = trackList.FirstOrDefault() ?? this.SourceTracks.FirstOrDefault(); - } - break; case 1: // Adding all remaining audio tracks this.AddAllRemaining(); break; @@ -389,35 +366,59 @@ namespace HandBrakeWPF.ViewModels } /// <summary> - /// The get language tracks. + /// The get preferred audio track, or the first if none available. /// </summary> /// <returns> - /// The Users desired audio tracks + /// The users preferred language, or the first if none available. /// </returns> - private List<Audio> GetLanguageTracks() + private Audio GetPreferredAudioTrack() + { + // Get the preferred Language + IEnumerable<Audio> preferredAudioTracks = + this.SourceTracks.Where( + item => + item.Language.Contains( + this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage))); + return preferredAudioTracks.FirstOrDefault() ?? this.SourceTracks.FirstOrDefault(); + } + + /// <summary> + /// Gets a list of source tracks for the users selected languages. + /// </summary> + /// <returns> + /// A list of source audio tracks. + /// </returns> + private IEnumerable<Audio> GetSelectedLanguagesTracks() { List<Audio> trackList = new List<Audio>(); - if (this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage) == "Any") + foreach (string language in this.UserSettingService.GetUserSetting<StringCollection>(UserSettingConstants.SelectedLanguages)) { - // If we have Any as the preferred Language, just set the first track to all audio tracks. - trackList.Add(this.SourceTracks.FirstOrDefault()); + trackList.AddRange(this.SourceTracks.Where(source => source.Language.Trim() == language)); } - else + + return trackList; + } + + /// <summary> + /// Checks to see if we can skip over the given source audio track. + /// True when the user has set "Add only one per language" feature AND the language is contained in the track list. + /// </summary> + /// <param name="sourceTrack"> + /// The source track. + /// </param> + /// <returns> + /// True when the user has set "Add only one per language" feature AND the language is contained in the track list + /// </returns> + private bool CanSkipSourceTrack(Audio sourceTrack) + { + bool addOnlyOnePerLanguage = this.UserSettingService.GetUserSetting<bool>(UserSettingConstants.AddOnlyOneAudioPerLanguage); + bool sourceTrackLanguageFound = this.Task.AudioTracks.Any(audioTrack => audioTrack.ScannedTrack != null && sourceTrack.Language == audioTrack.ScannedTrack.Language); + if (addOnlyOnePerLanguage && sourceTrackLanguageFound) { - // Otherwise, fetch the preferred language. - foreach ( - Audio item in - this.SourceTracks.Where( - item => - item.Language.Contains( - this.UserSettingService.GetUserSetting<string>(UserSettingConstants.NativeLanguage)))) - { - trackList.Add(item); - break; - } + return true; // This track can be skipped. } - return trackList; + return false; } #endregion diff --git a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs index fee34fcb7..7a9461b25 100644 --- a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs @@ -1673,7 +1673,6 @@ namespace HandBrakeWPF.ViewModels this.NotifyOfPropertyChange(() => this.ScannedSource.Titles); this.SelectedTitle = this.ScannedSource.Titles.FirstOrDefault(t => t.MainTitle) ?? this.ScannedSource.Titles.FirstOrDefault(); - this.SetupTabs(); } this.ShowStatusWindow = false; diff --git a/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs index 82c0daa3c..6dc2a44dc 100644 --- a/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs @@ -800,7 +800,7 @@ namespace HandBrakeWPF.ViewModels set { this.selectedPreferredLangauge = value; - this.NotifyOfPropertyChange("SelectedPreferreedLangauge"); + this.NotifyOfPropertyChange(() => SelectedPreferredLangauge); } } @@ -817,7 +817,7 @@ namespace HandBrakeWPF.ViewModels set { this.selectedPreferredSubtitleLangauge = value; - this.NotifyOfPropertyChange("SelectedPreferredSubtitleLangauge"); + this.NotifyOfPropertyChange(() => SelectedPreferredSubtitleLangauge); } } @@ -1731,7 +1731,7 @@ namespace HandBrakeWPF.ViewModels /// <summary> /// Audio List Move Left /// </summary> - public void LanguageMoveLeft() + public void LanguageMoveRight() { if (this.SelectedAvailableToMove.Count > 0) { @@ -1749,7 +1749,7 @@ namespace HandBrakeWPF.ViewModels /// <summary> /// Audio List Move Right /// </summary> - public void LanguageMoveRight() + public void LanguageMoveLeft() { if (this.SelectedLangaugesToMove.Count > 0) { diff --git a/win/CS/HandBrakeWPF/ViewModels/SubtitlesViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/SubtitlesViewModel.cs index 446fab6cf..b52dd961a 100644 --- a/win/CS/HandBrakeWPF/ViewModels/SubtitlesViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/SubtitlesViewModel.cs @@ -120,13 +120,10 @@ namespace HandBrakeWPF.ViewModels /// </summary> public void AddAllClosedCaptions() { - if (this.UserSettingService.GetUserSetting<bool>(UserSettingConstants.UseClosedCaption)) + + foreach (Subtitle subtitle in this.SourceTitlesSubset(null).Where(s => s.SubtitleType == SubtitleType.CC)) { - foreach ( - Subtitle subtitle in this.SourceTitlesSubset(null).Where(s => s.SubtitleType == SubtitleType.CC)) - { - this.Add(subtitle); - } + this.Add(subtitle); } } @@ -160,38 +157,6 @@ namespace HandBrakeWPF.ViewModels } } - /// <summary> - /// Automatic Subtitle Selection based on user preferences. - /// </summary> - public void AutomaticSubtitleSelection() - { - this.Task.SubtitleTracks.Clear(); - - // New DUB Settings - int mode = this.UserSettingService.GetUserSetting<int>(UserSettingConstants.DubModeSubtitle); - switch (mode) - { - case 1: // Adding all remaining subtitle tracks - this.AddAllRemaining(); - break; - case 2: // Adding only the first or preferred first subtitle track. - this.Add(); - break; - case 3: // Selected Languages Only - this.AddAllRemainingForSelectedLanguages(); - break; - case 4: // Prefered Only - this.AddForPreferredLanaguages(true); - break; - case 5: // Prefered Only All - this.AddForPreferredLanaguages(false); - break; - } - - // Add all closed captions if enabled. - this.AddAllClosedCaptions(); - } - /// <summary> /// Import an SRT File. /// </summary> @@ -279,6 +244,41 @@ namespace HandBrakeWPF.ViewModels this.NotifyOfPropertyChange(() => this.Task); } + /// <summary> + /// Automatic Subtitle Selection based on user preferences. + /// </summary> + public void AutomaticSubtitleSelection() + { + this.Task.SubtitleTracks.Clear(); + + // New DUB Settings + int mode = this.UserSettingService.GetUserSetting<int>(UserSettingConstants.DubModeSubtitle); + switch (mode) + { + case 1: // Adding all remaining subtitle tracks + this.AddAllRemaining(); + break; + case 2: // Adding only the first or preferred first subtitle track. + this.Add(); + break; + case 3: // Selected Languages Only + this.AddAllRemainingForSelectedLanguages(); + break; + case 4: // Prefered Only + this.AddForPreferredLanaguages(true); + break; + case 5: // Prefered Only All + this.AddForPreferredLanaguages(false); + break; + } + + // Add all closed captions if enabled. + if (this.UserSettingService.GetUserSetting<bool>(UserSettingConstants.UseClosedCaption)) + { + this.AddAllClosedCaptions(); + } + } + #endregion #region Implemented Interfaces @@ -419,10 +419,8 @@ namespace HandBrakeWPF.ViewModels private IEnumerable<Subtitle> SourceTitlesSubset(IEnumerable<Subtitle> subtitles) { return subtitles != null - ? subtitles.Where( - subtitle => !this.Task.SubtitleTracks.Any(track => track.SourceTrack == subtitle)).ToList() - : this.SourceTracks.Where( - subtitle => !this.Task.SubtitleTracks.Any(track => track.SourceTrack == subtitle)).ToList(); + ? subtitles.Where(subtitle => !this.Task.SubtitleTracks.Any(track => Equals(track.SourceTrack, subtitle))).ToList() + : this.SourceTracks.Where(subtitle => !this.Task.SubtitleTracks.Any(track => Equals(track.SourceTrack, subtitle))).ToList(); } #endregion diff --git a/win/CS/HandBrakeWPF/Views/OptionsView.xaml b/win/CS/HandBrakeWPF/Views/OptionsView.xaml index c5d5d3e60..9c2080db5 100644 --- a/win/CS/HandBrakeWPF/Views/OptionsView.xaml +++ b/win/CS/HandBrakeWPF/Views/OptionsView.xaml @@ -236,8 +236,8 @@ <DockPanel Grid.Column="1" Margin="10,0,10,0"> <StackPanel Orientation="Vertical" VerticalAlignment="Center"> - <Button Content="Move Left" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveLeft]" Width="80" /> <Button Content="Move Right" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveRight]" Width="80" /> + <Button Content="Move Left" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageMoveLeft]" Width="80" /> <Button Content="Clear" VerticalAlignment="Center" Margin="0,0,0,5" cal:Message.Attach="[Event Click] = [Action LanguageClearAll]" Width="80"/> </StackPanel> </DockPanel>