diff --git a/Source/AppScaffolding/LibationScaffolding.cs b/Source/AppScaffolding/LibationScaffolding.cs index 5c6af0df..a44fe2d3 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) { diff --git a/Source/FileManager/PersistentDictionary.cs b/Source/FileManager/PersistentDictionary.cs index 315bcd36..99a2de79 100644 --- a/Source/FileManager/PersistentDictionary.cs +++ b/Source/FileManager/PersistentDictionary.cs @@ -33,29 +33,34 @@ 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; - stringCache[propertyName] = jObject[propertyName].Value(); + if (jObject.ContainsKey(propertyName)) + stringCache[propertyName] = jObject[propertyName].Value(); + else + stringCache[propertyName] = defaultValue; } 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) + { + 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) 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/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; } 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/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..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) - GridEntries.CommitEdit(); - - await Dispatcher.UIThread.InvokeAsync(GridEntries.Refresh); + await refreshGrid(); } } 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.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/LibationFileManager/Configuration.PersistentSettings.cs b/Source/LibationFileManager/Configuration.PersistentSettings.cs index 6e7b280c..0482a96a 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,82 @@ 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 + { + 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(); 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() ?? new(); 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(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() ?? new(); 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(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() ?? new(); 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(defaultValue: new EquatableDictionary()).Clone(); set => SetNonString(value); } - [Description("Save cover image alongside audiobook?")] - public bool DownloadCoverArt { get => GetNonString(); set => SetNonString(value); } + [Description("Save cover image alongside audiobook?")] + public bool DownloadCoverArt { get => GetNonString(defaultValue: false); 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 +176,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 +215,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(defaultValue: 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 4abbd0b3..c2e0fa76 100644 --- a/Source/LibationFileManager/Configuration.PropertyChange.cs +++ b/Source/LibationFileManager/Configuration.PropertyChange.cs @@ -12,7 +12,7 @@ namespace LibationFileManager private class EquatableDictionary : Dictionary { public EquatableDictionary() { } - public EquatableDictionary(IEnumerable> keyValuePairs) : base(keyValuePairs) { } + public EquatableDictionary(IEnumerable> keyValuePairs) : base(keyValuePairs) { } public EquatableDictionary Clone() => new(this); public override bool Equals(object obj) { diff --git a/Source/LibationFileManager/Configuration.cs b/Source/LibationFileManager/Configuration.cs index d40ba59a..d66d0c13 100644 --- a/Source/LibationFileManager/Configuration.cs +++ b/Source/LibationFileManager/Configuration.cs @@ -24,9 +24,6 @@ namespace LibationFileManager if (booksDir is null || !Directory.Exists(booksDir)) return false; - if (string.IsNullOrWhiteSpace(pDic.GetString(nameof(InProgress)))) - return false; - return true; } 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();