mattercontrol/SliceConfiguration/SliceSettingsOrganizer.cs
gregory-diaz 69dc56d2fd More Localization
Localization 2/10
2014-02-10 17:59:57 -08:00

349 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Utilities;
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.VectorMath;
using MatterHackers.MatterControl.DataStorage;
using MatterHackers.Localizations;
namespace MatterHackers.MatterControl
{
public class OrganizerSettingsData
{
[JsonConverter(typeof(StringEnumConverter))]
public enum DataEditTypes { STRING, INT, DOUBLE, POSITVE_DOUBLE, OFFSET, DOUBLE_OR_PERCENT, VECTOR2, OFFSET2, CHECK_BOX, LIST, MULTI_LINE_TEXT };
public string SlicerConfigName { get; set; }
public string PresentationName { get; set; }
public string HelpText { get; set; }
public DataEditTypes DataEditType { get; set; }
public string ExtraSettings { get; set; }
static public OrganizerSettingsData NewOrganizerSettingData(string slicerConfigName, string presentationName, OrganizerSettingsData.DataEditTypes dataEditType, string extraSettings = "", string helpText = "")
{
return new OrganizerSettingsData(slicerConfigName, presentationName, dataEditType, extraSettings, helpText);
}
static public OrganizerSettingsData NewOrganizerSettingData(string lineFromSettingsFile)
{
string[] parameters = lineFromSettingsFile.Split('|');
OrganizerSettingsData.DataEditTypes valueType = (OrganizerSettingsData.DataEditTypes)Enum.Parse(typeof(OrganizerSettingsData.DataEditTypes), parameters[2].Trim());
switch (parameters.Length)
{
case 3:
return NewOrganizerSettingData(parameters[0].Trim(), parameters[1].Trim(), valueType);
case 4:
return NewOrganizerSettingData(parameters[0].Trim(), parameters[1].Trim(), valueType, parameters[3].Trim());
case 5:
return NewOrganizerSettingData(parameters[0].Trim(), parameters[1].Trim(), valueType, parameters[3].Trim(), parameters[4].Trim());
default:
throw new Exception("Bad number of paramenters.");
}
}
public OrganizerSettingsData(string slicerConfigName, string presentationName, DataEditTypes dataEditType, string extraSettings = "", string helpText = "")
{
this.ExtraSettings = extraSettings;
this.SlicerConfigName = slicerConfigName;
this.PresentationName = presentationName;
this.DataEditType = dataEditType;
this.HelpText = new LocalizedString(helpText).Translated;
}
}
public class OrganizerSubGroup
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}
List<OrganizerSettingsData> settingDataList = new List<OrganizerSettingsData>();
public List<OrganizerSettingsData> SettingDataList
{
get { return settingDataList; }
set { settingDataList = value; }
}
public OrganizerSubGroup(string groupName)
{
this.name = groupName;
}
}
public class OrganizerGroup
{
private string groupName;
public string Name
{
get { return groupName; }
}
List<OrganizerSubGroup> subGroupsList = new List<OrganizerSubGroup>();
public List<OrganizerSubGroup> SubGroupsList
{
get { return subGroupsList; }
set { subGroupsList = value; }
}
public OrganizerGroup(string displayName)
{
this.groupName = displayName;
}
internal OrganizerSubGroup NewAndAddSettingsSubGroup(string subGroupName)
{
OrganizerSubGroup newSettingsSubGroup = new OrganizerSubGroup(subGroupName);
SubGroupsList.Add(newSettingsSubGroup);
return newSettingsSubGroup;
}
}
public class OrganizerCategory
{
public string Name { get; set; }
List<OrganizerGroup> groupsList = new List<OrganizerGroup>();
public List<OrganizerGroup> GroupsList
{
get { return groupsList; }
set { groupsList = value; }
}
public OrganizerCategory(string categoryName)
{
Name = categoryName;
}
public OrganizerGroup NewAndAddSettingsGroup(string settingsGroupName)
{
OrganizerGroup newSettingsGroup = new OrganizerGroup(settingsGroupName);
GroupsList.Add(newSettingsGroup);
return newSettingsGroup;
}
}
public class OrganizerUserLevel
{
public string Name { get; set; }
List<OrganizerCategory> categoriesList = new List<OrganizerCategory>();
public List<OrganizerCategory> CategoriesList
{
get { return categoriesList; }
set { categoriesList = value; }
}
public OrganizerUserLevel(string userLevelName)
{
Name = userLevelName;
}
public OrganizerCategory NewAndAddSettingsGroup(string settingsGroupName)
{
OrganizerCategory newCategoriesGroup = new OrganizerCategory(settingsGroupName);
CategoriesList.Add(newCategoriesGroup);
return newCategoriesGroup;
}
}
public class SliceSettingsOrganizer
{
Dictionary<string, OrganizerUserLevel> userLevels = new Dictionary<string, OrganizerUserLevel>();
public Dictionary<string, OrganizerUserLevel> UserLevels
{
get { return userLevels; }
set { userLevels = value; }
}
List<OrganizerSettingsData> settingsData = new List<OrganizerSettingsData>();
public List<OrganizerSettingsData> SettingsData
{
get { return settingsData; }
set { settingsData = value; }
}
static SliceSettingsOrganizer instance = null;
public static SliceSettingsOrganizer Instance
{
get
{
if (instance == null)
{
instance = new SliceSettingsOrganizer();
}
return instance;
}
}
SliceSettingsOrganizer()
{
string layouts = Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath, "SliceSettings", "Layouts.txt");
string properties = Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath, "SliceSettings", "Properties.txt");
LoadAndParseSettingsFiles(properties, layouts);
#if false
Categories.Add(CreatePrintSettings());
SettingsCategory filamentSettingsCategory = new SettingsCategory("Filament Settings");
Categories.Add(filamentSettingsCategory);
SettingsCategory printerSettingsCategory = new SettingsCategory("Printer Settings");
Categories.Add(printerSettingsCategory);
#endif
}
public bool Contains(string userLevel, string slicerConfigName)
{
foreach (OrganizerCategory category in UserLevels[userLevel].CategoriesList)
{
foreach (OrganizerGroup group in category.GroupsList)
{
foreach (OrganizerSubGroup subGroup in group.SubGroupsList)
{
foreach (OrganizerSettingsData settingData in subGroup.SettingDataList)
{
if (settingData.SlicerConfigName == slicerConfigName)
{
return true;
}
}
}
}
}
return false;
}
public OrganizerSettingsData GetSettingsData(string slicerConfigName)
{
foreach (OrganizerSettingsData settingData in SettingsData)
{
if (settingData.SlicerConfigName == slicerConfigName)
{
return settingData;
}
}
throw new Exception("You must not have a layout for a setting that is not in the Properties.txt");
}
public void ExportToJson(string savedFileName = null)
{
if (savedFileName == null)
{
savedFileName = Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath, "ConfigSettingsMapping.json");
}
string jsonString = JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
FileStream fs = new FileStream(savedFileName, FileMode.Create);
StreamWriter sw = new System.IO.StreamWriter(fs);
sw.Write(jsonString);
sw.Close();
}
void LoadAndParseSettingsFiles(string properties, string layout)
{
{
string propertiesFileContents = "";
using (FileStream fileStream = new FileStream(properties, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader propertiesReader = new StreamReader(fileStream))
{
propertiesFileContents = propertiesReader.ReadToEnd();
}
}
string[] lines = propertiesFileContents.Split('\n');
foreach (string line in lines)
{
if (line.Trim().Length > 0)
{
settingsData.Add(OrganizerSettingsData.NewOrganizerSettingData(line));
}
}
}
{
string layoutFileContents = "";
using (FileStream fileStream = new FileStream(layout, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader layoutReader = new StreamReader(fileStream))
{
layoutFileContents = layoutReader.ReadToEnd();
}
}
OrganizerUserLevel userLevelToAddTo = null;
OrganizerCategory categoryToAddTo = null;
OrganizerGroup groupToAddTo = null;
OrganizerSubGroup subGroupToAddTo = null;
string[] lines = layoutFileContents.Split('\n');
foreach (string line in lines)
{
if (line.Length > 0)
{
switch (CountLeadingSpaces(line))
{
case 0:
string userLevelText = line.Replace('"', ' ').Trim();
userLevelToAddTo = new OrganizerUserLevel(userLevelText);
UserLevels.Add(userLevelText, userLevelToAddTo);
break;
case 2:
categoryToAddTo = new OrganizerCategory(line.Replace('"', ' ').Trim());
userLevelToAddTo.CategoriesList.Add(categoryToAddTo);
break;
case 4:
groupToAddTo = new OrganizerGroup(line.Replace('"', ' ').Trim());
categoryToAddTo.GroupsList.Add(groupToAddTo);
break;
case 6:
subGroupToAddTo = new OrganizerSubGroup(line.Replace('"', ' ').Trim());
groupToAddTo.SubGroupsList.Add(subGroupToAddTo);
break;
case 8:
subGroupToAddTo.SettingDataList.Add(GetSettingsData(line.Replace('"', ' ').Trim()));
break;
default:
throw new Exception("Bad file, too many spaces (must be 0, 2, 4 or 6).");
}
}
}
}
}
private static int CountLeadingSpaces(string line)
{
int numSpaces = 0;
while (line[numSpaces] == ' ' && numSpaces < line.Length)
{
numSpaces++;
}
return numSpaces;
}
}
}