mirror of
https://github.com/tribufu/ServerManagers
synced 2026-05-06 15:17:34 +00:00
source code checkin
This commit is contained in:
parent
5f8fb2c825
commit
7e57b72e35
675 changed files with 168433 additions and 0 deletions
138
src/ServerManager.Common/Model/IniValueList.cs
Normal file
138
src/ServerManager.Common/Model/IniValueList.cs
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
using ServerManagerTool.Common.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ServerManagerTool.Common.Model
|
||||
{
|
||||
public abstract class IniValueList<T> : SortableObservableCollection<T>, IIniValuesCollection
|
||||
{
|
||||
private bool _isEnabled;
|
||||
|
||||
protected IniValueList(string aggregateValueName, Func<IEnumerable<T>> resetFunc, Func<T, T, bool> equivalencyFunc, Func<T, object> sortKeySelectorFunc, Func<T, string> toIniValue, Func<string, T> fromIniValue)
|
||||
{
|
||||
this.ToIniValue = toIniValue;
|
||||
this.FromIniValue = fromIniValue;
|
||||
this.ResetFunc = resetFunc;
|
||||
this.EquivalencyFunc = equivalencyFunc;
|
||||
this.SortKeySelectorFunc = sortKeySelectorFunc;
|
||||
this.IniCollectionKey = aggregateValueName;
|
||||
|
||||
this.Reset();
|
||||
this.IsEnabled = false;
|
||||
}
|
||||
|
||||
public Func<T, string> ToIniValue { get; }
|
||||
public Func<string, T> FromIniValue { get; }
|
||||
protected Func<IEnumerable<T>> ResetFunc { get; }
|
||||
public Func<T, T, bool> EquivalencyFunc { get; private set; }
|
||||
protected Func<T, object> SortKeySelectorFunc { get; }
|
||||
|
||||
public bool IsEnabled
|
||||
{
|
||||
get { return this._isEnabled; }
|
||||
set
|
||||
{
|
||||
this._isEnabled = value;
|
||||
OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs(nameof(IsEnabled)));
|
||||
}
|
||||
}
|
||||
|
||||
public abstract bool IsArray { get; }
|
||||
|
||||
public string IniCollectionKey { get; }
|
||||
|
||||
public void AddRange(IEnumerable<T> values)
|
||||
{
|
||||
foreach (var value in values)
|
||||
{
|
||||
base.Add(value);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void FromIniValues(IEnumerable<string> values)
|
||||
{
|
||||
this.Clear();
|
||||
|
||||
if (this.IsArray)
|
||||
{
|
||||
var list = new List<T>();
|
||||
if (this.ResetFunc != null)
|
||||
list.AddRange(this.ResetFunc());
|
||||
|
||||
foreach(var v in values)
|
||||
{
|
||||
var indexStart = v.IndexOf('[');
|
||||
var indexEnd = v.IndexOf(']');
|
||||
|
||||
if(indexStart >= indexEnd)
|
||||
{
|
||||
// Invalid format
|
||||
continue;
|
||||
}
|
||||
|
||||
int index;
|
||||
if(!int.TryParse(v.Substring(indexStart + 1, indexEnd - indexStart - 1), out index))
|
||||
{
|
||||
// Invalid index
|
||||
continue;
|
||||
}
|
||||
|
||||
if(index >= list.Count)
|
||||
{
|
||||
// Unexpected size
|
||||
continue;
|
||||
}
|
||||
|
||||
list[index] = this.FromIniValue(v.Substring(v.IndexOf('=') + 1).Trim());
|
||||
this.IsEnabled = true;
|
||||
}
|
||||
|
||||
this.AddRange(list);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AddRange(values.Select(v => v.Substring(v.IndexOf('=') + 1)).Select(this.FromIniValue));
|
||||
this.IsEnabled = (this.Count != 0);
|
||||
|
||||
// Add any default values which were missing
|
||||
if (this.ResetFunc != null)
|
||||
{
|
||||
var defaultItemsToAdd = this.ResetFunc().Where(r => !this.Any(v => this.EquivalencyFunc(v, r))).ToArray();
|
||||
this.AddRange(defaultItemsToAdd);
|
||||
this.Sort(this.SortKeySelectorFunc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public virtual IEnumerable<string> ToIniValues()
|
||||
{
|
||||
var values = new List<string>();
|
||||
if (this.IsArray)
|
||||
{
|
||||
for(var i = 0; i < this.Count; i++)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(IniCollectionKey))
|
||||
values.Add(this.ToIniValue(this[i]));
|
||||
else
|
||||
values.Add($"{this.IniCollectionKey}[{i}]={this.ToIniValue(this[i])}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(IniCollectionKey))
|
||||
values.AddRange(this.Select(d => this.ToIniValue(d)));
|
||||
else
|
||||
values.AddRange(this.Select(d => $"{this.IniCollectionKey}={this.ToIniValue(d)}"));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
this.Clear();
|
||||
if (this.ResetFunc != null)
|
||||
this.AddRange(this.ResetFunc());
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue