Refactor settings dialog
This commit is contained in:
parent
05c454dce4
commit
2d2907e076
@ -1,16 +1,10 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Data;
|
|
||||||
using Avalonia.Data.Converters;
|
|
||||||
using Dinah.Core;
|
using Dinah.Core;
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reactive.Subjects;
|
|
||||||
using System.Security.Cryptography;
|
|
||||||
|
|
||||||
namespace LibationAvalonia.Controls
|
namespace LibationAvalonia.Controls
|
||||||
{
|
{
|
||||||
|
|||||||
334
Source/LibationAvalonia/Controls/Settings/Audio.axaml
Normal file
334
Source/LibationAvalonia/Controls/Settings/Audio.axaml
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="850" d:DesignHeight="600"
|
||||||
|
xmlns:controls="clr-namespace:LibationAvalonia.Controls"
|
||||||
|
xmlns:vm="clr-namespace:LibationAvalonia.ViewModels.Settings"
|
||||||
|
x:DataType="vm:AudioSettingsVM"
|
||||||
|
x:Class="LibationAvalonia.Controls.Settings.Audio">
|
||||||
|
|
||||||
|
<Grid
|
||||||
|
RowDefinitions="*,Auto"
|
||||||
|
ColumnDefinitions="*,*">
|
||||||
|
|
||||||
|
<StackPanel
|
||||||
|
Margin="5"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0">
|
||||||
|
|
||||||
|
<StackPanel.Styles>
|
||||||
|
<Style Selector="CheckBox">
|
||||||
|
<Setter Property="Margin" Value="0,0,0,5" />
|
||||||
|
<Style Selector="^ > TextBlock">
|
||||||
|
<Setter Property="TextWrapping" Value="Wrap" />
|
||||||
|
</Style>
|
||||||
|
</Style>
|
||||||
|
</StackPanel.Styles>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding CreateCueSheet, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding CreateCueSheetText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding DownloadCoverArt, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding DownloadCoverArtText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding DownloadClipsBookmarks, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="Download Clips, Notes and Bookmarks as" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<controls:WheelComboBox
|
||||||
|
Margin="5,0,0,0"
|
||||||
|
IsEnabled="{CompiledBinding DownloadClipsBookmarks}"
|
||||||
|
Items="{CompiledBinding ClipBookmarkFormats}"
|
||||||
|
SelectedItem="{CompiledBinding ClipBookmarkFormat}"/>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding RetainAaxFile, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding RetainAaxFileText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding MergeOpeningAndEndCredits, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding MergeOpeningEndCreditsText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding AllowLibationFixup, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding AllowLibationFixupText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<controls:GroupBox
|
||||||
|
BorderWidth="1"
|
||||||
|
Label="Audiobook Fix-ups"
|
||||||
|
IsEnabled="{CompiledBinding AllowLibationFixup}">
|
||||||
|
|
||||||
|
<StackPanel Orientation="Vertical">
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding SplitFilesByChapter, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding SplitFilesByChapterText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding StripAudibleBrandAudio, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding StripAudibleBrandingText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding StripUnabridged, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding StripUnabridgedText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<RadioButton IsChecked="{CompiledBinding !DecryptToLossy, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<StackPanel >
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Text="Download my books in the original audio format (Lossless)" />
|
||||||
|
<CheckBox
|
||||||
|
IsEnabled="{CompiledBinding !DecryptToLossy}"
|
||||||
|
IsChecked="{CompiledBinding MoveMoovToBeginning, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock Text="{CompiledBinding MoveMoovToBeginningText}" />
|
||||||
|
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</RadioButton>
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
Margin="0,5,0,5"
|
||||||
|
IsChecked="{CompiledBinding DecryptToLossy, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Text="Download my books as .MP3 files (transcode if necessary)" />
|
||||||
|
|
||||||
|
</RadioButton>
|
||||||
|
</StackPanel>
|
||||||
|
</controls:GroupBox>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1">
|
||||||
|
|
||||||
|
<controls:GroupBox
|
||||||
|
BorderWidth="1"
|
||||||
|
Label="Mp3 Encoding Options">
|
||||||
|
|
||||||
|
<StackPanel Orientation="Vertical">
|
||||||
|
|
||||||
|
<Grid
|
||||||
|
Margin="5,5,5,0"
|
||||||
|
ColumnDefinitions="Auto,*">
|
||||||
|
|
||||||
|
<controls:GroupBox
|
||||||
|
BorderWidth="1"
|
||||||
|
Grid.Column="0"
|
||||||
|
Label="Target">
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
Margin="10"
|
||||||
|
Content="Bitrate"
|
||||||
|
IsChecked="{CompiledBinding LameTargetBitrate, Mode=TwoWay}"/>
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
Margin="10"
|
||||||
|
Content="Quality"
|
||||||
|
IsChecked="{CompiledBinding !LameTargetBitrate, Mode=TwoWay}"/>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</controls:GroupBox>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Grid.Column="1"
|
||||||
|
IsChecked="{CompiledBinding LameDownsampleMono, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Text="Downsample to mono? (Recommended)" />
|
||||||
|
|
||||||
|
</CheckBox>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid Margin="5,5,5,0" RowDefinitions="Auto,Auto" ColumnDefinitions="Auto,*,Auto">
|
||||||
|
|
||||||
|
<TextBlock Margin="0,0,0,5" Text="Max audio sample rate:" />
|
||||||
|
<controls:WheelComboBox
|
||||||
|
Grid.Row="1"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Items="{CompiledBinding SampleRates}"
|
||||||
|
SelectedItem="{CompiledBinding SelectedSampleRate, Mode=TwoWay}"/>
|
||||||
|
|
||||||
|
<TextBlock Margin="0,0,0,5" Grid.Column="2" Text="Encoder Quality:" />
|
||||||
|
|
||||||
|
<controls:WheelComboBox
|
||||||
|
Grid.Column="2"
|
||||||
|
Grid.Row="1"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Items="{CompiledBinding EncoderQualities}"
|
||||||
|
SelectedItem="{CompiledBinding SelectedEncoderQuality, Mode=TwoWay}"/>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<controls:GroupBox
|
||||||
|
Margin="5,5,5,0"
|
||||||
|
BorderWidth="1"
|
||||||
|
Label="Bitrate"
|
||||||
|
IsEnabled="{CompiledBinding LameTargetBitrate}" >
|
||||||
|
|
||||||
|
<StackPanel>
|
||||||
|
|
||||||
|
<Grid ColumnDefinitions="*,25,Auto">
|
||||||
|
|
||||||
|
<Slider
|
||||||
|
Grid.Column="0"
|
||||||
|
IsEnabled="{CompiledBinding !LameMatchSource}"
|
||||||
|
Value="{CompiledBinding LameBitrate, Mode=TwoWay}"
|
||||||
|
Minimum="16"
|
||||||
|
Maximum="320"
|
||||||
|
IsSnapToTickEnabled="True" TickFrequency="16"
|
||||||
|
Ticks="16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320"
|
||||||
|
TickPlacement="Outside">
|
||||||
|
|
||||||
|
<Slider.Styles>
|
||||||
|
<Style Selector="Slider /template/ Thumb">
|
||||||
|
<Setter Property="ToolTip.Tip" Value="{CompiledBinding $parent[Slider].Value, Mode=OneWay, StringFormat='\{0:f0\} Kbps'}" />
|
||||||
|
<Setter Property="ToolTip.Placement" Value="Top" />
|
||||||
|
<Setter Property="ToolTip.VerticalOffset" Value="-10" />
|
||||||
|
<Setter Property="ToolTip.HorizontalOffset" Value="-30" />
|
||||||
|
</Style>
|
||||||
|
</Slider.Styles>
|
||||||
|
</Slider>
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="1"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Text="{CompiledBinding LameBitrate}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="2"
|
||||||
|
Text=" Kbps" />
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid ColumnDefinitions="*,*">
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
Grid.Column="0"
|
||||||
|
IsChecked="{CompiledBinding LameConstantBitrate, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Text="Restrict Encoder to Constant Bitrate?" />
|
||||||
|
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
Grid.Column="1"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
IsChecked="{CompiledBinding LameMatchSource, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Text="Match Source Bitrate?" />
|
||||||
|
|
||||||
|
</CheckBox>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
</controls:GroupBox>
|
||||||
|
|
||||||
|
<controls:GroupBox
|
||||||
|
Margin="5,5,5,0"
|
||||||
|
BorderWidth="1"
|
||||||
|
Label="Quality"
|
||||||
|
IsEnabled="{CompiledBinding !LameTargetBitrate}">
|
||||||
|
|
||||||
|
<Grid
|
||||||
|
ColumnDefinitions="*,*,25"
|
||||||
|
RowDefinitions="*,Auto">
|
||||||
|
|
||||||
|
<Slider
|
||||||
|
Grid.Column="0"
|
||||||
|
Grid.ColumnSpan="2"
|
||||||
|
Value="{CompiledBinding LameVBRQuality, Mode=TwoWay}"
|
||||||
|
Minimum="0"
|
||||||
|
Maximum="9"
|
||||||
|
IsSnapToTickEnabled="True" TickFrequency="1"
|
||||||
|
Ticks="0,1,2,3,4,5,6,7,8,9"
|
||||||
|
TickPlacement="Outside">
|
||||||
|
<Slider.Styles>
|
||||||
|
<Style Selector="Slider /template/ Thumb">
|
||||||
|
<Setter Property="ToolTip.Tip" Value="{CompiledBinding $parent[Slider].Value, Mode=OneWay, StringFormat='V\{0:f0\}'}" />
|
||||||
|
<Setter Property="ToolTip.Placement" Value="Top" />
|
||||||
|
<Setter Property="ToolTip.VerticalOffset" Value="-10" />
|
||||||
|
<Setter Property="ToolTip.HorizontalOffset" Value="-30" />
|
||||||
|
</Style>
|
||||||
|
</Slider.Styles>
|
||||||
|
</Slider>
|
||||||
|
|
||||||
|
<StackPanel
|
||||||
|
Grid.Column="2"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
|
||||||
|
<TextBlock Text="V" />
|
||||||
|
<TextBlock Text="{CompiledBinding LameVBRQuality}" />
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="0"
|
||||||
|
Grid.Row="1"
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
Text="Higher" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="1"
|
||||||
|
Grid.Row="1"
|
||||||
|
Margin="0,0,10,0"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Text="Lower" />
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</controls:GroupBox>
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Margin="5,5,5,5"
|
||||||
|
Text="Using L.A.M.E encoding engine"
|
||||||
|
FontStyle="Italic" />
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</controls:GroupBox>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<controls:GroupBox
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.ColumnSpan="2"
|
||||||
|
Margin="5"
|
||||||
|
BorderWidth="1" IsEnabled="{CompiledBinding SplitFilesByChapter}"
|
||||||
|
Label="{CompiledBinding ChapterTitleTemplateText}">
|
||||||
|
|
||||||
|
<Grid ColumnDefinitions="*,Auto">
|
||||||
|
|
||||||
|
<TextBox
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="0,10,10,10"
|
||||||
|
FontSize="14"
|
||||||
|
IsReadOnly="True"
|
||||||
|
Text="{CompiledBinding ChapterTitleTemplate}" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
Grid.Column="1"
|
||||||
|
Content="Edit"
|
||||||
|
Height="30"
|
||||||
|
Padding="30,3,30,3"
|
||||||
|
Click="EditChapterTitleTemplateButton_Click" />
|
||||||
|
</Grid>
|
||||||
|
</controls:GroupBox>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
||||||
37
Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs
Normal file
37
Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
using LibationAvalonia.Dialogs;
|
||||||
|
using LibationAvalonia.ViewModels.Settings;
|
||||||
|
using LibationFileManager;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.Controls.Settings
|
||||||
|
{
|
||||||
|
public partial class Audio : ReactiveUserControl<AudioSettingsVM>
|
||||||
|
{
|
||||||
|
public Audio()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
if (Design.IsDesignMode)
|
||||||
|
{
|
||||||
|
_ = Configuration.Instance.LibationFiles;
|
||||||
|
DataContext = new AudioSettingsVM(Configuration.Instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void EditChapterTitleTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var newTemplate = await editTemplate(TemplateEditor<Templates.ChapterTitleTemplate>.CreateNameEditor(ViewModel.ChapterTitleTemplate));
|
||||||
|
if (newTemplate is not null)
|
||||||
|
ViewModel.ChapterTitleTemplate = newTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<string> editTemplate(ITemplateEditor template)
|
||||||
|
{
|
||||||
|
var form = new EditTemplateDialog(template);
|
||||||
|
if (await form.ShowDialog<DialogResult>(this.GetParentWindow()) == DialogResult.OK)
|
||||||
|
return template.EditingTemplate.TemplateText;
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
184
Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml
Normal file
184
Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="700"
|
||||||
|
xmlns:controls="clr-namespace:LibationAvalonia.Controls"
|
||||||
|
xmlns:vm="clr-namespace:LibationAvalonia.ViewModels.Settings"
|
||||||
|
x:DataType="vm:DownloadDecryptSettingsVM"
|
||||||
|
x:Class="LibationAvalonia.Controls.Settings.DownloadDecrypt">
|
||||||
|
|
||||||
|
<Grid RowDefinitions="Auto,Auto,Auto,*">
|
||||||
|
<controls:GroupBox
|
||||||
|
Grid.Row="0"
|
||||||
|
Margin="5"
|
||||||
|
BorderWidth="1"
|
||||||
|
Label="{CompiledBinding BadBookGroupboxText}">
|
||||||
|
|
||||||
|
<Grid
|
||||||
|
ColumnDefinitions="*,*"
|
||||||
|
RowDefinitions="Auto,Auto">
|
||||||
|
<Grid.Styles>
|
||||||
|
<Style Selector="RadioButton">
|
||||||
|
<Setter Property="Margin" Value="0,5,0,5" />
|
||||||
|
<Style Selector="^ > TextBlock">
|
||||||
|
<Setter Property="TextWrapping" Value="Wrap" />
|
||||||
|
</Style>
|
||||||
|
</Style>
|
||||||
|
</Grid.Styles>
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
Grid.Column="0"
|
||||||
|
Grid.Row="0"
|
||||||
|
IsChecked="{CompiledBinding BadBookAsk, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock Text="{CompiledBinding BadBookAskText}" />
|
||||||
|
|
||||||
|
</RadioButton>
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
Grid.Column="1"
|
||||||
|
Grid.Row="0"
|
||||||
|
IsChecked="{CompiledBinding BadBookAbort, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock Text="{CompiledBinding BadBookAbortText}" />
|
||||||
|
|
||||||
|
</RadioButton>
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
Grid.Column="0"
|
||||||
|
Grid.Row="1"
|
||||||
|
IsChecked="{CompiledBinding BadBookRetry, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock Text="{CompiledBinding BadBookRetryText}" />
|
||||||
|
|
||||||
|
</RadioButton>
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
Grid.Column="1"
|
||||||
|
Grid.Row="1"
|
||||||
|
IsChecked="{CompiledBinding BadBookIgnore, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock Text="{CompiledBinding BadBookIgnoreText}" />
|
||||||
|
|
||||||
|
</RadioButton>
|
||||||
|
</Grid>
|
||||||
|
</controls:GroupBox>
|
||||||
|
|
||||||
|
<controls:GroupBox
|
||||||
|
Margin="5"
|
||||||
|
Grid.Row="1"
|
||||||
|
BorderWidth="1"
|
||||||
|
Label="Custom File Naming">
|
||||||
|
|
||||||
|
<Grid
|
||||||
|
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto"
|
||||||
|
ColumnDefinitions="*,Auto">
|
||||||
|
|
||||||
|
<Grid.Styles>
|
||||||
|
<Style Selector="TextBox">
|
||||||
|
<Setter Property="Margin" Value="0,5,10,10" />
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="IsReadOnly" Value="True" />
|
||||||
|
</Style>
|
||||||
|
<Style Selector="Button">
|
||||||
|
<Setter Property="VerticalAlignment" Value="Stretch" />
|
||||||
|
<Setter Property="Margin" Value="0,5,10,10" />
|
||||||
|
<Setter Property="Padding" Value="30,0" />
|
||||||
|
</Style>
|
||||||
|
</Grid.Styles>
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="0,5,0,0"
|
||||||
|
Text="{CompiledBinding FolderTemplateText}" />
|
||||||
|
|
||||||
|
<TextBox
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
|
Text="{CompiledBinding FolderTemplate}" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="1"
|
||||||
|
Content="Edit"
|
||||||
|
Click="EditFolderTemplateButton_Click" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.Column="0"
|
||||||
|
Text="{CompiledBinding FileTemplateText}" />
|
||||||
|
|
||||||
|
<TextBox
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="0"
|
||||||
|
Text="{CompiledBinding FileTemplate}" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="1"
|
||||||
|
Content="Edit"
|
||||||
|
Click="EditFileTemplateButton_Click" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="4"
|
||||||
|
Grid.Column="0"
|
||||||
|
Text="{CompiledBinding ChapterFileTemplateText}" />
|
||||||
|
|
||||||
|
<TextBox
|
||||||
|
Grid.Row="5"
|
||||||
|
Grid.Column="0"
|
||||||
|
Text="{CompiledBinding ChapterFileTemplate}" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
Grid.Row="5"
|
||||||
|
Grid.Column="1"
|
||||||
|
Content="Edit"
|
||||||
|
Click="EditChapterFileTemplateButton_Click" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
Grid.Row="6"
|
||||||
|
Grid.Column="0"
|
||||||
|
Height="30"
|
||||||
|
Margin="0"
|
||||||
|
Content="{CompiledBinding EditCharReplacementText}"
|
||||||
|
Click="EditCharReplacementButton_Click" />
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</controls:GroupBox>
|
||||||
|
<controls:GroupBox
|
||||||
|
Grid.Row="2"
|
||||||
|
Margin="5"
|
||||||
|
BorderWidth="1"
|
||||||
|
Label="Temporary Files Location">
|
||||||
|
|
||||||
|
<StackPanel
|
||||||
|
Margin="5" >
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,0,0,10"
|
||||||
|
Text="{CompiledBinding InProgressDescriptionText}" />
|
||||||
|
|
||||||
|
<controls:DirectoryOrCustomSelectControl
|
||||||
|
Directory="{CompiledBinding InProgressDirectory, Mode=TwoWay}"
|
||||||
|
KnownDirectories="{CompiledBinding KnownDirectories}" />
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</controls:GroupBox>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
Grid.Row="3"
|
||||||
|
Margin="5"
|
||||||
|
VerticalAlignment="Top"
|
||||||
|
IsVisible="{CompiledBinding !Config.IsLinux}"
|
||||||
|
IsChecked="{CompiledBinding UseCoverAsFolderIcon, Mode=TwoWay}">
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Text="{CompiledBinding UseCoverAsFolderIconText}" />
|
||||||
|
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
using LibationAvalonia.Dialogs;
|
||||||
|
using LibationAvalonia.ViewModels.Settings;
|
||||||
|
using LibationFileManager;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.Controls.Settings
|
||||||
|
{
|
||||||
|
public partial class DownloadDecrypt : ReactiveUserControl<DownloadDecryptSettingsVM>
|
||||||
|
{
|
||||||
|
public DownloadDecrypt()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
if (Design.IsDesignMode)
|
||||||
|
{
|
||||||
|
_ = Configuration.Instance.LibationFiles;
|
||||||
|
DataContext = new DownloadDecryptSettingsVM(Configuration.Instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void EditFolderTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var newTemplate = await editTemplate(TemplateEditor<Templates.FolderTemplate>.CreateFilenameEditor(ViewModel.Config.Books, ViewModel.FolderTemplate));
|
||||||
|
if (newTemplate is not null)
|
||||||
|
ViewModel.FolderTemplate = newTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void EditFileTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var newTemplate = await editTemplate(TemplateEditor<Templates.FileTemplate>.CreateFilenameEditor(ViewModel.Config.Books, ViewModel.FileTemplate));
|
||||||
|
if (newTemplate is not null)
|
||||||
|
ViewModel.FileTemplate = newTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void EditChapterFileTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
var newTemplate = await editTemplate(TemplateEditor<Templates.ChapterFileTemplate>.CreateFilenameEditor(ViewModel.Config.Books, ViewModel.ChapterFileTemplate));
|
||||||
|
if (newTemplate is not null)
|
||||||
|
ViewModel.ChapterFileTemplate = newTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void EditCharReplacementButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var form = new EditReplacementChars(ViewModel.Config);
|
||||||
|
await form.ShowDialog<DialogResult>(this.GetParentWindow());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private async Task<string> editTemplate(ITemplateEditor template)
|
||||||
|
{
|
||||||
|
var form = new EditTemplateDialog(template);
|
||||||
|
if (await form.ShowDialog<DialogResult>(this.GetParentWindow()) == DialogResult.OK)
|
||||||
|
return template.EditingTemplate.TemplateText;
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
41
Source/LibationAvalonia/Controls/Settings/Import.axaml
Normal file
41
Source/LibationAvalonia/Controls/Settings/Import.axaml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="450"
|
||||||
|
xmlns:controls="clr-namespace:LibationAvalonia.Controls"
|
||||||
|
xmlns:vm="clr-namespace:LibationAvalonia.ViewModels.Settings"
|
||||||
|
x:DataType="vm:ImportSettingsVM"
|
||||||
|
x:Class="LibationAvalonia.Controls.Settings.Import">
|
||||||
|
|
||||||
|
<StackPanel Margin="5">
|
||||||
|
<StackPanel.Styles>
|
||||||
|
<Style Selector="CheckBox">
|
||||||
|
<Setter Property="Margin" Value="0,0,0,10" />
|
||||||
|
<Style Selector="^ > TextBlock">
|
||||||
|
<Setter Property="TextWrapping" Value="Wrap" />
|
||||||
|
</Style>
|
||||||
|
</Style>
|
||||||
|
</StackPanel.Styles>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding AutoScan, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding AutoScanText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding ShowImportedStats, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding ShowImportedStatsText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding ImportEpisodes, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding ImportEpisodesText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding DownloadEpisodes, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding DownloadEpisodesText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding AutoDownloadEpisodes, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding AutoDownloadEpisodesText}" />
|
||||||
|
</CheckBox>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
||||||
21
Source/LibationAvalonia/Controls/Settings/Import.axaml.cs
Normal file
21
Source/LibationAvalonia/Controls/Settings/Import.axaml.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
using LibationAvalonia.ViewModels.Settings;
|
||||||
|
using LibationFileManager;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.Controls.Settings
|
||||||
|
{
|
||||||
|
public partial class Import : ReactiveUserControl<ImportSettingsVM>
|
||||||
|
{
|
||||||
|
public Import()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
if (Design.IsDesignMode)
|
||||||
|
{
|
||||||
|
_ = Configuration.Instance.LibationFiles;
|
||||||
|
DataContext = new ImportSettingsVM(Configuration.Instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
86
Source/LibationAvalonia/Controls/Settings/Important.axaml
Normal file
86
Source/LibationAvalonia/Controls/Settings/Important.axaml
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="450"
|
||||||
|
xmlns:controls="clr-namespace:LibationAvalonia.Controls"
|
||||||
|
xmlns:vm="clr-namespace:LibationAvalonia.ViewModels.Settings"
|
||||||
|
x:DataType="vm:ImportantSettingsVM"
|
||||||
|
x:Class="LibationAvalonia.Controls.Settings.Important">
|
||||||
|
|
||||||
|
<Grid RowDefinitions="Auto,Auto,*">
|
||||||
|
<controls:GroupBox
|
||||||
|
Grid.Row="0"
|
||||||
|
Margin="5"
|
||||||
|
BorderWidth="1"
|
||||||
|
Label="Books Location">
|
||||||
|
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
Margin="5"
|
||||||
|
Text="{CompiledBinding BooksText}" />
|
||||||
|
|
||||||
|
<controls:DirectoryOrCustomSelectControl Margin="0,10,0,10"
|
||||||
|
SubDirectory="Books"
|
||||||
|
Directory="{CompiledBinding BooksDirectory, Mode=TwoWay}"
|
||||||
|
KnownDirectories="{CompiledBinding KnownDirectories}" />
|
||||||
|
|
||||||
|
<CheckBox IsChecked="{CompiledBinding SavePodcastsToParentFolder, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{CompiledBinding SavePodcastsToParentFolderText}" />
|
||||||
|
</CheckBox>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</controls:GroupBox>
|
||||||
|
|
||||||
|
<StackPanel
|
||||||
|
Grid.Row="1" Margin="5"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,0,10,0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="Logging level" />
|
||||||
|
|
||||||
|
<controls:WheelComboBox
|
||||||
|
Width="150"
|
||||||
|
Height="25"
|
||||||
|
HorizontalContentAlignment="Stretch"
|
||||||
|
SelectedItem="{CompiledBinding LoggingLevel, Mode=TwoWay}"
|
||||||
|
Items="{CompiledBinding LoggingLevels}" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
Margin="50,0,0,0"
|
||||||
|
Padding="20,3,20,3"
|
||||||
|
Content="Open Log Folder"
|
||||||
|
Click="OpenLogFolderButton_Click" />
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<Grid
|
||||||
|
Grid.Row="2"
|
||||||
|
ColumnDefinitions="Auto,Auto,*"
|
||||||
|
Margin="10"
|
||||||
|
VerticalAlignment="Bottom">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="0"
|
||||||
|
FontSize="16"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="Theme: "/>
|
||||||
|
|
||||||
|
<controls:WheelComboBox
|
||||||
|
Grid.Column="1"
|
||||||
|
SelectedItem="{CompiledBinding ThemeVariant, Mode=TwoWay}"
|
||||||
|
Items="{CompiledBinding Themes}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="2"
|
||||||
|
FontSize="16"
|
||||||
|
FontWeight="Bold"
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsVisible="{CompiledBinding SelectionChanged}"
|
||||||
|
Text="Theme change takes effect on restart"/>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
||||||
27
Source/LibationAvalonia/Controls/Settings/Important.axaml.cs
Normal file
27
Source/LibationAvalonia/Controls/Settings/Important.axaml.cs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
using Dinah.Core;
|
||||||
|
using FileManager;
|
||||||
|
using LibationAvalonia.ViewModels.Settings;
|
||||||
|
using LibationFileManager;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.Controls.Settings
|
||||||
|
{
|
||||||
|
public partial class Important : ReactiveUserControl<ImportantSettingsVM>
|
||||||
|
{
|
||||||
|
public Important()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
if (Design.IsDesignMode)
|
||||||
|
{
|
||||||
|
_ = Configuration.Instance.LibationFiles;
|
||||||
|
DataContext = new ImportantSettingsVM(Configuration.Instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenLogFolderButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Go.To.Folder(((LongPath)Configuration.Instance.LibationFiles).ShortPathName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,10 +3,13 @@
|
|||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d" d:DesignWidth="900" d:DesignHeight="750"
|
mc:Ignorable="d" d:DesignWidth="900" d:DesignHeight="750"
|
||||||
MinWidth="900" MinHeight="700"
|
MinWidth="900" MinHeight="750"
|
||||||
Width="900" Height="700"
|
Width="900" Height="750"
|
||||||
x:Class="LibationAvalonia.Dialogs.SettingsDialog"
|
x:Class="LibationAvalonia.Dialogs.SettingsDialog"
|
||||||
xmlns:controls="clr-namespace:LibationAvalonia.Controls"
|
xmlns:controls="clr-namespace:LibationAvalonia.Controls"
|
||||||
|
xmlns:settings="clr-namespace:LibationAvalonia.Controls.Settings"
|
||||||
|
xmlns:vm="clr-namespace:LibationAvalonia.ViewModels.Settings"
|
||||||
|
x:DataType="vm:SettingsVM"
|
||||||
Title="Edit Settings"
|
Title="Edit Settings"
|
||||||
Icon="/Assets/libation.ico">
|
Icon="/Assets/libation.ico">
|
||||||
|
|
||||||
@ -24,789 +27,61 @@
|
|||||||
|
|
||||||
<TabControl Name="tabControl" Grid.Column="0">
|
<TabControl Name="tabControl" Grid.Column="0">
|
||||||
<TabControl.Styles>
|
<TabControl.Styles>
|
||||||
<Style Selector="ItemsPresenter#PART_ItemsPresenter">
|
<Style Selector="TabControl /template/ ItemsPresenter#PART_ItemsPresenter">
|
||||||
<Setter Property="Height" Value="28"/>
|
<Setter Property="Height" Value="30"/>
|
||||||
|
</Style>
|
||||||
|
<Style Selector="TabControl /template/ ContentPresenter#PART_SelectedContentHost">
|
||||||
|
<Setter Property="BorderBrush" Value="{DynamicResource DataGridGridLinesBrush}" />
|
||||||
|
<Setter Property="BorderThickness" Value="2" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style Selector="TabItem">
|
<Style Selector="TabItem">
|
||||||
<Setter Property="MinHeight" Value="40"/>
|
<Setter Property="MinHeight" Value="40"/>
|
||||||
<Setter Property="Height" Value="40"/>
|
<Setter Property="Height" Value="40"/>
|
||||||
<Setter Property="Padding" Value="8,2,8,10"/>
|
<Setter Property="Padding" Value="8,2,8,10"/>
|
||||||
|
<Style Selector="^ > TextBlock" >
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="VerticalAlignment" Value="Center" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style Selector="TabItem#Header TextBlock">
|
</Style>
|
||||||
<Setter Property="MinHeight" Value="5"/>
|
<Style Selector="Button">
|
||||||
|
<Setter Property="VerticalContentAlignment" Value="Center" />
|
||||||
</Style>
|
</Style>
|
||||||
</TabControl.Styles>
|
</TabControl.Styles>
|
||||||
|
|
||||||
|
|
||||||
<TabItem>
|
<TabItem>
|
||||||
|
|
||||||
<TabItem.Header>
|
<TabItem.Header>
|
||||||
|
<TextBlock Text="Important Settings"/>
|
||||||
<TextBlock
|
|
||||||
FontSize="14"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Text="Important Settings"/>
|
|
||||||
|
|
||||||
</TabItem.Header>
|
</TabItem.Header>
|
||||||
|
|
||||||
<Border
|
<settings:Important DataContext="{CompiledBinding ImportantSettings}" />
|
||||||
Grid.Column="0"
|
|
||||||
Grid.Row="0"
|
|
||||||
BorderThickness="2"
|
|
||||||
BorderBrush="{DynamicResource DataGridGridLinesBrush}">
|
|
||||||
|
|
||||||
<Grid RowDefinitions="Auto,Auto,*">
|
|
||||||
|
|
||||||
<controls:GroupBox
|
|
||||||
Grid.Row="0"
|
|
||||||
Margin="5"
|
|
||||||
BorderWidth="1"
|
|
||||||
Label="Books Location">
|
|
||||||
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock
|
|
||||||
Margin="5"
|
|
||||||
Text="{Binding ImportantSettings.BooksText}" />
|
|
||||||
|
|
||||||
<controls:DirectoryOrCustomSelectControl Margin="0,10,0,10"
|
|
||||||
SubDirectory="Books"
|
|
||||||
Directory="{Binding ImportantSettings.BooksDirectory, Mode=TwoWay}"
|
|
||||||
KnownDirectories="{Binding ImportantSettings.KnownDirectories}" />
|
|
||||||
|
|
||||||
<CheckBox IsChecked="{Binding ImportantSettings.SavePodcastsToParentFolder, Mode=TwoWay}">
|
|
||||||
<TextBlock Text="{Binding ImportantSettings.SavePodcastsToParentFolderText}" />
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
</controls:GroupBox>
|
|
||||||
|
|
||||||
<StackPanel
|
|
||||||
Grid.Row="1" Margin="5"
|
|
||||||
Orientation="Horizontal">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Margin="0,0,10,0"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Text="Logging level" />
|
|
||||||
|
|
||||||
<controls:WheelComboBox
|
|
||||||
Width="150"
|
|
||||||
Height="25"
|
|
||||||
HorizontalContentAlignment="Stretch"
|
|
||||||
SelectedItem="{Binding ImportantSettings.LoggingLevel, Mode=TwoWay}"
|
|
||||||
Items="{Binding ImportantSettings.LoggingLevels}" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
Margin="50,0,0,0"
|
|
||||||
Padding="20,3,20,3"
|
|
||||||
Content="Open Log Folder"
|
|
||||||
Click="OpenLogFolderButton_Click" />
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
<!--
|
|
||||||
<CheckBox
|
|
||||||
Grid.Row="2"
|
|
||||||
Margin="5"
|
|
||||||
VerticalAlignment="Bottom"
|
|
||||||
IsChecked="{Binding ImportantSettings.BetaOptIn, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock Text="{Binding ImportantSettings.BetaOptInText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
-->
|
|
||||||
<Grid
|
|
||||||
Grid.Row="2"
|
|
||||||
ColumnDefinitions="Auto,Auto,*"
|
|
||||||
Margin="10"
|
|
||||||
VerticalAlignment="Bottom">
|
|
||||||
<TextBlock
|
|
||||||
Grid.Column="0"
|
|
||||||
FontSize="16"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Text="Theme: "/>
|
|
||||||
|
|
||||||
<controls:WheelComboBox
|
|
||||||
Grid.Column="1"
|
|
||||||
SelectedItem="{Binding ImportantSettings.ThemeVariant, Mode=TwoWay}"
|
|
||||||
Items="{Binding ImportantSettings.Themes}" />
|
|
||||||
<TextBlock
|
|
||||||
Grid.Column="2"
|
|
||||||
FontSize="16"
|
|
||||||
FontWeight="Bold"
|
|
||||||
Margin="10,0,0,0"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
IsVisible="{Binding ImportantSettings.SelectionChanged}"
|
|
||||||
Text="Theme change takes effect on restart"/>
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</TabItem>
|
|
||||||
|
|
||||||
|
|
||||||
<TabItem>
|
|
||||||
|
|
||||||
<TabItem.Header>
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
FontSize="14"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Text="Import Library"/>
|
|
||||||
|
|
||||||
</TabItem.Header>
|
|
||||||
|
|
||||||
<Border
|
|
||||||
Grid.Column="0"
|
|
||||||
Grid.Row="0"
|
|
||||||
BorderThickness="2"
|
|
||||||
BorderBrush="{DynamicResource DataGridGridLinesBrush}">
|
|
||||||
|
|
||||||
<StackPanel Margin="5">
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,10"
|
|
||||||
IsChecked="{Binding ImportSettings.AutoScan, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding ImportSettings.AutoScanText}" />
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,10"
|
|
||||||
IsChecked="{Binding ImportSettings.ShowImportedStats, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding ImportSettings.ShowImportedStatsText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,10"
|
|
||||||
IsChecked="{Binding ImportSettings.ImportEpisodes, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding ImportSettings.ImportEpisodesText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,10"
|
|
||||||
IsChecked="{Binding ImportSettings.DownloadEpisodes, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding ImportSettings.DownloadEpisodesText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,10"
|
|
||||||
IsChecked="{Binding ImportSettings.AutoDownloadEpisodes, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding ImportSettings.AutoDownloadEpisodesText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem>
|
<TabItem>
|
||||||
|
|
||||||
<TabItem.Header>
|
<TabItem.Header>
|
||||||
|
<TextBlock Text="Import Library"/>
|
||||||
<TextBlock
|
|
||||||
FontSize="14"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Text="Download/Decrypt"/>
|
|
||||||
|
|
||||||
</TabItem.Header>
|
</TabItem.Header>
|
||||||
|
|
||||||
<Border
|
<settings:Import DataContext="{CompiledBinding ImportSettings}" />
|
||||||
Grid.Column="0"
|
|
||||||
Grid.Row="0"
|
|
||||||
BorderThickness="2"
|
|
||||||
BorderBrush="{DynamicResource DataGridGridLinesBrush}">
|
|
||||||
|
|
||||||
<Grid RowDefinitions="Auto,Auto,Auto,*">
|
|
||||||
<controls:GroupBox
|
|
||||||
Grid.Row="0"
|
|
||||||
Margin="5"
|
|
||||||
BorderWidth="1"
|
|
||||||
Label="{Binding DownloadDecryptSettings.BadBookGroupboxText}">
|
|
||||||
|
|
||||||
<Grid
|
|
||||||
ColumnDefinitions="*,*"
|
|
||||||
RowDefinitions="Auto,Auto">
|
|
||||||
|
|
||||||
<RadioButton
|
|
||||||
Grid.Column="0"
|
|
||||||
Grid.Row="0"
|
|
||||||
Margin="0,5,0,5"
|
|
||||||
IsChecked="{Binding DownloadDecryptSettings.BadBookAsk, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding DownloadDecryptSettings.BadBookAskText}" />
|
|
||||||
|
|
||||||
</RadioButton>
|
|
||||||
|
|
||||||
<RadioButton
|
|
||||||
Grid.Column="1"
|
|
||||||
Grid.Row="0"
|
|
||||||
Margin="0,5,0,5"
|
|
||||||
IsChecked="{Binding DownloadDecryptSettings.BadBookAbort, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding DownloadDecryptSettings.BadBookAbortText}" />
|
|
||||||
|
|
||||||
</RadioButton>
|
|
||||||
|
|
||||||
<RadioButton
|
|
||||||
Grid.Column="0"
|
|
||||||
Grid.Row="1"
|
|
||||||
Margin="0,5,0,5"
|
|
||||||
IsChecked="{Binding DownloadDecryptSettings.BadBookRetry, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding DownloadDecryptSettings.BadBookRetryText}" />
|
|
||||||
|
|
||||||
</RadioButton>
|
|
||||||
|
|
||||||
<RadioButton
|
|
||||||
Grid.Column="1"
|
|
||||||
Grid.Row="1"
|
|
||||||
Margin="0,5,0,5"
|
|
||||||
IsChecked="{Binding DownloadDecryptSettings.BadBookIgnore, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding DownloadDecryptSettings.BadBookIgnoreText}" />
|
|
||||||
|
|
||||||
</RadioButton>
|
|
||||||
</Grid>
|
|
||||||
</controls:GroupBox>
|
|
||||||
|
|
||||||
<controls:GroupBox
|
|
||||||
Margin="5"
|
|
||||||
Grid.Row="1"
|
|
||||||
BorderWidth="1"
|
|
||||||
Label="Custom File Naming">
|
|
||||||
|
|
||||||
<Grid
|
|
||||||
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto"
|
|
||||||
ColumnDefinitions="*,Auto">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Grid.Row="0"
|
|
||||||
Grid.Column="0"
|
|
||||||
Margin="0,5,0,0"
|
|
||||||
Text="{Binding DownloadDecryptSettings.FolderTemplateText}" />
|
|
||||||
|
|
||||||
<TextBox
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.Column="0"
|
|
||||||
Margin="0,5,10,10"
|
|
||||||
FontSize="14"
|
|
||||||
IsReadOnly="True"
|
|
||||||
Text="{Binding DownloadDecryptSettings.FolderTemplate}" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.Column="1"
|
|
||||||
Content="Edit"
|
|
||||||
Height="30"
|
|
||||||
Padding="30,3,30,3"
|
|
||||||
Click="EditFolderTemplateButton_Click" />
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Grid.Row="2"
|
|
||||||
Grid.Column="0"
|
|
||||||
Text="{Binding DownloadDecryptSettings.FileTemplateText}" />
|
|
||||||
|
|
||||||
<TextBox
|
|
||||||
Grid.Row="3"
|
|
||||||
Grid.Column="0"
|
|
||||||
Margin="0,5,10,10"
|
|
||||||
FontSize="14"
|
|
||||||
IsReadOnly="True"
|
|
||||||
Text="{Binding DownloadDecryptSettings.FileTemplate}" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
Grid.Row="3"
|
|
||||||
Grid.Column="1"
|
|
||||||
Content="Edit"
|
|
||||||
Height="30"
|
|
||||||
Padding="30,3,30,3"
|
|
||||||
Click="EditFileTemplateButton_Click" />
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Grid.Row="4"
|
|
||||||
Grid.Column="0"
|
|
||||||
Text="{Binding DownloadDecryptSettings.ChapterFileTemplateText}" />
|
|
||||||
|
|
||||||
<TextBox
|
|
||||||
Grid.Row="5"
|
|
||||||
Grid.Column="0"
|
|
||||||
Margin="0,5,10,10"
|
|
||||||
FontSize="14"
|
|
||||||
IsReadOnly="True"
|
|
||||||
Text="{Binding DownloadDecryptSettings.ChapterFileTemplate}" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
Grid.Row="5"
|
|
||||||
Grid.Column="1"
|
|
||||||
Content="Edit"
|
|
||||||
Height="30"
|
|
||||||
Padding="30,3,30,3"
|
|
||||||
Click="EditChapterFileTemplateButton_Click" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
Grid.Row="6"
|
|
||||||
Grid.Column="0"
|
|
||||||
Content="{Binding DownloadDecryptSettings.EditCharReplacementText}"
|
|
||||||
Height="30"
|
|
||||||
Padding="30,3,30,3"
|
|
||||||
Click="EditCharReplacementButton_Click" />
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
</controls:GroupBox>
|
|
||||||
<controls:GroupBox
|
|
||||||
Grid.Row="2"
|
|
||||||
Margin="5"
|
|
||||||
BorderWidth="1"
|
|
||||||
Label="Temporary Files Location">
|
|
||||||
|
|
||||||
<StackPanel
|
|
||||||
Margin="5" >
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Margin="0,0,0,10"
|
|
||||||
Text="{Binding DownloadDecryptSettings.InProgressDescriptionText}" />
|
|
||||||
|
|
||||||
<controls:DirectoryOrCustomSelectControl
|
|
||||||
Directory="{Binding DownloadDecryptSettings.InProgressDirectory, Mode=TwoWay}"
|
|
||||||
KnownDirectories="{Binding DownloadDecryptSettings.KnownDirectories}" />
|
|
||||||
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
</controls:GroupBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Grid.Row="3"
|
|
||||||
Margin="5"
|
|
||||||
VerticalAlignment="Top"
|
|
||||||
IsVisible="{Binding !IsLinux}"
|
|
||||||
IsChecked="{Binding DownloadDecryptSettings.UseCoverAsFolderIcon, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding DownloadDecryptSettings.UseCoverAsFolderIconText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem>
|
<TabItem>
|
||||||
|
|
||||||
<TabItem.Header>
|
<TabItem.Header>
|
||||||
|
<TextBlock Text="Download/Decrypt"/>
|
||||||
<TextBlock
|
|
||||||
FontSize="14"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Text="Audio File Settings"/>
|
|
||||||
|
|
||||||
</TabItem.Header>
|
</TabItem.Header>
|
||||||
|
|
||||||
<Border
|
<settings:DownloadDecrypt DataContext="{CompiledBinding DownloadDecryptSettings}" />
|
||||||
Grid.Column="0"
|
</TabItem>
|
||||||
Grid.Row="0"
|
|
||||||
BorderThickness="2"
|
|
||||||
BorderBrush="{DynamicResource DataGridGridLinesBrush}">
|
|
||||||
|
|
||||||
<Grid
|
<TabItem>
|
||||||
RowDefinitions="*,Auto"
|
|
||||||
ColumnDefinitions="*,*">
|
|
||||||
|
|
||||||
<StackPanel
|
<TabItem.Header>
|
||||||
Margin="5"
|
<TextBlock Text="Audio File Settings"/>
|
||||||
Grid.Row="0"
|
</TabItem.Header>
|
||||||
Grid.Column="0">
|
|
||||||
|
|
||||||
<CheckBox
|
<settings:Audio DataContext="{CompiledBinding AudioSettings}" />
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.CreateCueSheet, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.CreateCueSheetText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.DownloadCoverArt, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.DownloadCoverArtText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.DownloadClipsBookmarks, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="Download Clips, Notes and Bookmarks as" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<controls:WheelComboBox
|
|
||||||
Margin="5,0,0,0"
|
|
||||||
IsEnabled="{Binding AudioSettings.DownloadClipsBookmarks}"
|
|
||||||
Items="{Binding AudioSettings.ClipBookmarkFormats}"
|
|
||||||
SelectedItem="{Binding AudioSettings.ClipBookmarkFormat}"/>
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.RetainAaxFile, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.RetainAaxFileText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.MergeOpeningAndEndCredits, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.MergeOpeningEndCreditsText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.AllowLibationFixup, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.AllowLibationFixupText}" />
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<controls:GroupBox
|
|
||||||
BorderWidth="1"
|
|
||||||
Label="Audiobook Fix-ups"
|
|
||||||
IsEnabled="{Binding AudioSettings.AllowLibationFixup}">
|
|
||||||
|
|
||||||
<StackPanel Orientation="Vertical">
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.SplitFilesByChapter, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.SplitFilesByChapterText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.StripAudibleBrandAudio, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.StripAudibleBrandingText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.StripUnabridged, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.StripUnabridgedText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<RadioButton
|
|
||||||
Margin="0,5,0,5"
|
|
||||||
IsChecked="{Binding !AudioSettings.DecryptToLossy, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<StackPanel >
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="Download my books in the original audio format (Lossless)" />
|
|
||||||
<CheckBox
|
|
||||||
Margin="0,0,0,5"
|
|
||||||
IsEnabled="{Binding !AudioSettings.DecryptToLossy}"
|
|
||||||
IsChecked="{Binding AudioSettings.MoveMoovToBeginning, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="{Binding AudioSettings.MoveMoovToBeginningText}" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
</RadioButton>
|
|
||||||
|
|
||||||
<RadioButton
|
|
||||||
Margin="0,5,0,5"
|
|
||||||
IsChecked="{Binding AudioSettings.DecryptToLossy, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="Download my books as .MP3 files (transcode if necessary)" />
|
|
||||||
|
|
||||||
</RadioButton>
|
|
||||||
</StackPanel>
|
|
||||||
</controls:GroupBox>
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<StackPanel
|
|
||||||
Grid.Row="0"
|
|
||||||
Grid.Column="1">
|
|
||||||
|
|
||||||
<controls:GroupBox
|
|
||||||
BorderWidth="1"
|
|
||||||
Label="Mp3 Encoding Options">
|
|
||||||
|
|
||||||
<StackPanel Orientation="Vertical">
|
|
||||||
|
|
||||||
<Grid
|
|
||||||
Margin="5,5,5,0"
|
|
||||||
ColumnDefinitions="Auto,*">
|
|
||||||
|
|
||||||
<controls:GroupBox
|
|
||||||
BorderWidth="1"
|
|
||||||
Grid.Column="0"
|
|
||||||
Label="Target">
|
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
|
|
||||||
<RadioButton
|
|
||||||
Margin="10"
|
|
||||||
Content="Bitrate"
|
|
||||||
IsChecked="{Binding AudioSettings.LameTargetBitrate, Mode=TwoWay}"/>
|
|
||||||
|
|
||||||
<RadioButton
|
|
||||||
Margin="10"
|
|
||||||
Content="Quality"
|
|
||||||
IsChecked="{Binding !AudioSettings.LameTargetBitrate, Mode=TwoWay}"/>
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
</controls:GroupBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
HorizontalAlignment="Right"
|
|
||||||
Grid.Column="1"
|
|
||||||
IsChecked="{Binding AudioSettings.LameDownsampleMono, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="Downsample to mono? (Recommended)" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<Grid Margin="5,5,5,0" RowDefinitions="Auto,Auto" ColumnDefinitions="Auto,*,Auto">
|
|
||||||
|
|
||||||
<TextBlock Margin="0,0,0,5" Text="Max audio sample rate:" />
|
|
||||||
<controls:WheelComboBox
|
|
||||||
Grid.Row="1"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
Items="{Binding AudioSettings.SampleRates}"
|
|
||||||
SelectedItem="{Binding AudioSettings.SelectedSampleRate, Mode=TwoWay}"/>
|
|
||||||
|
|
||||||
<TextBlock Margin="0,0,0,5" Grid.Column="2" Text="Encoder Quality:" />
|
|
||||||
|
|
||||||
<controls:WheelComboBox
|
|
||||||
Grid.Column="2"
|
|
||||||
Grid.Row="1"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
Items="{Binding AudioSettings.EncoderQualities}"
|
|
||||||
SelectedItem="{Binding AudioSettings.SelectedEncoderQuality, Mode=TwoWay}"/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<controls:GroupBox
|
|
||||||
Margin="5,5,5,0"
|
|
||||||
BorderWidth="1"
|
|
||||||
Label="Bitrate"
|
|
||||||
IsEnabled="{Binding AudioSettings.LameTargetBitrate}" >
|
|
||||||
|
|
||||||
<StackPanel>
|
|
||||||
|
|
||||||
<Grid ColumnDefinitions="*,25,Auto">
|
|
||||||
|
|
||||||
<Slider
|
|
||||||
Grid.Column="0"
|
|
||||||
IsEnabled="{Binding !AudioSettings.LameMatchSource}"
|
|
||||||
Value="{Binding AudioSettings.LameBitrate, Mode=TwoWay}"
|
|
||||||
Minimum="16"
|
|
||||||
Maximum="320"
|
|
||||||
IsSnapToTickEnabled="True" TickFrequency="16"
|
|
||||||
Ticks="16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320"
|
|
||||||
TickPlacement="Outside">
|
|
||||||
|
|
||||||
<Slider.Styles>
|
|
||||||
<Style Selector="Slider /template/ Thumb">
|
|
||||||
<Setter Property="ToolTip.Tip" Value="{Binding $parent[Slider].Value, Mode=OneWay, StringFormat='\{0:f0\} Kbps'}" />
|
|
||||||
<Setter Property="ToolTip.Placement" Value="Top" />
|
|
||||||
<Setter Property="ToolTip.VerticalOffset" Value="-10" />
|
|
||||||
<Setter Property="ToolTip.HorizontalOffset" Value="-30" />
|
|
||||||
</Style>
|
|
||||||
</Slider.Styles>
|
|
||||||
</Slider>
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Grid.Column="1"
|
|
||||||
HorizontalAlignment="Right"
|
|
||||||
Text="{Binding AudioSettings.LameBitrate}" />
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Grid.Column="2"
|
|
||||||
Text=" Kbps" />
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<Grid ColumnDefinitions="*,*">
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Grid.Column="0"
|
|
||||||
IsChecked="{Binding AudioSettings.LameConstantBitrate, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="Restrict Encoder to Constant Bitrate?" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
Grid.Column="1"
|
|
||||||
HorizontalAlignment="Right"
|
|
||||||
IsChecked="{Binding AudioSettings.LameMatchSource, Mode=TwoWay}">
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
TextWrapping="Wrap"
|
|
||||||
Text="Match Source Bitrate?" />
|
|
||||||
|
|
||||||
</CheckBox>
|
|
||||||
</Grid>
|
|
||||||
</StackPanel>
|
|
||||||
</controls:GroupBox>
|
|
||||||
|
|
||||||
<controls:GroupBox
|
|
||||||
Margin="5,5,5,0"
|
|
||||||
BorderWidth="1"
|
|
||||||
Label="Quality"
|
|
||||||
IsEnabled="{Binding !AudioSettings.LameTargetBitrate}">
|
|
||||||
|
|
||||||
<Grid
|
|
||||||
ColumnDefinitions="*,*,25"
|
|
||||||
RowDefinitions="*,Auto">
|
|
||||||
|
|
||||||
<Slider
|
|
||||||
Grid.Column="0"
|
|
||||||
Grid.ColumnSpan="2"
|
|
||||||
Value="{Binding AudioSettings.LameVBRQuality, Mode=TwoWay}"
|
|
||||||
Minimum="0"
|
|
||||||
Maximum="9"
|
|
||||||
IsSnapToTickEnabled="True" TickFrequency="1"
|
|
||||||
Ticks="0,1,2,3,4,5,6,7,8,9"
|
|
||||||
TickPlacement="Outside">
|
|
||||||
<Slider.Styles>
|
|
||||||
<Style Selector="Slider /template/ Thumb">
|
|
||||||
<Setter Property="ToolTip.Tip" Value="{Binding $parent[Slider].Value, Mode=OneWay, StringFormat='V\{0:f0\}'}" />
|
|
||||||
<Setter Property="ToolTip.Placement" Value="Top" />
|
|
||||||
<Setter Property="ToolTip.VerticalOffset" Value="-10" />
|
|
||||||
<Setter Property="ToolTip.HorizontalOffset" Value="-30" />
|
|
||||||
</Style>
|
|
||||||
</Slider.Styles>
|
|
||||||
</Slider>
|
|
||||||
|
|
||||||
<StackPanel
|
|
||||||
Grid.Column="2"
|
|
||||||
HorizontalAlignment="Right"
|
|
||||||
Orientation="Horizontal">
|
|
||||||
|
|
||||||
<TextBlock Text="V" />
|
|
||||||
<TextBlock Text="{Binding AudioSettings.LameVBRQuality}" />
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Grid.Column="0"
|
|
||||||
Grid.Row="1"
|
|
||||||
Margin="10,0,0,0"
|
|
||||||
Text="Higher" />
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Grid.Column="1"
|
|
||||||
Grid.Row="1"
|
|
||||||
Margin="0,0,10,0"
|
|
||||||
HorizontalAlignment="Right"
|
|
||||||
Text="Lower" />
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
</controls:GroupBox>
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Margin="5,5,5,5"
|
|
||||||
Text="Using L.A.M.E encoding engine"
|
|
||||||
FontStyle="Italic" />
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
</controls:GroupBox>
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<controls:GroupBox
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.ColumnSpan="2"
|
|
||||||
Margin="5"
|
|
||||||
BorderWidth="1" IsEnabled="{Binding AudioSettings.SplitFilesByChapter}"
|
|
||||||
Label="{Binding AudioSettings.ChapterTitleTemplateText}">
|
|
||||||
|
|
||||||
<Grid ColumnDefinitions="*,Auto">
|
|
||||||
|
|
||||||
<TextBox
|
|
||||||
Grid.Column="0"
|
|
||||||
Margin="0,10,10,10"
|
|
||||||
FontSize="14"
|
|
||||||
IsReadOnly="True"
|
|
||||||
Text="{Binding AudioSettings.ChapterTitleTemplate}" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
Grid.Column="1"
|
|
||||||
Content="Edit"
|
|
||||||
Height="30"
|
|
||||||
Padding="30,3,30,3"
|
|
||||||
Click="EditChapterTitleTemplateButton_Click" />
|
|
||||||
</Grid>
|
|
||||||
</controls:GroupBox>
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</TabControl>
|
</TabControl>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@ -2,6 +2,7 @@ using Avalonia.Collections;
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Dinah.Core;
|
using Dinah.Core;
|
||||||
using FileManager;
|
using FileManager;
|
||||||
|
using LibationAvalonia.ViewModels.Settings;
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
using LibationUiBase;
|
using LibationUiBase;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
@ -14,7 +15,7 @@ namespace LibationAvalonia.Dialogs
|
|||||||
{
|
{
|
||||||
public partial class SettingsDialog : DialogWindow
|
public partial class SettingsDialog : DialogWindow
|
||||||
{
|
{
|
||||||
private SettingsPages settingsDisp;
|
private SettingsVM settingsDisp;
|
||||||
|
|
||||||
private readonly Configuration config = Configuration.Instance;
|
private readonly Configuration config = Configuration.Instance;
|
||||||
public SettingsDialog()
|
public SettingsDialog()
|
||||||
@ -28,8 +29,17 @@ namespace LibationAvalonia.Dialogs
|
|||||||
|
|
||||||
protected override async Task SaveAndCloseAsync()
|
protected override async Task SaveAndCloseAsync()
|
||||||
{
|
{
|
||||||
if (!await settingsDisp.SaveSettingsAsync(config))
|
#region validation
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(settingsDisp.ImportantSettings.BooksDirectory))
|
||||||
|
{
|
||||||
|
await MessageBox.Show(this.GetParentWindow(), "Cannot set Books Location to blank", "Location is blank", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
settingsDisp.SaveSettings(config);
|
||||||
|
|
||||||
await MessageBox.VerboseLoggingWarning_ShowIfTrue();
|
await MessageBox.VerboseLoggingWarning_ShowIfTrue();
|
||||||
await base.SaveAndCloseAsync();
|
await base.SaveAndCloseAsync();
|
||||||
@ -42,489 +52,5 @@ namespace LibationAvalonia.Dialogs
|
|||||||
{
|
{
|
||||||
Go.To.Folder(((LongPath)Configuration.Instance.LibationFiles).ShortPathName);
|
Go.To.Folder(((LongPath)Configuration.Instance.LibationFiles).ShortPathName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void EditFolderTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var newTemplate = await editTemplate(TemplateEditor<Templates.FolderTemplate>.CreateFilenameEditor(config.Books, settingsDisp.DownloadDecryptSettings.FolderTemplate));
|
|
||||||
if (newTemplate is not null)
|
|
||||||
settingsDisp.DownloadDecryptSettings.FolderTemplate = newTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async void EditFileTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var newTemplate = await editTemplate(TemplateEditor<Templates.FileTemplate>.CreateFilenameEditor(config.Books, settingsDisp.DownloadDecryptSettings.FileTemplate));
|
|
||||||
if (newTemplate is not null)
|
|
||||||
settingsDisp.DownloadDecryptSettings.FileTemplate = newTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async void EditChapterFileTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
|
|
||||||
var newTemplate = await editTemplate(TemplateEditor<Templates.ChapterFileTemplate>.CreateFilenameEditor(config.Books, settingsDisp.DownloadDecryptSettings.ChapterFileTemplate));
|
|
||||||
if (newTemplate is not null)
|
|
||||||
settingsDisp.DownloadDecryptSettings.ChapterFileTemplate = newTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async void EditCharReplacementButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var form = new EditReplacementChars(config);
|
|
||||||
await form.ShowDialog<DialogResult>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async void EditChapterTitleTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var newTemplate = await editTemplate(TemplateEditor<Templates.ChapterTitleTemplate>.CreateNameEditor(settingsDisp.AudioSettings.ChapterTitleTemplate));
|
|
||||||
if (newTemplate is not null)
|
|
||||||
settingsDisp.AudioSettings.ChapterTitleTemplate = newTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<string> editTemplate(ITemplateEditor template)
|
|
||||||
{
|
|
||||||
var form = new EditTemplateDialog(template);
|
|
||||||
if (await form.ShowDialog<DialogResult>(this) == DialogResult.OK)
|
|
||||||
return template.EditingTemplate.TemplateText;
|
|
||||||
else return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal interface ISettingsDisplay
|
|
||||||
{
|
|
||||||
void LoadSettings(Configuration config);
|
|
||||||
Task<bool> SaveSettingsAsync(Configuration config);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class SettingsPages : ISettingsDisplay
|
|
||||||
{
|
|
||||||
public SettingsPages(Configuration config)
|
|
||||||
{
|
|
||||||
LoadSettings(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsLinux => Configuration.IsLinux;
|
|
||||||
public bool IsWindows => Configuration.IsWindows;
|
|
||||||
public ImportantSettings ImportantSettings { get; private set; }
|
|
||||||
public ImportSettings ImportSettings { get; private set; }
|
|
||||||
public DownloadDecryptSettings DownloadDecryptSettings { get; private set; }
|
|
||||||
public AudioSettings AudioSettings { get; private set; }
|
|
||||||
|
|
||||||
public void LoadSettings(Configuration config)
|
|
||||||
{
|
|
||||||
ImportantSettings = new(config);
|
|
||||||
ImportSettings = new(config);
|
|
||||||
DownloadDecryptSettings = new(config);
|
|
||||||
AudioSettings = new(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<bool> SaveSettingsAsync(Configuration config)
|
|
||||||
{
|
|
||||||
var result = await ImportantSettings.SaveSettingsAsync(config);
|
|
||||||
result &= await ImportSettings.SaveSettingsAsync(config);
|
|
||||||
result &= await DownloadDecryptSettings.SaveSettingsAsync(config);
|
|
||||||
result &= await AudioSettings.SaveSettingsAsync(config);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ImportantSettings : ViewModels.ViewModelBase, ISettingsDisplay
|
|
||||||
{
|
|
||||||
public ImportantSettings(Configuration config)
|
|
||||||
{
|
|
||||||
LoadSettings(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadSettings(Configuration config)
|
|
||||||
{
|
|
||||||
BooksDirectory = config.Books.PathWithoutPrefix;
|
|
||||||
SavePodcastsToParentFolder = config.SavePodcastsToParentFolder;
|
|
||||||
LoggingLevel = config.LogLevel;
|
|
||||||
BetaOptIn = config.BetaOptIn;
|
|
||||||
ThemeVariant = InitialThemeVariant
|
|
||||||
= Configuration.Instance.GetString(propertyName: nameof(ThemeVariant)) is nameof(Avalonia.Styling.ThemeVariant.Dark)
|
|
||||||
? nameof(Avalonia.Styling.ThemeVariant.Dark)
|
|
||||||
: nameof(Avalonia.Styling.ThemeVariant.Light);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<bool> SaveSettingsAsync(Configuration config)
|
|
||||||
{
|
|
||||||
#region validation
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(BooksDirectory))
|
|
||||||
{
|
|
||||||
await MessageBox.Show("Cannot set Books Location to blank", "Location is blank", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
LongPath lonNewBooks = BooksDirectory;
|
|
||||||
if (!System.IO.Directory.Exists(lonNewBooks))
|
|
||||||
System.IO.Directory.CreateDirectory(lonNewBooks);
|
|
||||||
config.Books = BooksDirectory;
|
|
||||||
config.SavePodcastsToParentFolder = SavePodcastsToParentFolder;
|
|
||||||
config.LogLevel = LoggingLevel;
|
|
||||||
config.BetaOptIn = BetaOptIn;
|
|
||||||
Configuration.Instance.SetString(ThemeVariant, nameof(ThemeVariant));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public List<Configuration.KnownDirectories> KnownDirectories { get; } = new()
|
|
||||||
{
|
|
||||||
Configuration.KnownDirectories.UserProfile,
|
|
||||||
Configuration.KnownDirectories.AppDir,
|
|
||||||
Configuration.KnownDirectories.MyDocs
|
|
||||||
};
|
|
||||||
|
|
||||||
public string BooksText { get; } = Configuration.GetDescription(nameof(Configuration.Books));
|
|
||||||
public string SavePodcastsToParentFolderText { get; } = Configuration.GetDescription(nameof(Configuration.SavePodcastsToParentFolder));
|
|
||||||
public Serilog.Events.LogEventLevel[] LoggingLevels { get; } = Enum.GetValues<Serilog.Events.LogEventLevel>();
|
|
||||||
public string BetaOptInText { get; } = Configuration.GetDescription(nameof(Configuration.BetaOptIn));
|
|
||||||
public string[] Themes { get; } = { nameof(Avalonia.Styling.ThemeVariant.Light), nameof(Avalonia.Styling.ThemeVariant.Dark) };
|
|
||||||
|
|
||||||
|
|
||||||
public string BooksDirectory { get; set; }
|
|
||||||
public bool SavePodcastsToParentFolder { get; set; }
|
|
||||||
public Serilog.Events.LogEventLevel LoggingLevel { get; set; }
|
|
||||||
public bool BetaOptIn { get; set; }
|
|
||||||
private string themeVariant;
|
|
||||||
public string ThemeVariant
|
|
||||||
{
|
|
||||||
get => themeVariant;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
this.RaiseAndSetIfChanged(ref themeVariant, value);
|
|
||||||
|
|
||||||
SelectionChanged = ThemeVariant != InitialThemeVariant;
|
|
||||||
this.RaisePropertyChanged(nameof(SelectionChanged));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public string InitialThemeVariant { get; private set; }
|
|
||||||
public bool SelectionChanged { get; private set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ImportSettings : ISettingsDisplay
|
|
||||||
{
|
|
||||||
public ImportSettings(Configuration config)
|
|
||||||
{
|
|
||||||
LoadSettings(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadSettings(Configuration config)
|
|
||||||
{
|
|
||||||
AutoScan = config.AutoScan;
|
|
||||||
ShowImportedStats = config.ShowImportedStats;
|
|
||||||
ImportEpisodes = config.ImportEpisodes;
|
|
||||||
DownloadEpisodes = config.DownloadEpisodes;
|
|
||||||
AutoDownloadEpisodes = config.AutoDownloadEpisodes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> SaveSettingsAsync(Configuration config)
|
|
||||||
{
|
|
||||||
config.AutoScan = AutoScan;
|
|
||||||
config.ShowImportedStats = ShowImportedStats;
|
|
||||||
config.ImportEpisodes = ImportEpisodes;
|
|
||||||
config.DownloadEpisodes = DownloadEpisodes;
|
|
||||||
config.AutoDownloadEpisodes = AutoDownloadEpisodes;
|
|
||||||
return Task.FromResult(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string AutoScanText { get; } = Configuration.GetDescription(nameof(Configuration.AutoScan));
|
|
||||||
public string ShowImportedStatsText { get; } = Configuration.GetDescription(nameof(Configuration.ShowImportedStats));
|
|
||||||
public string ImportEpisodesText { get; } = Configuration.GetDescription(nameof(Configuration.ImportEpisodes));
|
|
||||||
public string DownloadEpisodesText { get; } = Configuration.GetDescription(nameof(Configuration.DownloadEpisodes));
|
|
||||||
public string AutoDownloadEpisodesText { get; } = Configuration.GetDescription(nameof(Configuration.AutoDownloadEpisodes));
|
|
||||||
|
|
||||||
public bool AutoScan { get; set; }
|
|
||||||
public bool ShowImportedStats { get; set; }
|
|
||||||
public bool ImportEpisodes { get; set; }
|
|
||||||
public bool DownloadEpisodes { get; set; }
|
|
||||||
public bool AutoDownloadEpisodes { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DownloadDecryptSettings : ViewModels.ViewModelBase, ISettingsDisplay
|
|
||||||
{
|
|
||||||
private bool _badBookAsk;
|
|
||||||
private bool _badBookAbort;
|
|
||||||
private bool _badBookRetry;
|
|
||||||
private bool _badBookIgnore;
|
|
||||||
|
|
||||||
private string _folderTemplate;
|
|
||||||
private string _fileTemplate;
|
|
||||||
private string _chapterFileTemplate;
|
|
||||||
|
|
||||||
public DownloadDecryptSettings(Configuration config)
|
|
||||||
{
|
|
||||||
LoadSettings(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Configuration.KnownDirectories> KnownDirectories { get; } = new()
|
|
||||||
{
|
|
||||||
Configuration.KnownDirectories.WinTemp,
|
|
||||||
Configuration.KnownDirectories.UserProfile,
|
|
||||||
Configuration.KnownDirectories.AppDir,
|
|
||||||
Configuration.KnownDirectories.MyDocs,
|
|
||||||
Configuration.KnownDirectories.LibationFiles
|
|
||||||
};
|
|
||||||
|
|
||||||
public string InProgressDirectory { get; set; }
|
|
||||||
public void LoadSettings(Configuration config)
|
|
||||||
{
|
|
||||||
BadBookAsk = config.BadBook is Configuration.BadBookAction.Ask;
|
|
||||||
BadBookAbort = config.BadBook is Configuration.BadBookAction.Abort;
|
|
||||||
BadBookRetry = config.BadBook is Configuration.BadBookAction.Retry;
|
|
||||||
BadBookIgnore = config.BadBook is Configuration.BadBookAction.Ignore;
|
|
||||||
FolderTemplate = config.FolderTemplate;
|
|
||||||
FileTemplate = config.FileTemplate;
|
|
||||||
ChapterFileTemplate = config.ChapterFileTemplate;
|
|
||||||
InProgressDirectory = config.InProgress;
|
|
||||||
UseCoverAsFolderIcon = config.UseCoverAsFolderIcon;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> SaveSettingsAsync(Configuration config)
|
|
||||||
{
|
|
||||||
config.BadBook
|
|
||||||
= BadBookAbort ? Configuration.BadBookAction.Abort
|
|
||||||
: BadBookRetry ? Configuration.BadBookAction.Retry
|
|
||||||
: BadBookIgnore ? Configuration.BadBookAction.Ignore
|
|
||||||
: Configuration.BadBookAction.Ask;
|
|
||||||
|
|
||||||
config.FolderTemplate = FolderTemplate;
|
|
||||||
config.FileTemplate = FileTemplate;
|
|
||||||
config.ChapterFileTemplate = ChapterFileTemplate;
|
|
||||||
config.InProgress = InProgressDirectory;
|
|
||||||
|
|
||||||
config.UseCoverAsFolderIcon = UseCoverAsFolderIcon;
|
|
||||||
|
|
||||||
return Task.FromResult(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string UseCoverAsFolderIconText { get; } = Configuration.GetDescription(nameof(Configuration.UseCoverAsFolderIcon));
|
|
||||||
public string BadBookGroupboxText { get; } = Configuration.GetDescription(nameof(Configuration.BadBook));
|
|
||||||
public string BadBookAskText { get; } = Configuration.BadBookAction.Ask.GetDescription();
|
|
||||||
public string BadBookAbortText { get; } = Configuration.BadBookAction.Abort.GetDescription();
|
|
||||||
public string BadBookRetryText { get; } = Configuration.BadBookAction.Retry.GetDescription();
|
|
||||||
public string BadBookIgnoreText { get; } = Configuration.BadBookAction.Ignore.GetDescription();
|
|
||||||
public string FolderTemplateText { get; } = Configuration.GetDescription(nameof(Configuration.FolderTemplate));
|
|
||||||
public string FileTemplateText { get; } = Configuration.GetDescription(nameof(Configuration.FileTemplate));
|
|
||||||
public string ChapterFileTemplateText { get; } = Configuration.GetDescription(nameof(Configuration.ChapterFileTemplate));
|
|
||||||
public string EditCharReplacementText { get; } = Configuration.GetDescription(nameof(Configuration.ReplacementCharacters));
|
|
||||||
public string InProgressDescriptionText { get; } = Configuration.GetDescription(nameof(Configuration.InProgress));
|
|
||||||
|
|
||||||
public string FolderTemplate { get => _folderTemplate; set { this.RaiseAndSetIfChanged(ref _folderTemplate, value); } }
|
|
||||||
public string FileTemplate { get => _fileTemplate; set { this.RaiseAndSetIfChanged(ref _fileTemplate, value); } }
|
|
||||||
public string ChapterFileTemplate { get => _chapterFileTemplate; set { this.RaiseAndSetIfChanged(ref _chapterFileTemplate, value); } }
|
|
||||||
public bool UseCoverAsFolderIcon { get; set; }
|
|
||||||
|
|
||||||
public bool BadBookAsk
|
|
||||||
{
|
|
||||||
get => _badBookAsk;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
this.RaiseAndSetIfChanged(ref _badBookAsk, value);
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
BadBookAbort = false;
|
|
||||||
BadBookRetry = false;
|
|
||||||
BadBookIgnore = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public bool BadBookAbort
|
|
||||||
{
|
|
||||||
get => _badBookAbort;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
this.RaiseAndSetIfChanged(ref _badBookAbort, value);
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
BadBookAsk = false;
|
|
||||||
BadBookRetry = false;
|
|
||||||
BadBookIgnore = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public bool BadBookRetry
|
|
||||||
{
|
|
||||||
get => _badBookRetry;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
this.RaiseAndSetIfChanged(ref _badBookRetry, value);
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
BadBookAsk = false;
|
|
||||||
BadBookAbort = false;
|
|
||||||
BadBookIgnore = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public bool BadBookIgnore
|
|
||||||
{
|
|
||||||
get => _badBookIgnore;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
this.RaiseAndSetIfChanged(ref _badBookIgnore, value);
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
BadBookAsk = false;
|
|
||||||
BadBookAbort = false;
|
|
||||||
BadBookRetry = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class AudioSettings : ViewModels.ViewModelBase, ISettingsDisplay
|
|
||||||
{
|
|
||||||
|
|
||||||
private bool _downloadClipsBookmarks;
|
|
||||||
private bool _decryptToLossy;
|
|
||||||
private bool _splitFilesByChapter;
|
|
||||||
private bool _allowLibationFixup;
|
|
||||||
private bool _lameTargetBitrate;
|
|
||||||
private bool _lameMatchSource;
|
|
||||||
private int _lameBitrate;
|
|
||||||
private int _lameVBRQuality;
|
|
||||||
private string _chapterTitleTemplate;
|
|
||||||
public SampleRateSelection SelectedSampleRate { get; set; }
|
|
||||||
public NAudio.Lame.EncoderQuality SelectedEncoderQuality { get; set; }
|
|
||||||
|
|
||||||
public AvaloniaList<SampleRateSelection> SampleRates { get; }
|
|
||||||
= new(
|
|
||||||
new[]
|
|
||||||
{
|
|
||||||
AAXClean.SampleRate.Hz_44100,
|
|
||||||
AAXClean.SampleRate.Hz_32000,
|
|
||||||
AAXClean.SampleRate.Hz_24000,
|
|
||||||
AAXClean.SampleRate.Hz_22050,
|
|
||||||
AAXClean.SampleRate.Hz_16000,
|
|
||||||
AAXClean.SampleRate.Hz_12000,
|
|
||||||
}
|
|
||||||
.Select(s => new SampleRateSelection(s)));
|
|
||||||
|
|
||||||
public AvaloniaList<NAudio.Lame.EncoderQuality> EncoderQualities { get; }
|
|
||||||
= new(
|
|
||||||
new[]
|
|
||||||
{
|
|
||||||
NAudio.Lame.EncoderQuality.High,
|
|
||||||
NAudio.Lame.EncoderQuality.Standard,
|
|
||||||
NAudio.Lame.EncoderQuality.Fast,
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
public AudioSettings(Configuration config)
|
|
||||||
{
|
|
||||||
LoadSettings(config);
|
|
||||||
}
|
|
||||||
public void LoadSettings(Configuration config)
|
|
||||||
{
|
|
||||||
CreateCueSheet = config.CreateCueSheet;
|
|
||||||
AllowLibationFixup = config.AllowLibationFixup;
|
|
||||||
DownloadCoverArt = config.DownloadCoverArt;
|
|
||||||
RetainAaxFile = config.RetainAaxFile;
|
|
||||||
DownloadClipsBookmarks = config.DownloadClipsBookmarks;
|
|
||||||
ClipBookmarkFormat = config.ClipsBookmarksFileFormat;
|
|
||||||
SplitFilesByChapter = config.SplitFilesByChapter;
|
|
||||||
MergeOpeningAndEndCredits = config.MergeOpeningAndEndCredits;
|
|
||||||
StripAudibleBrandAudio = config.StripAudibleBrandAudio;
|
|
||||||
StripUnabridged = config.StripUnabridged;
|
|
||||||
ChapterTitleTemplate = config.ChapterTitleTemplate;
|
|
||||||
DecryptToLossy = config.DecryptToLossy;
|
|
||||||
MoveMoovToBeginning = config.MoveMoovToBeginning;
|
|
||||||
LameTargetBitrate = config.LameTargetBitrate;
|
|
||||||
LameDownsampleMono = config.LameDownsampleMono;
|
|
||||||
LameConstantBitrate = config.LameConstantBitrate;
|
|
||||||
LameMatchSource = config.LameMatchSourceBR;
|
|
||||||
LameBitrate = config.LameBitrate;
|
|
||||||
LameVBRQuality = config.LameVBRQuality;
|
|
||||||
|
|
||||||
SelectedSampleRate = SampleRates.FirstOrDefault(s => s.SampleRate == config.MaxSampleRate);
|
|
||||||
SelectedEncoderQuality = config.LameEncoderQuality;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> SaveSettingsAsync(Configuration config)
|
|
||||||
{
|
|
||||||
config.CreateCueSheet = CreateCueSheet;
|
|
||||||
config.AllowLibationFixup = AllowLibationFixup;
|
|
||||||
config.DownloadCoverArt = DownloadCoverArt;
|
|
||||||
config.RetainAaxFile = RetainAaxFile;
|
|
||||||
config.DownloadClipsBookmarks = DownloadClipsBookmarks;
|
|
||||||
config.ClipsBookmarksFileFormat = ClipBookmarkFormat;
|
|
||||||
config.SplitFilesByChapter = SplitFilesByChapter;
|
|
||||||
config.MergeOpeningAndEndCredits = MergeOpeningAndEndCredits;
|
|
||||||
config.StripAudibleBrandAudio = StripAudibleBrandAudio;
|
|
||||||
config.StripUnabridged = StripUnabridged;
|
|
||||||
config.ChapterTitleTemplate = ChapterTitleTemplate;
|
|
||||||
config.DecryptToLossy = DecryptToLossy;
|
|
||||||
config.MoveMoovToBeginning = MoveMoovToBeginning;
|
|
||||||
config.LameTargetBitrate = LameTargetBitrate;
|
|
||||||
config.LameDownsampleMono = LameDownsampleMono;
|
|
||||||
config.LameConstantBitrate = LameConstantBitrate;
|
|
||||||
config.LameMatchSourceBR = LameMatchSource;
|
|
||||||
config.LameBitrate = LameBitrate;
|
|
||||||
config.LameVBRQuality = LameVBRQuality;
|
|
||||||
|
|
||||||
config.LameEncoderQuality = SelectedEncoderQuality;
|
|
||||||
config.MaxSampleRate = SelectedSampleRate?.SampleRate ?? config.MaxSampleRate;
|
|
||||||
|
|
||||||
return Task.FromResult(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public AvaloniaList<Configuration.ClipBookmarkFormat> ClipBookmarkFormats { get; } = new(Enum<Configuration.ClipBookmarkFormat>.GetValues());
|
|
||||||
public string CreateCueSheetText { get; } = Configuration.GetDescription(nameof(Configuration.CreateCueSheet));
|
|
||||||
public string AllowLibationFixupText { get; } = Configuration.GetDescription(nameof(Configuration.AllowLibationFixup));
|
|
||||||
public string DownloadCoverArtText { get; } = Configuration.GetDescription(nameof(Configuration.DownloadCoverArt));
|
|
||||||
public string RetainAaxFileText { get; } = Configuration.GetDescription(nameof(Configuration.RetainAaxFile));
|
|
||||||
public string SplitFilesByChapterText { get; } = Configuration.GetDescription(nameof(Configuration.SplitFilesByChapter));
|
|
||||||
public string MergeOpeningEndCreditsText { get; } = Configuration.GetDescription(nameof(Configuration.MergeOpeningAndEndCredits));
|
|
||||||
public string StripAudibleBrandingText { get; } = Configuration.GetDescription(nameof(Configuration.StripAudibleBrandAudio));
|
|
||||||
public string StripUnabridgedText { get; } = Configuration.GetDescription(nameof(Configuration.StripUnabridged));
|
|
||||||
public string ChapterTitleTemplateText { get; } = Configuration.GetDescription(nameof(Configuration.ChapterTitleTemplate));
|
|
||||||
public string MoveMoovToBeginningText { get; } = Configuration.GetDescription(nameof(Configuration.MoveMoovToBeginning));
|
|
||||||
|
|
||||||
public bool CreateCueSheet { get; set; }
|
|
||||||
public bool DownloadCoverArt { get; set; }
|
|
||||||
public bool RetainAaxFile { get; set; }
|
|
||||||
public bool DownloadClipsBookmarks { get => _downloadClipsBookmarks; set => this.RaiseAndSetIfChanged(ref _downloadClipsBookmarks, value); }
|
|
||||||
public Configuration.ClipBookmarkFormat ClipBookmarkFormat { get; set; }
|
|
||||||
public bool MergeOpeningAndEndCredits { get; set; }
|
|
||||||
public bool StripAudibleBrandAudio { get; set; }
|
|
||||||
public bool StripUnabridged { get; set; }
|
|
||||||
public bool DecryptToLossy { get => _decryptToLossy; set => this.RaiseAndSetIfChanged(ref _decryptToLossy, value); }
|
|
||||||
public bool MoveMoovToBeginning { get; set; }
|
|
||||||
|
|
||||||
public bool LameDownsampleMono { get; set; } = Design.IsDesignMode;
|
|
||||||
public bool LameConstantBitrate { get; set; } = Design.IsDesignMode;
|
|
||||||
|
|
||||||
public bool SplitFilesByChapter { get => _splitFilesByChapter; set { this.RaiseAndSetIfChanged(ref _splitFilesByChapter, value); } }
|
|
||||||
public bool LameTargetBitrate { get => _lameTargetBitrate; set { this.RaiseAndSetIfChanged(ref _lameTargetBitrate, value); } }
|
|
||||||
public bool LameMatchSource { get => _lameMatchSource; set { this.RaiseAndSetIfChanged(ref _lameMatchSource, value); } }
|
|
||||||
public int LameBitrate { get => _lameBitrate; set { this.RaiseAndSetIfChanged(ref _lameBitrate, value); } }
|
|
||||||
public int LameVBRQuality { get => _lameVBRQuality; set { this.RaiseAndSetIfChanged(ref _lameVBRQuality, value); } }
|
|
||||||
|
|
||||||
|
|
||||||
public string ChapterTitleTemplate { get => _chapterTitleTemplate; set { this.RaiseAndSetIfChanged(ref _chapterTitleTemplate, value); } }
|
|
||||||
|
|
||||||
|
|
||||||
public bool AllowLibationFixup
|
|
||||||
{
|
|
||||||
get => _allowLibationFixup;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
this.RaiseAndSetIfChanged(ref _allowLibationFixup, value);
|
|
||||||
if (!_allowLibationFixup)
|
|
||||||
{
|
|
||||||
SplitFilesByChapter = false;
|
|
||||||
StripAudibleBrandAudio = false;
|
|
||||||
StripUnabridged = false;
|
|
||||||
DecryptToLossy = false;
|
|
||||||
this.RaisePropertyChanged(nameof(SplitFilesByChapter));
|
|
||||||
this.RaisePropertyChanged(nameof(StripAudibleBrandAudio));
|
|
||||||
this.RaisePropertyChanged(nameof(StripUnabridged));
|
|
||||||
this.RaisePropertyChanged(nameof(DecryptToLossy));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
157
Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs
Normal file
157
Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
using Avalonia.Collections;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Dinah.Core;
|
||||||
|
using LibationFileManager;
|
||||||
|
using LibationUiBase;
|
||||||
|
using ReactiveUI;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.ViewModels.Settings
|
||||||
|
{
|
||||||
|
public class AudioSettingsVM : ViewModelBase, ISettingsDisplay
|
||||||
|
{
|
||||||
|
private bool _downloadClipsBookmarks;
|
||||||
|
private bool _decryptToLossy;
|
||||||
|
private bool _splitFilesByChapter;
|
||||||
|
private bool _allowLibationFixup;
|
||||||
|
private bool _lameTargetBitrate;
|
||||||
|
private bool _lameMatchSource;
|
||||||
|
private int _lameBitrate;
|
||||||
|
private int _lameVBRQuality;
|
||||||
|
private string _chapterTitleTemplate;
|
||||||
|
public SampleRateSelection SelectedSampleRate { get; set; }
|
||||||
|
public NAudio.Lame.EncoderQuality SelectedEncoderQuality { get; set; }
|
||||||
|
|
||||||
|
public AvaloniaList<SampleRateSelection> SampleRates { get; }
|
||||||
|
= new(
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
AAXClean.SampleRate.Hz_44100,
|
||||||
|
AAXClean.SampleRate.Hz_32000,
|
||||||
|
AAXClean.SampleRate.Hz_24000,
|
||||||
|
AAXClean.SampleRate.Hz_22050,
|
||||||
|
AAXClean.SampleRate.Hz_16000,
|
||||||
|
AAXClean.SampleRate.Hz_12000,
|
||||||
|
}
|
||||||
|
.Select(s => new SampleRateSelection(s)));
|
||||||
|
|
||||||
|
public AvaloniaList<NAudio.Lame.EncoderQuality> EncoderQualities { get; }
|
||||||
|
= new(
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
NAudio.Lame.EncoderQuality.High,
|
||||||
|
NAudio.Lame.EncoderQuality.Standard,
|
||||||
|
NAudio.Lame.EncoderQuality.Fast,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
public AudioSettingsVM(Configuration config)
|
||||||
|
{
|
||||||
|
LoadSettings(config);
|
||||||
|
}
|
||||||
|
public void LoadSettings(Configuration config)
|
||||||
|
{
|
||||||
|
CreateCueSheet = config.CreateCueSheet;
|
||||||
|
AllowLibationFixup = config.AllowLibationFixup;
|
||||||
|
DownloadCoverArt = config.DownloadCoverArt;
|
||||||
|
RetainAaxFile = config.RetainAaxFile;
|
||||||
|
DownloadClipsBookmarks = config.DownloadClipsBookmarks;
|
||||||
|
ClipBookmarkFormat = config.ClipsBookmarksFileFormat;
|
||||||
|
SplitFilesByChapter = config.SplitFilesByChapter;
|
||||||
|
MergeOpeningAndEndCredits = config.MergeOpeningAndEndCredits;
|
||||||
|
StripAudibleBrandAudio = config.StripAudibleBrandAudio;
|
||||||
|
StripUnabridged = config.StripUnabridged;
|
||||||
|
ChapterTitleTemplate = config.ChapterTitleTemplate;
|
||||||
|
DecryptToLossy = config.DecryptToLossy;
|
||||||
|
MoveMoovToBeginning = config.MoveMoovToBeginning;
|
||||||
|
LameTargetBitrate = config.LameTargetBitrate;
|
||||||
|
LameDownsampleMono = config.LameDownsampleMono;
|
||||||
|
LameConstantBitrate = config.LameConstantBitrate;
|
||||||
|
LameMatchSource = config.LameMatchSourceBR;
|
||||||
|
LameBitrate = config.LameBitrate;
|
||||||
|
LameVBRQuality = config.LameVBRQuality;
|
||||||
|
|
||||||
|
SelectedSampleRate = SampleRates.FirstOrDefault(s => s.SampleRate == config.MaxSampleRate);
|
||||||
|
SelectedEncoderQuality = config.LameEncoderQuality;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveSettings(Configuration config)
|
||||||
|
{
|
||||||
|
config.CreateCueSheet = CreateCueSheet;
|
||||||
|
config.AllowLibationFixup = AllowLibationFixup;
|
||||||
|
config.DownloadCoverArt = DownloadCoverArt;
|
||||||
|
config.RetainAaxFile = RetainAaxFile;
|
||||||
|
config.DownloadClipsBookmarks = DownloadClipsBookmarks;
|
||||||
|
config.ClipsBookmarksFileFormat = ClipBookmarkFormat;
|
||||||
|
config.SplitFilesByChapter = SplitFilesByChapter;
|
||||||
|
config.MergeOpeningAndEndCredits = MergeOpeningAndEndCredits;
|
||||||
|
config.StripAudibleBrandAudio = StripAudibleBrandAudio;
|
||||||
|
config.StripUnabridged = StripUnabridged;
|
||||||
|
config.ChapterTitleTemplate = ChapterTitleTemplate;
|
||||||
|
config.DecryptToLossy = DecryptToLossy;
|
||||||
|
config.MoveMoovToBeginning = MoveMoovToBeginning;
|
||||||
|
config.LameTargetBitrate = LameTargetBitrate;
|
||||||
|
config.LameDownsampleMono = LameDownsampleMono;
|
||||||
|
config.LameConstantBitrate = LameConstantBitrate;
|
||||||
|
config.LameMatchSourceBR = LameMatchSource;
|
||||||
|
config.LameBitrate = LameBitrate;
|
||||||
|
config.LameVBRQuality = LameVBRQuality;
|
||||||
|
|
||||||
|
config.LameEncoderQuality = SelectedEncoderQuality;
|
||||||
|
config.MaxSampleRate = SelectedSampleRate?.SampleRate ?? config.MaxSampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AvaloniaList<Configuration.ClipBookmarkFormat> ClipBookmarkFormats { get; } = new(Enum<Configuration.ClipBookmarkFormat>.GetValues());
|
||||||
|
public string CreateCueSheetText { get; } = Configuration.GetDescription(nameof(Configuration.CreateCueSheet));
|
||||||
|
public string AllowLibationFixupText { get; } = Configuration.GetDescription(nameof(Configuration.AllowLibationFixup));
|
||||||
|
public string DownloadCoverArtText { get; } = Configuration.GetDescription(nameof(Configuration.DownloadCoverArt));
|
||||||
|
public string RetainAaxFileText { get; } = Configuration.GetDescription(nameof(Configuration.RetainAaxFile));
|
||||||
|
public string SplitFilesByChapterText { get; } = Configuration.GetDescription(nameof(Configuration.SplitFilesByChapter));
|
||||||
|
public string MergeOpeningEndCreditsText { get; } = Configuration.GetDescription(nameof(Configuration.MergeOpeningAndEndCredits));
|
||||||
|
public string StripAudibleBrandingText { get; } = Configuration.GetDescription(nameof(Configuration.StripAudibleBrandAudio));
|
||||||
|
public string StripUnabridgedText { get; } = Configuration.GetDescription(nameof(Configuration.StripUnabridged));
|
||||||
|
public string ChapterTitleTemplateText { get; } = Configuration.GetDescription(nameof(Configuration.ChapterTitleTemplate));
|
||||||
|
public string MoveMoovToBeginningText { get; } = Configuration.GetDescription(nameof(Configuration.MoveMoovToBeginning));
|
||||||
|
|
||||||
|
public bool CreateCueSheet { get; set; }
|
||||||
|
public bool DownloadCoverArt { get; set; }
|
||||||
|
public bool RetainAaxFile { get; set; }
|
||||||
|
public bool DownloadClipsBookmarks { get => _downloadClipsBookmarks; set => this.RaiseAndSetIfChanged(ref _downloadClipsBookmarks, value); }
|
||||||
|
public Configuration.ClipBookmarkFormat ClipBookmarkFormat { get; set; }
|
||||||
|
public bool MergeOpeningAndEndCredits { get; set; }
|
||||||
|
public bool StripAudibleBrandAudio { get; set; }
|
||||||
|
public bool StripUnabridged { get; set; }
|
||||||
|
public bool DecryptToLossy { get => _decryptToLossy; set => this.RaiseAndSetIfChanged(ref _decryptToLossy, value); }
|
||||||
|
public bool MoveMoovToBeginning { get; set; }
|
||||||
|
|
||||||
|
public bool LameDownsampleMono { get; set; } = Design.IsDesignMode;
|
||||||
|
public bool LameConstantBitrate { get; set; } = Design.IsDesignMode;
|
||||||
|
|
||||||
|
public bool SplitFilesByChapter { get => _splitFilesByChapter; set { this.RaiseAndSetIfChanged(ref _splitFilesByChapter, value); } }
|
||||||
|
public bool LameTargetBitrate { get => _lameTargetBitrate; set { this.RaiseAndSetIfChanged(ref _lameTargetBitrate, value); } }
|
||||||
|
public bool LameMatchSource { get => _lameMatchSource; set { this.RaiseAndSetIfChanged(ref _lameMatchSource, value); } }
|
||||||
|
public int LameBitrate { get => _lameBitrate; set { this.RaiseAndSetIfChanged(ref _lameBitrate, value); } }
|
||||||
|
public int LameVBRQuality { get => _lameVBRQuality; set { this.RaiseAndSetIfChanged(ref _lameVBRQuality, value); } }
|
||||||
|
|
||||||
|
public string ChapterTitleTemplate { get => _chapterTitleTemplate; set { this.RaiseAndSetIfChanged(ref _chapterTitleTemplate, value); } }
|
||||||
|
|
||||||
|
public bool AllowLibationFixup
|
||||||
|
{
|
||||||
|
get => _allowLibationFixup;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (!this.RaiseAndSetIfChanged(ref _allowLibationFixup, value))
|
||||||
|
{
|
||||||
|
SplitFilesByChapter = false;
|
||||||
|
StripAudibleBrandAudio = false;
|
||||||
|
StripUnabridged = false;
|
||||||
|
DecryptToLossy = false;
|
||||||
|
this.RaisePropertyChanged(nameof(SplitFilesByChapter));
|
||||||
|
this.RaisePropertyChanged(nameof(StripAudibleBrandAudio));
|
||||||
|
this.RaisePropertyChanged(nameof(StripUnabridged));
|
||||||
|
this.RaisePropertyChanged(nameof(DecryptToLossy));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
using Dinah.Core;
|
||||||
|
using LibationFileManager;
|
||||||
|
using ReactiveUI;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.ViewModels.Settings
|
||||||
|
{
|
||||||
|
public class DownloadDecryptSettingsVM : ViewModelBase, ISettingsDisplay
|
||||||
|
{
|
||||||
|
private string _folderTemplate;
|
||||||
|
private string _fileTemplate;
|
||||||
|
private string _chapterFileTemplate;
|
||||||
|
|
||||||
|
public Configuration Config { get; }
|
||||||
|
public DownloadDecryptSettingsVM(Configuration config)
|
||||||
|
{
|
||||||
|
Config = config;
|
||||||
|
LoadSettings(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Configuration.KnownDirectories> KnownDirectories { get; } = new()
|
||||||
|
{
|
||||||
|
Configuration.KnownDirectories.WinTemp,
|
||||||
|
Configuration.KnownDirectories.UserProfile,
|
||||||
|
Configuration.KnownDirectories.AppDir,
|
||||||
|
Configuration.KnownDirectories.MyDocs,
|
||||||
|
Configuration.KnownDirectories.LibationFiles
|
||||||
|
};
|
||||||
|
|
||||||
|
public void LoadSettings(Configuration config)
|
||||||
|
{
|
||||||
|
BadBookAsk = config.BadBook is Configuration.BadBookAction.Ask;
|
||||||
|
BadBookAbort = config.BadBook is Configuration.BadBookAction.Abort;
|
||||||
|
BadBookRetry = config.BadBook is Configuration.BadBookAction.Retry;
|
||||||
|
BadBookIgnore = config.BadBook is Configuration.BadBookAction.Ignore;
|
||||||
|
FolderTemplate = config.FolderTemplate;
|
||||||
|
FileTemplate = config.FileTemplate;
|
||||||
|
ChapterFileTemplate = config.ChapterFileTemplate;
|
||||||
|
InProgressDirectory = config.InProgress;
|
||||||
|
UseCoverAsFolderIcon = config.UseCoverAsFolderIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveSettings(Configuration config)
|
||||||
|
{
|
||||||
|
config.BadBook
|
||||||
|
= BadBookAbort ? Configuration.BadBookAction.Abort
|
||||||
|
: BadBookRetry ? Configuration.BadBookAction.Retry
|
||||||
|
: BadBookIgnore ? Configuration.BadBookAction.Ignore
|
||||||
|
: Configuration.BadBookAction.Ask;
|
||||||
|
|
||||||
|
config.FolderTemplate = FolderTemplate;
|
||||||
|
config.FileTemplate = FileTemplate;
|
||||||
|
config.ChapterFileTemplate = ChapterFileTemplate;
|
||||||
|
config.InProgress = InProgressDirectory;
|
||||||
|
|
||||||
|
config.UseCoverAsFolderIcon = UseCoverAsFolderIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string UseCoverAsFolderIconText { get; } = Configuration.GetDescription(nameof(Configuration.UseCoverAsFolderIcon));
|
||||||
|
public string BadBookGroupboxText { get; } = Configuration.GetDescription(nameof(Configuration.BadBook));
|
||||||
|
public string BadBookAskText { get; } = Configuration.BadBookAction.Ask.GetDescription();
|
||||||
|
public string BadBookAbortText { get; } = Configuration.BadBookAction.Abort.GetDescription();
|
||||||
|
public string BadBookRetryText { get; } = Configuration.BadBookAction.Retry.GetDescription();
|
||||||
|
public string BadBookIgnoreText { get; } = Configuration.BadBookAction.Ignore.GetDescription();
|
||||||
|
public string FolderTemplateText { get; } = Configuration.GetDescription(nameof(Configuration.FolderTemplate));
|
||||||
|
public string FileTemplateText { get; } = Configuration.GetDescription(nameof(Configuration.FileTemplate));
|
||||||
|
public string ChapterFileTemplateText { get; } = Configuration.GetDescription(nameof(Configuration.ChapterFileTemplate));
|
||||||
|
public string EditCharReplacementText { get; } = Configuration.GetDescription(nameof(Configuration.ReplacementCharacters));
|
||||||
|
public string InProgressDescriptionText { get; } = Configuration.GetDescription(nameof(Configuration.InProgress));
|
||||||
|
|
||||||
|
public string FolderTemplate { get => _folderTemplate; set { this.RaiseAndSetIfChanged(ref _folderTemplate, value); } }
|
||||||
|
public string FileTemplate { get => _fileTemplate; set { this.RaiseAndSetIfChanged(ref _fileTemplate, value); } }
|
||||||
|
public string ChapterFileTemplate { get => _chapterFileTemplate; set { this.RaiseAndSetIfChanged(ref _chapterFileTemplate, value); } }
|
||||||
|
public bool UseCoverAsFolderIcon { get; set; }
|
||||||
|
|
||||||
|
public bool BadBookAsk { get; set; }
|
||||||
|
public bool BadBookAbort { get; set; }
|
||||||
|
public bool BadBookRetry { get; set; }
|
||||||
|
public bool BadBookIgnore { get; set; }
|
||||||
|
|
||||||
|
public string InProgressDirectory { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
using LibationFileManager;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.ViewModels.Settings
|
||||||
|
{
|
||||||
|
public class ImportSettingsVM : ISettingsDisplay
|
||||||
|
{
|
||||||
|
public ImportSettingsVM(Configuration config)
|
||||||
|
{
|
||||||
|
LoadSettings(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadSettings(Configuration config)
|
||||||
|
{
|
||||||
|
AutoScan = config.AutoScan;
|
||||||
|
ShowImportedStats = config.ShowImportedStats;
|
||||||
|
ImportEpisodes = config.ImportEpisodes;
|
||||||
|
DownloadEpisodes = config.DownloadEpisodes;
|
||||||
|
AutoDownloadEpisodes = config.AutoDownloadEpisodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveSettings(Configuration config)
|
||||||
|
{
|
||||||
|
config.AutoScan = AutoScan;
|
||||||
|
config.ShowImportedStats = ShowImportedStats;
|
||||||
|
config.ImportEpisodes = ImportEpisodes;
|
||||||
|
config.DownloadEpisodes = DownloadEpisodes;
|
||||||
|
config.AutoDownloadEpisodes = AutoDownloadEpisodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string AutoScanText { get; } = Configuration.GetDescription(nameof(Configuration.AutoScan));
|
||||||
|
public string ShowImportedStatsText { get; } = Configuration.GetDescription(nameof(Configuration.ShowImportedStats));
|
||||||
|
public string ImportEpisodesText { get; } = Configuration.GetDescription(nameof(Configuration.ImportEpisodes));
|
||||||
|
public string DownloadEpisodesText { get; } = Configuration.GetDescription(nameof(Configuration.DownloadEpisodes));
|
||||||
|
public string AutoDownloadEpisodesText { get; } = Configuration.GetDescription(nameof(Configuration.AutoDownloadEpisodes));
|
||||||
|
|
||||||
|
public bool AutoScan { get; set; }
|
||||||
|
public bool ShowImportedStats { get; set; }
|
||||||
|
public bool ImportEpisodes { get; set; }
|
||||||
|
public bool DownloadEpisodes { get; set; }
|
||||||
|
public bool AutoDownloadEpisodes { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
using FileManager;
|
||||||
|
using LibationFileManager;
|
||||||
|
using ReactiveUI;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.ViewModels.Settings
|
||||||
|
{
|
||||||
|
public class ImportantSettingsVM : ViewModelBase, ISettingsDisplay
|
||||||
|
{
|
||||||
|
private string themeVariant;
|
||||||
|
private string initialThemeVariant;
|
||||||
|
|
||||||
|
public ImportantSettingsVM(Configuration config)
|
||||||
|
{
|
||||||
|
LoadSettings(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadSettings(Configuration config)
|
||||||
|
{
|
||||||
|
BooksDirectory = config.Books.PathWithoutPrefix;
|
||||||
|
SavePodcastsToParentFolder = config.SavePodcastsToParentFolder;
|
||||||
|
LoggingLevel = config.LogLevel;
|
||||||
|
ThemeVariant = initialThemeVariant
|
||||||
|
= Configuration.Instance.GetString(propertyName: nameof(ThemeVariant)) is nameof(Avalonia.Styling.ThemeVariant.Dark)
|
||||||
|
? nameof(Avalonia.Styling.ThemeVariant.Dark)
|
||||||
|
: nameof(Avalonia.Styling.ThemeVariant.Light);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveSettings(Configuration config)
|
||||||
|
{
|
||||||
|
LongPath lonNewBooks = BooksDirectory;
|
||||||
|
if (!System.IO.Directory.Exists(lonNewBooks))
|
||||||
|
System.IO.Directory.CreateDirectory(lonNewBooks);
|
||||||
|
config.Books = BooksDirectory;
|
||||||
|
config.SavePodcastsToParentFolder = SavePodcastsToParentFolder;
|
||||||
|
config.LogLevel = LoggingLevel;
|
||||||
|
Configuration.Instance.SetString(ThemeVariant, nameof(ThemeVariant));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Configuration.KnownDirectories> KnownDirectories { get; } = new()
|
||||||
|
{
|
||||||
|
Configuration.KnownDirectories.UserProfile,
|
||||||
|
Configuration.KnownDirectories.AppDir,
|
||||||
|
Configuration.KnownDirectories.MyDocs
|
||||||
|
};
|
||||||
|
|
||||||
|
public string BooksText { get; } = Configuration.GetDescription(nameof(Configuration.Books));
|
||||||
|
public string SavePodcastsToParentFolderText { get; } = Configuration.GetDescription(nameof(Configuration.SavePodcastsToParentFolder));
|
||||||
|
public Serilog.Events.LogEventLevel[] LoggingLevels { get; } = Enum.GetValues<Serilog.Events.LogEventLevel>();
|
||||||
|
public string BetaOptInText { get; } = Configuration.GetDescription(nameof(Configuration.BetaOptIn));
|
||||||
|
public string[] Themes { get; } = { nameof(Avalonia.Styling.ThemeVariant.Light), nameof(Avalonia.Styling.ThemeVariant.Dark) };
|
||||||
|
|
||||||
|
public string BooksDirectory { get; set; }
|
||||||
|
public bool SavePodcastsToParentFolder { get; set; }
|
||||||
|
public Serilog.Events.LogEventLevel LoggingLevel { get; set; }
|
||||||
|
|
||||||
|
public string ThemeVariant
|
||||||
|
{
|
||||||
|
get => themeVariant;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this.RaiseAndSetIfChanged(ref themeVariant, value);
|
||||||
|
|
||||||
|
SelectionChanged = ThemeVariant != initialThemeVariant;
|
||||||
|
this.RaisePropertyChanged(nameof(SelectionChanged));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool SelectionChanged { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
39
Source/LibationAvalonia/ViewModels/Settings/SettingsVM.cs
Normal file
39
Source/LibationAvalonia/ViewModels/Settings/SettingsVM.cs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
using LibationFileManager;
|
||||||
|
|
||||||
|
namespace LibationAvalonia.ViewModels.Settings
|
||||||
|
{
|
||||||
|
internal interface ISettingsDisplay
|
||||||
|
{
|
||||||
|
void LoadSettings(Configuration config);
|
||||||
|
void SaveSettings(Configuration config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SettingsVM : ISettingsDisplay
|
||||||
|
{
|
||||||
|
public SettingsVM(Configuration config)
|
||||||
|
{
|
||||||
|
LoadSettings(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImportantSettingsVM ImportantSettings { get; private set; }
|
||||||
|
public ImportSettingsVM ImportSettings { get; private set; }
|
||||||
|
public DownloadDecryptSettingsVM DownloadDecryptSettings { get; private set; }
|
||||||
|
public AudioSettingsVM AudioSettings { get; private set; }
|
||||||
|
|
||||||
|
public void LoadSettings(Configuration config)
|
||||||
|
{
|
||||||
|
ImportantSettings = new ImportantSettingsVM(config);
|
||||||
|
ImportSettings = new ImportSettingsVM(config);
|
||||||
|
DownloadDecryptSettings = new DownloadDecryptSettingsVM(config);
|
||||||
|
AudioSettings = new AudioSettingsVM(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveSettings(Configuration config)
|
||||||
|
{
|
||||||
|
ImportantSettings.SaveSettings(config);
|
||||||
|
ImportSettings.SaveSettings(config);
|
||||||
|
DownloadDecryptSettings.SaveSettings(config);
|
||||||
|
AudioSettings.SaveSettings(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user