HandBrake/win/CS/HandBrakeWPF/ViewModels/SubtitlesDefaultsViewModel.cs
Damiano Galassi 66fe47c548
libhb: ui: add new presets key for track names (#6840)
Add AudioTrackNamePassthru and SubtitleTrackNamePassthru preset key to
preserve the existing track names, and AudioAutomaticNamingBehavior to
disable or enable the audio track automatic names.

Co-authored-by: sr55 <sr55.code@outlook.com>
2025-06-03 08:48:59 +02:00

281 lines
9.1 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="SubtitlesDefaultsViewModel.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>
// <summary>
// The Subtitles Defaults View Model
// </summary>
// --------------------------------------------------------------------------------------------------------------------
namespace HandBrakeWPF.ViewModels
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using HandBrake.App.Core.Utilities;
using HandBrake.Interop.Interop;
using HandBrake.Interop.Interop.Interfaces.Model;
using HandBrake.Interop.Utilities;
using HandBrakeWPF.Model.Subtitles;
using HandBrakeWPF.Properties;
using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.Services.Presets.Model;
using HandBrakeWPF.ViewModels.Interfaces;
using HandBrakeWPF.Views;
/// <summary>
/// The Subtitles View Model
/// </summary>
public class SubtitlesDefaultsViewModel : ViewModelBase, ISubtitlesDefaultsViewModel
{
private readonly IWindowManager windowManager;
private SubtitleBehaviours subtitleBehaviours;
private BindingList<Language> availableLanguages;
/// <summary>
/// Initializes a new instance of the <see cref="SubtitlesDefaultsViewModel"/> class.
/// </summary>
public SubtitlesDefaultsViewModel(IWindowManager windowManager)
{
this.windowManager = windowManager;
this.Languages = HandBrakeLanguagesHelper.AllLanguagesWithAny;
this.CharacterCodes = CharCodesUtilities.GetCharacterCodes();
this.SubtitleBehaviours = new SubtitleBehaviours();
this.SelectedAvailableToMove = new BindingList<Language>();
this.SelectedLanguagesToMove = new BindingList<Language>();
this.availableLanguages = new BindingList<Language>();
this.SetupPreset((Preset)null);
this.Title = Resources.SubtitlesViewModel_SubDefaults;
}
public bool IsApplied { get; set; }
/// <summary>
/// Gets CharacterCodes.
/// </summary>
public IEnumerable<string> CharacterCodes { get; private set; }
/// <summary>
/// Gets Languages.
/// </summary>
public IEnumerable<Language> Languages { get; private set; }
/// <summary>
/// Gets or sets the subtitle behaviours.
/// </summary>
public SubtitleBehaviours SubtitleBehaviours
{
get
{
return this.subtitleBehaviours;
}
set
{
if (Equals(value, this.subtitleBehaviours))
{
return;
}
this.subtitleBehaviours = value;
this.NotifyOfPropertyChange(() => this.SubtitleBehaviours);
}
}
/// <summary>
/// Gets the subtitle behaviour modes.
/// </summary>
public BindingList<SubtitleBehaviourModes> SubtitleBehaviourModeList
{
get
{
return new BindingList<SubtitleBehaviourModes>(EnumHelper<SubtitleBehaviourModes>.GetEnumList().ToList());
}
}
/// <summary>
/// Gets the subtitle burn in behaviour mode list.
/// </summary>
public BindingList<SubtitleBurnInBehaviourModes> SubtitleBurnInBehaviourModeList
{
get
{
return new BindingList<SubtitleBurnInBehaviourModes>(EnumHelper<SubtitleBurnInBehaviourModes>.GetEnumList().ToList());
}
}
/// <summary>
/// Gets AvailableLanguages.
/// </summary>
public BindingList<Language> AvailableLanguages
{
get
{
return this.availableLanguages;
}
private set
{
this.availableLanguages = value;
this.NotifyOfPropertyChange(() => this.AvailableLanguages);
}
}
/// <summary>
/// Gets SelectedLanguages.
/// </summary>
public BindingList<Language> SelectedAvailableToMove { get; private set; }
/// <summary>
/// Gets SelectedLanguages.
/// </summary>
public BindingList<Language> SelectedLanguagesToMove { get; private set; }
/// <summary>
/// Audio List Move Left
/// </summary>
public void LanguageMoveRight()
{
if (this.SelectedAvailableToMove.Count > 0)
{
List<Language> copiedList = SelectedAvailableToMove.ToList();
foreach (Language item in copiedList)
{
this.SubtitleBehaviours.SelectedLanguages.Add(item);
}
this.UpdateAvailableLanguages();
}
}
/// <summary>
/// Audio List Move Right
/// </summary>
public void LanguageMoveLeft()
{
if (this.SelectedLanguagesToMove.Count > 0)
{
List<Language> copiedList = SelectedLanguagesToMove.ToList();
foreach (Language item in copiedList)
{
this.SubtitleBehaviours.SelectedLanguages.Remove(item);
}
}
this.UpdateAvailableLanguages();
}
/// <summary>
/// Language List Clear all selected languages
/// </summary>
public void LanguageClearAll()
{
this.SubtitleBehaviours.SelectedLanguages.Clear();
this.UpdateAvailableLanguages();
}
public void LaunchHelp()
{
Process.Start("explorer.exe", "https://handbrake.fr/docs/en/latest/advanced/audio-subtitle-defaults.html");
}
/// <summary>
/// The setup languages.
/// </summary>
/// <param name="preset">
/// The preset.
/// </param>
public void SetupPreset(Preset preset)
{
if (preset != null)
{
this.SetupPreset(preset.SubtitleTrackBehaviours);
}
}
/// <summary>
/// The setup languages.
/// </summary>
/// <param name="behaviours">
/// The behaviours.
/// </param>
public void SetupPreset(SubtitleBehaviours behaviours)
{
// Reset
this.IsApplied = false;
// Step 1, Set the behaviour mode
this.SubtitleBehaviours.SelectedBehaviour = SubtitleBehaviourModes.None;
this.SubtitleBehaviours.SelectedBurnInBehaviour = SubtitleBurnInBehaviourModes.None;
this.SubtitleBehaviours.AddClosedCaptions = false;
this.SubtitleBehaviours.AddForeignAudioScanTrack = false;
this.SubtitleBehaviours.SelectedLanguages.Clear();
// Step 2, Setup Available Languages
this.AvailableLanguages.Clear();
foreach (Language item in HandBrakeLanguagesHelper.AllLanguagesWithAny)
{
this.AvailableLanguages.Add(item);
}
// Step 3, Set the Selected Languages
if (behaviours != null)
{
this.SubtitleBehaviours.SelectedBehaviour = behaviours.SelectedBehaviour;
this.SubtitleBehaviours.SelectedBurnInBehaviour = behaviours.SelectedBurnInBehaviour;
this.SubtitleBehaviours.AddClosedCaptions = behaviours.AddClosedCaptions;
this.SubtitleBehaviours.AddForeignAudioScanTrack = behaviours.AddForeignAudioScanTrack;
this.SubtitleBehaviours.SubtitleTrackNamePassthru = behaviours.SubtitleTrackNamePassthru;
foreach (Language selectedItem in behaviours.SelectedLanguages)
{
this.SubtitleBehaviours.SelectedLanguages.Add(selectedItem);
}
this.UpdateAvailableLanguages();
}
}
public bool ShowWindow()
{
this.IsApplied = false;
this.windowManager.ShowDialog<SubtitlesDefaultsView>(this);
return this.IsApplied;
}
public void Cancel()
{
this.IsApplied = false;
this.TryClose();
}
public void Save()
{
this.IsApplied = true;
this.TryClose();
}
private void UpdateAvailableLanguages()
{
List<Language> copiedList = this.SubtitleBehaviours.SelectedLanguages.ToList();
BindingList<Language> newAvailable = new BindingList<Language>();
foreach (Language lang in HandBrakeLanguagesHelper.AllLanguagesWithAny)
{
if (!copiedList.Contains(lang))
{
newAvailable.Add(lang);
}
}
this.AvailableLanguages = newAvailable;
}
}
}