/// <summary> /// Stretch positions table to fill targetWidth. /// </summary> /// <param name="targetWidth"></param> /// <param name="positions">Measure segment items indexes positions</param> /// <param name="positionIndex">All unique indexes inside current measure</param> public static void StretchPositionsToWidth(double targetWidth, Dictionary <int, Tuple <double, double> > positions, List <int> positionIndex) { LayoutStyle.MeasureLayoutStyle attributesLayout = ViewModel.ViewModelLocator.Instance.Main.CurrentLayout.LayoutStyle.MeasureStyle; double currentFullWidth = positions.Sum(x => x.Value.Item2); double difference = (targetWidth - attributesLayout.AttributesRightOffset.TenthsToWPFUnit()) - currentFullWidth; for (int i = 0; i < positionIndex.Count; i++) { Tuple <double, double> currentPositionPair = positions[positionIndex[i]]; double currentPosition = currentPositionPair.Item1; double correctedSpacing = (currentPositionPair.Item2 / currentFullWidth) * difference; if (i == 0) { Tuple <double, double> t = Tuple.Create(currentPosition, correctedSpacing + currentPositionPair.Item2); positions[positionIndex[i]] = t; } else { currentPosition = positions[positionIndex[i - 1]].Item1 + positions[positionIndex[i - 1]].Item2; Tuple <double, double> t = Tuple.Create(currentPosition, correctedSpacing + currentPositionPair.Item2); positions[positionIndex[i]] = t; } } }
/// <summary> /// Gets max width of all beginning attributes from measure segment of all parts /// </summary> /// <param name="measureSegments">List of measures with the same Number from all parts</param> /// <returns>Max width of each attribute(clef,key,time) of all parts</returns> public static Tuple <double, double, double> GetAttributesWidth(List <MeasureSegmentController> measureSegments) { List <Tuple <double, double, double> > attributesWidths = new List <Tuple <double, double, double> >(); LayoutStyle.MeasureLayoutStyle attributesLayout = ViewModel.ViewModelLocator.Instance.Main.CurrentLayout.LayoutStyle.MeasureStyle; foreach (var measureSegment in measureSegments) { attributesWidths.Add(measureSegment.GetAttributesWidths()); } double maxClef = 0.0; double maxKey = 0.0; double maxTime = 0.0; if (attributesWidths.Count != 0) { maxClef = attributesWidths.Select(x => x.Item1).Max(); maxKey = attributesWidths.Select(x => x.Item2).Max(); maxTime = attributesWidths.Select(x => x.Item3).Max(); } if (!maxClef.Equals4DigitPrecision(0.0)) { maxClef += attributesLayout.ClefLeftOffset.TenthsToWPFUnit() + attributesLayout.ClefRightOffset.TenthsToWPFUnit(); } if (!maxKey.Equals4DigitPrecision(0.0)) { maxKey += attributesLayout.KeySigLeftOffset.TenthsToWPFUnit() + attributesLayout.KeySigRightOffset.TenthsToWPFUnit(); } if (!maxTime.Equals4DigitPrecision(0.0)) { maxTime += attributesLayout.TimeSigLeftOffset.TenthsToWPFUnit() + attributesLayout.TimeSigRightOffset.TenthsToWPFUnit(); } return(Tuple.Create(maxClef, maxKey, maxTime)); }
public double ArrangeAttributes(IAttributeItemVisual attributeVisual, Dictionary <string, double> staffPositions, double currentPosition = 0.0) { double width = currentPosition; LayoutStyle.MeasureLayoutStyle attributesLayout = ViewModel.ViewModelLocator.Instance.Main.CurrentLayout.LayoutStyle.MeasureStyle; switch (attributeVisual.AttributeType) { case AttributeType.clef: ClefContainerItem clef = attributeVisual as ClefContainerItem; width += clef.ItemLeftMargin; SetLeft(clef.ItemCanvas, width); width += clef.ItemWidth + clef.ItemRightMargin; break; case AttributeType.key: KeyContainerItem key = attributeVisual as KeyContainerItem; width += key.ItemLeftMargin; SetLeft(key.ItemCanvas, width); width += key.ItemWidth + (key.ItemWidth != 0 ? key.ItemRightMargin: 0); break; case AttributeType.time: TimeSignatureContainerItem timeSig = attributeVisual as TimeSignatureContainerItem; width += timeSig.ItemLeftMargin; SetLeft(timeSig.ItemCanvas, width); width += timeSig.ItemWidth + timeSig.ItemRightMargin; break; default: throw new ArgumentException("invalid argument value ", attributeVisual.AttributeType.ToString()); } return(width); }