From eee785377ff7b0de466bf238c1380fe7a1d35c63 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Mon, 9 Jan 2023 14:05:33 -0700 Subject: [PATCH 1/8] Add default values to Configuration --- Source/AppScaffolding/LibationScaffolding.cs | 110 +----------------- Source/FileManager/PersistentDictionary.cs | 8 +- Source/LibationAvalonia/App.axaml.cs | 2 - Source/LibationAvalonia/FormSaveExtension.cs | 3 +- .../Views/MainWindow.Export.cs | 2 - .../Views/MainWindow.Filter.cs | 1 - .../Views/MainWindow.Liberate.cs | 1 - .../Views/MainWindow.ProcessQueue.cs | 5 +- .../Views/MainWindow.QuickFilters.cs | 1 - .../Views/MainWindow.RemoveBooks.cs | 1 - .../Views/MainWindow.ScanAuto.cs | 1 - .../Views/MainWindow.ScanManual.cs | 2 - .../Views/MainWindow.ScanNotification.cs | 1 - .../Views/MainWindow.Settings.cs | 1 - .../Views/MainWindow.Update.cs | 2 +- .../Views/MainWindow.VisibleBooks.cs | 3 - .../Configuration.PersistentSettings.cs | 89 +++++++------- .../Configuration.PropertyChange.cs | 1 + .../Dialogs/UpgradeNotificationDialog.cs | 2 +- Source/LibationWinForms/Form1.ProcessQueue.cs | 2 +- Source/LibationWinForms/FormSaveExtension.cs | 2 +- Source/LibationWinForms/Program.cs | 1 - Source/LibationWinForms/Updater.cs | 2 +- 23 files changed, 58 insertions(+), 185 deletions(-) diff --git a/Source/AppScaffolding/LibationScaffolding.cs b/Source/AppScaffolding/LibationScaffolding.cs index 5c6af0df..a36517e9 100644 --- a/Source/AppScaffolding/LibationScaffolding.cs +++ b/Source/AppScaffolding/LibationScaffolding.cs @@ -77,7 +77,6 @@ namespace AppScaffolding public static void RunPostConfigMigrations(Configuration config) { AudibleApiStorage.EnsureAccountsSettingsFileExists(); - PopulateMissingConfigValues(config); // // migrations go below here @@ -86,110 +85,6 @@ namespace AppScaffolding Migrations.migrate_to_v6_6_9(config); } - public static void PopulateMissingConfigValues(Configuration config) - { - config.InProgress ??= Configuration.WinTemp; - - if (!config.Exists(nameof(config.UseCoverAsFolderIcon))) - config.UseCoverAsFolderIcon = false; - - if (!config.Exists(nameof(config.BetaOptIn))) - config.BetaOptIn = false; - - if (!config.Exists(nameof(config.AllowLibationFixup))) - config.AllowLibationFixup = true; - - if (!config.Exists(nameof(config.CreateCueSheet))) - config.CreateCueSheet = true; - - if (!config.Exists(nameof(config.RetainAaxFile))) - config.RetainAaxFile = false; - - if (!config.Exists(nameof(config.SplitFilesByChapter))) - config.SplitFilesByChapter = false; - - if (!config.Exists(nameof(config.StripUnabridged))) - config.StripUnabridged = false; - - if (!config.Exists(nameof(config.StripAudibleBrandAudio))) - config.StripAudibleBrandAudio = false; - - if (!config.Exists(nameof(config.DecryptToLossy))) - config.DecryptToLossy = false; - - if (!config.Exists(nameof(config.LameTargetBitrate))) - config.LameTargetBitrate = false; - - if (!config.Exists(nameof(config.LameDownsampleMono))) - config.LameDownsampleMono = true; - - if (!config.Exists(nameof(config.LameBitrate))) - config.LameBitrate = 64; - - if (!config.Exists(nameof(config.LameConstantBitrate))) - config.LameConstantBitrate = false; - - if (!config.Exists(nameof(config.LameMatchSourceBR))) - config.LameMatchSourceBR = true; - - if (!config.Exists(nameof(config.LameVBRQuality))) - config.LameVBRQuality = 2; - - if (!config.Exists(nameof(config.BadBook))) - config.BadBook = Configuration.BadBookAction.Ask; - - if (!config.Exists(nameof(config.ShowImportedStats))) - config.ShowImportedStats = true; - - if (!config.Exists(nameof(config.ImportEpisodes))) - config.ImportEpisodes = true; - - if (!config.Exists(nameof(config.DownloadEpisodes))) - config.DownloadEpisodes = true; - - if (!config.Exists(nameof(config.ReplacementCharacters))) - config.ReplacementCharacters = FileManager.ReplacementCharacters.Default; - - if (!config.Exists(nameof(config.FolderTemplate))) - config.FolderTemplate = Templates.Folder.DefaultTemplate; - - if (!config.Exists(nameof(config.FileTemplate))) - config.FileTemplate = Templates.File.DefaultTemplate; - - if (!config.Exists(nameof(config.ChapterFileTemplate))) - config.ChapterFileTemplate = Templates.ChapterFile.DefaultTemplate; - - if (!config.Exists(nameof(config.ChapterTitleTemplate))) - config.ChapterTitleTemplate = Templates.ChapterTitle.DefaultTemplate; - - if (!config.Exists(nameof(config.AutoScan))) - config.AutoScan = true; - - if (!config.Exists(nameof(config.GridColumnsVisibilities))) - config.GridColumnsVisibilities = new Dictionary(); - - if (!config.Exists(nameof(config.GridColumnsDisplayIndices))) - config.GridColumnsDisplayIndices = new Dictionary(); - - if (!config.Exists(nameof(config.GridColumnsWidths))) - config.GridColumnsWidths = new Dictionary(); - - if (!config.Exists(nameof(config.DownloadCoverArt))) - config.DownloadCoverArt = true; - - if (!config.Exists(nameof(config.DownloadClipsBookmarks))) - config.DownloadClipsBookmarks = false; - - if (!config.Exists(nameof(config.ClipsBookmarksFileFormat))) - config.ClipsBookmarksFileFormat = Configuration.ClipBookmarkFormat.CSV; - - if (!config.Exists(nameof(config.AutoDownloadEpisodes))) - config.AutoDownloadEpisodes = false; - - if (!config.Exists(nameof(config.DownloadSpeedLimit))) - config.DownloadSpeedLimit = 0; - } - /// Initialize logging. Wire-up events. Run after migration public static void RunPostMigrationScaffolding(Configuration config) { @@ -366,10 +261,6 @@ namespace AppScaffolding if (!Version.TryParse(latestVersionString, out var latestRelease)) return null; - // we're up to date - if (latestRelease <= BuildVersion) - return null; - // we have an update var zipUrl = zip?.BrowserDownloadUrl; @@ -405,6 +296,7 @@ namespace AppScaffolding var repoName = "Libation"; var gitHubClient = new Octokit.GitHubClient(new Octokit.ProductHeaderValue(repoName)); + gitHubClient.Credentials = new("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"); //Download the release index var bts = await gitHubClient.Repository.Content.GetRawContent(ownerAccount, repoName, ".releaseindex.json"); diff --git a/Source/FileManager/PersistentDictionary.cs b/Source/FileManager/PersistentDictionary.cs index 315bcd36..22d58e4a 100644 --- a/Source/FileManager/PersistentDictionary.cs +++ b/Source/FileManager/PersistentDictionary.cs @@ -33,24 +33,24 @@ namespace FileManager createNewFile(); } - public string GetString(string propertyName) + public string GetString(string propertyName, string defaultValue = null) { if (!stringCache.ContainsKey(propertyName)) { var jObject = readFile(); if (!jObject.ContainsKey(propertyName)) - return null; + return defaultValue; stringCache[propertyName] = jObject[propertyName].Value(); } return stringCache[propertyName]; } - public T GetNonString(string propertyName) + public T GetNonString(string propertyName, T defaultValue = default) { var obj = GetObject(propertyName); - if (obj is null) return default; + if (obj is null) return defaultValue; if (obj.GetType().IsAssignableTo(typeof(T))) return (T)obj; if (obj is JObject jObject) return jObject.ToObject(); if (obj is JValue jValue) diff --git a/Source/LibationAvalonia/App.axaml.cs b/Source/LibationAvalonia/App.axaml.cs index a7dcc392..e4b5d3db 100644 --- a/Source/LibationAvalonia/App.axaml.cs +++ b/Source/LibationAvalonia/App.axaml.cs @@ -131,8 +131,6 @@ namespace LibationAvalonia { config.Books ??= Path.Combine(Configuration.UserProfile, "Books"); - AppScaffolding.LibationScaffolding.PopulateMissingConfigValues(config); - var settingsDialog = new SettingsDialog(); desktop.MainWindow = settingsDialog; settingsDialog.RestoreSizeAndLocation(Configuration.Instance); diff --git a/Source/LibationAvalonia/FormSaveExtension.cs b/Source/LibationAvalonia/FormSaveExtension.cs index 384f3323..748bb344 100644 --- a/Source/LibationAvalonia/FormSaveExtension.cs +++ b/Source/LibationAvalonia/FormSaveExtension.cs @@ -28,8 +28,7 @@ namespace LibationAvalonia if (Design.IsDesignMode) return; try { - - FormSizeAndPosition savedState = config.GetNonString(form.GetType().Name); + var savedState = config.GetNonString(defaultValue: null, form.GetType().Name); if (savedState is null) return; diff --git a/Source/LibationAvalonia/Views/MainWindow.Export.cs b/Source/LibationAvalonia/Views/MainWindow.Export.cs index 4864fa3e..338c6e3d 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Export.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Export.cs @@ -1,5 +1,4 @@ using ApplicationServices; -using Avalonia.Controls; using Avalonia.Platform.Storage; using LibationFileManager; using System; @@ -7,7 +6,6 @@ using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_Export() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.Filter.cs b/Source/LibationAvalonia/Views/MainWindow.Filter.cs index e550abf2..4df730d0 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Filter.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Filter.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { protected void Configure_Filter() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.Liberate.cs b/Source/LibationAvalonia/Views/MainWindow.Liberate.cs index 6aab470f..c79ba1e9 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Liberate.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Liberate.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_Liberate() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.ProcessQueue.cs b/Source/LibationAvalonia/Views/MainWindow.ProcessQueue.cs index b14acea3..d6bdad54 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ProcessQueue.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ProcessQueue.cs @@ -6,12 +6,11 @@ using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_ProcessQueue() { - var collapseState = !Configuration.Instance.GetNonString(nameof(_viewModel.QueueOpen)); + var collapseState = !Configuration.Instance.GetNonString(defaultValue: true, nameof(_viewModel.QueueOpen)); SetQueueCollapseState(collapseState); } @@ -51,12 +50,12 @@ namespace LibationAvalonia.Views private void SetQueueCollapseState(bool collapsed) { _viewModel.QueueOpen = !collapsed; + Configuration.Instance.SetNonString(!collapsed, nameof(_viewModel.QueueOpen)); } public void ToggleQueueHideBtn_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) { SetQueueCollapseState(_viewModel.QueueOpen); - Configuration.Instance.SetNonString(_viewModel.QueueOpen, nameof(_viewModel.QueueOpen)); } } } diff --git a/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs b/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs index a3f6563f..da00ed0e 100644 --- a/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs +++ b/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs @@ -5,7 +5,6 @@ using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_QuickFilters() diff --git a/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs b/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs index 85e3b135..0a357caf 100644 --- a/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs +++ b/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs @@ -4,7 +4,6 @@ using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_RemoveBooks() diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs b/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs index 422872e4..7348a033 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs @@ -9,7 +9,6 @@ using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private InterruptableTimer autoScanTimer; diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs b/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs index acd9602e..72b9ce29 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs @@ -1,6 +1,5 @@ using ApplicationServices; using AudibleUtilities; -using Avalonia.Controls; using LibationFileManager; using System; using System.Collections.Generic; @@ -9,7 +8,6 @@ using System.Threading.Tasks; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_ScanManual() diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs b/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs index 08f39e8d..77933ab5 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs @@ -4,7 +4,6 @@ using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_ScanNotification() diff --git a/Source/LibationAvalonia/Views/MainWindow.Settings.cs b/Source/LibationAvalonia/Views/MainWindow.Settings.cs index 296def23..027e56bf 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Settings.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Settings.cs @@ -3,7 +3,6 @@ using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_Settings() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.Update.cs b/Source/LibationAvalonia/Views/MainWindow.Update.cs index 40f515cc..99d2bfa8 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Update.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Update.cs @@ -80,7 +80,7 @@ namespace LibationAvalonia.Views const string ignoreUpdate = "IgnoreUpdate"; var config = Configuration.Instance; - if (config.GetString(ignoreUpdate) == upgradeProperties.LatestRelease.ToString()) + if (config.GetString(propertyName: ignoreUpdate) == upgradeProperties.LatestRelease.ToString()) return; var notificationResult = await new UpgradeNotificationDialog(upgradeProperties, Configuration.IsWindows).ShowDialog(this); diff --git a/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs b/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs index d3a2402f..c979845c 100644 --- a/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs +++ b/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs @@ -1,15 +1,12 @@ using ApplicationServices; using Avalonia.Threading; using DataLayer; -using Dinah.Core; -using LibationFileManager; using System; using System.Linq; using System.Threading.Tasks; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_VisibleBooks() diff --git a/Source/LibationFileManager/Configuration.PersistentSettings.cs b/Source/LibationFileManager/Configuration.PersistentSettings.cs index 890617b1..dc5e2686 100644 --- a/Source/LibationFileManager/Configuration.PersistentSettings.cs +++ b/Source/LibationFileManager/Configuration.PersistentSettings.cs @@ -20,9 +20,9 @@ namespace LibationFileManager private PersistentDictionary persistentDictionary; - public T GetNonString([CallerMemberName] string propertyName = "") => persistentDictionary.GetNonString(propertyName); + public T GetNonString(T defaultValue, [CallerMemberName] string propertyName = "") => persistentDictionary.GetNonString(propertyName, defaultValue); public object GetObject([CallerMemberName] string propertyName = "") => persistentDictionary.GetObject(propertyName); - public string GetString([CallerMemberName] string propertyName = "") => persistentDictionary.GetString(propertyName); + public string GetString(string defaultValue = null, [CallerMemberName] string propertyName = "") => persistentDictionary.GetString(propertyName, defaultValue); public void SetNonString(object newValue, [CallerMemberName] string propertyName = "") { var existing = getExistingValue(propertyName); @@ -74,77 +74,77 @@ namespace LibationFileManager public bool Exists(string propertyName) => persistentDictionary.Exists(propertyName); [Description("Set cover art as the folder's icon. (Windows only)")] - public bool UseCoverAsFolderIcon { get => GetNonString(); set => SetNonString(value); } + public bool UseCoverAsFolderIcon { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Use the beta version of Libation\r\nNew and experimental features, but probably buggy.\r\n(requires restart to take effect)")] - public bool BetaOptIn { get => GetNonString(); set => SetNonString(value); } + public bool BetaOptIn { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Location for book storage. Includes destination of newly liberated books")] public string Books { get => GetString(); set => SetString(value); } // temp/working dir(s) should be outside of dropbox [Description("Temporary location of files while they're in process of being downloaded and decrypted.\r\nWhen decryption is complete, the final file will be in Books location\r\nRecommend not using a folder which is backed up real time. Eg: Dropbox, iCloud, Google Drive")] - public string InProgress { get => GetString(); set => SetString(value); } + public string InProgress { get => GetString(defaultValue: WinTemp); set => SetString(value); } [Description("Allow Libation to fix up audiobook metadata")] - public bool AllowLibationFixup { get => GetNonString(); set => SetNonString(value); } + public bool AllowLibationFixup { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Create a cue sheet (.cue)")] - public bool CreateCueSheet { get => GetNonString(); set => SetNonString(value); } + public bool CreateCueSheet { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Retain the Aax file after successfully decrypting")] - public bool RetainAaxFile { get => GetNonString(); set => SetNonString(value); } + public bool RetainAaxFile { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Split my books into multiple files by chapter")] - public bool SplitFilesByChapter { get => GetNonString(); set => SetNonString(value); } + public bool SplitFilesByChapter { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Merge Opening/End Credits into the following/preceding chapters")] - public bool MergeOpeningAndEndCredits { get => GetNonString(); set => SetNonString(value); } + public bool MergeOpeningAndEndCredits { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Strip \"(Unabridged)\" from audiobook metadata tags")] - public bool StripUnabridged { get => GetNonString(); set => SetNonString(value); } + public bool StripUnabridged { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Strip audible branding from the start and end of audiobooks.\r\n(e.g. \"This is Audible\")")] - public bool StripAudibleBrandAudio { get => GetNonString(); set => SetNonString(value); } + public bool StripAudibleBrandAudio { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Decrypt to lossy format?")] - public bool DecryptToLossy { get => GetNonString(); set => SetNonString(value); } + public bool DecryptToLossy { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Lame encoder target. true = Bitrate, false = Quality")] - public bool LameTargetBitrate { get => GetNonString(); set => SetNonString(value); } + public bool LameTargetBitrate { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Lame encoder downsamples to mono")] - public bool LameDownsampleMono { get => GetNonString(); set => SetNonString(value); } + public bool LameDownsampleMono { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Lame target bitrate [16,320]")] - public int LameBitrate { get => GetNonString(); set => SetNonString(value); } + public int LameBitrate { get => GetNonString(defaultValue: 64); set => SetNonString(value); } [Description("Restrict encoder to constant bitrate?")] - public bool LameConstantBitrate { get => GetNonString(); set => SetNonString(value); } + public bool LameConstantBitrate { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Match the source bitrate?")] - public bool LameMatchSourceBR { get => GetNonString(); set => SetNonString(value); } + public bool LameMatchSourceBR { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Lame target VBR quality [10,100]")] - public int LameVBRQuality { get => GetNonString(); set => SetNonString(value); } + public int LameVBRQuality { get => GetNonString(defaultValue: 2); set => SetNonString(value); } [Description("A Dictionary of GridView data property names and bool indicating its column's visibility in ProductsGrid")] - public Dictionary GridColumnsVisibilities { get => GetNonString>().Clone(); set => SetNonString(value); } + public Dictionary GridColumnsVisibilities { get => GetNonString(defaultValue: new EquatableDictionary()).Clone(); set => SetNonString(value); } [Description("A Dictionary of GridView data property names and int indicating its column's display index in ProductsGrid")] - public Dictionary GridColumnsDisplayIndices { get => GetNonString>().Clone(); set => SetNonString(value); } + public Dictionary GridColumnsDisplayIndices { get => GetNonString(defaultValue: new EquatableDictionary()).Clone(); set => SetNonString(value); } [Description("A Dictionary of GridView data property names and int indicating its column's width in ProductsGrid")] - public Dictionary GridColumnsWidths { get => GetNonString>().Clone(); set => SetNonString(value); } + public Dictionary GridColumnsWidths { get => GetNonString(defaultValue: new EquatableDictionary()).Clone(); set => SetNonString(value); } [Description("Save cover image alongside audiobook?")] - public bool DownloadCoverArt { get => GetNonString(); set => SetNonString(value); } + public bool DownloadCoverArt { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Download clips and bookmarks?")] - public bool DownloadClipsBookmarks { get => GetNonString(); set => SetNonString(value); } + public bool DownloadClipsBookmarks { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("File format to save clips and bookmarks")] - public ClipBookmarkFormat ClipsBookmarksFileFormat { get => GetNonString(); set => SetNonString(value); } + public ClipBookmarkFormat ClipsBookmarksFileFormat { get => GetNonString(defaultValue: ClipBookmarkFormat.CSV); set => SetNonString(value); } [JsonConverter(typeof(StringEnumConverter))] public enum ClipBookmarkFormat @@ -171,33 +171,33 @@ namespace LibationFileManager } [Description("When liberating books and there is an error, Libation should:")] - public BadBookAction BadBook { get => GetNonString(); set => SetNonString(value); } + public BadBookAction BadBook { get => GetNonString(defaultValue: BadBookAction.Ask); set => SetNonString(value); } [Description("Show number of newly imported titles? When unchecked, no pop-up will appear after library scan.")] - public bool ShowImportedStats { get => GetNonString(); set => SetNonString(value); } + public bool ShowImportedStats { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Import episodes? (eg: podcasts) When unchecked, episodes will not be imported into Libation.")] - public bool ImportEpisodes { get => GetNonString(); set => SetNonString(value); } + public bool ImportEpisodes { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Download episodes? (eg: podcasts). When unchecked, episodes already in Libation will not be downloaded.")] - public bool DownloadEpisodes { get => GetNonString(); set => SetNonString(value); } + public bool DownloadEpisodes { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Automatically run periodic scans in the background?")] - public bool AutoScan { get => GetNonString(); set => SetNonString(value); } + public bool AutoScan { get => GetNonString(defaultValue: true); set => SetNonString(value); } [Description("Auto download books? After scan, download new books in 'checked' accounts.")] // poorly named setting. Should just be 'AutoDownload'. It is NOT episode specific - public bool AutoDownloadEpisodes { get => GetNonString(); set => SetNonString(value); } + public bool AutoDownloadEpisodes { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Save all podcast episodes in a series to the series parent folder?")] - public bool SavePodcastsToParentFolder { get => GetNonString(); set => SetNonString(value); } + public bool SavePodcastsToParentFolder { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Global download speed limit in bytes per second.")] public long DownloadSpeedLimit { get { - var limit = GetNonString(); + var limit = GetNonString(defaultValue: 0L); return limit <= 0 ? 0 : Math.Max(limit, AaxDecrypter.NetworkFileStream.MIN_BYTES_PER_SECOND); } set @@ -210,42 +210,41 @@ namespace LibationFileManager #region templates: custom file naming [Description("Edit how filename characters are replaced")] - public ReplacementCharacters ReplacementCharacters { get => GetNonString(); set => SetNonString(value); } + public ReplacementCharacters ReplacementCharacters { get => GetNonString(defaultValue: ReplacementCharacters.Default); set => SetNonString(value); } [Description("How to format the folders in which files will be saved")] public string FolderTemplate { - get => getTemplate(nameof(FolderTemplate), Templates.Folder); - set => setTemplate(nameof(FolderTemplate), Templates.Folder, value); + get => Templates.Folder.GetValid(GetString(Templates.Folder.DefaultTemplate)); + set => setTemplate(Templates.Folder, value); } [Description("How to format the saved pdf and audio files")] public string FileTemplate { - get => getTemplate(nameof(FileTemplate), Templates.File); - set => setTemplate(nameof(FileTemplate), Templates.File, value); + get => Templates.File.GetValid(GetString(defaultValue: Templates.File.DefaultTemplate)); + set => setTemplate(Templates.File, value); } [Description("How to format the saved audio files when split by chapters")] public string ChapterFileTemplate { - get => getTemplate(nameof(ChapterFileTemplate), Templates.ChapterFile); - set => setTemplate(nameof(ChapterFileTemplate), Templates.ChapterFile, value); + get => Templates.ChapterFile.GetValid(GetString(defaultValue: Templates.ChapterFile.DefaultTemplate)); + set => setTemplate(Templates.ChapterFile, value); } [Description("How to format the file's Tile stored in metadata")] public string ChapterTitleTemplate { - get => getTemplate(nameof(ChapterTitleTemplate), Templates.ChapterTitle); - set => setTemplate(nameof(ChapterTitleTemplate), Templates.ChapterTitle, value); + get => Templates.ChapterTitle.GetValid(GetString(defaultValue: Templates.ChapterTitle.DefaultTemplate)); + set => setTemplate(Templates.ChapterTitle, value); } - private string getTemplate(string settingName, Templates templ) => templ.GetValid(GetString(settingName)); - private void setTemplate(string settingName, Templates templ, string newValue) + private void setTemplate(Templates templ, string newValue, [CallerMemberName] string propertyName = "") { var template = newValue?.Trim(); if (templ.IsValid(template)) - SetString(template, settingName); + SetString(template, propertyName); } #endregion } diff --git a/Source/LibationFileManager/Configuration.PropertyChange.cs b/Source/LibationFileManager/Configuration.PropertyChange.cs index f384fa3f..c2e0fa76 100644 --- a/Source/LibationFileManager/Configuration.PropertyChange.cs +++ b/Source/LibationFileManager/Configuration.PropertyChange.cs @@ -11,6 +11,7 @@ namespace LibationFileManager */ private class EquatableDictionary : Dictionary { + public EquatableDictionary() { } public EquatableDictionary(IEnumerable> keyValuePairs) : base(keyValuePairs) { } public EquatableDictionary Clone() => new(this); public override bool Equals(object obj) diff --git a/Source/LibationWinForms/Dialogs/UpgradeNotificationDialog.cs b/Source/LibationWinForms/Dialogs/UpgradeNotificationDialog.cs index 8bb7ebdc..bb8bfd69 100644 --- a/Source/LibationWinForms/Dialogs/UpgradeNotificationDialog.cs +++ b/Source/LibationWinForms/Dialogs/UpgradeNotificationDialog.cs @@ -30,7 +30,7 @@ namespace LibationWinForms.Dialogs private void UpgradeNotificationDialog_Load(object sender, EventArgs e) { //This dialog starts before Form1, soposition it at the center of where Form1 will be. - var savedState = Configuration.Instance.GetNonString(nameof(Form1)); + var savedState = Configuration.Instance.GetNonString(defaultValue: null, nameof(Form1)); if (savedState is null) return; diff --git a/Source/LibationWinForms/Form1.ProcessQueue.cs b/Source/LibationWinForms/Form1.ProcessQueue.cs index 62bae864..398e0802 100644 --- a/Source/LibationWinForms/Form1.ProcessQueue.cs +++ b/Source/LibationWinForms/Form1.ProcessQueue.cs @@ -16,7 +16,7 @@ namespace LibationWinForms { processBookQueue1.popoutBtn.Click += ProcessBookQueue1_PopOut; splitContainer1.Panel2MinSize = 350; - var coppalseState = Configuration.Instance.GetNonString(nameof(splitContainer1.Panel2Collapsed)); + var coppalseState = Configuration.Instance.GetNonString(defaultValue: false, nameof(splitContainer1.Panel2Collapsed)); WidthChange = splitContainer1.Panel2.Width + splitContainer1.SplitterWidth; int width = this.Width; SetQueueCollapseState(coppalseState); diff --git a/Source/LibationWinForms/FormSaveExtension.cs b/Source/LibationWinForms/FormSaveExtension.cs index f5763ad3..3ab11630 100644 --- a/Source/LibationWinForms/FormSaveExtension.cs +++ b/Source/LibationWinForms/FormSaveExtension.cs @@ -21,7 +21,7 @@ namespace LibationWinForms public static void RestoreSizeAndLocation(this Form form, Configuration config) { - FormSizeAndPosition savedState = config.GetNonString(form.Name); + var savedState = config.GetNonString(defaultValue: null, form.Name); if (savedState is null) return; diff --git a/Source/LibationWinForms/Program.cs b/Source/LibationWinForms/Program.cs index 7cb9bc75..66ab6fc9 100644 --- a/Source/LibationWinForms/Program.cs +++ b/Source/LibationWinForms/Program.cs @@ -144,7 +144,6 @@ namespace LibationWinForms // INIT DEFAULT SETTINGS // if 'new user' was clicked, or if 'returning user' chose new install: show basic settings dialog config.Books ??= Path.Combine(defaultLibationFilesDir, "Books"); - AppScaffolding.LibationScaffolding.PopulateMissingConfigValues(config); if (new SettingsDialog().ShowDialog() != DialogResult.OK) { diff --git a/Source/LibationWinForms/Updater.cs b/Source/LibationWinForms/Updater.cs index 6e2c1eb7..3bb6a926 100644 --- a/Source/LibationWinForms/Updater.cs +++ b/Source/LibationWinForms/Updater.cs @@ -29,7 +29,7 @@ namespace LibationWinForms const string ignoreUpdate = "IgnoreUpdate"; var config = Configuration.Instance; - if (config.GetString(ignoreUpdate) == args.CurrentVersion) + if (config.GetString(propertyName: ignoreUpdate) == args.CurrentVersion) return; var notificationResult = new UpgradeNotificationDialog(upgradeProperties).ShowDialog(); From 4e80af5c5305ad98335e8efe638971914a14bec3 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Mon, 9 Jan 2023 14:06:06 -0700 Subject: [PATCH 2/8] Bind MyRatingCellEditor background color to the cell's background --- .../Controls/DataGridMyRatingColumn.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Source/LibationAvalonia/Controls/DataGridMyRatingColumn.cs b/Source/LibationAvalonia/Controls/DataGridMyRatingColumn.cs index 36df2d0c..3fefa38c 100644 --- a/Source/LibationAvalonia/Controls/DataGridMyRatingColumn.cs +++ b/Source/LibationAvalonia/Controls/DataGridMyRatingColumn.cs @@ -2,6 +2,9 @@ using Avalonia.Controls; using Avalonia.Interactivity; using DataLayer; +using LibationAvalonia.ViewModels; +using ReactiveUI; +using System; namespace LibationAvalonia.Controls { @@ -29,6 +32,21 @@ namespace LibationAvalonia.Controls myRatingElement.Bind(BindingTarget, Binding); } + void setControlBackground(object dataContext) + { + if (dataContext is GridEntry ge) + myRatingElement.Background = ge.BackgroundBrush; + } + + setControlBackground(cell?.DataContext); + + var subscriber = + cell + ?.ObservableForProperty(g => g.DataContext) + ?.Subscribe(ctx => setControlBackground(ctx?.Value)); + + myRatingElement.DetachedFromVisualTree += (_, _) => subscriber?.Dispose(); + return myRatingElement; } From 2b243a6934e59c798df206fa34d9669c8722e77a Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Mon, 9 Jan 2023 15:28:36 -0700 Subject: [PATCH 3/8] Remove testing code --- Source/AppScaffolding/LibationScaffolding.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/AppScaffolding/LibationScaffolding.cs b/Source/AppScaffolding/LibationScaffolding.cs index a36517e9..a44fe2d3 100644 --- a/Source/AppScaffolding/LibationScaffolding.cs +++ b/Source/AppScaffolding/LibationScaffolding.cs @@ -261,6 +261,10 @@ namespace AppScaffolding if (!Version.TryParse(latestVersionString, out var latestRelease)) return null; + // we're up to date + if (latestRelease <= BuildVersion) + return null; + // we have an update var zipUrl = zip?.BrowserDownloadUrl; @@ -296,7 +300,6 @@ namespace AppScaffolding var repoName = "Libation"; var gitHubClient = new Octokit.GitHubClient(new Octokit.ProductHeaderValue(repoName)); - gitHubClient.Credentials = new("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"); //Download the release index var bts = await gitHubClient.Repository.Content.GetRawContent(ownerAccount, repoName, ".releaseindex.json"); From 50a8c7508a1e5f9d102fe8014a9c762e742c0d45 Mon Sep 17 00:00:00 2001 From: Mbucari Date: Mon, 9 Jan 2023 16:05:55 -0700 Subject: [PATCH 4/8] Cache default values --- Source/FileManager/PersistentDictionary.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Source/FileManager/PersistentDictionary.cs b/Source/FileManager/PersistentDictionary.cs index 22d58e4a..c74a9c35 100644 --- a/Source/FileManager/PersistentDictionary.cs +++ b/Source/FileManager/PersistentDictionary.cs @@ -38,10 +38,11 @@ namespace FileManager if (!stringCache.ContainsKey(propertyName)) { var jObject = readFile(); - if (!jObject.ContainsKey(propertyName)) - return defaultValue; - stringCache[propertyName] = jObject[propertyName].Value(); - } + if (jObject.ContainsKey(propertyName)) + stringCache[propertyName] = jObject[propertyName].Value(); + else + stringCache[propertyName] = defaultValue; + } return stringCache[propertyName]; } @@ -50,12 +51,16 @@ namespace FileManager { var obj = GetObject(propertyName); - if (obj is null) return defaultValue; + if (obj is null) + { + objectCache[propertyName] = defaultValue; + return defaultValue; + } if (obj.GetType().IsAssignableTo(typeof(T))) return (T)obj; if (obj is JObject jObject) return jObject.ToObject(); if (obj is JValue jValue) { - if (jValue.Type == JTokenType.String && typeof(T).IsAssignableTo(typeof(Enum))) + if (typeof(T).IsAssignableTo(typeof(Enum))) { return Enum.TryParse(typeof(T), jValue.Value(), out var enumVal) From e58952035fa9b3034c5b7ab403d81c87043fbcdf Mon Sep 17 00:00:00 2001 From: Mbucari Date: Mon, 9 Jan 2023 16:06:37 -0700 Subject: [PATCH 5/8] Spaces --- Source/FileManager/PersistentDictionary.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/FileManager/PersistentDictionary.cs b/Source/FileManager/PersistentDictionary.cs index c74a9c35..99a2de79 100644 --- a/Source/FileManager/PersistentDictionary.cs +++ b/Source/FileManager/PersistentDictionary.cs @@ -39,10 +39,10 @@ namespace FileManager { var jObject = readFile(); if (jObject.ContainsKey(propertyName)) - stringCache[propertyName] = jObject[propertyName].Value(); - else - stringCache[propertyName] = defaultValue; - } + stringCache[propertyName] = jObject[propertyName].Value(); + else + stringCache[propertyName] = defaultValue; + } return stringCache[propertyName]; } @@ -53,9 +53,9 @@ namespace FileManager if (obj is null) { - objectCache[propertyName] = defaultValue; + objectCache[propertyName] = defaultValue; return defaultValue; - } + } if (obj.GetType().IsAssignableTo(typeof(T))) return (T)obj; if (obj is JObject jObject) return jObject.ToObject(); if (obj is JValue jValue) From 10de241d53c5e9f4b400caadca6408449281de94 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Mon, 9 Jan 2023 15:28:36 -0700 Subject: [PATCH 6/8] Cache default values --- Source/AppScaffolding/LibationScaffolding.cs | 5 ++++- Source/FileManager/PersistentDictionary.cs | 15 ++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Source/AppScaffolding/LibationScaffolding.cs b/Source/AppScaffolding/LibationScaffolding.cs index a36517e9..a44fe2d3 100644 --- a/Source/AppScaffolding/LibationScaffolding.cs +++ b/Source/AppScaffolding/LibationScaffolding.cs @@ -261,6 +261,10 @@ namespace AppScaffolding if (!Version.TryParse(latestVersionString, out var latestRelease)) return null; + // we're up to date + if (latestRelease <= BuildVersion) + return null; + // we have an update var zipUrl = zip?.BrowserDownloadUrl; @@ -296,7 +300,6 @@ namespace AppScaffolding var repoName = "Libation"; var gitHubClient = new Octokit.GitHubClient(new Octokit.ProductHeaderValue(repoName)); - gitHubClient.Credentials = new("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"); //Download the release index var bts = await gitHubClient.Repository.Content.GetRawContent(ownerAccount, repoName, ".releaseindex.json"); diff --git a/Source/FileManager/PersistentDictionary.cs b/Source/FileManager/PersistentDictionary.cs index 22d58e4a..99a2de79 100644 --- a/Source/FileManager/PersistentDictionary.cs +++ b/Source/FileManager/PersistentDictionary.cs @@ -38,9 +38,10 @@ namespace FileManager if (!stringCache.ContainsKey(propertyName)) { var jObject = readFile(); - if (!jObject.ContainsKey(propertyName)) - return defaultValue; - stringCache[propertyName] = jObject[propertyName].Value(); + if (jObject.ContainsKey(propertyName)) + stringCache[propertyName] = jObject[propertyName].Value(); + else + stringCache[propertyName] = defaultValue; } return stringCache[propertyName]; @@ -50,12 +51,16 @@ namespace FileManager { var obj = GetObject(propertyName); - if (obj is null) return defaultValue; + if (obj is null) + { + objectCache[propertyName] = defaultValue; + return defaultValue; + } if (obj.GetType().IsAssignableTo(typeof(T))) return (T)obj; if (obj is JObject jObject) return jObject.ToObject(); if (obj is JValue jValue) { - if (jValue.Type == JTokenType.String && typeof(T).IsAssignableTo(typeof(Enum))) + if (typeof(T).IsAssignableTo(typeof(Enum))) { return Enum.TryParse(typeof(T), jValue.Value(), out var enumVal) From c89eafd5685fd951068632addf039658bb24b763 Mon Sep 17 00:00:00 2001 From: Mbucari Date: Mon, 9 Jan 2023 16:27:19 -0700 Subject: [PATCH 7/8] Fix rating edits updating search results. --- .../LibationAvalonia/ViewModels/GridEntry.cs | 19 +++++++++---------- .../ViewModels/ProductsDisplayViewModel.cs | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Source/LibationAvalonia/ViewModels/GridEntry.cs b/Source/LibationAvalonia/ViewModels/GridEntry.cs index 24d57a76..4219699e 100644 --- a/Source/LibationAvalonia/ViewModels/GridEntry.cs +++ b/Source/LibationAvalonia/ViewModels/GridEntry.cs @@ -57,13 +57,6 @@ namespace LibationAvalonia.ViewModels && updateReviewTask?.IsCompleted is not false) { updateReviewTask = UpdateRating(value); - updateReviewTask.ContinueWith(t => - { - if (t.Result) - LibraryBook.Book.UpdateUserDefinedItem(Book.UserDefinedItem.Tags, Book.UserDefinedItem.BookStatus, Book.UserDefinedItem.PdfStatus, value); - - this.RaiseAndSetIfChanged(ref _myRating, value); - }); } } } @@ -82,12 +75,18 @@ namespace LibationAvalonia.ViewModels #region User rating - private Task updateReviewTask; - private async Task UpdateRating(Rating rating) + private Task updateReviewTask; + private async Task UpdateRating(Rating rating) { var api = await LibraryBook.GetApiAsync(); - return await api.ReviewAsync(Book.AudibleProductId, (int)rating.OverallRating, (int)rating.PerformanceRating, (int)rating.StoryRating); + if (await api.ReviewAsync(Book.AudibleProductId, (int)rating.OverallRating, (int)rating.PerformanceRating, (int)rating.StoryRating)) + { + _myRating = rating; + LibraryBook.Book.UpdateUserDefinedItem(Book.UserDefinedItem.Tags, Book.UserDefinedItem.BookStatus, Book.UserDefinedItem.PdfStatus, rating); + } + + this.RaisePropertyChanged(nameof(MyRating)); } #endregion diff --git a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs index 477282b7..51a09a0c 100644 --- a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs @@ -178,7 +178,7 @@ namespace LibationAvalonia.ViewModels FilteredInGridEntries = filterResults; if (GridEntries.IsEditingItem) - GridEntries.CommitEdit(); + await Dispatcher.UIThread.InvokeAsync(GridEntries.CommitEdit); await Dispatcher.UIThread.InvokeAsync(GridEntries.Refresh); } From 2e49c7f6973e0cd522a2548c043aa10a8db0d576 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Mon, 9 Jan 2023 18:21:59 -0700 Subject: [PATCH 8/8] Commit edits before refresh --- .../ViewModels/ProductsDisplayViewModel.cs | 23 +++++++++++-------- .../Views/MainWindow.Export.cs | 2 ++ .../Views/MainWindow.Filter.cs | 1 + .../Views/MainWindow.Liberate.cs | 1 + .../Views/MainWindow.QuickFilters.cs | 1 + .../Views/MainWindow.RemoveBooks.cs | 1 + .../Views/MainWindow.ScanAuto.cs | 1 + .../Views/MainWindow.ScanManual.cs | 2 ++ .../Views/MainWindow.ScanNotification.cs | 1 + .../Views/MainWindow.Settings.cs | 1 + .../Views/MainWindow.VisibleBooks.cs | 3 +++ .../Configuration.PersistentSettings.cs | 7 +++++- 12 files changed, 34 insertions(+), 10 deletions(-) diff --git a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs index 51a09a0c..2083768c 100644 --- a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs @@ -77,7 +77,7 @@ namespace LibationAvalonia.ViewModels //Run query on new list FilteredInGridEntries = QueryResults(SOURCE, FilterString); - await Dispatcher.UIThread.InvokeAsync(GridEntries.Refresh); + await refreshGrid(); } catch (Exception ex) @@ -86,6 +86,14 @@ namespace LibationAvalonia.ViewModels } } + private async Task refreshGrid() + { + if (GridEntries.IsEditingItem) + await Dispatcher.UIThread.InvokeAsync(GridEntries.CommitEdit); + + await Dispatcher.UIThread.InvokeAsync(GridEntries.Refresh); + } + private static List CreateGridEntries(IEnumerable dbBooks) { var geList = dbBooks @@ -118,10 +126,11 @@ namespace LibationAvalonia.ViewModels return bookList; } - public void ToggleSeriesExpanded(SeriesEntry seriesEntry) + public async Task ToggleSeriesExpanded(SeriesEntry seriesEntry) { seriesEntry.Liberate.Expanded = !seriesEntry.Liberate.Expanded; - GridEntries.Refresh(); + + await refreshGrid(); } #endregion @@ -140,7 +149,7 @@ namespace LibationAvalonia.ViewModels FilteredInGridEntries = QueryResults(SOURCE, searchString); - await Dispatcher.UIThread.InvokeAsync(GridEntries.Refresh); + await refreshGrid(); } private bool CollectionFilter(object item) @@ -176,11 +185,7 @@ namespace LibationAvalonia.ViewModels if (filterResults is not null && FilteredInGridEntries.Intersect(filterResults).Count() != FilteredInGridEntries.Count) { FilteredInGridEntries = filterResults; - - if (GridEntries.IsEditingItem) - await Dispatcher.UIThread.InvokeAsync(GridEntries.CommitEdit); - - await Dispatcher.UIThread.InvokeAsync(GridEntries.Refresh); + await refreshGrid(); } } diff --git a/Source/LibationAvalonia/Views/MainWindow.Export.cs b/Source/LibationAvalonia/Views/MainWindow.Export.cs index 338c6e3d..4864fa3e 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Export.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Export.cs @@ -1,4 +1,5 @@ using ApplicationServices; +using Avalonia.Controls; using Avalonia.Platform.Storage; using LibationFileManager; using System; @@ -6,6 +7,7 @@ using System.Linq; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private void Configure_Export() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.Filter.cs b/Source/LibationAvalonia/Views/MainWindow.Filter.cs index 4df730d0..e550abf2 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Filter.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Filter.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { protected void Configure_Filter() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.Liberate.cs b/Source/LibationAvalonia/Views/MainWindow.Liberate.cs index c79ba1e9..6aab470f 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Liberate.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Liberate.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private void Configure_Liberate() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs b/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs index da00ed0e..a3f6563f 100644 --- a/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs +++ b/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs @@ -5,6 +5,7 @@ using System.Linq; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private void Configure_QuickFilters() diff --git a/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs b/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs index 0a357caf..85e3b135 100644 --- a/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs +++ b/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs @@ -4,6 +4,7 @@ using System.Linq; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private void Configure_RemoveBooks() diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs b/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs index 7348a033..422872e4 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs @@ -9,6 +9,7 @@ using System.Linq; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private InterruptableTimer autoScanTimer; diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs b/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs index 72b9ce29..acd9602e 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs @@ -1,5 +1,6 @@ using ApplicationServices; using AudibleUtilities; +using Avalonia.Controls; using LibationFileManager; using System; using System.Collections.Generic; @@ -8,6 +9,7 @@ using System.Threading.Tasks; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private void Configure_ScanManual() diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs b/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs index 77933ab5..08f39e8d 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs @@ -4,6 +4,7 @@ using System.Linq; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private void Configure_ScanNotification() diff --git a/Source/LibationAvalonia/Views/MainWindow.Settings.cs b/Source/LibationAvalonia/Views/MainWindow.Settings.cs index 027e56bf..296def23 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Settings.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Settings.cs @@ -3,6 +3,7 @@ using System.Linq; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private void Configure_Settings() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs b/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs index c979845c..d3a2402f 100644 --- a/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs +++ b/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs @@ -1,12 +1,15 @@ using ApplicationServices; using Avalonia.Threading; using DataLayer; +using Dinah.Core; +using LibationFileManager; using System; using System.Linq; using System.Threading.Tasks; namespace LibationAvalonia.Views { + //DONE public partial class MainWindow { private void Configure_VisibleBooks() diff --git a/Source/LibationFileManager/Configuration.PersistentSettings.cs b/Source/LibationFileManager/Configuration.PersistentSettings.cs index b8e3c4ee..0482a96a 100644 --- a/Source/LibationFileManager/Configuration.PersistentSettings.cs +++ b/Source/LibationFileManager/Configuration.PersistentSettings.cs @@ -84,7 +84,12 @@ namespace LibationFileManager // temp/working dir(s) should be outside of dropbox [Description("Temporary location of files while they're in process of being downloaded and decrypted.\r\nWhen decryption is complete, the final file will be in Books location\r\nRecommend not using a folder which is backed up real time. Eg: Dropbox, iCloud, Google Drive")] - public string InProgress { get => GetString(defaultValue: WinTemp); set => SetString(value); } + public string InProgress { get + { + var tempDir = GetString(); + return string.IsNullOrWhiteSpace(tempDir) ? WinTemp : tempDir; + } + set => SetString(value); } [Description("Allow Libation to fix up audiobook metadata")] public bool AllowLibationFixup { get => GetNonString(defaultValue: true); set => SetNonString(value); }