diff --git a/Source/LibationAvalonia/Controls/DirectoryOrCustomSelectControl.axaml.cs b/Source/LibationAvalonia/Controls/DirectoryOrCustomSelectControl.axaml.cs
index 14e66f0c..3e851854 100644
--- a/Source/LibationAvalonia/Controls/DirectoryOrCustomSelectControl.axaml.cs
+++ b/Source/LibationAvalonia/Controls/DirectoryOrCustomSelectControl.axaml.cs
@@ -1,16 +1,10 @@
using Avalonia;
using Avalonia.Controls;
-using Avalonia.Data;
-using Avalonia.Data.Converters;
using Dinah.Core;
using LibationFileManager;
using ReactiveUI;
-using System;
using System.Collections.Generic;
-using System.Globalization;
using System.Linq;
-using System.Reactive.Subjects;
-using System.Security.Cryptography;
namespace LibationAvalonia.Controls
{
diff --git a/Source/LibationAvalonia/Controls/Settings/Audio.axaml b/Source/LibationAvalonia/Controls/Settings/Audio.axaml
new file mode 100644
index 00000000..acfcc007
--- /dev/null
+++ b/Source/LibationAvalonia/Controls/Settings/Audio.axaml
@@ -0,0 +1,334 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs b/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs
new file mode 100644
index 00000000..b79d08e8
--- /dev/null
+++ b/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs
@@ -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
+ {
+ 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.CreateNameEditor(ViewModel.ChapterTitleTemplate));
+ if (newTemplate is not null)
+ ViewModel.ChapterTitleTemplate = newTemplate;
+ }
+
+ private async Task editTemplate(ITemplateEditor template)
+ {
+ var form = new EditTemplateDialog(template);
+ if (await form.ShowDialog(this.GetParentWindow()) == DialogResult.OK)
+ return template.EditingTemplate.TemplateText;
+ else return null;
+ }
+ }
+}
diff --git a/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml b/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml
new file mode 100644
index 00000000..70400c83
--- /dev/null
+++ b/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml.cs b/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml.cs
new file mode 100644
index 00000000..a7708f3e
--- /dev/null
+++ b/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml.cs
@@ -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
+ {
+ 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.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.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.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(this.GetParentWindow());
+ }
+
+
+ private async Task editTemplate(ITemplateEditor template)
+ {
+ var form = new EditTemplateDialog(template);
+ if (await form.ShowDialog(this.GetParentWindow()) == DialogResult.OK)
+ return template.EditingTemplate.TemplateText;
+ else return null;
+ }
+ }
+}
diff --git a/Source/LibationAvalonia/Controls/Settings/Import.axaml b/Source/LibationAvalonia/Controls/Settings/Import.axaml
new file mode 100644
index 00000000..a78daaee
--- /dev/null
+++ b/Source/LibationAvalonia/Controls/Settings/Import.axaml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/LibationAvalonia/Controls/Settings/Import.axaml.cs b/Source/LibationAvalonia/Controls/Settings/Import.axaml.cs
new file mode 100644
index 00000000..d43d3454
--- /dev/null
+++ b/Source/LibationAvalonia/Controls/Settings/Import.axaml.cs
@@ -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
+ {
+ public Import()
+ {
+ InitializeComponent();
+
+ if (Design.IsDesignMode)
+ {
+ _ = Configuration.Instance.LibationFiles;
+ DataContext = new ImportSettingsVM(Configuration.Instance);
+ }
+ }
+ }
+}
diff --git a/Source/LibationAvalonia/Controls/Settings/Important.axaml b/Source/LibationAvalonia/Controls/Settings/Important.axaml
new file mode 100644
index 00000000..2b42dd29
--- /dev/null
+++ b/Source/LibationAvalonia/Controls/Settings/Important.axaml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/LibationAvalonia/Controls/Settings/Important.axaml.cs b/Source/LibationAvalonia/Controls/Settings/Important.axaml.cs
new file mode 100644
index 00000000..43724111
--- /dev/null
+++ b/Source/LibationAvalonia/Controls/Settings/Important.axaml.cs
@@ -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
+ {
+ 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);
+ }
+ }
+}
diff --git a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml
index 9fcd1a9b..2f6fa609 100644
--- a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml
+++ b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml
@@ -3,10 +3,13 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="900" d:DesignHeight="750"
- MinWidth="900" MinHeight="700"
- Width="900" Height="700"
+ MinWidth="900" MinHeight="750"
+ Width="900" Height="750"
x:Class="LibationAvalonia.Dialogs.SettingsDialog"
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"
Icon="/Assets/libation.ico">
@@ -24,789 +27,61 @@
-
+
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
+
-
+
+
-
+
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs
index 8f253da9..7160fafa 100644
--- a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs
+++ b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs
@@ -2,6 +2,7 @@ using Avalonia.Collections;
using Avalonia.Controls;
using Dinah.Core;
using FileManager;
+using LibationAvalonia.ViewModels.Settings;
using LibationFileManager;
using LibationUiBase;
using ReactiveUI;
@@ -14,7 +15,7 @@ namespace LibationAvalonia.Dialogs
{
public partial class SettingsDialog : DialogWindow
{
- private SettingsPages settingsDisp;
+ private SettingsVM settingsDisp;
private readonly Configuration config = Configuration.Instance;
public SettingsDialog()
@@ -28,8 +29,17 @@ namespace LibationAvalonia.Dialogs
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;
+ }
+
+ #endregion
+
+ settingsDisp.SaveSettings(config);
await MessageBox.VerboseLoggingWarning_ShowIfTrue();
await base.SaveAndCloseAsync();
@@ -42,489 +52,5 @@ namespace LibationAvalonia.Dialogs
{
Go.To.Folder(((LongPath)Configuration.Instance.LibationFiles).ShortPathName);
}
-
- public async void EditFolderTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
- {
- var newTemplate = await editTemplate(TemplateEditor.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.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.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(this);
- }
-
- public async void EditChapterTitleTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
- {
- var newTemplate = await editTemplate(TemplateEditor.CreateNameEditor(settingsDisp.AudioSettings.ChapterTitleTemplate));
- if (newTemplate is not null)
- settingsDisp.AudioSettings.ChapterTitleTemplate = newTemplate;
- }
-
- private async Task editTemplate(ITemplateEditor template)
- {
- var form = new EditTemplateDialog(template);
- if (await form.ShowDialog(this) == DialogResult.OK)
- return template.EditingTemplate.TemplateText;
- else return null;
- }
- }
-
- internal interface ISettingsDisplay
- {
- void LoadSettings(Configuration config);
- Task 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 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 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 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();
- 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 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 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 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 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 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 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 ClipBookmarkFormats { get; } = new(Enum.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));
- }
- }
- }
}
}
diff --git a/Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs
new file mode 100644
index 00000000..98e9f515
--- /dev/null
+++ b/Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs
@@ -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 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 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 ClipBookmarkFormats { get; } = new(Enum.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));
+ }
+ }
+ }
+ }
+}
diff --git a/Source/LibationAvalonia/ViewModels/Settings/DownloadDecryptSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/DownloadDecryptSettingsVM.cs
new file mode 100644
index 00000000..9a206bba
--- /dev/null
+++ b/Source/LibationAvalonia/ViewModels/Settings/DownloadDecryptSettingsVM.cs
@@ -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 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; }
+ }
+}
diff --git a/Source/LibationAvalonia/ViewModels/Settings/ImportSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/ImportSettingsVM.cs
new file mode 100644
index 00000000..87e92899
--- /dev/null
+++ b/Source/LibationAvalonia/ViewModels/Settings/ImportSettingsVM.cs
@@ -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; }
+ }
+}
diff --git a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs
new file mode 100644
index 00000000..aab917a6
--- /dev/null
+++ b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs
@@ -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 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();
+ 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; }
+ }
+}
diff --git a/Source/LibationAvalonia/ViewModels/Settings/SettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/SettingsVM.cs
new file mode 100644
index 00000000..2e275dd1
--- /dev/null
+++ b/Source/LibationAvalonia/ViewModels/Settings/SettingsVM.cs
@@ -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);
+ }
+ }
+}