Add support for renaming and duplicating presets
- Fixes #720 - Changing preset names has no effect - Fixes #767 - Presets editor contains user overrides - Fixes #768 - Oem presets should be copied... - Migrate from int to string based printer IDs - Add json document migration capabilities
This commit is contained in:
parent
9102a03dc6
commit
cb56e85776
11 changed files with 337 additions and 151 deletions
|
|
@ -52,9 +52,9 @@ namespace MatterHackers.MatterControl
|
|||
this.AddItem(printer.Name, printer.Id.ToString());
|
||||
}
|
||||
|
||||
if(ActiveSliceSettings.Instance != null)
|
||||
if (ActiveSliceSettings.Instance != null)
|
||||
{
|
||||
this.SelectedValue = ActiveSliceSettings.Instance.Id();
|
||||
this.SelectedValue = ActiveSliceSettings.Instance.ID;
|
||||
}
|
||||
|
||||
ImageBuffer plusImage = StaticData.Instance.LoadIcon("icon_plus.png", 32, 32);
|
||||
|
|
@ -62,18 +62,18 @@ namespace MatterHackers.MatterControl
|
|||
|
||||
this.SelectionChanged += (s, e) =>
|
||||
{
|
||||
int printerID;
|
||||
if (int.TryParse(this.SelectedValue, out printerID))
|
||||
string printerID = this.SelectedValue;
|
||||
if (printerID == "new")
|
||||
{
|
||||
ActiveSliceSettings.SwitchToProfile(printerID);
|
||||
}
|
||||
else if(this.SelectedValue == "new")
|
||||
{
|
||||
if(AddPrinter != null)
|
||||
if (AddPrinter != null)
|
||||
{
|
||||
UiThread.RunOnIdle(() => AddPrinter(this, null));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ActiveSliceSettings.SwitchToProfile(printerID);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,8 +86,9 @@ namespace MatterHackers.MatterControl.DataStorage.ClassicDB
|
|||
LoadQualitySettings(layeredProfile, printer);
|
||||
LoadMaterialSettings(layeredProfile, printer);
|
||||
|
||||
layeredProfile.ID = printer.Id.ToString();
|
||||
|
||||
layeredProfile.UserLayer["MatterControl.PrinterName"] = printer.Name ?? "";
|
||||
layeredProfile.UserLayer["MatterControl.PrinterID"] = printer.Id.ToString();
|
||||
layeredProfile.UserLayer["MatterControl.Make"] = printer.Make ?? "";
|
||||
layeredProfile.UserLayer["MatterControl.Model"] = printer.Model ?? "";
|
||||
layeredProfile.UserLayer["MatterControl.BaudRate"] = printer.BaudRate ?? "";
|
||||
|
|
@ -133,6 +134,7 @@ namespace MatterHackers.MatterControl.DataStorage.ClassicDB
|
|||
// TODO: Where can we find CalibrationFiiles in the current model?
|
||||
//layeredProfile.SetActiveValue("MatterControl.CalibrationFiles", printer.Make);
|
||||
|
||||
layeredProfile.ID = printer.Id.ToString();
|
||||
string fullProfilePath = Path.Combine(profilePath, printer.Id + ".json");
|
||||
File.WriteAllText(fullProfilePath, JsonConvert.SerializeObject(layeredProfile, Formatting.Indented));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2491,7 +2491,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
|
|||
// TODO: Fix printerItemID int requirement
|
||||
activePrintTask = new PrintTask();
|
||||
activePrintTask.PrintStart = DateTime.Now;
|
||||
activePrintTask.PrinterId = this.ActivePrinter.Id().GetHashCode();
|
||||
activePrintTask.PrinterId = this.ActivePrinter.ID.GetHashCode();
|
||||
activePrintTask.PrintName = ActivePrintItem.PrintItem.Name;
|
||||
activePrintTask.PrintItemId = ActivePrintItem.PrintItem.Id;
|
||||
activePrintTask.PrintingGCodeFileName = ActivePrintItem.GetGCodePathAndFileName();
|
||||
|
|
|
|||
|
|
@ -264,7 +264,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections
|
|||
BaudRate = settings.BaudRate(),
|
||||
ComPort = settings.ComPort(),
|
||||
DriverType = settings.DriverType(),
|
||||
Id = settings.Id(),
|
||||
Id = settings.ID,
|
||||
Name = settings.Name()
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,7 +72,6 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections
|
|||
settings.SetBaudRate(ActivePrinter.BaudRate);
|
||||
settings.SetComPort(ActivePrinter.ComPort);
|
||||
settings.SetDriverType(ActivePrinter.DriverType);
|
||||
settings.SetId(ActivePrinter.Id);
|
||||
settings.SetName(ActivePrinter.Name);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
BaudRate = profile.BaudRate(),
|
||||
ComPort = profile.ComPort(),
|
||||
DriverType = profile.DriverType(),
|
||||
Id = profile.Id(),
|
||||
Id = profile.ID,
|
||||
Make = profile.Make,
|
||||
Model = profile.Model,
|
||||
Name = profile.Name(),
|
||||
|
|
@ -193,11 +193,11 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
}
|
||||
}
|
||||
|
||||
internal static void SwitchToProfile(int id)
|
||||
internal static void SwitchToProfile(string printerID)
|
||||
{
|
||||
var profile = LoadProfile(id);
|
||||
var profile = LoadProfile(printerID);
|
||||
|
||||
UserSettings.Instance.set("ActiveProfileID", id.ToString());
|
||||
UserSettings.Instance.set("ActiveProfileID", printerID);
|
||||
|
||||
if (profile != null)
|
||||
{
|
||||
|
|
@ -205,16 +205,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
}
|
||||
}
|
||||
|
||||
internal static SettingsProfile LoadProfile(int id)
|
||||
{
|
||||
string profileID = ProfileData.Profiles.Where(p => p.Id == id.ToString()).FirstOrDefault()?.Id.ToString();
|
||||
if (!string.IsNullOrEmpty(profileID))
|
||||
{
|
||||
return LoadProfile(profileID);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
internal static void AcquireNewProfile(string make, string model, string printerName)
|
||||
{
|
||||
|
|
@ -223,11 +213,11 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
OemProfile printerProfile = LoadHttpOemProfile(make, model);
|
||||
SettingsLayer baseConfig = LoadMatterHackersBaseLayer();
|
||||
|
||||
var layeredProfile = new LayeredProfile(
|
||||
printerProfile,
|
||||
baseConfig);
|
||||
layeredProfile.DocumentPath = Path.Combine(profilesPath, guid + ".json");
|
||||
layeredProfile.UserLayer["MatterControl.PrinterID"] = guid.ToString();
|
||||
var layeredProfile = new LayeredProfile(printerProfile, baseConfig)
|
||||
{
|
||||
ID = guid,
|
||||
DocumentPath = Path.Combine(profilesPath, guid + ".json")
|
||||
};
|
||||
layeredProfile.UserLayer["MatterControl.PrinterName"] = printerName;
|
||||
|
||||
// Import named macros as defined in the following printers: (Airwolf Axiom, HD, HD-R, HD2x, HDL, HDx, Me3D Me2, Robo R1[+])
|
||||
|
|
@ -258,6 +248,17 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
}
|
||||
}
|
||||
|
||||
// Copy OemProfile presets into user layers
|
||||
foreach(var layer in layeredProfile.OemProfile.MaterialLayers)
|
||||
{
|
||||
layeredProfile.MaterialLayers[layer.Key] = layer.Value;
|
||||
}
|
||||
|
||||
foreach (var layer in layeredProfile.OemProfile.QualityLayers)
|
||||
{
|
||||
layeredProfile.QualityLayers[layer.Key] = layer.Value;
|
||||
}
|
||||
|
||||
layeredProfile.Save();
|
||||
|
||||
ProfileData.Profiles.Add(new PrinterInfo
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ using System.Linq;
|
|||
using System.Runtime.Serialization;
|
||||
using System;
|
||||
using System.IO;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace MatterHackers.MatterControl.SlicerConfiguration
|
||||
{
|
||||
|
|
@ -43,8 +44,73 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
public DateTime LastModified { get; set; }
|
||||
}
|
||||
|
||||
public static class ProfileMigrations
|
||||
{
|
||||
public static string MigrateDocument(string filePath, int fromVersion)
|
||||
{
|
||||
var jObject = JObject.Parse(File.ReadAllText(filePath));
|
||||
|
||||
if (fromVersion < 201605131)
|
||||
{
|
||||
var materialLayers = jObject["MaterialLayers"] as JObject;
|
||||
foreach (JProperty layer in materialLayers.Properties().ToList())
|
||||
{
|
||||
layer.Remove();
|
||||
|
||||
string layerID = Guid.NewGuid().ToString();
|
||||
|
||||
var body = layer.Value as JObject;
|
||||
body["MatterControl.LayerID"] = layerID;
|
||||
body["MatterControl.LayerName"] = layer.Name;
|
||||
|
||||
materialLayers[layerID] = layer.Value;
|
||||
}
|
||||
|
||||
var qualityLayers = jObject["QualityLayers"] as JObject;
|
||||
foreach (JProperty layer in qualityLayers.Properties().ToList())
|
||||
{
|
||||
layer.Remove();
|
||||
|
||||
string layerID = Guid.NewGuid().ToString();
|
||||
|
||||
var body = layer.Value as JObject;
|
||||
body["MatterControl.LayerID"] = layerID;
|
||||
body["MatterControl.LayerName"] = layer.Name;
|
||||
|
||||
qualityLayers[layerID] = layer.Value;
|
||||
}
|
||||
|
||||
|
||||
jObject["DocumentVersion"] = 201605131;
|
||||
}
|
||||
|
||||
if (fromVersion < 201605132)
|
||||
{
|
||||
string printerID = Guid.NewGuid().ToString();
|
||||
jObject.Remove("DocumentPath");
|
||||
jObject["ID"] = printerID;
|
||||
jObject["DocumentVersion"] = 201605132;
|
||||
|
||||
File.Delete(filePath);
|
||||
filePath = Path.Combine(Path.GetDirectoryName(filePath), printerID + ".json");
|
||||
}
|
||||
|
||||
File.WriteAllText(
|
||||
filePath,
|
||||
JsonConvert.SerializeObject(jObject, Formatting.Indented));
|
||||
|
||||
return filePath;
|
||||
}
|
||||
}
|
||||
|
||||
public class LayeredProfile
|
||||
{
|
||||
public int DocumentVersion { get; set; }
|
||||
|
||||
public string ID { get; set; }
|
||||
|
||||
public static int LatestVersion { get; } = 201605132;
|
||||
|
||||
[JsonIgnore]
|
||||
internal SettingsLayer QualityLayer { get; private set; }
|
||||
|
||||
|
|
@ -126,7 +192,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public string GetMaterialPresetKey(int extruderIndex)
|
||||
{
|
||||
if (extruderIndex >= MaterialSettingsKeys.Count)
|
||||
|
|
@ -165,13 +230,14 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
|
||||
public List<string> MaterialSettingsKeys { get; set; } = new List<string>();
|
||||
|
||||
[JsonIgnore]
|
||||
public string DocumentPath { get; set; }
|
||||
|
||||
internal void Save()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(DocumentPath))
|
||||
{
|
||||
File.WriteAllText(DocumentPath, JsonConvert.SerializeObject(this));
|
||||
File.WriteAllText(DocumentPath, JsonConvert.SerializeObject(this, Formatting.Indented));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -180,19 +246,17 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
/// </summary>
|
||||
public SettingsLayer UserLayer { get; } = new SettingsLayer();
|
||||
|
||||
public IEnumerable<string> AllMaterialKeys()
|
||||
{
|
||||
return MaterialLayers.Keys.Union(this.OemProfile.MaterialLayers.Keys);
|
||||
}
|
||||
|
||||
public IEnumerable<string> AllQualityKeys()
|
||||
{
|
||||
return QualityLayers.Keys.Union(this.OemProfile.QualityLayers.Keys);
|
||||
}
|
||||
|
||||
internal static LayeredProfile LoadFile(string printerProfilePath)
|
||||
{
|
||||
var layeredProfile = JsonConvert.DeserializeObject<LayeredProfile>(File.ReadAllText(printerProfilePath));
|
||||
if (layeredProfile.DocumentVersion < LayeredProfile.LatestVersion)
|
||||
{
|
||||
printerProfilePath = ProfileMigrations.MigrateDocument(printerProfilePath, layeredProfile.DocumentVersion);
|
||||
|
||||
// Reload the document with the new schema
|
||||
layeredProfile = JsonConvert.DeserializeObject<LayeredProfile>(File.ReadAllText(printerProfilePath));
|
||||
}
|
||||
|
||||
layeredProfile.DocumentPath = printerProfilePath;
|
||||
|
||||
return layeredProfile;
|
||||
|
|
@ -210,18 +274,22 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
/// </summary>
|
||||
public Dictionary<string, SettingsLayer> QualityLayers { get; } = new Dictionary<string, SettingsLayer>();
|
||||
|
||||
|
||||
///<summary>
|
||||
///Returns the settings value at the 'top' of the stack
|
||||
///</summary>
|
||||
public string GetValue(string sliceSetting)
|
||||
{
|
||||
return GetValue(sliceSetting, settingsLayers);
|
||||
return GetValue(sliceSetting, defaultLayerCascade);
|
||||
}
|
||||
|
||||
public string GetValue(string sliceSetting, IEnumerable<SettingsLayer> layers)
|
||||
public string GetValue(string sliceSetting, IEnumerable<SettingsLayer> layerCascade)
|
||||
{
|
||||
foreach (SettingsLayer layer in layers)
|
||||
if (layerCascade == null)
|
||||
{
|
||||
layerCascade = defaultLayerCascade;
|
||||
}
|
||||
|
||||
foreach (SettingsLayer layer in layerCascade)
|
||||
{
|
||||
string value;
|
||||
if (layer.TryGetValue(sliceSetting, out value))
|
||||
|
|
@ -235,7 +303,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
|
||||
public SettingsLayer BaseLayer { get; set; }
|
||||
|
||||
private IEnumerable<SettingsLayer> settingsLayers
|
||||
private IEnumerable<SettingsLayer> defaultLayerCascade
|
||||
{
|
||||
get
|
||||
{
|
||||
|
|
|
|||
|
|
@ -64,13 +64,25 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
layeredProfile = profile;
|
||||
}
|
||||
|
||||
public string ID => layeredProfile.ID;
|
||||
|
||||
public SettingsLayer BaseLayer => layeredProfile.BaseLayer;
|
||||
|
||||
public SettingsLayer OemLayer => layeredProfile.OemProfile.OemLayer;
|
||||
|
||||
public SettingsLayer UserLayer => layeredProfile.UserLayer;
|
||||
|
||||
public string ActiveMaterialKey => layeredProfile.ActiveMaterialKey;
|
||||
public string ActiveMaterialKey
|
||||
{
|
||||
get
|
||||
{
|
||||
return layeredProfile.ActiveMaterialKey;
|
||||
}
|
||||
set
|
||||
{
|
||||
layeredProfile.ActiveMaterialKey = value;
|
||||
}
|
||||
}
|
||||
|
||||
public string ActiveQualityKey
|
||||
{
|
||||
|
|
@ -92,15 +104,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
// Commit
|
||||
}
|
||||
|
||||
public IEnumerable<string> AllMaterialKeys()
|
||||
{
|
||||
return layeredProfile.AllMaterialKeys();
|
||||
}
|
||||
public Dictionary<string, SettingsLayer> MaterialLayers => layeredProfile.MaterialLayers;
|
||||
|
||||
public IEnumerable<string> AllQualityKeys()
|
||||
{
|
||||
return layeredProfile.AllQualityKeys();
|
||||
}
|
||||
public Dictionary<string, SettingsLayer> QualityLayers => layeredProfile.QualityLayers;
|
||||
|
||||
public class SettingsConverter
|
||||
{
|
||||
|
|
@ -176,23 +182,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
return layeredProfile.GetMaterialLayer(key);
|
||||
}
|
||||
|
||||
internal SettingsLayer CreatePresetsLayer(NamedSettingsLayers layerType)
|
||||
{
|
||||
SettingsLayer newLayer = new SettingsLayer();
|
||||
if (layerType == NamedSettingsLayers.Quality)
|
||||
{
|
||||
newLayer.Name = "Quality" + layeredProfile.QualityLayers.Count;
|
||||
layeredProfile.QualityLayers[newLayer.Name] = newLayer;
|
||||
}
|
||||
else
|
||||
{
|
||||
newLayer.Name = "Material" + layeredProfile.MaterialLayers.Count;
|
||||
layeredProfile.MaterialLayers[newLayer.Name] = newLayer;
|
||||
}
|
||||
|
||||
return newLayer;
|
||||
}
|
||||
|
||||
internal SettingsLayer QualityLayer(string key)
|
||||
{
|
||||
return layeredProfile.GetQualityLayer(key);
|
||||
|
|
@ -563,9 +552,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
return layeredProfile.GetValue(sliceSetting);
|
||||
}
|
||||
|
||||
public string GetActiveValue(string sliceSetting, IEnumerable<SettingsLayer> layers)
|
||||
public string GetActiveValue(string sliceSetting, IEnumerable<SettingsLayer> layerCascade)
|
||||
{
|
||||
return layeredProfile.GetValue(sliceSetting, layers);
|
||||
return layeredProfile.GetValue(sliceSetting, layerCascade);
|
||||
}
|
||||
|
||||
public void SetActiveValue(string sliceSetting, string sliceValue)
|
||||
|
|
@ -924,16 +913,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
layeredProfile.SetActiveValue("MatterControl.PrinterName", name);
|
||||
}
|
||||
|
||||
public string Id()
|
||||
{
|
||||
return layeredProfile.GetValue("MatterControl.PrinterID");
|
||||
}
|
||||
|
||||
public void SetId(string id)
|
||||
{
|
||||
layeredProfile.SetActiveValue("MatterControl.PrinterID", id);
|
||||
}
|
||||
|
||||
public string Model => layeredProfile.GetValue("MatterControl.Model");
|
||||
|
||||
HashSet<string> knownSettings = null;
|
||||
|
|
@ -1047,9 +1026,61 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
}
|
||||
}
|
||||
|
||||
public string Name { get; set; }
|
||||
public string Source { get; set; }
|
||||
public string ETag { get; set; }
|
||||
public string ID
|
||||
{
|
||||
get
|
||||
{
|
||||
// TODO: Short term hack to silently upgrade existing profiles with missing ID
|
||||
string layerKey = ValueOrDefault("MatterControl.LayerID");
|
||||
if (string.IsNullOrEmpty(layerKey))
|
||||
{
|
||||
layerKey = Guid.NewGuid().ToString();
|
||||
ID = layerKey;
|
||||
}
|
||||
|
||||
return layerKey;
|
||||
}
|
||||
set
|
||||
{
|
||||
this["MatterControl.LayerID"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get
|
||||
{
|
||||
return ValueOrDefault("MatterControl.LayerName");
|
||||
}
|
||||
set
|
||||
{
|
||||
this["MatterControl.LayerName"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public string Source
|
||||
{
|
||||
get
|
||||
{
|
||||
return ValueOrDefault("MatterControl.LayerSource");
|
||||
}
|
||||
set
|
||||
{
|
||||
this["MatterControl.LayerSource"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public string ETag
|
||||
{
|
||||
get
|
||||
{
|
||||
return ValueOrDefault("MatterControl.LayerETag");
|
||||
}
|
||||
set
|
||||
{
|
||||
this["MatterControl.LayerETag"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public string ValueOrDefault(string key, string defaultValue = "")
|
||||
{
|
||||
|
|
@ -1104,6 +1135,18 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
|
||||
return layer;
|
||||
}
|
||||
|
||||
public SettingsLayer Clone()
|
||||
{
|
||||
string id = Guid.NewGuid().ToString();
|
||||
return new SettingsLayer(this as Dictionary<string, string>)
|
||||
{
|
||||
ID = id,
|
||||
Name = this.Name,
|
||||
ETag = this.ETag,
|
||||
Source = this.Source
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public class ProfileData
|
||||
|
|
|
|||
|
|
@ -108,7 +108,13 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
return;
|
||||
}
|
||||
|
||||
ApplicationController.Instance.EditMaterialPresetsWindow = new SlicePresetsWindow(ActiveSliceSettings.Instance.MaterialLayer(presetsKey), NamedSettingsLayers.Material, presetsKey);
|
||||
var presetsContext = new PresetsContext(ActiveSliceSettings.Instance.MaterialLayers, presetsKey)
|
||||
{
|
||||
LayerType = NamedSettingsLayers.Material,
|
||||
SetAsActive = (materialKey) => ActiveSliceSettings.Instance.ActiveMaterialKey = materialKey
|
||||
};
|
||||
|
||||
ApplicationController.Instance.EditMaterialPresetsWindow = new SlicePresetsWindow(presetsContext);
|
||||
ApplicationController.Instance.EditMaterialPresetsWindow.Closed += (s, e2) =>
|
||||
{
|
||||
ApplicationController.Instance.EditMaterialPresetsWindow = null;
|
||||
|
|
@ -132,7 +138,13 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
return;
|
||||
}
|
||||
|
||||
ApplicationController.Instance.EditQualityPresetsWindow = new SlicePresetsWindow(ActiveSliceSettings.Instance.QualityLayer(presetsKey), NamedSettingsLayers.Quality, presetsKey);
|
||||
var presetsContext = new PresetsContext(ActiveSliceSettings.Instance.QualityLayers, presetsKey)
|
||||
{
|
||||
LayerType = NamedSettingsLayers.Quality,
|
||||
SetAsActive = (qualityKey) => ActiveSliceSettings.Instance.ActiveQualityKey = qualityKey
|
||||
};
|
||||
|
||||
ApplicationController.Instance.EditQualityPresetsWindow = new SlicePresetsWindow(presetsContext);
|
||||
ApplicationController.Instance.EditQualityPresetsWindow.Closed += (s, e2) =>
|
||||
{
|
||||
ApplicationController.Instance.EditQualityPresetsWindow = null;
|
||||
|
|
@ -193,23 +205,33 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
MenuItem defaultMenuItem = dropDownList.AddItem("- default -", "");
|
||||
defaultMenuItem.Selected += MenuItem_Selected;
|
||||
|
||||
var listSource = (layerType == NamedSettingsLayers.Material) ? ActiveSliceSettings.Instance.AllMaterialKeys() : ActiveSliceSettings.Instance.AllQualityKeys();
|
||||
foreach (var presetName in listSource)
|
||||
var listSource = (layerType == NamedSettingsLayers.Material) ? ActiveSliceSettings.Instance.MaterialLayers : ActiveSliceSettings.Instance.QualityLayers;
|
||||
foreach (var layer in listSource)
|
||||
{
|
||||
MenuItem menuItem = dropDownList.AddItem(presetName, presetName);
|
||||
if (string.IsNullOrEmpty(layer.Value.Name))
|
||||
{
|
||||
layer.Value.Name = layer.Key;
|
||||
}
|
||||
|
||||
MenuItem menuItem = dropDownList.AddItem(layer.Value.Name, layer.Value.ID);
|
||||
menuItem.Selected += MenuItem_Selected;
|
||||
}
|
||||
|
||||
MenuItem addNewPreset = dropDownList.AddItem(StaticData.Instance.LoadIcon("icon_plus.png", 32, 32), "Add New Setting...", "new");
|
||||
addNewPreset.Selected += (s, e) =>
|
||||
{
|
||||
var newLayer = ActiveSliceSettings.Instance.CreatePresetsLayer(layerType);
|
||||
var newLayer = new SettingsLayer();
|
||||
if (layerType == NamedSettingsLayers.Quality)
|
||||
{
|
||||
ActiveSliceSettings.Instance.ActiveQualityKey = newLayer.Name;
|
||||
newLayer.Name = "Quality" + ActiveSliceSettings.Instance.QualityLayers.Count;
|
||||
ActiveSliceSettings.Instance.QualityLayers[newLayer.Name] = newLayer;
|
||||
ActiveSliceSettings.Instance.ActiveQualityKey = newLayer.ID;
|
||||
}
|
||||
else if (layerType == NamedSettingsLayers.Material)
|
||||
else
|
||||
{
|
||||
newLayer.Name = "Material" + ActiveSliceSettings.Instance.MaterialLayers.Count;
|
||||
ActiveSliceSettings.Instance.MaterialLayers[newLayer.Name] = newLayer;
|
||||
ActiveSliceSettings.Instance.ActiveMaterialKey = newLayer.ID;
|
||||
ActiveSliceSettings.Instance.SetMaterialPreset(this.extruderIndex, newLayer.Name);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,39 +36,55 @@ using MatterHackers.MatterControl.DataStorage.ClassicDB;
|
|||
using MatterHackers.VectorMath;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace MatterHackers.MatterControl.SlicerConfiguration
|
||||
{
|
||||
public class PresetsContext
|
||||
{
|
||||
public Dictionary<string, SettingsLayer> PresetsDictionary { get; }
|
||||
public SettingsLayer PersistenceLayer { get; }
|
||||
public Action<string> SetAsActive { get; set; }
|
||||
public NamedSettingsLayers LayerType { get; set; }
|
||||
|
||||
private string presetsKey;
|
||||
|
||||
public PresetsContext(Dictionary<string, SettingsLayer> parentDictionary, string presetsKey)
|
||||
{
|
||||
this.presetsKey = presetsKey;
|
||||
this.PersistenceLayer = parentDictionary[presetsKey];
|
||||
this.PresetsDictionary = parentDictionary;
|
||||
}
|
||||
}
|
||||
|
||||
public class SlicePresetsWindow : SystemWindow
|
||||
{
|
||||
private string presetsKey;
|
||||
private SettingsLayer persistenceLayer;
|
||||
private NamedSettingsLayers layerType;
|
||||
|
||||
private TextImageButtonFactory buttonFactory;
|
||||
private LinkButtonFactory linkButtonFactory;
|
||||
private PresetsContext presetsContext;
|
||||
private MHTextEditWidget presetNameInput;
|
||||
|
||||
private string initialPresetName = null;
|
||||
private string configFileExtension = "slice";
|
||||
|
||||
public SlicePresetsWindow(SettingsLayer persistenceLayer, NamedSettingsLayers layerType, string presetsKey)
|
||||
private static Regex numberMatch = new Regex("\\s*\\(\\d+\\)", RegexOptions.Compiled);
|
||||
|
||||
|
||||
public SlicePresetsWindow(PresetsContext presetsContext)
|
||||
: base(641, 481)
|
||||
{
|
||||
this.presetsContext = presetsContext;
|
||||
this.AlwaysOnTopOfMain = true;
|
||||
this.Title = LocalizedString.Get("Slice Presets Editor");
|
||||
this.persistenceLayer = persistenceLayer;
|
||||
this.layerType = layerType;
|
||||
this.presetsKey = presetsKey;
|
||||
this.MinimumSize = new Vector2(640, 480);
|
||||
this.AnchorAll();
|
||||
|
||||
linkButtonFactory = new LinkButtonFactory()
|
||||
var linkButtonFactory = new LinkButtonFactory()
|
||||
{
|
||||
fontSize = 8,
|
||||
textColor = ActiveTheme.Instance.SecondaryAccentColor
|
||||
};
|
||||
|
||||
buttonFactory = new TextImageButtonFactory()
|
||||
var buttonFactory = new TextImageButtonFactory()
|
||||
{
|
||||
normalTextColor = ActiveTheme.Instance.PrimaryTextColor,
|
||||
hoverTextColor = ActiveTheme.Instance.PrimaryTextColor,
|
||||
|
|
@ -85,39 +101,37 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
|
||||
mainContainer.AddChild(GetTopRow());
|
||||
mainContainer.AddChild(GetMiddleRow());
|
||||
mainContainer.AddChild(GetBottomRow());
|
||||
mainContainer.AddChild(GetBottomRow(buttonFactory));
|
||||
|
||||
this.AddChild(mainContainer);
|
||||
|
||||
BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
|
||||
|
||||
}
|
||||
|
||||
private FlowLayoutWidget GetTopRow()
|
||||
{
|
||||
FlowLayoutWidget metaContainer = new FlowLayoutWidget(FlowDirection.TopToBottom)
|
||||
var metaContainer = new FlowLayoutWidget(FlowDirection.TopToBottom)
|
||||
{
|
||||
HAnchor = HAnchor.ParentLeftRight,
|
||||
Padding = new BorderDouble(0, 3)
|
||||
};
|
||||
|
||||
FlowLayoutWidget firstRow = new FlowLayoutWidget(hAnchor: HAnchor.ParentLeftRight);
|
||||
|
||||
TextWidget labelText = new TextWidget("Preset Name:".Localize(), pointSize: 14)
|
||||
var labelText = new TextWidget("Preset Name:".Localize(), pointSize: 14)
|
||||
{
|
||||
TextColor = ActiveTheme.Instance.PrimaryTextColor,
|
||||
VAnchor = VAnchor.ParentCenter,
|
||||
Margin = new BorderDouble(right: 4)
|
||||
};
|
||||
|
||||
presetNameInput = new MHTextEditWidget(this.presetsKey);
|
||||
initialPresetName = presetsContext.PersistenceLayer.Name;
|
||||
presetNameInput = new MHTextEditWidget(initialPresetName);
|
||||
presetNameInput.HAnchor = HAnchor.ParentLeftRight;
|
||||
|
||||
var firstRow = new FlowLayoutWidget(hAnchor: HAnchor.ParentLeftRight);
|
||||
firstRow.AddChild(labelText);
|
||||
firstRow.AddChild(presetNameInput);
|
||||
|
||||
FlowLayoutWidget secondRow = new FlowLayoutWidget(hAnchor: HAnchor.ParentLeftRight);
|
||||
|
||||
var secondRow = new FlowLayoutWidget(hAnchor: HAnchor.ParentLeftRight);
|
||||
secondRow.AddChild(new GuiWidget(labelText.Width + 4, 1));
|
||||
|
||||
metaContainer.AddChild(firstRow);
|
||||
|
|
@ -129,36 +143,58 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
private GuiWidget GetMiddleRow()
|
||||
{
|
||||
var settings = ActiveSliceSettings.Instance;
|
||||
var layerCascade = new List<SettingsLayer> { settings.BaseLayer, settings.OemLayer, persistenceLayer };
|
||||
var layerCascade = new List<SettingsLayer> { presetsContext.PersistenceLayer, settings.OemLayer, settings.BaseLayer};
|
||||
|
||||
var settingsWidget = new SliceSettingsWidget(layerCascade, layerType);
|
||||
var settingsWidget = new SliceSettingsWidget(layerCascade, presetsContext.LayerType);
|
||||
settingsWidget.settingsControlBar.Visible = false;
|
||||
|
||||
return settingsWidget;
|
||||
}
|
||||
|
||||
private FlowLayoutWidget GetBottomRow()
|
||||
private string GetNonCollidingName(string profileName, IEnumerable<string> existingNames)
|
||||
{
|
||||
FlowLayoutWidget container = new FlowLayoutWidget()
|
||||
if (!existingNames.Contains(profileName))
|
||||
{
|
||||
return profileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
int currentIndex = 1;
|
||||
string possiblePrinterName;
|
||||
|
||||
do
|
||||
{
|
||||
possiblePrinterName = String.Format("{0} ({1})", profileName, currentIndex++);
|
||||
} while (existingNames.Contains(possiblePrinterName));
|
||||
|
||||
return possiblePrinterName;
|
||||
}
|
||||
}
|
||||
|
||||
private FlowLayoutWidget GetBottomRow(TextImageButtonFactory buttonFactory)
|
||||
{
|
||||
var container = new FlowLayoutWidget()
|
||||
{
|
||||
HAnchor = HAnchor.ParentLeftRight,
|
||||
Margin = new BorderDouble(top: 3)
|
||||
};
|
||||
|
||||
Button saveButton = buttonFactory.Generate("Save".Localize());
|
||||
saveButton.Click += (s, e) =>
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
};
|
||||
|
||||
Button duplicateButton = buttonFactory.Generate("Duplicate".Localize());
|
||||
duplicateButton.Click += (s, e) =>
|
||||
{
|
||||
UiThread.RunOnIdle(() =>
|
||||
{
|
||||
// duplicatePresets_Click
|
||||
// TODO: copy existing dictionary to new named instance
|
||||
throw new NotImplementedException();
|
||||
string sanitizedName = numberMatch.Replace(presetNameInput.Text, "").Trim();
|
||||
string newProfileName = GetNonCollidingName(sanitizedName, presetsContext.PresetsDictionary.Values.Select(preset => preset.Name));
|
||||
|
||||
this.Close();
|
||||
|
||||
var clonedLayer = presetsContext.PersistenceLayer.Clone();
|
||||
clonedLayer.Name = newProfileName;
|
||||
presetsContext.PresetsDictionary[clonedLayer.ID] = clonedLayer;
|
||||
|
||||
presetsContext.SetAsActive(clonedLayer.ID);
|
||||
});
|
||||
};
|
||||
|
||||
|
|
@ -174,15 +210,25 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
Button closeButton = buttonFactory.Generate("Close".Localize());
|
||||
closeButton.Click += (sender, e) =>
|
||||
{
|
||||
UiThread.RunOnIdle(this.Close);
|
||||
UiThread.RunOnIdle(() =>
|
||||
{
|
||||
if (initialPresetName != presetNameInput.Text)
|
||||
{
|
||||
presetsContext.PersistenceLayer.Name = presetNameInput.Text;
|
||||
|
||||
// TODO: If we get to the point where we refresh rather than reload, we need
|
||||
// to rebuild the target droplist to display the new name
|
||||
ApplicationController.Instance.ReloadAdvancedControlsPanel();
|
||||
}
|
||||
this.Close();
|
||||
});
|
||||
};
|
||||
|
||||
container.AddChild(saveButton);
|
||||
container.AddChild(duplicateButton);
|
||||
|
||||
//Only show duplicate/import/export buttons if setting has been saved.
|
||||
if (false)
|
||||
{
|
||||
container.AddChild(duplicateButton);
|
||||
container.AddChild(importButton);
|
||||
container.AddChild(exportButton);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -91,18 +91,18 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
|
||||
private TextImageButtonFactory textImageButtonFactory;
|
||||
|
||||
private List<SettingsLayer> layerFilters = null;
|
||||
private List<SettingsLayer> layerCascade = null;
|
||||
private SettingsLayer persistenceLayer = null;
|
||||
|
||||
private NamedSettingsLayers viewFilter;
|
||||
|
||||
public SliceSettingsWidget(List<SettingsLayer> layerFilters = null, NamedSettingsLayers viewFilter = NamedSettingsLayers.All)
|
||||
public SliceSettingsWidget(List<SettingsLayer> layerCascade = null, NamedSettingsLayers viewFilter = NamedSettingsLayers.All)
|
||||
{
|
||||
this.layerFilters = layerFilters;
|
||||
this.layerCascade = layerCascade;
|
||||
this.viewFilter = viewFilter;
|
||||
|
||||
// The last layer of the layerFilters is the target persistence layer
|
||||
persistenceLayer = layerFilters?.Last() ?? ActiveSliceSettings.Instance.UserLayer;
|
||||
persistenceLayer = layerCascade?.First() ?? ActiveSliceSettings.Instance.UserLayer;
|
||||
|
||||
textImageButtonFactory = new TextImageButtonFactory();
|
||||
textImageButtonFactory.normalFillColor = RGBA_Bytes.Transparent;
|
||||
|
|
@ -464,7 +464,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
return leftSideGroupTabs;
|
||||
}
|
||||
|
||||
private static bool CheckIfShouldBeShown(OrganizerSettingsData settingInfo)
|
||||
private bool CheckIfShouldBeShown(OrganizerSettingsData settingInfo)
|
||||
{
|
||||
bool settingShouldBeShown = true;
|
||||
if (settingInfo.ShowIfSet != null
|
||||
|
|
@ -477,7 +477,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
showValue = "1";
|
||||
checkName = checkName.Substring(1);
|
||||
}
|
||||
string sliceSettingValue = ActiveSliceSettings.Instance.ActiveValue(checkName);
|
||||
string sliceSettingValue = GetActiveValue(checkName, layerCascade);
|
||||
if (sliceSettingValue == showValue)
|
||||
{
|
||||
settingShouldBeShown = false;
|
||||
|
|
@ -601,9 +601,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
HAnchor = Agg.UI.HAnchor.ParentLeftRight;
|
||||
}
|
||||
|
||||
public void RefreshValue()
|
||||
public void RefreshValue(IEnumerable<SettingsLayer> layerFilters)
|
||||
{
|
||||
string latestValue = ActiveSliceSettings.Instance.ActiveValue(this.SettingsKey);
|
||||
string latestValue = GetActiveValue(this.SettingsKey, layerFilters);
|
||||
//if(latestValue != SettingsValue)
|
||||
{
|
||||
ValueChanged?.Invoke(latestValue);
|
||||
|
|
@ -619,12 +619,17 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
private static readonly RGBA_Bytes userSettingBackgroundColor = new RGBA_Bytes(68, 95, 220, 108);
|
||||
private static readonly RGBA_Bytes qualitySettingBackgroundColor = new RGBA_Bytes(255, 255, 0, 108);
|
||||
|
||||
private static string GetActiveValue(string slicerConfigName, IEnumerable<SettingsLayer> layerCascade)
|
||||
{
|
||||
return ActiveSliceSettings.Instance.GetActiveValue(slicerConfigName, layerCascade);
|
||||
}
|
||||
|
||||
private GuiWidget CreateSettingInfoUIControls(OrganizerSettingsData settingData, double rightContentWidth, int extruderIndex)
|
||||
{
|
||||
GuiWidget container = new GuiWidget();
|
||||
this.HAnchor = HAnchor.ParentLeftRight;
|
||||
|
||||
string sliceSettingValue = ActiveSliceSettings.Instance.ActiveValue(settingData.SlicerConfigName);
|
||||
string sliceSettingValue = GetActiveValue(settingData.SlicerConfigName, layerCascade);
|
||||
|
||||
GuiWidget nameArea = new GuiWidget(HAnchor.ParentLeftRight, VAnchor.FitToChildren | VAnchor.ParentCenter);
|
||||
var dataArea = new FlowLayoutWidget();
|
||||
|
|
@ -765,10 +770,10 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
if (ChangesMultipleOtherSettings)
|
||||
{
|
||||
bool allTheSame = true;
|
||||
string setting = ActiveSliceSettings.Instance.ActiveValue(settingData.SetSettingsOnChange[0]);
|
||||
string setting = GetActiveValue(settingData.SetSettingsOnChange[0], layerCascade);
|
||||
for (int i = 1; i < settingData.SetSettingsOnChange.Count; i++)
|
||||
{
|
||||
string nextSetting = ActiveSliceSettings.Instance.ActiveValue(settingData.SetSettingsOnChange[i]);
|
||||
string nextSetting = GetActiveValue(settingData.SetSettingsOnChange[i], layerCascade);
|
||||
if (setting != nextSetting)
|
||||
{
|
||||
allTheSame = false;
|
||||
|
|
@ -1373,7 +1378,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
ActiveSliceSettings.Instance.ClearValue(settingData.SlicerConfigName, persistenceLayer);
|
||||
}
|
||||
|
||||
settingsRow.RefreshValue();
|
||||
settingsRow.RefreshValue(layerCascade);
|
||||
};
|
||||
|
||||
restoreArea.AddChild(restoreButton);
|
||||
|
|
@ -1400,7 +1405,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
|
||||
restoreButton.Visible = true;
|
||||
}
|
||||
else if (layerFilters == null)
|
||||
else if (layerCascade == null)
|
||||
{
|
||||
if (ActiveSliceSettings.Instance.SettingExistsInLayer(settingData.SlicerConfigName, NamedSettingsLayers.Material))
|
||||
{
|
||||
|
|
@ -1496,7 +1501,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
|
||||
private GuiWidget CreateQuickMenu(OrganizerSettingsData settingData, GuiWidget content, InternalTextEditWidget internalTextWidget)
|
||||
{
|
||||
string sliceSettingValue = ActiveSliceSettings.Instance.ActiveValue(settingData.SlicerConfigName);
|
||||
string sliceSettingValue = GetActiveValue(settingData.SlicerConfigName, layerCascade);
|
||||
FlowLayoutWidget totalContent = new FlowLayoutWidget();
|
||||
|
||||
StyledDropDownList selectableOptions = new StyledDropDownList("Custom", maxHeight: 200);
|
||||
|
|
@ -1534,7 +1539,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
foreach (QuickMenuNameValue nameValue in settingData.QuickMenuSettings)
|
||||
{
|
||||
string localName = nameValue.MenuName;
|
||||
string newSliceSettingValue = ActiveSliceSettings.Instance.ActiveValue(settingData.SlicerConfigName);
|
||||
string newSliceSettingValue = GetActiveValue(settingData.SlicerConfigName, layerCascade);
|
||||
if (newSliceSettingValue == nameValue.Value)
|
||||
{
|
||||
selectableOptions.SelectedLabel = localName;
|
||||
|
|
@ -1554,7 +1559,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
|
|||
|
||||
private void SaveCommaSeparatedIndexSetting(int extruderIndexLocal, string slicerConfigName, string newSingleValue)
|
||||
{
|
||||
string[] settings = ActiveSliceSettings.Instance.ActiveValue(slicerConfigName).Split(',');
|
||||
string[] settings = GetActiveValue(slicerConfigName, layerCascade).Split(',');
|
||||
if (settings.Length > extruderIndexLocal)
|
||||
{
|
||||
settings[extruderIndexLocal] = newSingleValue;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue