New setting: dynamically change log level without app restart
This commit is contained in:
parent
b6fe3ae009
commit
35fe3ae786
@ -4,8 +4,12 @@ using System.ComponentModel;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Dinah.Core;
|
using Dinah.Core;
|
||||||
|
using Dinah.Core.Logging;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
|
using Serilog;
|
||||||
|
using Serilog.Events;
|
||||||
|
|
||||||
namespace FileManager
|
namespace FileManager
|
||||||
{
|
{
|
||||||
@ -34,28 +38,6 @@ namespace FileManager
|
|||||||
|
|
||||||
#region persistent configuration settings/values
|
#region persistent configuration settings/values
|
||||||
|
|
||||||
#region // properties to test reflection
|
|
||||||
/*
|
|
||||||
// field should NOT be populated
|
|
||||||
public string TestField;
|
|
||||||
// int should NOT be populated
|
|
||||||
public int TestInt { get; set; }
|
|
||||||
// read-only should NOT be populated
|
|
||||||
public string TestGet { get; } // get only: should NOT get auto-populated
|
|
||||||
// set-only should NOT be populated
|
|
||||||
public string TestSet { private get; set; }
|
|
||||||
|
|
||||||
// get and set: SHOULD be auto-populated
|
|
||||||
public string TestGetSet { get; set; }
|
|
||||||
*/
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
// settings will be persisted when all are true
|
|
||||||
// - property (not field)
|
|
||||||
// - string
|
|
||||||
// - public getter
|
|
||||||
// - public setter
|
|
||||||
|
|
||||||
// note: any potential file manager static ctors can't compensate if storage dir is changed at run time via settings. this is partly bad architecture. but the side effect is desirable. if changing LibationFiles location: restart app
|
// note: any potential file manager static ctors can't compensate if storage dir is changed at run time via settings. this is partly bad architecture. but the side effect is desirable. if changing LibationFiles location: restart app
|
||||||
|
|
||||||
// default setting and directory creation occur in class responsible for files.
|
// default setting and directory creation occur in class responsible for files.
|
||||||
@ -65,8 +47,8 @@ namespace FileManager
|
|||||||
private PersistentDictionary persistentDictionary;
|
private PersistentDictionary persistentDictionary;
|
||||||
|
|
||||||
public object GetObject(string propertyName) => persistentDictionary.GetObject(propertyName);
|
public object GetObject(string propertyName) => persistentDictionary.GetObject(propertyName);
|
||||||
public void SetObject(string propertyName, object newValue) => persistentDictionary.Set(propertyName, newValue);
|
public void SetObject(string propertyName, object newValue) => persistentDictionary.SetNonString(propertyName, newValue);
|
||||||
public void SetWithJsonPath(string jsonPath, string propertyName, string newValue) => persistentDictionary.SetWithJsonPath(jsonPath, propertyName, newValue);
|
public void SetWithJsonPath(string jsonPath, string propertyName, string newValue, bool suppressLogging = false) => persistentDictionary.SetWithJsonPath(jsonPath, propertyName, newValue, suppressLogging);
|
||||||
|
|
||||||
public string SettingsFilePath => Path.Combine(LibationFiles, "Settings.json");
|
public string SettingsFilePath => Path.Combine(LibationFiles, "Settings.json");
|
||||||
|
|
||||||
@ -87,7 +69,7 @@ namespace FileManager
|
|||||||
public string Books
|
public string Books
|
||||||
{
|
{
|
||||||
get => persistentDictionary.GetString(nameof(Books));
|
get => persistentDictionary.GetString(nameof(Books));
|
||||||
set => persistentDictionary.Set(nameof(Books), value);
|
set => persistentDictionary.SetString(nameof(Books), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// temp/working dir(s) should be outside of dropbox
|
// temp/working dir(s) should be outside of dropbox
|
||||||
@ -95,21 +77,21 @@ namespace FileManager
|
|||||||
public string InProgress
|
public string InProgress
|
||||||
{
|
{
|
||||||
get => persistentDictionary.GetString(nameof(InProgress));
|
get => persistentDictionary.GetString(nameof(InProgress));
|
||||||
set => persistentDictionary.Set(nameof(InProgress), value);
|
set => persistentDictionary.SetString(nameof(InProgress), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Description("Allow Libation for fix up audiobook metadata?")]
|
[Description("Allow Libation for fix up audiobook metadata?")]
|
||||||
public bool AllowLibationFixup
|
public bool AllowLibationFixup
|
||||||
{
|
{
|
||||||
get => persistentDictionary.Get<bool>(nameof(AllowLibationFixup));
|
get => persistentDictionary.GetNonString<bool>(nameof(AllowLibationFixup));
|
||||||
set => persistentDictionary.Set(nameof(AllowLibationFixup), value);
|
set => persistentDictionary.SetNonString(nameof(AllowLibationFixup), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Description("Decrypt to lossy format?")]
|
[Description("Decrypt to lossy format?")]
|
||||||
public bool DecryptToLossy
|
public bool DecryptToLossy
|
||||||
{
|
{
|
||||||
get => persistentDictionary.Get<bool>(nameof(DecryptToLossy));
|
get => persistentDictionary.GetNonString<bool>(nameof(DecryptToLossy));
|
||||||
set => persistentDictionary.Set(nameof(DecryptToLossy), value);
|
set => persistentDictionary.SetNonString(nameof(DecryptToLossy), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -170,6 +152,53 @@ namespace FileManager
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region logging
|
||||||
|
private IConfigurationRoot configuration;
|
||||||
|
public void ConfigureLogging()
|
||||||
|
{
|
||||||
|
configuration = new ConfigurationBuilder()
|
||||||
|
.AddJsonFile(SettingsFilePath, optional: false, reloadOnChange: true)
|
||||||
|
.Build();
|
||||||
|
Log.Logger = new LoggerConfiguration()
|
||||||
|
.ReadFrom.Configuration(configuration)
|
||||||
|
.CreateLogger();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Description("The importance of a log event")]
|
||||||
|
public LogEventLevel LogLevel
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var logLevelStr = persistentDictionary.GetStringFromJsonPath("Serilog", "MinimumLevel");
|
||||||
|
var logLevelEnum = Enum<LogEventLevel>.Parse(logLevelStr);
|
||||||
|
return logLevelEnum;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return LogEventLevel.Information;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
persistentDictionary.SetWithJsonPath("Serilog", "MinimumLevel", value.ToString());
|
||||||
|
|
||||||
|
configuration.Reload();
|
||||||
|
|
||||||
|
Log.Logger.Information("Updated LogLevel MinimumLevel. {@DebugInfo}", new
|
||||||
|
{
|
||||||
|
LogLevel_Verbose_Enabled = Log.Logger.IsVerboseEnabled(),
|
||||||
|
LogLevel_Debug_Enabled = Log.Logger.IsDebugEnabled(),
|
||||||
|
LogLevel_Information_Enabled = Log.Logger.IsInformationEnabled(),
|
||||||
|
LogLevel_Warning_Enabled = Log.Logger.IsWarningEnabled(),
|
||||||
|
LogLevel_Error_Enabled = Log.Logger.IsErrorEnabled(),
|
||||||
|
LogLevel_Fatal_Enabled = Log.Logger.IsFatalEnabled()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region singleton stuff
|
#region singleton stuff
|
||||||
public static Configuration Instance { get; } = new Configuration();
|
public static Configuration Instance { get; } = new Configuration();
|
||||||
private Configuration() { }
|
private Configuration() { }
|
||||||
@ -191,7 +220,12 @@ namespace FileManager
|
|||||||
// must write here before SettingsFilePath in next step reads cache
|
// must write here before SettingsFilePath in next step reads cache
|
||||||
libationFilesPathCache = getLiberationFilesSettingFromJson();
|
libationFilesPathCache = getLiberationFilesSettingFromJson();
|
||||||
|
|
||||||
// load json values into memory. create settings if not exists
|
// Config init in Program.ensureSerilogConfig() only happens when serilog setting is first created (prob on 1st run).
|
||||||
|
// This Set() enforces current LibationFiles every time we restart Libation or redirect LibationFiles
|
||||||
|
var logPath = Path.Combine(LibationFiles, "Log.log");
|
||||||
|
SetWithJsonPath("Serilog.WriteTo[1].Args", "path", logPath, true);
|
||||||
|
configuration?.Reload();
|
||||||
|
|
||||||
persistentDictionary = new PersistentDictionary(SettingsFilePath);
|
persistentDictionary = new PersistentDictionary(SettingsFilePath);
|
||||||
|
|
||||||
return libationFilesPathCache;
|
return libationFilesPathCache;
|
||||||
@ -259,18 +293,19 @@ namespace FileManager
|
|||||||
if (startingContents == endingContents)
|
if (startingContents == endingContents)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Serilog.Log.Logger.Information("Libation files changed {@DebugInfo}", new { APPSETTINGS_JSON, LIBATION_FILES_KEY, directory });
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
|
|
||||||
// now it's set in the file again but no settings have moved yet
|
// now it's set in the file again but no settings have moved yet
|
||||||
File.WriteAllText(APPSETTINGS_JSON, endingContents);
|
File.WriteAllText(APPSETTINGS_JSON, endingContents);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Log.Logger.Information("Libation files changed {@DebugInfo}", new { APPSETTINGS_JSON, LIBATION_FILES_KEY, directory });
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
|
||||||
//// attempting this will try to change the settings file which has not yet been moved
|
//// attempting this will try to change the settings file which has not yet been moved
|
||||||
|
//// after this is fixed, can remove it from Program.configureLogging()
|
||||||
// var logPath = Path.Combine(LibationFiles, "Log.log");
|
// var logPath = Path.Combine(LibationFiles, "Log.log");
|
||||||
// SetWithJsonPath("Serilog.WriteTo[1].Args", "path", logPath);
|
// SetWithJsonPath("Serilog.WriteTo[1].Args", "path", logPath, true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
|
||||||
<PackageReference Include="Octokit" Version="0.50.0" />
|
<PackageReference Include="Octokit" Version="0.50.0" />
|
||||||
<PackageReference Include="Polly" Version="7.2.2" />
|
<PackageReference Include="Polly" Version="7.2.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@ -47,7 +47,7 @@ namespace FileManager
|
|||||||
return stringCache[propertyName];
|
return stringCache[propertyName];
|
||||||
}
|
}
|
||||||
|
|
||||||
public T Get<T>(string propertyName)
|
public T GetNonString<T>(string propertyName)
|
||||||
{
|
{
|
||||||
var obj = GetObject(propertyName);
|
var obj = GetObject(propertyName);
|
||||||
if (obj is null) return default;
|
if (obj is null) return default;
|
||||||
@ -68,10 +68,32 @@ namespace FileManager
|
|||||||
return objectCache[propertyName];
|
return objectCache[propertyName];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetStringFromJsonPath(string jsonPath, string propertyName) => GetStringFromJsonPath($"{jsonPath}.{propertyName}");
|
||||||
|
public string GetStringFromJsonPath(string jsonPath)
|
||||||
|
{
|
||||||
|
if (!stringCache.ContainsKey(jsonPath))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var jObject = readFile();
|
||||||
|
var token = jObject.SelectToken(jsonPath);
|
||||||
|
if (token is null)
|
||||||
|
return null;
|
||||||
|
stringCache[jsonPath] = (string)token;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringCache[jsonPath];
|
||||||
|
}
|
||||||
|
|
||||||
public bool Exists(string propertyName) => readFile().ContainsKey(propertyName);
|
public bool Exists(string propertyName) => readFile().ContainsKey(propertyName);
|
||||||
|
|
||||||
private object locker { get; } = new object();
|
private object locker { get; } = new object();
|
||||||
public void Set(string propertyName, string newValue)
|
public void SetString(string propertyName, string newValue)
|
||||||
{
|
{
|
||||||
// only do this check in string cache, NOT object cache
|
// only do this check in string cache, NOT object cache
|
||||||
if (stringCache.ContainsKey(propertyName) && stringCache[propertyName] == newValue)
|
if (stringCache.ContainsKey(propertyName) && stringCache[propertyName] == newValue)
|
||||||
@ -83,7 +105,7 @@ namespace FileManager
|
|||||||
writeFile(propertyName, newValue);
|
writeFile(propertyName, newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Set(string propertyName, object newValue)
|
public void SetNonString(string propertyName, object newValue)
|
||||||
{
|
{
|
||||||
// set cache
|
// set cache
|
||||||
objectCache[propertyName] = newValue;
|
objectCache[propertyName] = newValue;
|
||||||
@ -97,19 +119,6 @@ namespace FileManager
|
|||||||
if (IsReadOnly)
|
if (IsReadOnly)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var str = newValue?.ToString();
|
|
||||||
var formattedValue
|
|
||||||
= str is null ? "[null]"
|
|
||||||
: string.IsNullOrEmpty(str) ? "[empty]"
|
|
||||||
: string.IsNullOrWhiteSpace(str) ? $"[whitespace. Length={str.Length}]"
|
|
||||||
: str.Length > 100 ? $"[Length={str.Length}] {str[0..50]}...{str[^50..^0]}"
|
|
||||||
: str;
|
|
||||||
Serilog.Log.Logger.Information($"Config changed. {propertyName}={formattedValue}");
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
|
|
||||||
// write new setting to file
|
// write new setting to file
|
||||||
lock (locker)
|
lock (locker)
|
||||||
{
|
{
|
||||||
@ -119,31 +128,67 @@ namespace FileManager
|
|||||||
jObject[propertyName] = newValue;
|
jObject[propertyName] = newValue;
|
||||||
var endContents = JsonConvert.SerializeObject(jObject, Formatting.Indented);
|
var endContents = JsonConvert.SerializeObject(jObject, Formatting.Indented);
|
||||||
|
|
||||||
if (startContents != endContents)
|
if (startContents == endContents)
|
||||||
|
return;
|
||||||
|
|
||||||
File.WriteAllText(Filepath, endContents);
|
File.WriteAllText(Filepath, endContents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var str = formatValueForLog(newValue?.ToString());
|
||||||
|
Serilog.Log.Logger.Information("Config changed. {@DebugInfo}", new { propertyName, newValue = str });
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
// special case: no caching. no logging
|
public void SetWithJsonPath(string jsonPath, string propertyName, string newValue, bool suppressLogging = false)
|
||||||
public void SetWithJsonPath(string jsonPath, string propertyName, string newValue)
|
|
||||||
{
|
{
|
||||||
if (IsReadOnly)
|
if (IsReadOnly)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var path = $"{jsonPath}.{propertyName}";
|
||||||
|
|
||||||
|
{
|
||||||
|
// only do this check in string cache, NOT object cache
|
||||||
|
if (stringCache.ContainsKey(path) && stringCache[path] == newValue)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// set cache
|
||||||
|
stringCache[path] = newValue;
|
||||||
|
}
|
||||||
|
|
||||||
lock (locker)
|
lock (locker)
|
||||||
{
|
{
|
||||||
var jObject = readFile();
|
var jObject = readFile();
|
||||||
var token = jObject.SelectToken(jsonPath);
|
var token = jObject.SelectToken(jsonPath);
|
||||||
var oldValue = (string)token[propertyName];
|
var oldValue = token.Value<string>(propertyName);
|
||||||
|
|
||||||
|
if (oldValue == newValue)
|
||||||
|
return;
|
||||||
|
|
||||||
if (oldValue != newValue)
|
|
||||||
{
|
|
||||||
token[propertyName] = newValue;
|
token[propertyName] = newValue;
|
||||||
File.WriteAllText(Filepath, JsonConvert.SerializeObject(jObject, Formatting.Indented));
|
File.WriteAllText(Filepath, JsonConvert.SerializeObject(jObject, Formatting.Indented));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!suppressLogging)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var str = formatValueForLog(newValue?.ToString());
|
||||||
|
Serilog.Log.Logger.Information("Config changed. {@DebugInfo}", new { jsonPath, propertyName, newValue = str });
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string formatValueForLog(string value)
|
||||||
|
=> value is null ? "[null]"
|
||||||
|
: string.IsNullOrEmpty(value) ? "[empty]"
|
||||||
|
: string.IsNullOrWhiteSpace(value) ? $"[whitespace. Length={value.Length}]"
|
||||||
|
: value.Length > 100 ? $"[Length={value.Length}] {value[0..50]}...{value[^50..^0]}"
|
||||||
|
: value;
|
||||||
|
|
||||||
private JObject readFile()
|
private JObject readFile()
|
||||||
{
|
{
|
||||||
var settingsJsonContents = File.ReadAllText(Filepath);
|
var settingsJsonContents = File.ReadAllText(Filepath);
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
<!-- <PublishSingleFile>true</PublishSingleFile> -->
|
<!-- <PublishSingleFile>true</PublishSingleFile> -->
|
||||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||||
|
|
||||||
<Version>5.2.3.1</Version>
|
<Version>5.3.0.1</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@ -10,7 +10,6 @@ using FileManager;
|
|||||||
using InternalUtilities;
|
using InternalUtilities;
|
||||||
using LibationWinForms;
|
using LibationWinForms;
|
||||||
using LibationWinForms.Dialogs;
|
using LibationWinForms.Dialogs;
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
@ -285,27 +284,16 @@ namespace LibationLauncher
|
|||||||
}
|
}
|
||||||
|
|
||||||
// to restore original: Console.SetOut(origOut);
|
// to restore original: Console.SetOut(origOut);
|
||||||
private static System.IO.TextWriter origOut { get; } = Console.Out;
|
private static TextWriter origOut { get; } = Console.Out;
|
||||||
|
|
||||||
private static void configureLogging(Configuration config)
|
private static void configureLogging(Configuration config)
|
||||||
{
|
{
|
||||||
{
|
config.ConfigureLogging();
|
||||||
// always override path here.
|
|
||||||
// init in ensureSerilogConfig() only happens when serilog setting is first created (prob on 1st run).
|
|
||||||
// the override here uses current libation files every time we restart libation
|
|
||||||
var logPath = Path.Combine(config.LibationFiles, "Log.log");
|
|
||||||
config.SetWithJsonPath("Serilog.WriteTo[1].Args", "path", logPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
var configuration = new ConfigurationBuilder()
|
// Fwd Console to serilog.
|
||||||
.AddJsonFile(config.SettingsFilePath, optional: false, reloadOnChange: true)
|
// Serilog also write to Console (should probably change this) so it might be asking for trouble.
|
||||||
.Build();
|
// SerilogTextWriter needs to be more robust and tested. Esp the Write() methods.
|
||||||
Log.Logger = new LoggerConfiguration()
|
// Empirical testing so far has shown no issues.
|
||||||
.ReadFrom.Configuration(configuration)
|
|
||||||
.CreateLogger();
|
|
||||||
|
|
||||||
// Fwd Console to serilog. Serilog also write to Console (should probably change this) so it might be asking for trouble.
|
|
||||||
// First SerilogTextWriter needs to be more robust and tested. Esp the Write() methods
|
|
||||||
Console.SetOut(new MultiTextWriter(origOut, new SerilogTextWriter()));
|
Console.SetOut(new MultiTextWriter(origOut, new SerilogTextWriter()));
|
||||||
|
|
||||||
// .Here() captures debug info via System.Runtime.CompilerServices attributes. Warning: expensive
|
// .Here() captures debug info via System.Runtime.CompilerServices attributes. Warning: expensive
|
||||||
|
|||||||
57
LibationWinForms/Dialogs/SettingsDialog.Designer.cs
generated
57
LibationWinForms/Dialogs/SettingsDialog.Designer.cs
generated
@ -33,13 +33,15 @@
|
|||||||
this.saveBtn = new System.Windows.Forms.Button();
|
this.saveBtn = new System.Windows.Forms.Button();
|
||||||
this.cancelBtn = new System.Windows.Forms.Button();
|
this.cancelBtn = new System.Windows.Forms.Button();
|
||||||
this.advancedSettingsGb = new System.Windows.Forms.GroupBox();
|
this.advancedSettingsGb = new System.Windows.Forms.GroupBox();
|
||||||
|
this.logsBtn = new System.Windows.Forms.Button();
|
||||||
this.convertLossyRb = new System.Windows.Forms.RadioButton();
|
this.convertLossyRb = new System.Windows.Forms.RadioButton();
|
||||||
this.convertLosslessRb = new System.Windows.Forms.RadioButton();
|
this.convertLosslessRb = new System.Windows.Forms.RadioButton();
|
||||||
this.inProgressSelectControl = new LibationWinForms.Dialogs.DirectorySelectControl();
|
this.inProgressSelectControl = new LibationWinForms.Dialogs.DirectorySelectControl();
|
||||||
this.allowLibationFixupCbox = new System.Windows.Forms.CheckBox();
|
this.allowLibationFixupCbox = new System.Windows.Forms.CheckBox();
|
||||||
this.booksSelectControl = new LibationWinForms.Dialogs.DirectoryOrCustomSelectControl();
|
this.booksSelectControl = new LibationWinForms.Dialogs.DirectoryOrCustomSelectControl();
|
||||||
this.booksGb = new System.Windows.Forms.GroupBox();
|
this.booksGb = new System.Windows.Forms.GroupBox();
|
||||||
this.logsBtn = new System.Windows.Forms.Button();
|
this.loggingLevelLbl = new System.Windows.Forms.Label();
|
||||||
|
this.loggingLevelCb = new System.Windows.Forms.ComboBox();
|
||||||
this.advancedSettingsGb.SuspendLayout();
|
this.advancedSettingsGb.SuspendLayout();
|
||||||
this.booksGb.SuspendLayout();
|
this.booksGb.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
@ -67,7 +69,7 @@
|
|||||||
// saveBtn
|
// saveBtn
|
||||||
//
|
//
|
||||||
this.saveBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.saveBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.saveBtn.Location = new System.Drawing.Point(714, 380);
|
this.saveBtn.Location = new System.Drawing.Point(714, 409);
|
||||||
this.saveBtn.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
this.saveBtn.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
||||||
this.saveBtn.Name = "saveBtn";
|
this.saveBtn.Name = "saveBtn";
|
||||||
this.saveBtn.Size = new System.Drawing.Size(88, 27);
|
this.saveBtn.Size = new System.Drawing.Size(88, 27);
|
||||||
@ -80,7 +82,7 @@
|
|||||||
//
|
//
|
||||||
this.cancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.cancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.cancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
this.cancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||||
this.cancelBtn.Location = new System.Drawing.Point(832, 380);
|
this.cancelBtn.Location = new System.Drawing.Point(832, 409);
|
||||||
this.cancelBtn.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
this.cancelBtn.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
||||||
this.cancelBtn.Name = "cancelBtn";
|
this.cancelBtn.Name = "cancelBtn";
|
||||||
this.cancelBtn.Size = new System.Drawing.Size(88, 27);
|
this.cancelBtn.Size = new System.Drawing.Size(88, 27);
|
||||||
@ -93,21 +95,30 @@
|
|||||||
//
|
//
|
||||||
this.advancedSettingsGb.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.advancedSettingsGb.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.advancedSettingsGb.Controls.Add(this.logsBtn);
|
|
||||||
this.advancedSettingsGb.Controls.Add(this.convertLossyRb);
|
this.advancedSettingsGb.Controls.Add(this.convertLossyRb);
|
||||||
this.advancedSettingsGb.Controls.Add(this.convertLosslessRb);
|
this.advancedSettingsGb.Controls.Add(this.convertLosslessRb);
|
||||||
this.advancedSettingsGb.Controls.Add(this.inProgressSelectControl);
|
this.advancedSettingsGb.Controls.Add(this.inProgressSelectControl);
|
||||||
this.advancedSettingsGb.Controls.Add(this.allowLibationFixupCbox);
|
this.advancedSettingsGb.Controls.Add(this.allowLibationFixupCbox);
|
||||||
this.advancedSettingsGb.Controls.Add(this.inProgressDescLbl);
|
this.advancedSettingsGb.Controls.Add(this.inProgressDescLbl);
|
||||||
this.advancedSettingsGb.Location = new System.Drawing.Point(12, 141);
|
this.advancedSettingsGb.Location = new System.Drawing.Point(12, 170);
|
||||||
this.advancedSettingsGb.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
this.advancedSettingsGb.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
||||||
this.advancedSettingsGb.Name = "advancedSettingsGb";
|
this.advancedSettingsGb.Name = "advancedSettingsGb";
|
||||||
this.advancedSettingsGb.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
this.advancedSettingsGb.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
||||||
this.advancedSettingsGb.Size = new System.Drawing.Size(908, 226);
|
this.advancedSettingsGb.Size = new System.Drawing.Size(908, 226);
|
||||||
this.advancedSettingsGb.TabIndex = 3;
|
this.advancedSettingsGb.TabIndex = 5;
|
||||||
this.advancedSettingsGb.TabStop = false;
|
this.advancedSettingsGb.TabStop = false;
|
||||||
this.advancedSettingsGb.Text = "Advanced settings for control freaks";
|
this.advancedSettingsGb.Text = "Advanced settings for control freaks";
|
||||||
//
|
//
|
||||||
|
// logsBtn
|
||||||
|
//
|
||||||
|
this.logsBtn.Location = new System.Drawing.Point(262, 141);
|
||||||
|
this.logsBtn.Name = "logsBtn";
|
||||||
|
this.logsBtn.Size = new System.Drawing.Size(132, 23);
|
||||||
|
this.logsBtn.TabIndex = 4;
|
||||||
|
this.logsBtn.Text = "Open log folder";
|
||||||
|
this.logsBtn.UseVisualStyleBackColor = true;
|
||||||
|
this.logsBtn.Click += new System.EventHandler(this.logsBtn_Click);
|
||||||
|
//
|
||||||
// convertLossyRb
|
// convertLossyRb
|
||||||
//
|
//
|
||||||
this.convertLossyRb.AutoSize = true;
|
this.convertLossyRb.AutoSize = true;
|
||||||
@ -170,19 +181,27 @@
|
|||||||
this.booksGb.Location = new System.Drawing.Point(12, 12);
|
this.booksGb.Location = new System.Drawing.Point(12, 12);
|
||||||
this.booksGb.Name = "booksGb";
|
this.booksGb.Name = "booksGb";
|
||||||
this.booksGb.Size = new System.Drawing.Size(908, 123);
|
this.booksGb.Size = new System.Drawing.Size(908, 123);
|
||||||
this.booksGb.TabIndex = 6;
|
this.booksGb.TabIndex = 1;
|
||||||
this.booksGb.TabStop = false;
|
this.booksGb.TabStop = false;
|
||||||
this.booksGb.Text = "Books location";
|
this.booksGb.Text = "Books location";
|
||||||
//
|
//
|
||||||
// logsBtn
|
// loggingLevelLbl
|
||||||
//
|
//
|
||||||
this.logsBtn.Location = new System.Drawing.Point(826, 18);
|
this.loggingLevelLbl.AutoSize = true;
|
||||||
this.logsBtn.Name = "logsBtn";
|
this.loggingLevelLbl.Location = new System.Drawing.Point(12, 144);
|
||||||
this.logsBtn.Size = new System.Drawing.Size(75, 64);
|
this.loggingLevelLbl.Name = "loggingLevelLbl";
|
||||||
this.logsBtn.TabIndex = 3;
|
this.loggingLevelLbl.Size = new System.Drawing.Size(78, 15);
|
||||||
this.logsBtn.Text = "Open log\r\nfiles folder";
|
this.loggingLevelLbl.TabIndex = 2;
|
||||||
this.logsBtn.UseVisualStyleBackColor = true;
|
this.loggingLevelLbl.Text = "Logging level";
|
||||||
this.logsBtn.Click += new System.EventHandler(this.logsBtn_Click);
|
//
|
||||||
|
// loggingLevelCb
|
||||||
|
//
|
||||||
|
this.loggingLevelCb.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.loggingLevelCb.FormattingEnabled = true;
|
||||||
|
this.loggingLevelCb.Location = new System.Drawing.Point(96, 141);
|
||||||
|
this.loggingLevelCb.Name = "loggingLevelCb";
|
||||||
|
this.loggingLevelCb.Size = new System.Drawing.Size(129, 23);
|
||||||
|
this.loggingLevelCb.TabIndex = 3;
|
||||||
//
|
//
|
||||||
// SettingsDialog
|
// SettingsDialog
|
||||||
//
|
//
|
||||||
@ -190,7 +209,10 @@
|
|||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.CancelButton = this.cancelBtn;
|
this.CancelButton = this.cancelBtn;
|
||||||
this.ClientSize = new System.Drawing.Size(933, 421);
|
this.ClientSize = new System.Drawing.Size(933, 450);
|
||||||
|
this.Controls.Add(this.logsBtn);
|
||||||
|
this.Controls.Add(this.loggingLevelCb);
|
||||||
|
this.Controls.Add(this.loggingLevelLbl);
|
||||||
this.Controls.Add(this.booksGb);
|
this.Controls.Add(this.booksGb);
|
||||||
this.Controls.Add(this.advancedSettingsGb);
|
this.Controls.Add(this.advancedSettingsGb);
|
||||||
this.Controls.Add(this.cancelBtn);
|
this.Controls.Add(this.cancelBtn);
|
||||||
@ -206,6 +228,7 @@
|
|||||||
this.booksGb.ResumeLayout(false);
|
this.booksGb.ResumeLayout(false);
|
||||||
this.booksGb.PerformLayout();
|
this.booksGb.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,5 +245,7 @@
|
|||||||
private System.Windows.Forms.RadioButton convertLosslessRb;
|
private System.Windows.Forms.RadioButton convertLosslessRb;
|
||||||
private System.Windows.Forms.GroupBox booksGb;
|
private System.Windows.Forms.GroupBox booksGb;
|
||||||
private System.Windows.Forms.Button logsBtn;
|
private System.Windows.Forms.Button logsBtn;
|
||||||
|
private System.Windows.Forms.Label loggingLevelLbl;
|
||||||
|
private System.Windows.Forms.ComboBox loggingLevelCb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -18,6 +18,13 @@ namespace LibationWinForms.Dialogs
|
|||||||
if (this.DesignMode)
|
if (this.DesignMode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
{
|
||||||
|
loggingLevelCb.Items.Clear();
|
||||||
|
foreach (var level in Enum<Serilog.Events.LogEventLevel>.GetValues())
|
||||||
|
loggingLevelCb.Items.Add(level);
|
||||||
|
loggingLevelCb.SelectedItem = config.LogLevel;
|
||||||
|
}
|
||||||
|
|
||||||
this.booksLocationDescLbl.Text = desc(nameof(config.Books));
|
this.booksLocationDescLbl.Text = desc(nameof(config.Books));
|
||||||
this.inProgressDescLbl.Text = desc(nameof(config.InProgress));
|
this.inProgressDescLbl.Text = desc(nameof(config.InProgress));
|
||||||
|
|
||||||
@ -65,11 +72,6 @@ namespace LibationWinForms.Dialogs
|
|||||||
|
|
||||||
private void saveBtn_Click(object sender, EventArgs e)
|
private void saveBtn_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
config.AllowLibationFixup = allowLibationFixupCbox.Checked;
|
|
||||||
config.DecryptToLossy = convertLossyRb.Checked;
|
|
||||||
|
|
||||||
config.InProgress = inProgressSelectControl.SelectedDirectory;
|
|
||||||
|
|
||||||
var newBooks = booksSelectControl.SelectedDirectory;
|
var newBooks = booksSelectControl.SelectedDirectory;
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(newBooks))
|
if (string.IsNullOrWhiteSpace(newBooks))
|
||||||
@ -92,6 +94,13 @@ namespace LibationWinForms.Dialogs
|
|||||||
|
|
||||||
config.Books = newBooks;
|
config.Books = newBooks;
|
||||||
|
|
||||||
|
config.LogLevel = (Serilog.Events.LogEventLevel)loggingLevelCb.SelectedItem;
|
||||||
|
|
||||||
|
config.AllowLibationFixup = allowLibationFixupCbox.Checked;
|
||||||
|
config.DecryptToLossy = convertLossyRb.Checked;
|
||||||
|
|
||||||
|
config.InProgress = inProgressSelectControl.SelectedDirectory;
|
||||||
|
|
||||||
this.DialogResult = DialogResult.OK;
|
this.DialogResult = DialogResult.OK;
|
||||||
this.Close();
|
this.Close();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user