migrate Settings codebase from MBS.Framework.UserInterface to MBS.Framework

This commit is contained in:
Michael Becker 2021-02-07 00:12:14 -05:00
parent 2c9d62ac37
commit a594833143
No known key found for this signature in database
GPG Key ID: 98C333A81F18C22C
15 changed files with 849 additions and 0 deletions

View File

@ -0,0 +1,30 @@
//
// CommandStylePresets.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework
{
public enum CommandStylePreset
{
None = 0,
Destructive,
Suggested
}
}

View File

@ -96,6 +96,20 @@
<Compile Include="Collections\Generic\ExtensionMethods.cs" /> <Compile Include="Collections\Generic\ExtensionMethods.cs" />
<Compile Include="ISupportsExtraData.cs" /> <Compile Include="ISupportsExtraData.cs" />
<Compile Include="InstallationStatus.cs" /> <Compile Include="InstallationStatus.cs" />
<Compile Include="Setting.cs" />
<Compile Include="SettingsGroup.cs" />
<Compile Include="SettingsProfile.cs" />
<Compile Include="SettingsProvider.cs" />
<Compile Include="SettingsValue.cs" />
<Compile Include="Settings\CommandSetting.cs" />
<Compile Include="Settings\RangeSetting.cs" />
<Compile Include="Settings\GroupSetting.cs" />
<Compile Include="Settings\BooleanSetting.cs" />
<Compile Include="Settings\ChoiceSetting.cs" />
<Compile Include="Settings\TextSetting.cs" />
<Compile Include="Settings\CollectionSetting.cs" />
<Compile Include="Settings\FileSetting.cs" />
<Compile Include="CommandStylePreset.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Logic\" /> <Folder Include="Logic\" />
@ -104,6 +118,7 @@
<Folder Include="IO\" /> <Folder Include="IO\" />
<Folder Include="Scripting\" /> <Folder Include="Scripting\" />
<Folder Include="Scripting\Strings\" /> <Folder Include="Scripting\Strings\" />
<Folder Include="Settings\" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project> </Project>

147
MBS.Framework/Setting.cs Normal file
View File

@ -0,0 +1,147 @@
//
// Option.cs
//
// Author:
// Mike Becker <alcexhim@gmail.com>
//
// Copyright (c) 2019 Mike Becker
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
namespace MBS.Framework
{
public abstract class Setting
{
public Setting(string name, string title, object defaultValue = null)
{
Name = name;
Title = title;
DefaultValue = defaultValue;
mvarValue = defaultValue;
}
public Guid ID { get; set; } = Guid.Empty;
[Obsolete("This is no longer implemented. Please set a proper ID in order for your setting to be saved.")]
public string Name { get; set; } = String.Empty;
public string Title { get; set; } = String.Empty;
public string Description { get; set; } = String.Empty;
public class SettingCollection
: System.Collections.ObjectModel.Collection<Setting>
{
public Setting this[string name]
{
get
{
foreach (Setting item in this)
{
if (item.Title.Replace("_", String.Empty).Replace(' ', '_').Equals(name))
{
return item;
}
}
return null;
}
}
private Dictionary<Guid, Setting> _itemsByID = new Dictionary<Guid, Setting>();
protected override void ClearItems()
{
base.ClearItems();
_itemsByID.Clear();
}
protected override void InsertItem(int index, Setting item)
{
base.InsertItem(index, item);
_itemsByID[item.ID] = item;
}
protected override void RemoveItem(int index)
{
_itemsByID.Remove(this[index].ID);
base.RemoveItem(index);
}
public bool Contains(Guid id)
{
return _itemsByID.ContainsKey(id);
}
}
protected Setting()
{
}
public object DefaultValue { get; set; } = null;
public SettingsValue.SettingsValueCollection ScopedValues { get; } = new SettingsValue.SettingsValueCollection();
private object mvarValue = null;
public virtual object GetValue(Guid? scopeId = null)
{
if (scopeId != null)
{
if (ScopedValues.Contains(scopeId.Value))
{
return ScopedValues[scopeId.Value].Value;
}
}
return mvarValue;
}
public virtual void SetValue(object value, Guid? scopeId = null)
{
if (scopeId != null)
{
if (ScopedValues.Contains(scopeId.Value))
{
ScopedValues[scopeId.Value].Value = value;
}
else
{
ScopedValues.Add(scopeId.Value, value);
}
}
else
{
mvarValue = value;
}
}
public T GetValue<T>(T defaultValue = default(T), Guid? scopeId = null)
{
try
{
object val = GetValue(scopeId);
if (val is T)
return (T)val;
if (val is string)
{
return (val as string).Parse<T>();
}
return defaultValue;
}
catch
{
return defaultValue;
}
}
public void SetValue<T>(T value)
{
mvarValue = value;
}
}
}

View File

@ -0,0 +1,40 @@
//
// BooleanSetting.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework.Settings
{
public class BooleanSetting : Setting
{
public BooleanSetting(string name, string title, bool defaultValue = false) : base(name, title, defaultValue)
{
}
public override void SetValue(object value, Guid? scopeId = null)
{
bool val = false;
if (value != null)
{
val = (value.ToString().ToLower().Equals("true"));
}
base.SetValue(val);
}
}
}

View File

@ -0,0 +1,74 @@
//
// ChoiceSetting.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework.Settings
{
public class ChoiceSetting : Setting
{
public ChoiceSetting(string name, string title, ChoiceSettingValue defaultValue = null, ChoiceSettingValue[] values = null) : base(name, title, null)
{
if (values == null)
{
values = new ChoiceSettingValue[0];
}
if (defaultValue != null)
{
if (defaultValue.Value != null)
{
base.DefaultValue = defaultValue.Value.ToString();
}
else
{
base.DefaultValue = null;
}
}
foreach (ChoiceSettingValue value in values)
{
ValidValues.Add(value);
}
}
public class ChoiceSettingValue
{
public class ChoiceSettingValueCollection
: System.Collections.ObjectModel.Collection<ChoiceSettingValue>
{
}
public string Name { get; set; } = String.Empty;
public string Title { get; set; } = String.Empty;
public object Value { get; set; } = null;
public ChoiceSettingValue(string name, string title, object value)
{
Name = name;
Title = title;
Value = value;
}
}
public ChoiceSettingValue.ChoiceSettingValueCollection ValidValues { get; } = new ChoiceSettingValue.ChoiceSettingValueCollection();
public ChoiceSettingValue SelectedValue { get; set; } = null;
public bool RequireSelectionFromList { get; set; } = true;
}
}

View File

@ -0,0 +1,37 @@
//
// CollectionSetting.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework.Settings
{
public class CollectionSetting : Setting
{
public Setting.SettingCollection Settings { get; } = new Setting.SettingCollection();
public SettingsGroup.SettingsGroupCollection Items { get; } = new SettingsGroup.SettingsGroupCollection();
public CollectionSetting(string name, string title, SettingsGroup group) : base(name, title, null)
{
for (int i = 0; i < group.Settings.Count; i++)
{
Settings.Add(group.Settings[i]);
}
}
}
}

View File

@ -0,0 +1,34 @@
//
// CommandSetting.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework.Settings
{
public class CommandSetting : Setting
{
public string CommandID { get; set; } = null;
public CommandStylePreset StylePreset { get; set; } = CommandStylePreset.None;
public CommandSetting(string name, string title, string commandID) : base(name, title)
{
CommandID = commandID;
}
}
}

View File

@ -0,0 +1,41 @@
//
// FileSetting.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework.Settings
{
public enum FileSettingMode
{
Open,
Save,
SelectFolder,
CreateFolder
}
public class FileSetting : TextSetting
{
public bool RequireExistingFile { get; set; } = true;
public FileSettingMode Mode { get; set; } = FileSettingMode.Open;
public FileSetting(string name, string title, string defaultValue = "", bool requireExistingFile = true) : base(name, title, defaultValue)
{
RequireExistingFile = requireExistingFile;
}
}
}

View File

@ -0,0 +1,40 @@
//
// GroupSetting.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework.Settings
{
public class GroupSetting : Setting
{
public Setting.SettingCollection Options { get; } = new Setting.SettingCollection();
public Setting.SettingCollection HeaderSettings { get; } = new Setting.SettingCollection();
public GroupSetting(string name, string title, Setting[] options = null) : base(name, title)
{
if (options != null)
{
foreach (Setting option in options)
{
Options.Add(option);
}
}
}
}
}

View File

@ -0,0 +1,35 @@
//
// RangeSetting.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework.Settings
{
public class RangeSetting : Setting
{
public decimal? MinimumValue { get; set; } = null;
public decimal? MaximumValue { get; set; } = null;
public RangeSetting(string name, string title, decimal defaultValue = 0.0M, decimal? minimumValue = null, decimal? maximumValue = null) : base(name, title, defaultValue)
{
MinimumValue = minimumValue;
MaximumValue = maximumValue;
}
}
}

View File

@ -0,0 +1,30 @@
//
// TextSetting.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2021 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework.Settings
{
public class TextSetting : Setting
{
public TextSetting(string name, string title, string defaultValue = "") : base(name, title, defaultValue)
{
}
}
}

View File

@ -0,0 +1,146 @@
//
// OptionPanel.cs
//
// Author:
// Mike Becker <alcexhim@gmail.com>
//
// Copyright (c) 2019 Mike Becker
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
namespace MBS.Framework
{
public class SettingsGroup : IComparable<SettingsGroup>
{
public class SettingsGroupCollection
: System.Collections.ObjectModel.Collection<SettingsGroup>
{
public SettingsGroup Add(string path, Setting[] options)
{
string[] paths = new string[0];
if (!String.IsNullOrEmpty (path)) {
paths = path.Split (new char[] { ':' });
}
return Add (paths, options);
}
public SettingsGroup Add(string[] path, Setting[] options)
{
SettingsGroup grp = new SettingsGroup();
grp.Path = path;
if (options != null) {
foreach (Setting option in options) {
grp.Settings.Add (option);
}
}
Add (grp);
return grp;
}
private Dictionary<Guid, SettingsGroup> _itemsByID = new Dictionary<Guid, SettingsGroup>();
protected override void ClearItems()
{
base.ClearItems();
_itemsByID.Clear();
}
protected override void InsertItem(int index, SettingsGroup item)
{
base.InsertItem(index, item);
_itemsByID[item.ID] = item;
}
protected override void RemoveItem(int index)
{
_itemsByID.Remove(this[index].ID);
base.RemoveItem(index);
}
public bool Contains(Guid id)
{
return _itemsByID.ContainsKey(id);
}
}
public SettingsGroup()
{
}
public SettingsGroup(string path, Setting[] options = null)
{
string[] paths = new string[0];
if (!String.IsNullOrEmpty (path)) {
paths = path.Split (new char[] { ':' });
}
Path = paths;
if (options != null)
{
foreach (Setting option in options)
{
Settings.Add(option);
}
}
}
public SettingsGroup(string[] paths, Setting[] options = null)
{
Path = paths;
if (options != null)
{
foreach (Setting option in options)
{
Settings.Add(option);
}
}
}
public int CompareTo(SettingsGroup other)
{
int xprior = this.Priority;
int yprior = other.Priority;
if (xprior == -1 && yprior == -1)
{
string xpath = String.Join(":", this.GetPath());
string ypath = String.Join(":", other.GetPath());
return xpath.CompareTo(ypath);
}
else
{
return yprior.CompareTo(xprior);
}
}
public Guid ID { get; set; } = Guid.Empty;
public string[] GetPath()
{
if (Path == null) return new string[0];
return Path;
}
public string[] Path { get; set; } = null;
public string Title
{
get
{
if (Path.Length > 0) return Path[Path.Length - 1];
return null;
}
}
public Setting.SettingCollection Settings { get; } = new Setting.SettingCollection();
public int Priority { get; set; } = -1;
public override string ToString ()
{
return String.Join (":", Path);
}
}
}

View File

@ -0,0 +1,38 @@
//
// SettingsProfile.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2020 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework
{
public class SettingsProfile
{
public class SettingsProfileCollection
: System.Collections.ObjectModel.Collection<SettingsProfile>
{
}
public static readonly Guid AllUsersGUID = new Guid("{6c1e84c6-7cb8-4798-b000-349dba816114}");
public static readonly Guid ThisUserGUID = new Guid("{a550229d-05e1-4a93-96a6-98ae1c69b847}");
public Guid ID { get; set; } = Guid.Empty;
public string Title { get; set; } = null;
}
}

View File

@ -0,0 +1,81 @@
//
// OptionProvider.cs
//
// Author:
// Mike Becker <alcexhim@gmail.com>
//
// Copyright (c) 2019 Mike Becker
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace MBS.Framework
{
public abstract class SettingsProvider
{
public class SettingsProviderCollection
: System.Collections.ObjectModel.Collection<SettingsProvider>
{
private System.Collections.Generic.Dictionary<Guid, SettingsProvider> _itemsByID = new System.Collections.Generic.Dictionary<Guid, SettingsProvider>();
public bool Contains(Guid id)
{
return _itemsByID.ContainsKey(id);
}
protected override void ClearItems()
{
base.ClearItems();
_itemsByID.Clear();
}
protected override void InsertItem(int index, SettingsProvider item)
{
_itemsByID[item.ID] = item;
base.InsertItem(index, item);
}
protected override void RemoveItem(int index)
{
_itemsByID.Remove(this[index].ID);
base.RemoveItem(index);
}
}
public Guid ID { get; set; } = Guid.Empty;
public SettingsGroup.SettingsGroupCollection SettingsGroups { get; } = new SettingsGroup.SettingsGroupCollection();
protected virtual void InitializeInternal()
{
}
public void Initialize()
{
InitializeInternal();
}
protected virtual void LoadSettingsInternal()
{
}
public void LoadSettings()
{
LoadSettingsInternal ();
}
protected virtual void SaveSettingsInternal()
{
}
public void SaveSettings()
{
SaveSettingsInternal ();
}
}
}

View File

@ -0,0 +1,61 @@
//
// SettingValue.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2020 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
namespace MBS.Framework
{
public class SettingsValue
{
public class SettingsValueCollection : System.Collections.ObjectModel.Collection<SettingsValue>
{
Dictionary<Guid, SettingsValue> _itemsByGuid = new Dictionary<Guid, SettingsValue>();
public int Count { get { return _itemsByGuid.Count; } }
public bool Contains(Guid scopeId)
{
return _itemsByGuid.ContainsKey(scopeId);
}
public void Add(Guid scopeId, object value)
{
SettingsValue item = new SettingsValue();
item.ScopeId = scopeId;
item.Value = value;
Add(item);
}
public SettingsValue this[Guid scopeId]
{
get
{
if (_itemsByGuid.ContainsKey(scopeId))
return _itemsByGuid[scopeId];
return null;
}
}
}
public Guid ScopeId { get; set; }
public object Value { get; set; } = null;
}
}