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;