emby-toolbox/EmbyToolbox/Views/FileConversionSettingsWindow.xaml
Emby Toolbox 6264b487fe Initial commit: Emby Toolbox (conversion scroll fix, bulk Del for tracks).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 21:33:47 +05:00

649 lines
39 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<Window x:Class="EmbyToolbox.Views.FileConversionSettingsWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:models="clr-namespace:EmbyToolbox.Models"
xmlns:vm="clr-namespace:EmbyToolbox.ViewModels"
xmlns:converters="clr-namespace:EmbyToolbox.Converters"
xmlns:behaviors="clr-namespace:EmbyToolbox.Behaviors"
Title="Настройки конвертации файла"
MinWidth="900"
MinHeight="600"
Width="960"
Height="800"
WindowStartupLocation="CenterOwner"
Background="{DynamicResource Ui.Brush.Surface}">
<Window.InputBindings>
<KeyBinding Key="Enter"
Modifiers="Control"
Command="{Binding SaveAndCloseCommand}" />
</Window.InputBindings>
<Window.Resources>
<converters:BooleanToVisibilityConverter x:Key="BoolToVis" />
<converters:TrackActionKindToRussianConverter x:Key="TrackActionRu" />
<!-- Две строки текста в ячейках Title / Details -->
<Style x:Key="TracksGridWrapTextDisplay" TargetType="TextBlock" BasedOn="{StaticResource UiDataGridTextElement}">
<Setter Property="FontSize" Value="11" />
<Setter Property="LineHeight" Value="16" />
<Setter Property="LineStackingStrategy" Value="BlockLineHeight" />
<Setter Property="MaxHeight" Value="32" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="TextTrimming" Value="CharacterEllipsis" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<!-- Пастельные фоны дорожек (таблица настроек) -->
<SolidColorBrush x:Key="TracksRow.DefaultBg" Color="{DynamicResource C.Track.DefaultBg}" />
<SolidColorBrush x:Key="TracksRow.ConvertBg" Color="{DynamicResource C.Track.ConvertBg}" />
<SolidColorBrush x:Key="TracksRow.RemoveBg" Color="{DynamicResource C.Track.RemoveBg}" />
<SolidColorBrush x:Key="TracksRow.NormalBg" Color="{DynamicResource C.Track.NormalBg}" />
<SolidColorBrush x:Key="TracksRow.HoverDefault" Color="{DynamicResource C.Track.HoverDefault}" />
<SolidColorBrush x:Key="TracksRow.HoverConvert" Color="{DynamicResource C.Track.HoverConvert}" />
<SolidColorBrush x:Key="TracksRow.HoverRemove" Color="{DynamicResource C.Track.HoverRemove}" />
<SolidColorBrush x:Key="TracksRow.SelDefault" Color="{DynamicResource C.Track.SelDefault}" />
<SolidColorBrush x:Key="TracksRow.SelConvert" Color="{DynamicResource C.Track.SelConvert}" />
<SolidColorBrush x:Key="TracksRow.SelRemove" Color="{DynamicResource C.Track.SelRemove}" />
<SolidColorBrush x:Key="TracksRow.SelNormal" Color="{DynamicResource C.Track.SelNormal}" />
<SolidColorBrush x:Key="TracksRow.SelHoverDefault" Color="{DynamicResource C.Track.SelHoverDefault}" />
<SolidColorBrush x:Key="TracksRow.SelHoverConvert" Color="{DynamicResource C.Track.SelHoverConvert}" />
<SolidColorBrush x:Key="TracksRow.SelHoverRemove" Color="{DynamicResource C.Track.SelHoverRemove}" />
<SolidColorBrush x:Key="TracksRow.SelHoverNormal" Color="{DynamicResource C.Track.SelHoverNormal}" />
<SolidColorBrush x:Key="TracksRow.SelectionStripe" Color="{DynamicResource C.Track.SelectionStripe}" />
<SolidColorBrush x:Key="TracksRow.ConflictBorder" Color="{DynamicResource C.Track.ConflictBorder}" />
</Window.Resources>
<Grid ClipToBounds="False">
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" MinHeight="220" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Margin="0,0,0,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button Grid.Column="0"
VerticalAlignment="Center"
MinWidth="34"
Width="34"
MinHeight="{StaticResource Ui.BaseControlHeight}"
Height="{StaticResource Ui.BaseControlHeight}"
Margin="0,0,8,0"
Padding="0"
Style="{StaticResource UiButtonPrimary}"
Command="{Binding PlayFileCommand}"
CommandParameter="{Binding FilePath}"
ToolTip="{Binding PlayFileToolTip}">
<TextBlock Style="{StaticResource UiMdlGlyphOnPrimary}"
Text="&#xE768;"
Margin="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="15" />
</Button>
<TextBlock Grid.Column="1"
Text="{Binding FilePath, Mode=OneWay}"
TextWrapping="Wrap"
FontSize="12"
Foreground="{DynamicResource Ui.Brush.Text}"
VerticalAlignment="Center" />
</Grid>
<TextBlock Margin="0,6,0,0" FontSize="11" Foreground="{DynamicResource Ui.Brush.Caption}">
<Run Text="Профиль: " />
<Run Text="{Binding ProfileName, Mode=OneWay}" />
</TextBlock>
<TextBlock Margin="0,4,0,0" Text="{Binding PlanPreview, Mode=OneWay}" TextWrapping="Wrap" FontSize="12" Foreground="{DynamicResource Ui.Brush.Text}" />
<TextBlock Margin="0,8,0,0" Text="Дорожки" FontSize="11" />
</StackPanel>
<Grid Grid.Row="1" ClipToBounds="False">
<DataGrid x:Name="TracksGrid"
ItemsSource="{Binding TrackRows, Mode=OneWay}"
AutoGenerateColumns="False"
IsReadOnly="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
SelectionUnit="FullRow"
SelectionMode="Extended"
EnableRowVirtualization="True"
EnableColumnVirtualization="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
RowHeaderWidth="0"
RowHeight="38"
FontSize="11"
Foreground="{DynamicResource Ui.Brush.Text}"
VerticalAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
behaviors:DataGridRightClickSelectionBehavior.IsEnabled="True"
behaviors:DataGridSelectionChangedCommandBehavior.Command="{Binding OnSelectionChangedCommand}"
Style="{StaticResource UiDataGrid}"
Panel.ZIndex="0"
LoadingRow="TracksGrid_LoadingRow">
<DataGrid.InputBindings>
<KeyBinding Key="Delete"
Command="{Binding SetSelectedTracksRemoveCommand}"
CommandParameter="{Binding ElementName=TracksGrid, Path=SelectedItems}" />
<KeyBinding Key="Delete" Modifiers="Shift"
Command="{Binding MarkForeignTracksForRemovalCommand}" />
</DataGrid.InputBindings>
<DataGrid.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Оставить"
Command="{Binding ContextSetActionCommand}"
CommandParameter="{x:Static models:TrackActionKind.Keep}" />
<MenuItem Header="Конвертировать"
Command="{Binding ContextSetActionCommand}"
CommandParameter="{x:Static models:TrackActionKind.Convert}" />
<MenuItem Header="Удалить"
InputGestureText="Del"
Command="{Binding ContextSetActionCommand}"
CommandParameter="{x:Static models:TrackActionKind.Remove}" />
<MenuItem Header="Добавить"
Command="{Binding ContextSetActionCommand}"
CommandParameter="{x:Static models:TrackActionKind.Add}" />
<Separator />
<MenuItem Header="128 kbps"
Command="{Binding ContextSetBitrateCommand}"
CommandParameter="128 kbps" />
<MenuItem Header="192 kbps"
Command="{Binding ContextSetBitrateCommand}"
CommandParameter="192 kbps" />
<MenuItem Header="256 kbps"
Command="{Binding ContextSetBitrateCommand}"
CommandParameter="256 kbps" />
<MenuItem Header="320 kbps"
Command="{Binding ContextSetBitrateCommand}"
CommandParameter="320 kbps" />
<Separator />
<MenuItem Header="Удалить иностранные дорожки"
InputGestureText="Shift+Del"
Command="{Binding MarkForeignTracksForRemovalCommand}" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource UiDataGridColumnHeader}" />
</DataGrid.ColumnHeaderStyle>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource UiDataGridCell}">
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Padding" Value="4,2" />
<!-- Фон строки — у DataGridRow; ячейки не перекрывают Selection -->
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
<Setter Property="Background" Value="Transparent" />
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow" BasedOn="{StaticResource UiDataGridRow}">
<Setter Property="Background" Value="{StaticResource TracksRow.NormalBg}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Style.Triggers>
<!-- Не выбрано: пастель по статусу (порядок как раньше: Default → Convert → Remove) -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False" />
<Condition Binding="{Binding Default}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.DefaultBg}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Convert}" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.ConvertBg}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Remove}" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.RemoveBg}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<!-- Hover без выделения: лёгкое затемнение -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Remove}" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.HoverRemove}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Convert}" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.HoverConvert}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding Default}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.HoverDefault}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<!-- Конфликт Def без выделения -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False" />
<Condition Binding="{Binding HasDefaultConflict}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.ConflictBorder}" />
<Setter Property="BorderThickness" Value="1" />
</MultiDataTrigger>
<!-- Выбрано без hover: более поздний триггер перекрывает — порядок низший→высший: Keep/Add, Default, Convert, Remove -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="False" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Keep}" />
<Condition Binding="{Binding Default}" Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelNormal}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="False" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Add}" />
<Condition Binding="{Binding Default}" Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelNormal}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="False" />
<Condition Binding="{Binding Default}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelDefault}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="False" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Convert}" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelConvert}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="False" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Remove}" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelRemove}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<!-- Выбрано + hover (тот же приоритет по действию) -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Keep}" />
<Condition Binding="{Binding Default}" Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelHoverNormal}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Add}" />
<Condition Binding="{Binding Default}" Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelHoverNormal}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding Default}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelHoverDefault}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Convert}" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelHoverConvert}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding Action}" Value="{x:Static models:TrackActionKind.Remove}" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource TracksRow.SelHoverRemove}" />
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.SelectionStripe}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
<!-- Teletext subtitle: текст строки акцентом ошибки -->
<DataTrigger Binding="{Binding IsTeletextSubtitle}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.ErrorText}" />
</DataTrigger>
<!-- Конфликт + выбрано — тонкий контур поверх маркировки выбора -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
<Condition Binding="{Binding HasDefaultConflict}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="BorderBrush" Value="{StaticResource TracksRow.ConflictBorder}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="#" Binding="{Binding IndexDisplay, Mode=OneWay}" IsReadOnly="True" MinWidth="32" />
<DataGridTextColumn Header="сточник" Binding="{Binding SourceDisplay, Mode=OneWay}" IsReadOnly="True" MinWidth="80" />
<DataGridTextColumn Header="Тип" Binding="{Binding TypeDisplay, Mode=OneWay}" IsReadOnly="True" MinWidth="60" />
<DataGridTextColumn Header="Codec" Binding="{Binding Codec, Mode=OneWay}" IsReadOnly="True" MinWidth="70" />
<DataGridTextColumn Header="Language" Binding="{Binding Language, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="64" />
<DataGridTextColumn Header="Title"
Binding="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Width="*"
MinWidth="160"
MaxWidth="340">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock" BasedOn="{StaticResource TracksGridWrapTextDisplay}">
<Setter Property="ToolTip" Value="{Binding Title, Mode=OneWay}" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="AcceptsReturn" Value="True" />
<Setter Property="VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="MaxHeight" Value="64" />
<Setter Property="FontSize" Value="11" />
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn Header="Def" MinWidth="44">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Default, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{Binding IsDefaultEnabled, Mode=OneWay}" HorizontalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Действие" MinWidth="110">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Style="{StaticResource UiCombo}"
ItemsSource="{Binding ValidActions, Mode=OneWay}"
SelectedItem="{Binding Action, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource TrackActionRu}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Битрейт" MinWidth="88">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Style="{StaticResource UiCombo}"
Visibility="{Binding IsAudioBitrateVisible, Mode=OneWay, Converter={StaticResource BoolToVis}}"
ItemsSource="{Binding DataContext.FormOptions.AudioBitrateKbps, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedItem="{Binding AudioBitrateKbps, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Details" Width="*" MinWidth="160" MaxWidth="360">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Style="{StaticResource TracksGridWrapTextDisplay}"
Text="{Binding Details, Mode=OneWay}"
ToolTip="{Binding Details, Mode=OneWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<!-- Toast поверх таблицы дорожек (не сдвигает layout DataGrid) -->
<Border HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Margin="8,44,8,0"
MaxHeight="108"
Panel.ZIndex="1"
Background="Transparent"
Cursor="Hand"
Visibility="{Binding IsToastVisible, Converter={StaticResource BoolToVis}}">
<Border.InputBindings>
<MouseBinding MouseAction="LeftClick" Command="{Binding CloseToastCommand}" />
</Border.InputBindings>
<Border HorizontalAlignment="Right"
MaxWidth="420"
CornerRadius="6"
Background="Transparent">
<Border.Effect>
<DropShadowEffect BlurRadius="14"
Direction="282"
Opacity="0.22"
ShadowDepth="2" />
</Border.Effect>
<Border CornerRadius="6"
Padding="14,12"
BorderThickness="2">
<Border.Style>
<Style TargetType="Border">
<!-- Full (Success) по умолчанию -->
<Setter Property="Background" Value="{DynamicResource Ui.Brush.Track.DefaultBg}" />
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.Toast.SuccessBorder}" />
<Style.Triggers>
<DataTrigger Binding="{Binding ToastKind}" Value="{x:Static vm:ToastKind.Warning}">
<Setter Property="Background" Value="{DynamicResource Ui.Brush.Toast.WarningBg}" />
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.Toast.WarningBorder}" />
</DataTrigger>
<DataTrigger Binding="{Binding ToastKind}" Value="{x:Static vm:ToastKind.Error}">
<Setter Property="Background" Value="{DynamicResource Ui.Brush.Toast.ErrorBg}" />
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.Toast.ErrorBorder}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{Binding ToastIconGlyph}"
FontFamily="Segoe MDL2 Assets"
FontSize="20"
TextAlignment="Center"
Margin="0,0,12,0"
VerticalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Toast.SuccessIcon}" />
<Style.Triggers>
<DataTrigger Binding="{Binding ToastKind}" Value="{x:Static vm:ToastKind.Warning}">
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Toast.WarningIcon}" />
</DataTrigger>
<DataTrigger Binding="{Binding ToastKind}" Value="{x:Static vm:ToastKind.Error}">
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Toast.ErrorBorder}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Grid.Column="1"
Text="{Binding ToastMessage}"
FontSize="13"
FontWeight="SemiBold"
TextWrapping="Wrap"
LineHeight="18"
VerticalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</Border>
</Border>
</Border>
</Grid>
<StackPanel Grid.Row="2" Margin="0,4,0,0" VerticalAlignment="Top">
<TextBlock Text="Параметры видео" FontSize="11" Margin="0,0,0,4" />
<Grid MaxWidth="620" HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="200" />
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Margin="0,0,8,0">
<TextBlock Text="Контейнер" Margin="0,0,0,2" FontSize="11" />
<ComboBox Width="180" Style="{StaticResource UiCombo}" FontSize="11"
ItemsSource="{Binding FormOptions.ContainerOptions}" SelectedItem="{Binding TargetContainer, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<TextBlock Text="{Binding CurrentFileContainer, StringFormat='Текущее: {0}'}" Margin="2,2,0,0" FontSize="10" Foreground="{DynamicResource Ui.Brush.Muted}" TextTrimming="CharacterEllipsis" />
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" Margin="0,0,8,0">
<TextBlock Text="Видео" Margin="0,0,0,2" FontSize="11" />
<ComboBox Width="180" Style="{StaticResource UiCombo}" FontSize="11"
ItemsSource="{Binding FormOptions.VideoCodecOptions}" SelectedItem="{Binding TargetVideo, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<TextBlock Text="{Binding CurrentFileVideo, StringFormat='Текущее: {0}'}" Margin="2,2,0,0" FontSize="10" Foreground="{DynamicResource Ui.Brush.Muted}" TextTrimming="CharacterEllipsis" />
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="2">
<TextBlock Text="Pixel format" Margin="0,0,0,2" FontSize="11" />
<ComboBox Width="180" Style="{StaticResource UiCombo}" FontSize="11"
ItemsSource="{Binding FormOptions.PixelFormatOptions}" SelectedItem="{Binding TargetPixelFormat, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<TextBlock Text="{Binding CurrentFilePixel, StringFormat='Текущее: {0}'}" Margin="2,2,0,0" FontSize="10" Foreground="{DynamicResource Ui.Brush.Muted}" TextTrimming="CharacterEllipsis" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" Margin="0,6,8,0">
<TextBlock Text="Разрешение" Margin="0,0,0,2" FontSize="11" />
<ComboBox Width="180" Style="{StaticResource UiCombo}" FontSize="11"
ItemsSource="{Binding FormOptions.ResolutionOptions}" SelectedItem="{Binding TargetResolution, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<TextBlock Text="{Binding CurrentFileResolution, StringFormat='Текущее: {0}'}" Margin="2,2,0,0" FontSize="10" Foreground="{DynamicResource Ui.Brush.Muted}" TextTrimming="CharacterEllipsis" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1" Margin="0,6,8,0">
<TextBlock Text="FPS" Margin="0,0,0,2" FontSize="11" />
<ComboBox Width="180" Style="{StaticResource UiCombo}" FontSize="11"
ItemsSource="{Binding FormOptions.FpsOptions}" SelectedItem="{Binding TargetFps, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<TextBlock Text="{Binding CurrentFileFps, StringFormat='Текущее: {0}'}" Margin="2,2,0,0" FontSize="10" Foreground="{DynamicResource Ui.Brush.Muted}" TextTrimming="CharacterEllipsis" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="2" Margin="0,6,0,0">
<TextBlock Text="Видеобитрейт" Margin="0,0,0,2" FontSize="11" />
<ComboBox Width="180"
Style="{StaticResource UiCombo}"
FontSize="11"
MinHeight="{StaticResource Ui.BaseControlHeight}"
ItemsSource="{Binding VideoBitrateOptions}"
SelectedItem="{Binding TargetVideoBitrateMode, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<TextBlock Text="{Binding CurrentFileVideoBitrate}"
Margin="2,2,0,0"
FontSize="10"
Foreground="{DynamicResource Ui.Brush.Muted}"
TextTrimming="CharacterEllipsis" />
<StackPanel Margin="0,6,0,0"
Visibility="{Binding IsVideoBitrateCustomVisible, Converter={StaticResource BoolToVis}}">
<TextBlock Text="Custom bitrate, Mbps" Margin="0,0,0,2" FontSize="11" />
<TextBox Width="180"
Style="{StaticResource UiTextInput}"
FontSize="11"
MinHeight="{StaticResource Ui.BaseControlHeight}"
Text="{Binding VideoBitrateCustomMbps, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</StackPanel>
</Grid>
</StackPanel>
<Grid Grid.Row="3" Margin="0,8,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding SnapshotStatusText}"
VerticalAlignment="Center"
Foreground="{DynamicResource Ui.Brush.Caption}" />
<Button Margin="12,0,0,0"
MinWidth="190"
Content="Отменить автоприменение"
Command="{Binding UndoAutoApplyCommand}">
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource UiButtonSecondary}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsAutoAppliedFromSnapshot}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button MinWidth="100" Margin="0,0,8,0" Style="{StaticResource UiButtonPrimary}" Content="Сохранить" Command="{Binding SaveCommand}" />
<Button MinWidth="100" Style="{StaticResource UiButtonSecondary}" Content="Отмена" Command="{Binding CancelCommand}" />
</StackPanel>
</Grid>
</Grid>
</Grid>
</Window>