public void RebuildLayout() { if (LayoutChanges.Count == 1 && LayoutChanges[0] is PropertyChange pc && pc.Property == nameof(LeftHanded)) { if (VisualElements.Count > 0) { VisualElements.ForEach(e => e.FlipHandedness()); isLayoutDirty = false; LayoutChanges.Clear(); OnLayoutUpdated(); return; } } VisualElements.Clear(); for (int i = 0; i < NumberOfStrings; i++) { Strings[i].ClearLayoutData(); } _CachedBounds = RectangleM.Empty; if (StringSpacing is StringSpacingSimple) { (StringSpacing as StringSpacingSimple).CalculateAdjustedPositions(); } Measure nutCenter = Measure.Zero; Measure bridgeCenter = Measure.Zero; Measure[] nutStringPos = StringSpacing.GetStringPositions(FingerboardEnd.Nut, out nutCenter); Measure[] bridgeStringPos = StringSpacing.GetStringPositions(FingerboardEnd.Bridge, out bridgeCenter); LayoutStrings(nutStringPos, bridgeStringPos); CreateFingerboardEdges(); PlaceFrets(); FinishFingerboardShape(); var layoutBounds = GetLayoutBounds(); VisualElements.Add(new LayoutLine(new PointM(Measure.Zero, layoutBounds.Top), new PointM(Measure.Zero, layoutBounds.Bottom), VisualElementType.CenterLine)); if (LeftHanded) { VisualElements.ForEach(e => e.FlipHandedness()); } isLayoutDirty = false; LayoutChanges.Clear(); OnLayoutUpdated(); }
public void Save(Stream stream) { var root = new XElement("Layout"); //*** BASIC PARAMETERS *** if (!string.IsNullOrEmpty(LayoutName)) { root.Add(new XAttribute("Name", LayoutName)); } LayoutVersion = CURRENT_LAYOUT_VERSION; root.Add(new XAttribute("Version", LayoutVersion)); root.Add(new XComment("Temperaments: " + Enum.GetNames(typeof(Temperament)).Aggregate((i, j) => i + ", " + j))); root.Add(SerializeProperty("Temperament", FretsTemperament)); root.Add(SerializeProperty("LeftHanded", LeftHanded)); root.Add(SerializeProperty("FretCompensation", CompensateFretPositions)); root.Add(new XComment("LengthFunctions: " + Enum.GetNames(typeof(LengthFunction)).Aggregate((i, j) => i + ", " + j))); root.Add(CurrentScaleLength.Serialize("ScaleLength")); root.Add(Margins.Serialize("FingerboardMargins")); var stringsElem = new XElement("Strings", new XAttribute("Count", NumberOfStrings)); for (int i = 0; i < NumberOfStrings; i++) { //stringsElem.Add(SerializationHelper.GenericSerialize(Strings[i], "String")); stringsElem.Add(Strings[i].Serialize("String")); } root.Add(stringsElem); if (NumberOfStrings > 1) { root.Add(new XComment(string.Format("StringSpacingAlignment: {0}", Enum.GetNames(typeof(StringSpacingAlignment)).Aggregate((i, j) => i + ", " + j) ) )); root.Add(new XComment(string.Format("StringSpacingMethod: {0}", Enum.GetNames(typeof(StringSpacingMethod)).Aggregate((i, j) => i + ", " + j) ) )); root.Add(StringSpacing.Serialize("StringSpacings")); } var doc = new XDocument(root); doc.Save(stream); }