Inventory logger

This commit is contained in:
erik 2025-05-12 20:27:00 +02:00
parent 29fba4b7cb
commit de2057789a
41 changed files with 12834 additions and 171 deletions

View file

@ -0,0 +1,210 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Xml;
namespace Mag.Shared.Settings
{
static class SettingsFile
{
internal static readonly XmlDocument XmlDocument = new XmlDocument();
static string _documentPath;
static string _rootNodeName = "Settings";
static SettingsFile()
{
ReloadXmlDocument();
}
public static void Init(string filePath, string rootNode = "Settings")
{
_documentPath = filePath;
_rootNodeName = rootNode;
ReloadXmlDocument();
}
public static void ReloadXmlDocument()
{
try
{
if (!String.IsNullOrEmpty(_documentPath) && File.Exists(_documentPath))
XmlDocument.Load(_documentPath);
else
XmlDocument.LoadXml("<" + _rootNodeName + "></" + _rootNodeName + ">");
}
catch (Exception ex)
{
Debug.LogException(ex);
XmlDocument.LoadXml("<" + _rootNodeName + "></" + _rootNodeName + ">");
}
}
public static void SaveXmlDocument()
{
XmlDocument.Save(_documentPath);
}
public static T GetSetting<T>(string xPath, T defaultValue = default(T))
{
XmlNode xmlNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath);
if (xmlNode != null)
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
if (converter.CanConvertFrom(typeof(string)))
return (T)converter.ConvertFromString(xmlNode.InnerText);
}
return defaultValue;
}
public static void PutSetting<T>(string xPath, T value)
{
// Before we save a setting, we reload the document to make sure we don't overwrite settings saved from another session.
ReloadXmlDocument();
XmlNode xmlNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath);
if (xmlNode == null)
xmlNode = createMissingNode(_rootNodeName + "/" + xPath);
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
if (converter.CanConvertTo(typeof(string)))
{
string result = converter.ConvertToString(value);
if (result != null)
{
xmlNode.InnerText = result;
XmlDocument.Save(_documentPath);
}
}
}
static XmlNode createMissingNode(string xPath)
{
string[] xPathSections = xPath.Split('/');
string currentXPath = "";
XmlNode currentNode = XmlDocument.SelectSingleNode(_rootNodeName);
foreach (string xPathSection in xPathSections)
{
currentXPath += xPathSection;
XmlNode testNode = XmlDocument.SelectSingleNode(currentXPath);
if (testNode == null)
{
if (currentNode != null)
currentNode.InnerXml += "<" + xPathSection + "></" + xPathSection + ">";
}
currentNode = XmlDocument.SelectSingleNode(currentXPath);
currentXPath += "/";
}
return currentNode;
}
public static IList<string> GetChilderenInnerTexts(string xPath)
{
XmlNode xmlNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath);
Collection<string> collection = new Collection<string>();
if (xmlNode != null)
{
foreach (XmlNode childNode in xmlNode.ChildNodes)
collection.Add(childNode.InnerText);
}
return collection;
}
public static void SetNodeChilderen(string xPath, string childNodeName, IList<string> innerTexts)
{
// Before we save a setting, we reload the document to make sure we don't overwrite settings saved from another session.
ReloadXmlDocument();
XmlNode parentNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath);
if (parentNode == null)
{
if (innerTexts.Count == 0)
return;
parentNode = createMissingNode(_rootNodeName + "/" + xPath);
}
parentNode.RemoveAll();
if (innerTexts.Count == 0)
{
XmlDocument.Save(_documentPath);
return;
}
foreach (string innerText in innerTexts)
{
XmlNode childNode = parentNode.AppendChild(XmlDocument.CreateElement(childNodeName));
childNode.InnerText = innerText;
}
XmlDocument.Save(_documentPath);
}
public static XmlNode GetNode(string xPath, bool createIfNull = false)
{
var node = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath);
if (node == null && createIfNull)
node = createMissingNode(_rootNodeName + "/" + xPath);
return node;
}
public static void SetNodeChilderen(string xPath, string childNodeName, Collection<Dictionary<string, string>> childNodeAttributes)
{
// Before we save a setting, we reload the document to make sure we don't overwrite settings saved from another session.
ReloadXmlDocument();
XmlNode parentNode = XmlDocument.SelectSingleNode(_rootNodeName + "/" + xPath);
if (parentNode == null)
parentNode = createMissingNode(_rootNodeName + "/" + xPath);
if (parentNode.HasChildNodes)
parentNode.RemoveAll();
foreach (Dictionary<string, string> dictionary in childNodeAttributes)
{
XmlNode childNode = parentNode.AppendChild(XmlDocument.CreateElement(childNodeName));
foreach (KeyValuePair<string, string> pair in dictionary)
{
XmlAttribute attribute = XmlDocument.CreateAttribute(pair.Key);
attribute.Value = pair.Value;
if (childNode.Attributes != null)
childNode.Attributes.Append(attribute);
}
}
XmlDocument.Save(_documentPath);
}
}
}