Add overall progress, notifications, and UI polish

- Unify audio/subtitle selection: single-select, auto-default,
  cross-file propagation by exact name
- Show file size in queue, group divider and reordered columns in
  track table, drop accent highlight on row selection
- Add cumulative progress bar (files finished, MB copied) to the
  stripping window
- Add Windows toast notifications on stripping completion/cancel/error
- Restart the app after settings are changed; Cancel no longer
  clears the queue, only closes the window
- Add ConfigureAwait(false) throughout MkvService so concurrent
  strips don't starve the UI thread
- Hardcode scan/strip concurrency (10/5) instead of exposing it in
  Settings
This commit is contained in:
l4kr
2026-07-04 02:35:26 +02:00
parent 9b1bd51bd3
commit 05c496c10b
12 changed files with 272 additions and 68 deletions
+28 -6
View File
@@ -157,6 +157,7 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="16"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="18"/>
</Grid.ColumnDefinitions>
@@ -178,7 +179,12 @@
FontSize="12" VerticalAlignment="Center" Margin="6,0"
TextTrimming="CharacterEllipsis"/>
<Button Grid.Column="2" Content="&#xD7;"
<TextBlock Grid.Column="2" Text="{Binding FileSizeDisplay}"
FontSize="11" VerticalAlignment="Center" Margin="4,0"
Opacity="0.6"
Foreground="{DynamicResource TextFillColorSecondaryBrush}"/>
<Button Grid.Column="3" Content="&#xD7;"
Tag="{Binding}"
Click="RemoveFile_Click"
Background="Transparent" BorderThickness="0"
@@ -229,16 +235,32 @@
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="{DynamicResource ControlElevationBorderBrush}"/>
<Setter Property="BorderThickness" Value="0"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{DynamicResource AccentFillColorSecondaryBrush}"/>
</Trigger>
<DataTrigger Binding="{Binding IsGroupStart}" Value="True">
<Setter Property="BorderThickness" Value="0,1,0,0"/>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="video">
<Setter Property="Opacity" Value="0.5"/>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="chapters">
<Setter Property="Opacity" Value="0.5"/>
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Type}" Value="audio"/>
<Condition Binding="{Binding Copy}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Opacity" Value="0.5"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Type}" Value="subtitles"/>
<Condition Binding="{Binding Copy}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Opacity" Value="0.5"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
@@ -273,12 +295,12 @@
<DataGridTextColumn Header="ID"
Binding="{Binding IdDisplay}" Width="45" IsReadOnly="True"/>
<DataGridTextColumn Header="Codec"
Binding="{Binding Codec}" Width="185" IsReadOnly="True"/>
<DataGridTextColumn Header="Language"
Binding="{Binding Language}" Width="100" IsReadOnly="True"/>
<DataGridTextColumn Header="Name"
Binding="{Binding DisplayName}" Width="*" IsReadOnly="True"/>
<DataGridTextColumn Header="Codec"
Binding="{Binding Codec}" Width="185" IsReadOnly="True"/>
<!-- Default (read-only indicator) -->
<DataGridTemplateColumn Header="Default" Width="70"