Move subtitle default option to add dialog

This commit is contained in:
Emby Toolbox 2026-05-16 15:04:43 +05:00
parent 65eab83567
commit 642656971c
5 changed files with 62 additions and 65 deletions

View File

@ -3,5 +3,6 @@ namespace EmbyToolbox.Models;
public sealed class AddFilesOptions public sealed class AddFilesOptions
{ {
public string Profile { get; init; } = "Emby"; public string Profile { get; init; } = "Emby";
public bool DisableSubtitleDefault { get; init; }
public bool RemoveForeignAudioAndSubtitles { get; init; } public bool RemoveForeignAudioAndSubtitles { get; init; }
} }

View File

@ -10,17 +10,20 @@ public sealed class AddFilesOptionsViewModel : INotifyPropertyChanged
private readonly Action<AddFilesOptions> _onAdd; private readonly Action<AddFilesOptions> _onAdd;
private readonly Action _onCancel; private readonly Action _onCancel;
private bool _disableSubtitleDefault;
private bool _removeForeignAudioAndSubtitles; private bool _removeForeignAudioAndSubtitles;
private ConversionProfilePresetRow? _selectedProfile; private ConversionProfilePresetRow? _selectedProfile;
public AddFilesOptionsViewModel( public AddFilesOptionsViewModel(
IReadOnlyList<ConversionProfilePresetRow> profiles, IReadOnlyList<ConversionProfilePresetRow> profiles,
string selectedProfileName, string selectedProfileName,
bool disableSubtitleDefault,
Action<AddFilesOptions> onAdd, Action<AddFilesOptions> onAdd,
Action onCancel) Action onCancel)
{ {
_onAdd = onAdd; _onAdd = onAdd;
_onCancel = onCancel; _onCancel = onCancel;
_disableSubtitleDefault = disableSubtitleDefault;
Profiles = new ObservableCollection<ConversionProfilePresetRow>(profiles); Profiles = new ObservableCollection<ConversionProfilePresetRow>(profiles);
_selectedProfile = Profiles.FirstOrDefault(p => p.Profile.Equals(selectedProfileName, StringComparison.OrdinalIgnoreCase)) _selectedProfile = Profiles.FirstOrDefault(p => p.Profile.Equals(selectedProfileName, StringComparison.OrdinalIgnoreCase))
?? Profiles.FirstOrDefault(p => p.Profile.Equals("Emby", StringComparison.OrdinalIgnoreCase)) ?? Profiles.FirstOrDefault(p => p.Profile.Equals("Emby", StringComparison.OrdinalIgnoreCase))
@ -29,46 +32,33 @@ public sealed class AddFilesOptionsViewModel : INotifyPropertyChanged
CancelCommand = new RelayCommand(() => _onCancel()); CancelCommand = new RelayCommand(() => _onCancel());
} }
/// <summary>Взаимоисключающие опции: два свойства, чтобы не использовать TwoWay на одно поле с конвертером (переполнение стека в WPF).</summary> public bool DisableSubtitleDefault
public bool OptionKeepAllTracks
{ {
get => !_removeForeignAudioAndSubtitles; get => _disableSubtitleDefault;
set set
{ {
if (!value) if (_disableSubtitleDefault == value)
{ {
return; return;
} }
if (!_removeForeignAudioAndSubtitles) _disableSubtitleDefault = value;
{
return;
}
_removeForeignAudioAndSubtitles = false;
OnPropertyChanged(); OnPropertyChanged();
OnPropertyChanged(nameof(OptionRemoveForeignTracks));
} }
} }
public bool OptionRemoveForeignTracks public bool RemoveForeignAudioAndSubtitles
{ {
get => _removeForeignAudioAndSubtitles; get => _removeForeignAudioAndSubtitles;
set set
{ {
if (!value) if (_removeForeignAudioAndSubtitles == value)
{ {
return; return;
} }
if (_removeForeignAudioAndSubtitles) _removeForeignAudioAndSubtitles = value;
{
return;
}
_removeForeignAudioAndSubtitles = true;
OnPropertyChanged(); OnPropertyChanged();
OnPropertyChanged(nameof(OptionKeepAllTracks));
} }
} }
@ -98,6 +88,7 @@ public sealed class AddFilesOptionsViewModel : INotifyPropertyChanged
new AddFilesOptions new AddFilesOptions
{ {
Profile = string.IsNullOrWhiteSpace(_selectedProfile?.Profile) ? "Emby" : _selectedProfile.Profile, Profile = string.IsNullOrWhiteSpace(_selectedProfile?.Profile) ? "Emby" : _selectedProfile.Profile,
DisableSubtitleDefault = _disableSubtitleDefault,
RemoveForeignAudioAndSubtitles = _removeForeignAudioAndSubtitles RemoveForeignAudioAndSubtitles = _removeForeignAudioAndSubtitles
}); });
} }

View File

@ -1632,7 +1632,7 @@ public sealed class ConversionViewModel : INotifyPropertyChanged
var cts = _analysisCts; var cts = _analysisCts;
var token = cts.Token; var token = cts.Token;
var autoRemoveForeignTracksForBatch = addOptions.RemoveForeignAudioAndSubtitles; var autoRemoveForeignTracksForBatch = addOptions.RemoveForeignAudioAndSubtitles;
var disableSubtitleDefaultForBatch = DisableSubtitleDefault; var disableSubtitleDefaultForBatch = addOptions.DisableSubtitleDefault;
var app = Application.Current; var app = Application.Current;
try try
{ {
@ -1756,10 +1756,12 @@ public sealed class ConversionViewModel : INotifyPropertyChanged
var vm = new AddFilesOptionsViewModel( var vm = new AddFilesOptionsViewModel(
_presetRowsForSetup(), _presetRowsForSetup(),
CurrentProfileNameForNewTasks(), CurrentProfileNameForNewTasks(),
DisableSubtitleDefault,
options => options =>
{ {
selected = options; selected = options;
_defaultQueueProfile = options.Profile; _defaultQueueProfile = options.Profile;
DisableSubtitleDefault = options.DisableSubtitleDefault;
SyncDefaultProfileFromList(_presetRowsForSetup()); SyncDefaultProfileFromList(_presetRowsForSetup());
dialog.DialogResult = true; dialog.DialogResult = true;
dialog.Close(); dialog.Close();

View File

@ -3,25 +3,40 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Параметры добавления" Title="Параметры добавления"
Width="520" Width="520"
Height="300" Height="230"
ResizeMode="NoResize" ResizeMode="NoResize"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"
Background="{DynamicResource Ui.Brush.Surface}"> Background="{DynamicResource Ui.Brush.Surface}">
<Grid Margin="14"> <Grid Margin="14">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel Grid.Row="0" <Grid Grid.Row="0"
Margin="0,0,0,12"> VerticalAlignment="Top">
<TextBlock Text="Профиль для новых строк" <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
Grid.Column="0"
Text="Профиль"
Style="{StaticResource UiTextCaption}" Style="{StaticResource UiTextCaption}"
Margin="0,0,0,6" /> VerticalAlignment="Center"
<ComboBox Style="{StaticResource UiCombo}" Margin="0,0,12,12" />
<ComboBox Grid.Row="0"
Grid.Column="1"
Style="{StaticResource UiCombo}"
ItemsSource="{Binding Profiles}" ItemsSource="{Binding Profiles}"
SelectedItem="{Binding SelectedProfile, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> SelectedItem="{Binding SelectedProfile, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Margin="0,0,0,12">
<ComboBox.ItemTemplate> <ComboBox.ItemTemplate>
<DataTemplate> <DataTemplate>
<TextBlock Text="{Binding Profile, Mode=OneWay}" <TextBlock Text="{Binding Profile, Mode=OneWay}"
@ -29,25 +44,32 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
<TextBlock Text="Как обработать иностранные встроенные дорожки?"
TextWrapping="Wrap"
Style="{StaticResource UiTextBody}"
Margin="0,14,0,0" />
</StackPanel>
<StackPanel Grid.Row="1"> <TextBlock Grid.Row="1"
<RadioButton GroupName="AddFilesOptions" Grid.Column="0"
Style="{DynamicResource UiRadio}" Text="Отключать субтитры"
Content="Оставить все дорожки" Style="{StaticResource UiTextCaption}"
IsChecked="{Binding OptionKeepAllTracks, Mode=TwoWay}" VerticalAlignment="Center"
Margin="0,0,0,8" /> Margin="0,0,12,12" />
<RadioButton GroupName="AddFilesOptions" <CheckBox Grid.Row="1"
Style="{DynamicResource UiRadio}" Grid.Column="1"
Content="Пометить иностранные аудио и субтитры на удаление" VerticalAlignment="Center"
IsChecked="{Binding OptionRemoveForeignTracks, Mode=TwoWay}" /> IsChecked="{Binding DisableSubtitleDefault, Mode=TwoWay}"
</StackPanel> Margin="0,0,0,12" />
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,12,0,0"> <TextBlock Grid.Row="2"
Grid.Column="0"
Text="Удалять иностранные дорожки"
Style="{StaticResource UiTextCaption}"
VerticalAlignment="Center"
Margin="0,0,12,0" />
<CheckBox Grid.Row="2"
Grid.Column="1"
VerticalAlignment="Center"
IsChecked="{Binding RemoveForeignAudioAndSubtitles, Mode=TwoWay}" />
</Grid>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,12,0,0">
<Button MinWidth="100" <Button MinWidth="100"
Margin="0,0,8,0" Margin="0,0,8,0"
Style="{StaticResource UiButtonPrimary}" Style="{StaticResource UiButtonPrimary}"

View File

@ -486,25 +486,6 @@
</ToolTip> </ToolTip>
</CheckBox.ToolTip> </CheckBox.ToolTip>
</CheckBox> </CheckBox>
<CheckBox Margin="12,0,0,0"
Height="24"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
IsEnabled="{Binding CanEditQueue}"
IsChecked="{Binding DisableSubtitleDefault, Mode=TwoWay}">
<CheckBox.Content>
<TextBlock Text="Отключать субтитры"
FontSize="12"
LineHeight="16"
LineStackingStrategy="BlockLineHeight" />
</CheckBox.Content>
<CheckBox.ToolTip>
<ToolTip MaxWidth="360">
<TextBlock TextWrapping="Wrap"
Text="Если включено, у всех subtitle-дорожек Default будет выключен." />
</ToolTip>
</CheckBox.ToolTip>
</CheckBox>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="1" <StackPanel Grid.Column="1"