emby-toolbox/EmbyToolbox/MainWindow.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

1063 lines
57 KiB
XML
Raw 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.MainWindow"
x:Name="RootWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework"
xmlns:behaviors="clr-namespace:EmbyToolbox.Behaviors"
xmlns:views="clr-namespace:EmbyToolbox.Views"
xmlns:viewModels="clr-namespace:EmbyToolbox.ViewModels"
xmlns:converters="clr-namespace:EmbyToolbox.Converters"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
Title="Emby Toolbox"
Icon="/Resources/AppIcon.ico"
MinWidth="800"
MinHeight="500"
Width="1100"
Height="750"
Background="{DynamicResource Ui.Brush.Window}"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<converters:BooleanToVisibilityConverter x:Key="BoolToVis" />
</Window.Resources>
<Window.TaskbarItemInfo>
<shell:TaskbarItemInfo ProgressState="{Binding TaskbarProgressState, Mode=OneWay}"
ProgressValue="{Binding TaskbarProgressValue, Mode=OneWay}" />
</Window.TaskbarItemInfo>
<Grid Margin="{StaticResource Ui.PagePadding}">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TabControl Grid.Row="0" Style="{StaticResource UiTabControl}" SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTab}" Text="&#xE8AC;" />
<TextBlock Text="Переименование сериалов" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<Grid DataContext="{Binding SeriesRenamer}">
<Grid.Resources>
<Style x:Key="SeriesTreeItemStyle" TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</Style>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="8" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<TextBox x:Name="SeriesRootPathBox"
Style="{StaticResource UiTextInput}"
Text="{Binding RootFolderPath, Mode=OneWay}"
IsReadOnly="True"
HorizontalAlignment="Stretch" />
<TextBlock Margin="8,0,0,0"
VerticalAlignment="Center"
IsHitTestVisible="False"
Text="Выберите корневую папку сериала...">
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource UiTextCaption}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=SeriesRootPathBox}" Value="">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
<Button Grid.Column="2"
MinWidth="100"
Style="{StaticResource UiButtonSecondary}"
Command="{Binding SelectRootFolderCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE838;" />
<TextBlock Text="Выбрать" VerticalAlignment="Center" />
</StackPanel>
</Button>
</Grid>
<Grid Margin="0,8,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="8" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Style="{StaticResource UiTextCaption}"
Text="Имя сериала:"
VerticalAlignment="Center" />
<Grid Grid.Column="2">
<TextBox x:Name="SeriesNameBox"
Style="{StaticResource UiTextInput}"
Text="{Binding SeriesName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Stretch" />
<TextBlock Margin="8,0,0,0"
VerticalAlignment="Center"
IsHitTestVisible="False"
Text="Введите имя сериала...">
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource UiTextCaption}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=SeriesNameBox}" Value="">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</Grid>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="12,0,0,0">
<Button Style="{StaticResource UiButtonSecondary}" MinWidth="108" Margin="0,0,8,0" Command="{Binding RefreshPreviewCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE72C;" />
<TextBlock Text="Обновить" VerticalAlignment="Center" />
</StackPanel>
</Button>
<Button Style="{StaticResource UiButtonPrimary}" MinWidth="108" Command="{Binding RunRenameCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphOnPrimary}" Text="&#xE768;" />
<TextBlock Text="Запустить" VerticalAlignment="Center" />
</StackPanel>
</Button>
</StackPanel>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="6" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0"
Padding="6"
Background="{DynamicResource Ui.Brush.Surface}"
behaviors:SeriesRenamerDropTargetBehavior.IsEnabled="True">
<Border.Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.BorderSubtle}" />
<Setter Property="BorderThickness" Value="1" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsRootTreeDragOver}" Value="True">
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.Accent}" />
<Setter Property="BorderThickness" Value="2" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<TreeView ItemsSource="{Binding CurrentTree}"
BorderThickness="0"
Background="Transparent"
ItemContainerStyle="{StaticResource SeriesTreeItemStyle}"
behaviors:TreeViewScrollSyncBehavior.SyncGroup="SeriesRenameTrees">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type viewModels:RenameTreeNodeViewModel}" ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTree}" Text="{Binding IconGlyph}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Border>
<GridSplitter Grid.Column="1" Width="6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{DynamicResource Ui.Brush.BorderSubtle}" ShowsPreview="True" />
<Border Grid.Column="2" BorderBrush="{DynamicResource Ui.Brush.BorderSubtle}" BorderThickness="1" Background="{DynamicResource Ui.Brush.Surface}" Padding="6">
<Grid>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsPreviewSupported}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<TreeView ItemsSource="{Binding PreviewTree}"
BorderThickness="0"
Background="Transparent"
ItemContainerStyle="{StaticResource SeriesTreeItemStyle}"
behaviors:TreeViewScrollSyncBehavior.SyncGroup="SeriesRenameTrees">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type viewModels:RenameTreeNodeViewModel}" ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTree}" Text="{Binding IconGlyph}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsPreviewSupported}" Value="False">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphEmpty}" Text="&#xE946;" />
<TextBlock Style="{StaticResource UiTextH2}" Text="Невозможно построить предпросмотр" Margin="0,8,0,0" HorizontalAlignment="Center" />
<TextBlock Style="{StaticResource UiTextCaption}" Text="Проверьте структуру каталогов" HorizontalAlignment="Center" Margin="0,4,0,0" />
<TextBlock Style="{StaticResource UiTextCaption}" Text="{Binding UnsupportedReason}" HorizontalAlignment="Center" Margin="0,4,0,0" TextWrapping="Wrap" MaxWidth="320" />
</StackPanel>
</Grid>
</Grid>
</Border>
</Grid>
</Grid>
</TabItem>
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTab}" Text="&#xE9F5;" />
<TextBlock Text="Конвертация" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<views:ConversionView DataContext="{Binding Conversion}" />
</TabItem>
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTab}" Text="&#xEA3C;" />
<TextBlock Text="Объединение" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<views:MergeView DataContext="{Binding Merge}" />
</TabItem>
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTab}" Text="&#xE8BF;" />
<TextBlock Text="Извлечение дорожек" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<views:TrackExtractionView DataContext="{Binding TrackExtraction}" />
</TabItem>
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTab}" Text="&#xE946;" />
<TextBlock Text="Video info" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<Grid DataContext="{Binding VideoInfo}">
<TabControl Style="{StaticResource UiTabControl}" SelectedIndex="{Binding SelectedSubTabIndex, Mode=TwoWay}">
<TabItem Header="Краткая информация">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Grid.Row="0"
BorderBrush="{DynamicResource Ui.Brush.BorderSubtle}"
BorderThickness="0,0,0,1"
Padding="0,0,0,8"
Margin="0,0,0,8">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<Button Style="{StaticResource UiButtonSecondary}"
MinWidth="132"
Command="{Binding SelectSummaryFilesCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE8E5;" />
<TextBlock Text="Выбрать файлы" VerticalAlignment="Center" />
</StackPanel>
</Button>
</StackPanel>
</Border>
<Border Grid.Row="1"
Padding="8"
Background="{DynamicResource Ui.Brush.Surface}"
behaviors:VideoInfoDropTargetBehavior.IsEnabled="True">
<Border.Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.BorderSubtle}" />
<Setter Property="BorderThickness" Value="1" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsVideoInfoDropHighlight}" Value="True">
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.Accent}" />
<Setter Property="BorderThickness" Value="2" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding HasSummaryData}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<TextBox Text="{Binding SummaryText, Mode=OneWay}"
IsReadOnly="True"
AcceptsReturn="True"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
FontFamily="Consolas"
TextWrapping="NoWrap"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
Style="{StaticResource UiLog}" />
</Grid>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding HasSummaryData}" Value="False">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphEmpty}" Text="&#xE946;" />
<TextBlock Style="{StaticResource UiTextH2}"
Margin="0,8,0,0"
HorizontalAlignment="Center"
Text="Нет данных для отображения" />
</StackPanel>
</Grid>
</Grid>
</Border>
</Grid>
</TabItem>
<TabItem Header="Подробная информация">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="8" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<TextBox x:Name="VideoInfoFilePathBox"
Style="{StaticResource UiTextInput}"
Text="{Binding SelectedFilePath, Mode=OneWay}"
IsReadOnly="True"
HorizontalAlignment="Stretch" />
<TextBlock Margin="8,0,0,0"
VerticalAlignment="Center"
IsHitTestVisible="False"
Text="Выберите видеофайл для анализа...">
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource UiTextCaption}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=VideoInfoFilePathBox}" Value="">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
<Button Grid.Column="2"
MinWidth="100"
Style="{StaticResource UiButtonSecondary}"
Command="{Binding SelectFileCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE8E5;" />
<TextBlock Text="Выбрать" VerticalAlignment="Center" />
</StackPanel>
</Button>
</Grid>
<Border Grid.Row="1"
BorderBrush="{DynamicResource Ui.Brush.BorderSubtle}"
BorderThickness="0,0,0,1"
Padding="0,0,0,8"
Margin="0,0,0,8">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<Button Style="{StaticResource UiButtonSecondary}" Margin="0,0,8,0" MinWidth="126" Command="{Binding ExpandAllCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Развернуть всё" VerticalAlignment="Center" />
</StackPanel>
</Button>
<Button Style="{StaticResource UiButtonSecondary}" Margin="0,0,8,0" MinWidth="126" Command="{Binding CollapseAllCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Свернуть всё" VerticalAlignment="Center" />
</StackPanel>
</Button>
<Button Style="{StaticResource UiButtonSecondary}" Margin="0,0,8,0" MinWidth="132" Command="{Binding CopyJsonCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE8C8;" />
<TextBlock Text="Копировать JSON" VerticalAlignment="Center" />
</StackPanel>
</Button>
<Button Style="{StaticResource UiButtonSecondary}" MinWidth="130" Command="{Binding SaveJsonCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE74E;" />
<TextBlock Text="Сохранить JSON" VerticalAlignment="Center" />
</StackPanel>
</Button>
</StackPanel>
</Border>
<Border Grid.Row="2"
Padding="8,4,8,8"
Background="{DynamicResource Ui.Brush.Surface}"
behaviors:VideoInfoDropTargetBehavior.IsEnabled="True">
<Border.Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.BorderSubtle}" />
<Setter Property="BorderThickness" Value="1" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsVideoInfoDropHighlight}" Value="True">
<Setter Property="BorderBrush" Value="{DynamicResource Ui.Brush.Accent}" />
<Setter Property="BorderThickness" Value="2" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.Resources>
<Style x:Key="VideoInfoTreeItemStyle" TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="Padding" Value="2,1" />
<Setter Property="Margin" Value="0,0,0,1" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<EventSetter Event="PreviewMouseRightButtonDown" Handler="OnJsonTreeItemPreviewMouseRightButtonDown" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Копировать значение"
Command="{Binding DataContext.VideoInfo.CopyNodeValueCommand, Source={x:Reference RootWindow}}"
CommandParameter="{Binding}" />
<MenuItem Header="Копировать узел"
Command="{Binding DataContext.VideoInfo.CopyNodeLineCommand, Source={x:Reference RootWindow}}"
CommandParameter="{Binding}" />
<MenuItem Header="Копировать узел с дочерними элементами"
Command="{Binding DataContext.VideoInfo.CopyNodeWithChildrenCommand, Source={x:Reference RootWindow}}"
CommandParameter="{Binding}" />
<Separator />
<MenuItem Header="Копировать путь к узлу"
Command="{Binding DataContext.VideoInfo.CopyNodePathCommand, Source={x:Reference RootWindow}}"
CommandParameter="{Binding}" />
</ContextMenu>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{DynamicResource Ui.Brush.DataRowSelected}" />
<Setter Property="Foreground" Value="{DynamicResource Ui.Brush.Text}" />
<Setter Property="TextElement.Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Grid Grid.RowSpan="2">
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedFilePath}" Value="">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphEmpty}" Text="&#xE946;" />
<TextBlock Style="{StaticResource UiTextH2}"
Margin="0,8,0,0"
HorizontalAlignment="Center"
Text="Нет данных для отображения" />
<TextBlock Style="{StaticResource UiTextCaption}"
Margin="0,4,0,0"
HorizontalAlignment="Center"
Text="Выберите файл для получения информации через ffprobe" />
</StackPanel>
</Grid>
<TextBlock Grid.Row="0"
Text="{Binding ErrorMessage}"
Margin="0,0,0,8"
TextWrapping="Wrap">
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource UiTextError}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TreeView Grid.Row="1" ItemsSource="{Binding JsonNodes}" Margin="0" BorderThickness="0" Background="Transparent">
<TreeView.Style>
<Style TargetType="TreeView">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedFilePath}" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</TreeView.Style>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type viewModels:JsonTreeNodeViewModel}" ItemsSource="{Binding Children}">
<Border Background="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=Background}" Padding="2,1">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<TextBlock Text=": " />
<TextBlock Text="{Binding Value}" Foreground="{DynamicResource Ui.Brush.Muted}" />
</StackPanel>
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="Transparent" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource Ui.Brush.DataRowHover}" />
</Trigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsSelected}" Value="True">
<Setter Property="Background" Value="{DynamicResource Ui.Brush.DataRowSelected}" />
<Setter Property="TextElement.Foreground" Value="{DynamicResource Ui.Brush.Text}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</HierarchicalDataTemplate>
</TreeView.Resources>
<TreeView.ItemContainerStyle>
<StaticResource ResourceKey="VideoInfoTreeItemStyle" />
</TreeView.ItemContainerStyle>
</TreeView>
</Grid>
</Border>
</Grid>
</TabItem>
</TabControl>
</Grid>
</TabItem>
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTab}" Text="&#xE713;" />
<TextBlock Text="Настройки" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0"
VerticalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
Padding="0">
<Border Style="{StaticResource UiSectionCard}"
Margin="0,0,0,12"
HorizontalAlignment="Stretch">
<StackPanel HorizontalAlignment="Stretch">
<TextBlock Style="{StaticResource UiTextH2}" Text="Каталоги" />
<TextBlock Style="{StaticResource UiTextCaption}"
Margin="0,12,0,4"
Text="TEMP-каталог" />
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="8" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<TextBox x:Name="SettingsTempPathBox"
Style="{StaticResource UiTextInput}"
HorizontalAlignment="Stretch"
Text="{Binding ProcessingTempDirectory, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Margin="8,0,0,0"
VerticalAlignment="Center"
IsHitTestVisible="False"
Text="C:\Users\me\AppData\Local\Temp\EmbyToolbox">
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource UiTextCaption}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=SettingsTempPathBox}" Value="">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
<Button Grid.Column="2"
MinWidth="100"
Style="{StaticResource UiButtonSecondary}"
Command="{Binding ChooseTempDirectoryCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE838;" />
<TextBlock Text="Выбрать" VerticalAlignment="Center" />
</StackPanel>
</Button>
</Grid>
<TextBlock Style="{StaticResource UiTextCaption}"
Margin="0,6,0,0"
Text="Временный каталог для промежуточных файлов" />
<TextBlock Style="{StaticResource UiTextCaption}"
Margin="0,12,0,4"
Text="Минимальный уровень сохранения логов" />
<ComboBox Style="{StaticResource UiCombo}"
MinWidth="200"
Margin="0,0,24,0"
HorizontalAlignment="Stretch"
ItemsSource="{Binding LogLevelOptions}"
SelectedItem="{Binding MinimumFileLogLevel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Style="{StaticResource UiTextCaption}"
Margin="0,12,0,4"
Text="Аппаратное ускорение" />
<ComboBox Style="{StaticResource UiCombo}"
MinWidth="200"
Margin="0,0,24,0"
HorizontalAlignment="Stretch"
ItemsSource="{Binding HardwareAccelerationOptions}"
SelectedItem="{Binding HardwareAcceleration, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Style="{StaticResource UiTextH2}" Margin="0,16,0,8" Text="Уведомления о конвертации" />
<CheckBox Margin="0,8,0,0"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Top"
FocusVisualStyle="{x:Null}"
IsChecked="{Binding NotifyCompletionSoundAfterQueue, Mode=TwoWay}">
<CheckBox.ToolTip>
<ToolTip MaxWidth="360">
<TextBlock TextWrapping="Wrap"
Text="После обработки всей очереди конвертации воспроизводится системный звук успеха или ошибки (Windows)." />
</ToolTip>
</CheckBox.ToolTip>
<TextBlock Text="Звуковое уведомление после завершения"
TextWrapping="Wrap"
VerticalAlignment="Center" />
</CheckBox>
<CheckBox Margin="0,6,0,0"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Top"
FocusVisualStyle="{x:Null}"
IsChecked="{Binding NotifyWindowsToastAfterQueue, Mode=TwoWay}">
<CheckBox.ToolTip>
<ToolTip MaxWidth="360">
<TextBlock TextWrapping="Wrap"
Text="В центре уведомлений показывается итог обработки всей очереди (или сообщение при остановке пользователем)." />
</ToolTip>
</CheckBox.ToolTip>
<TextBlock Text="Показывать уведомления Windows"
TextWrapping="Wrap"
VerticalAlignment="Center" />
</CheckBox>
<Button Margin="0,12,0,0"
MinHeight="34"
MinWidth="240"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center"
Style="{StaticResource UiButtonSecondary}"
Command="{Binding TestWindowsNotificationCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xEA8F;" />
<TextBlock Margin="8,0,0,0"
VerticalAlignment="Center"
TextWrapping="Wrap"
Text="Проверить уведомление" />
</StackPanel>
</Button>
<TextBlock Style="{StaticResource UiTextH2}" Margin="0,16,0,8" Text="Профили конвертации" />
<DataGrid ItemsSource="{Binding ConversionProfiles}"
SelectedItem="{Binding SelectedConversionProfile, Mode=TwoWay}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="False"
Style="{StaticResource UiDataGrid}"
RowStyle="{StaticResource UiDataGridRow}"
ColumnHeaderStyle="{StaticResource UiDataGridColumnHeader}"
CellStyle="{StaticResource UiDataGridCell}"
HeadersVisibility="Column"
GridLinesVisibility="Horizontal"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
MinHeight="160">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Профиль" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Profile, Mode=OneWay}" VerticalAlignment="Center" Foreground="{DynamicResource Ui.Brush.Text}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsBuiltIn}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBox Text="{Binding Profile, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
VerticalAlignment="Center">
<TextBox.Style>
<Style TargetType="TextBox" BasedOn="{StaticResource UiTextInput}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsBuiltIn}" Value="True">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Контейнер" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Container}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionContainerOptions, ElementName=RootWindow}"
SelectedItem="{Binding Container, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Видео" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Video}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionVideoCodecOptions, ElementName=RootWindow}"
SelectedItem="{Binding Video, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Pixel Format" Width="120">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding PixelFormat}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionPixelFormatOptions, ElementName=RootWindow}"
SelectedItem="{Binding PixelFormat, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Разрешение" Width="145">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Resolution}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionResolutionOptions, ElementName=RootWindow}"
SelectedItem="{Binding Resolution, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="FPS" Width="130">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Fps}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionFpsOptions, ElementName=RootWindow}"
SelectedItem="{Binding Fps, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Аудио" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Audio}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionAudioCodecOptions, ElementName=RootWindow}"
SelectedItem="{Binding Audio, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Битрейт" Width="110">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Bitrate}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionBitrateOptions, ElementName=RootWindow}"
SelectedItem="{Binding Bitrate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Видеобитрейт" Width="120">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding VideoBitrateMode}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionVideoBitrateOptions, ElementName=RootWindow}"
SelectedItem="{Binding VideoBitrateMode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Субтитры" Width="95">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Subtitles}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionYesNoOptions, ElementName=RootWindow}"
SelectedItem="{Binding Subtitles, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Внешние дорожки" Width="125">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ExternalTracks}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionYesNoOptions, ElementName=RootWindow}"
SelectedItem="{Binding ExternalTracks, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Внешние субтитры" Width="135">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ExternalSubtitles}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionYesNoOptions, ElementName=RootWindow}"
SelectedItem="{Binding ExternalSubtitles, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Шрифты" Width="85">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Fonts}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.ConversionYesNoOptions, ElementName=RootWindow}"
SelectedItem="{Binding Fonts, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<StackPanel Orientation="Horizontal" Margin="0,8,0,0" HorizontalAlignment="Left">
<Button Style="{StaticResource UiButtonSecondary}" Margin="0,0,8,0" MinWidth="150" Command="{Binding AddConversionProfileCommand}">
<TextBlock Text="Добавить профиль" />
</Button>
<Button Style="{StaticResource UiButtonDanger}" MinWidth="150" Command="{Binding RemoveConversionProfileCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE74D;" />
<TextBlock Text="Удалить профиль" VerticalAlignment="Center" />
</StackPanel>
</Button>
</StackPanel>
</StackPanel>
</Border>
</ScrollViewer>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Style="{StaticResource UiButtonSecondary}"
MinWidth="168"
Margin="0,0,8,0"
Command="{Binding CheckToolsCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE895;" />
<TextBlock Text="Проверить инструменты" VerticalAlignment="Center" />
</StackPanel>
</Button>
<Button Style="{StaticResource UiButtonSecondary}"
MinWidth="112"
Margin="0,0,8,0"
Command="{Binding CancelSettingsCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphButton}" Text="&#xE711;" />
<TextBlock Text="Отменить" VerticalAlignment="Center" />
</StackPanel>
</Button>
<Button Style="{StaticResource UiButtonPrimary}"
MinWidth="112"
Command="{Binding SaveSettingsCommand}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource UiMdlGlyphOnPrimary}" Text="&#xE74E;" />
<TextBlock Text="Сохранить" VerticalAlignment="Center" />
</StackPanel>
</Button>
</StackPanel>
</Grid>
</TabItem>
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource UiMdlGlyphTab}" Text="&#xE81C;" />
<TextBlock Text="Логи" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<views:LogsView DataContext="{Binding Logs}" />
</TabItem>
</TabControl>
<Border Grid.Row="1"
Margin="0,8,0,0"
Padding="8,4"
BorderBrush="{DynamicResource Ui.Brush.BorderSubtle}"
BorderThickness="1"
Background="{DynamicResource Ui.Brush.Surface}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Foreground="{DynamicResource Ui.Brush.Text}"
FontWeight="SemiBold"
Text="{Binding AppStatusText}" />
<Grid Grid.Column="1"
Margin="14,0,0,0"
VerticalAlignment="Center">
<TextBlock VerticalAlignment="Center"
Foreground="{DynamicResource Ui.Brush.Caption}"
Text="Нет задач"
Visibility="{Binding ShowLongOperationIdlePlaceholder, Converter={StaticResource BoolToVis}}" />
<Grid VerticalAlignment="Center"
Visibility="{Binding IsLongOperationRunning, Converter={StaticResource BoolToVis}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" MinWidth="24" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ProgressBar Grid.Column="0"
Width="210"
Height="10"
MinHeight="8"
MaxHeight="12"
Style="{StaticResource UiProgressBar}"
VerticalAlignment="Center"
Minimum="0"
Maximum="100"
Value="{Binding LongOperationProgressPercent, Mode=OneWay}" />
<TextBlock Grid.Column="1"
Margin="10,0,8,0"
VerticalAlignment="Center"
TextTrimming="CharacterEllipsis"
Foreground="{DynamicResource Ui.Brush.Text}"
Text="{Binding LongOperationProgressText, Mode=OneWay}" />
<TextBlock Grid.Column="2"
VerticalAlignment="Center"
MinWidth="58"
TextAlignment="Right"
Foreground="{DynamicResource Ui.Brush.Text}"
Text="{Binding LongOperationProgressPercent, Mode=OneWay, StringFormat={}{0:F2}%}" />
</Grid>
</Grid>
</Grid>
</Border>
</Grid>
</Window>