Changes to default directories for file storage (#1112)

- Add My Music and Local Application Data to known directories
- Make %localappdata%\Libation the default settings folder on *nix machines
- Make %MyMusic%\Libation\Books the default books folder on *nix machines
This commit is contained in:
Michael Bucari-Tovo 2025-02-28 11:13:09 -07:00
parent 3b7d5a354f
commit a790c7535c
12 changed files with 64 additions and 34 deletions

View File

@ -44,7 +44,7 @@ namespace LibationAvalonia
if (!config.LibationSettingsAreValid) if (!config.LibationSettingsAreValid)
{ {
var defaultLibationFilesDir = Configuration.UserProfile; var defaultLibationFilesDir = Configuration.DefaultLibationFilesDirectory;
// check for existing settings in default location // check for existing settings in default location
var defaultSettingsFile = Path.Combine(defaultLibationFilesDir, "Settings.json"); var defaultSettingsFile = Path.Combine(defaultLibationFilesDir, "Settings.json");
@ -82,8 +82,8 @@ namespace LibationAvalonia
// - error message, Exit() // - error message, Exit()
if (setupDialog.IsNewUser) if (setupDialog.IsNewUser)
{ {
Configuration.SetLibationFiles(Configuration.UserProfile); Configuration.SetLibationFiles(Configuration.DefaultLibationFilesDirectory);
setupDialog.Config.Books = Path.Combine(Configuration.UserProfile, nameof(Configuration.Books)); setupDialog.Config.Books = Configuration.DefaultBooksDirectory;
if (setupDialog.Config.LibationSettingsAreValid) if (setupDialog.Config.LibationSettingsAreValid)
{ {
@ -174,7 +174,7 @@ namespace LibationAvalonia
if (continueResult == DialogResult.Yes) if (continueResult == DialogResult.Yes)
{ {
config.Books = Path.Combine(libationFilesDialog.SelectedDirectory, nameof(Configuration.Books)); config.Books = Configuration.DefaultBooksDirectory;
if (config.LibationSettingsAreValid) if (config.LibationSettingsAreValid)
{ {

View File

@ -51,7 +51,9 @@ namespace LibationAvalonia.Controls
{ {
Configuration.KnownDirectories.WinTemp, Configuration.KnownDirectories.WinTemp,
Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.UserProfile,
Configuration.KnownDirectories.ApplicationData,
Configuration.KnownDirectories.AppDir, Configuration.KnownDirectories.AppDir,
Configuration.KnownDirectories.MyMusic,
Configuration.KnownDirectories.MyDocs, Configuration.KnownDirectories.MyDocs,
Configuration.KnownDirectories.LibationFiles Configuration.KnownDirectories.LibationFiles
}; };

View File

@ -10,8 +10,8 @@ namespace LibationAvalonia.ViewModels
{ {
partial class MainVM partial class MainVM
{ {
private int _visibleNotLiberated = 1; private int _visibleNotLiberated = 0;
private int _visibleCount = 1; private int _visibleCount = 0;
/// <summary> The Bottom-right visible book count status text </summary> /// <summary> The Bottom-right visible book count status text </summary>
public string VisibleCountText => $"Visible: {_visibleCount}"; public string VisibleCountText => $"Visible: {_visibleCount}";

View File

@ -21,6 +21,7 @@ namespace LibationAvalonia.ViewModels.Settings
public List<Configuration.KnownDirectories> KnownDirectories { get; } = new() public List<Configuration.KnownDirectories> KnownDirectories { get; } = new()
{ {
Configuration.KnownDirectories.WinTemp, Configuration.KnownDirectories.WinTemp,
Configuration.KnownDirectories.ApplicationData,
Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.UserProfile,
Configuration.KnownDirectories.AppDir, Configuration.KnownDirectories.AppDir,
Configuration.KnownDirectories.MyDocs, Configuration.KnownDirectories.MyDocs,

View File

@ -67,7 +67,8 @@ namespace LibationAvalonia.ViewModels.Settings
{ {
Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.UserProfile,
Configuration.KnownDirectories.AppDir, Configuration.KnownDirectories.AppDir,
Configuration.KnownDirectories.MyDocs Configuration.KnownDirectories.MyDocs,
Configuration.KnownDirectories.MyMusic,
}; };
public string BooksText { get; } = Configuration.GetDescription(nameof(Configuration.Books)); public string BooksText { get; } = Configuration.GetDescription(nameof(Configuration.Books));

View File

@ -50,7 +50,7 @@ namespace LibationFileManager
get get
{ {
if (string.IsNullOrWhiteSpace(Configuration.Instance.Books)) 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; return Directory.CreateDirectory(Configuration.Instance.Books).FullName;
} }
} }

View File

@ -14,8 +14,12 @@ namespace LibationFileManager
public static string AppDir_Relative => $@".{Path.PathSeparator}{LIBATION_FILES_KEY}"; 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 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 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 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 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 public enum KnownDirectories
{ {
@ -34,19 +38,27 @@ namespace LibationFileManager
MyDocs = 4, MyDocs = 4,
[Description("Your settings folder (aka: Libation Files)")] [Description("Your settings folder (aka: Libation Files)")]
LibationFiles = 5 LibationFiles = 5,
}
// use func calls so we always get the latest value of LibationFiles [Description("User Application Data Folder")]
private static List<(KnownDirectories directory, Func<string?> getPathFunc)> directoryOptionsPaths { get; } = new() 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<string?> getPathFunc)> directoryOptionsPaths { get; } = new()
{ {
(KnownDirectories.None, () => null), (KnownDirectories.None, () => null),
(KnownDirectories.ApplicationData, () => LocalAppData),
(KnownDirectories.MyMusic, () => MyMusic),
(KnownDirectories.UserProfile, () => UserProfile), (KnownDirectories.UserProfile, () => UserProfile),
(KnownDirectories.AppDir, () => AppDir_Relative), (KnownDirectories.AppDir, () => AppDir_Relative),
(KnownDirectories.WinTemp, () => WinTemp), (KnownDirectories.WinTemp, () => WinTemp),
(KnownDirectories.MyDocs, () => MyDocs), (KnownDirectories.MyDocs, () => MyDocs),
// this is important to not let very early calls try to accidentally load LibationFiles too early. // this is important to not let very early calls try to accidentally load LibationFiles too early.
// also, keep this at bottom of this list // also, keep this at bottom of this list
(KnownDirectories.LibationFiles, () => libationFilesPathCache) (KnownDirectories.LibationFiles, () => LibationSettingsDirectory)
}; };
public static string? GetKnownDirectoryPath(KnownDirectories directory) public static string? GetKnownDirectoryPath(KnownDirectories directory)
{ {

View File

@ -22,11 +22,11 @@ namespace LibationFileManager
{ {
get get
{ {
if (libationFilesPathCache is not null) if (LibationSettingsDirectory is not null)
return libationFilesPathCache; return LibationSettingsDirectory;
// FIRST: must write here before SettingsFilePath in next step reads cache // 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 // SECOND. before setting to json file with SetWithJsonPath, PersistentDictionary must exist
persistentDictionary = new PersistentDictionary(SettingsFilePath); persistentDictionary = new PersistentDictionary(SettingsFilePath);
@ -42,11 +42,14 @@ namespace LibationFileManager
SetWithJsonPath(jsonpath, "path", logPath, true); SetWithJsonPath(jsonpath, "path", logPath, true);
return libationFilesPathCache; return LibationSettingsDirectory;
} }
} }
private static string? libationFilesPathCache { get; set; } /// <summary>
/// Directory pointed to by appsettings.json
/// </summary>
private static string? LibationSettingsDirectory { get; set; }
/// <summary> /// <summary>
/// Try to find appsettings.json in the following locations: /// Try to find appsettings.json in the following locations:
@ -79,7 +82,7 @@ namespace LibationFileManager
string[] possibleAppsettingsDirectories = new[] string[] possibleAppsettingsDirectories = new[]
{ {
ProcessDirectory, ProcessDirectory,
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Libation"), LocalAppData,
UserProfile, UserProfile,
Path.Combine(Path.GetTempPath(), "Libation") Path.Combine(Path.GetTempPath(), "Libation")
}; };
@ -106,9 +109,15 @@ namespace LibationFileManager
} }
//Valid appsettings.json not found. Try to create it in each folder. //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) 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); var appsettingsFile = Path.Combine(dir, appsettings_filename);
try try
@ -180,7 +189,7 @@ namespace LibationFileManager
public static void SetLibationFiles(string directory) public static void SetLibationFiles(string directory)
{ {
libationFilesPathCache = null; LibationSettingsDirectory = null;
var startingContents = File.ReadAllText(AppsettingsJsonFile); var startingContents = File.ReadAllText(AppsettingsJsonFile);
var jObj = JObject.Parse(startingContents); var jObj = JObject.Parse(startingContents);

View File

@ -18,9 +18,8 @@ namespace LibationFileManager
var pDic = new PersistentDictionary(settingsFile, isReadOnly: false); var pDic = new PersistentDictionary(settingsFile, isReadOnly: false);
var booksDir = pDic.GetString(nameof(Books)); if (pDic.GetString(nameof(Books)) is not string booksDir)
return false;
if (booksDir is null) return false;
if (!Directory.Exists(booksDir)) if (!Directory.Exists(booksDir))
{ {
@ -28,17 +27,21 @@ namespace LibationFileManager
throw new DirectoryNotFoundException(settingsFile); throw new DirectoryNotFoundException(settingsFile);
//"Books" is not null, so setup has already been run. //"Books" is not null, so setup has already been run.
//Since Books can't be found, try to create it in Libation settings folder //Since Books can't be found, try to create it
booksDir = Path.Combine(dir, nameof(Books)); //and then revert to the default books directory
try 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; return true;

View File

@ -37,6 +37,7 @@ namespace LibationWinForms.Dialogs
inProgressSelectControl.SetDirectoryItems(new() inProgressSelectControl.SetDirectoryItems(new()
{ {
Configuration.KnownDirectories.WinTemp, Configuration.KnownDirectories.WinTemp,
Configuration.KnownDirectories.ApplicationData,
Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.UserProfile,
Configuration.KnownDirectories.AppDir, Configuration.KnownDirectories.AppDir,
Configuration.KnownDirectories.MyDocs, Configuration.KnownDirectories.MyDocs,

View File

@ -44,7 +44,8 @@ namespace LibationWinForms.Dialogs
{ {
Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.UserProfile,
Configuration.KnownDirectories.AppDir, Configuration.KnownDirectories.AppDir,
Configuration.KnownDirectories.MyDocs Configuration.KnownDirectories.MyDocs,
Configuration.KnownDirectories.MyMusic,
}, },
Configuration.KnownDirectories.UserProfile, Configuration.KnownDirectories.UserProfile,
"Books"); "Books");

View File

@ -98,7 +98,7 @@ namespace LibationWinForms
if (config.LibationSettingsAreValid) if (config.LibationSettingsAreValid)
return; return;
var defaultLibationFilesDir = Configuration.UserProfile; var defaultLibationFilesDir = Configuration.DefaultLibationFilesDirectory;
// check for existing settings in default location // check for existing settings in default location
var defaultSettingsFile = Path.Combine(defaultLibationFilesDir, "Settings.json"); var defaultSettingsFile = Path.Combine(defaultLibationFilesDir, "Settings.json");
@ -154,7 +154,7 @@ namespace LibationWinForms
// INIT DEFAULT SETTINGS // INIT DEFAULT SETTINGS
// if 'new user' was clicked, or if 'returning user' chose new install: show basic settings dialog // 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) if (config.LibationSettingsAreValid)
return; return;