diff --git a/Source/LibationAvalonia/App.axaml.cs b/Source/LibationAvalonia/App.axaml.cs index 70b091d6..55e2a137 100644 --- a/Source/LibationAvalonia/App.axaml.cs +++ b/Source/LibationAvalonia/App.axaml.cs @@ -44,7 +44,7 @@ namespace LibationAvalonia if (!config.LibationSettingsAreValid) { - var defaultLibationFilesDir = Configuration.UserProfile; + var defaultLibationFilesDir = Configuration.DefaultLibationFilesDirectory; // check for existing settings in default location var defaultSettingsFile = Path.Combine(defaultLibationFilesDir, "Settings.json"); @@ -82,8 +82,8 @@ namespace LibationAvalonia // - error message, Exit() if (setupDialog.IsNewUser) { - Configuration.SetLibationFiles(Configuration.UserProfile); - setupDialog.Config.Books = Path.Combine(Configuration.UserProfile, nameof(Configuration.Books)); + Configuration.SetLibationFiles(Configuration.DefaultLibationFilesDirectory); + setupDialog.Config.Books = Configuration.DefaultBooksDirectory; if (setupDialog.Config.LibationSettingsAreValid) { @@ -174,7 +174,7 @@ namespace LibationAvalonia if (continueResult == DialogResult.Yes) { - config.Books = Path.Combine(libationFilesDialog.SelectedDirectory, nameof(Configuration.Books)); + config.Books = Configuration.DefaultBooksDirectory; if (config.LibationSettingsAreValid) { diff --git a/Source/LibationAvalonia/Controls/DirectorySelectControl.axaml.cs b/Source/LibationAvalonia/Controls/DirectorySelectControl.axaml.cs index 1f8b02ab..65933290 100644 --- a/Source/LibationAvalonia/Controls/DirectorySelectControl.axaml.cs +++ b/Source/LibationAvalonia/Controls/DirectorySelectControl.axaml.cs @@ -51,7 +51,9 @@ namespace LibationAvalonia.Controls { Configuration.KnownDirectories.WinTemp, Configuration.KnownDirectories.UserProfile, + Configuration.KnownDirectories.ApplicationData, Configuration.KnownDirectories.AppDir, + Configuration.KnownDirectories.MyMusic, Configuration.KnownDirectories.MyDocs, Configuration.KnownDirectories.LibationFiles }; diff --git a/Source/LibationAvalonia/ViewModels/MainVM.VisibleBooks.cs b/Source/LibationAvalonia/ViewModels/MainVM.VisibleBooks.cs index db6fe17b..782337bf 100644 --- a/Source/LibationAvalonia/ViewModels/MainVM.VisibleBooks.cs +++ b/Source/LibationAvalonia/ViewModels/MainVM.VisibleBooks.cs @@ -10,8 +10,8 @@ namespace LibationAvalonia.ViewModels { partial class MainVM { - private int _visibleNotLiberated = 1; - private int _visibleCount = 1; + private int _visibleNotLiberated = 0; + private int _visibleCount = 0; /// The Bottom-right visible book count status text public string VisibleCountText => $"Visible: {_visibleCount}"; diff --git a/Source/LibationAvalonia/ViewModels/Settings/DownloadDecryptSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/DownloadDecryptSettingsVM.cs index 67ec2567..84032983 100644 --- a/Source/LibationAvalonia/ViewModels/Settings/DownloadDecryptSettingsVM.cs +++ b/Source/LibationAvalonia/ViewModels/Settings/DownloadDecryptSettingsVM.cs @@ -21,6 +21,7 @@ namespace LibationAvalonia.ViewModels.Settings public List KnownDirectories { get; } = new() { Configuration.KnownDirectories.WinTemp, + Configuration.KnownDirectories.ApplicationData, Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.AppDir, Configuration.KnownDirectories.MyDocs, diff --git a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs index c164b449..6b03c69f 100644 --- a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs +++ b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs @@ -67,7 +67,8 @@ namespace LibationAvalonia.ViewModels.Settings { Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.AppDir, - Configuration.KnownDirectories.MyDocs + Configuration.KnownDirectories.MyDocs, + Configuration.KnownDirectories.MyMusic, }; public string BooksText { get; } = Configuration.GetDescription(nameof(Configuration.Books)); diff --git a/Source/LibationFileManager/AudibleFileStorage.cs b/Source/LibationFileManager/AudibleFileStorage.cs index 0de15d83..1a1c8b73 100644 --- a/Source/LibationFileManager/AudibleFileStorage.cs +++ b/Source/LibationFileManager/AudibleFileStorage.cs @@ -50,7 +50,7 @@ namespace LibationFileManager get { if (string.IsNullOrWhiteSpace(Configuration.Instance.Books)) - Configuration.Instance.Books = Path.Combine(Configuration.UserProfile, "Books"); + Configuration.Instance.Books = Configuration.DefaultBooksDirectory; return Directory.CreateDirectory(Configuration.Instance.Books).FullName; } } diff --git a/Source/LibationFileManager/Configuration.KnownDirectories.cs b/Source/LibationFileManager/Configuration.KnownDirectories.cs index 0549d54d..8159e0ff 100644 --- a/Source/LibationFileManager/Configuration.KnownDirectories.cs +++ b/Source/LibationFileManager/Configuration.KnownDirectories.cs @@ -14,8 +14,12 @@ namespace LibationFileManager public static string AppDir_Relative => $@".{Path.PathSeparator}{LIBATION_FILES_KEY}"; public static string AppDir_Absolute => Path.GetFullPath(Path.Combine(ProcessDirectory, LIBATION_FILES_KEY)); public static string MyDocs => Path.GetFullPath(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Libation")); + public static string MyMusic => Path.GetFullPath(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), "Libation")); public static string WinTemp => Path.GetFullPath(Path.Combine(Path.GetTempPath(), "Libation")); public static string UserProfile => Path.GetFullPath(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Libation")); + public static string LocalAppData => Path.GetFullPath(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Libation")); + public static string DefaultLibationFilesDirectory => !IsWindows ? LocalAppData : UserProfile; + public static string DefaultBooksDirectory => Path.Combine(!IsWindows ? MyMusic : UserProfile, nameof(Books)); public enum KnownDirectories { @@ -34,19 +38,27 @@ namespace LibationFileManager MyDocs = 4, [Description("Your settings folder (aka: Libation Files)")] - LibationFiles = 5 - } - // use func calls so we always get the latest value of LibationFiles - private static List<(KnownDirectories directory, Func getPathFunc)> directoryOptionsPaths { get; } = new() + LibationFiles = 5, + + [Description("User Application Data Folder")] + ApplicationData = 6, + + [Description("My Music")] + MyMusic = 7, + } + // use func calls so we always get the latest value of LibationFiles + private static List<(KnownDirectories directory, Func getPathFunc)> directoryOptionsPaths { get; } = new() { (KnownDirectories.None, () => null), + (KnownDirectories.ApplicationData, () => LocalAppData), + (KnownDirectories.MyMusic, () => MyMusic), (KnownDirectories.UserProfile, () => UserProfile), (KnownDirectories.AppDir, () => AppDir_Relative), (KnownDirectories.WinTemp, () => WinTemp), (KnownDirectories.MyDocs, () => MyDocs), // this is important to not let very early calls try to accidentally load LibationFiles too early. // also, keep this at bottom of this list - (KnownDirectories.LibationFiles, () => libationFilesPathCache) + (KnownDirectories.LibationFiles, () => LibationSettingsDirectory) }; public static string? GetKnownDirectoryPath(KnownDirectories directory) { diff --git a/Source/LibationFileManager/Configuration.LibationFiles.cs b/Source/LibationFileManager/Configuration.LibationFiles.cs index c7118fcf..875c1dc7 100644 --- a/Source/LibationFileManager/Configuration.LibationFiles.cs +++ b/Source/LibationFileManager/Configuration.LibationFiles.cs @@ -22,11 +22,11 @@ namespace LibationFileManager { get { - if (libationFilesPathCache is not null) - return libationFilesPathCache; + if (LibationSettingsDirectory is not null) + return LibationSettingsDirectory; // FIRST: must write here before SettingsFilePath in next step reads cache - libationFilesPathCache = getLibationFilesSettingFromJson(); + LibationSettingsDirectory = getLibationFilesSettingFromJson(); // SECOND. before setting to json file with SetWithJsonPath, PersistentDictionary must exist persistentDictionary = new PersistentDictionary(SettingsFilePath); @@ -42,11 +42,14 @@ namespace LibationFileManager SetWithJsonPath(jsonpath, "path", logPath, true); - return libationFilesPathCache; + return LibationSettingsDirectory; } } - private static string? libationFilesPathCache { get; set; } + /// + /// Directory pointed to by appsettings.json + /// + private static string? LibationSettingsDirectory { get; set; } /// /// Try to find appsettings.json in the following locations: @@ -79,7 +82,7 @@ namespace LibationFileManager string[] possibleAppsettingsDirectories = new[] { ProcessDirectory, - Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Libation"), + LocalAppData, UserProfile, Path.Combine(Path.GetTempPath(), "Libation") }; @@ -106,9 +109,15 @@ namespace LibationFileManager } //Valid appsettings.json not found. Try to create it in each folder. - var endingContents = new JObject { { LIBATION_FILES_KEY, UserProfile } }.ToString(Formatting.Indented); + var endingContents = new JObject { { LIBATION_FILES_KEY, DefaultLibationFilesDirectory } }.ToString(Formatting.Indented); + foreach (var dir in possibleAppsettingsDirectories) { + //Don't try to create appsettings.json in the program files directory on *.nix systems. + //However, still _look_ for one there for backwards compatibility with previous installations + if (!IsWindows && dir == ProcessDirectory) + continue; + var appsettingsFile = Path.Combine(dir, appsettings_filename); try @@ -180,7 +189,7 @@ namespace LibationFileManager public static void SetLibationFiles(string directory) { - libationFilesPathCache = null; + LibationSettingsDirectory = null; var startingContents = File.ReadAllText(AppsettingsJsonFile); var jObj = JObject.Parse(startingContents); diff --git a/Source/LibationFileManager/Configuration.cs b/Source/LibationFileManager/Configuration.cs index 4867ce27..4eb01822 100644 --- a/Source/LibationFileManager/Configuration.cs +++ b/Source/LibationFileManager/Configuration.cs @@ -18,9 +18,8 @@ namespace LibationFileManager var pDic = new PersistentDictionary(settingsFile, isReadOnly: false); - var booksDir = pDic.GetString(nameof(Books)); - - if (booksDir is null) return false; + if (pDic.GetString(nameof(Books)) is not string booksDir) + return false; if (!Directory.Exists(booksDir)) { @@ -28,17 +27,21 @@ namespace LibationFileManager throw new DirectoryNotFoundException(settingsFile); //"Books" is not null, so setup has already been run. - //Since Books can't be found, try to create it in Libation settings folder - booksDir = Path.Combine(dir, nameof(Books)); - try + //Since Books can't be found, try to create it + //and then revert to the default books directory + foreach (string d in new string[] { booksDir, DefaultBooksDirectory }) { - Directory.CreateDirectory(booksDir); + try + { + Directory.CreateDirectory(d); - pDic.SetString(nameof(Books), booksDir); + pDic.SetString(nameof(Books), d); - return booksDir is not null && Directory.Exists(booksDir); + return Directory.Exists(d); + } + catch { /* Do Nothing */ } } - catch { return false; } + return false; } return true; diff --git a/Source/LibationWinForms/Dialogs/SettingsDialog.DownloadDecrypt.cs b/Source/LibationWinForms/Dialogs/SettingsDialog.DownloadDecrypt.cs index 0aa15dfa..49894a7c 100644 --- a/Source/LibationWinForms/Dialogs/SettingsDialog.DownloadDecrypt.cs +++ b/Source/LibationWinForms/Dialogs/SettingsDialog.DownloadDecrypt.cs @@ -37,6 +37,7 @@ namespace LibationWinForms.Dialogs inProgressSelectControl.SetDirectoryItems(new() { Configuration.KnownDirectories.WinTemp, + Configuration.KnownDirectories.ApplicationData, Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.AppDir, Configuration.KnownDirectories.MyDocs, diff --git a/Source/LibationWinForms/Dialogs/SettingsDialog.Important.cs b/Source/LibationWinForms/Dialogs/SettingsDialog.Important.cs index 7f68667a..fead9d0b 100644 --- a/Source/LibationWinForms/Dialogs/SettingsDialog.Important.cs +++ b/Source/LibationWinForms/Dialogs/SettingsDialog.Important.cs @@ -44,7 +44,8 @@ namespace LibationWinForms.Dialogs { Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.AppDir, - Configuration.KnownDirectories.MyDocs + Configuration.KnownDirectories.MyDocs, + Configuration.KnownDirectories.MyMusic, }, Configuration.KnownDirectories.UserProfile, "Books"); diff --git a/Source/LibationWinForms/Program.cs b/Source/LibationWinForms/Program.cs index 2378c0e3..35aa0224 100644 --- a/Source/LibationWinForms/Program.cs +++ b/Source/LibationWinForms/Program.cs @@ -98,7 +98,7 @@ namespace LibationWinForms if (config.LibationSettingsAreValid) return; - var defaultLibationFilesDir = Configuration.UserProfile; + var defaultLibationFilesDir = Configuration.DefaultLibationFilesDirectory; // check for existing settings in default location var defaultSettingsFile = Path.Combine(defaultLibationFilesDir, "Settings.json"); @@ -154,7 +154,7 @@ 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"); + config.Books ??= Configuration.DefaultBooksDirectory; if (config.LibationSettingsAreValid) return;