Browse Source

fix(Added skyline calculation to dynamic labels): labels affect height of skyline now. Start and end

Benjamin Giesinger 7 years ago
parent
commit
e76e3a2470

+ 35 - 0
src/MusicalScore/Graphical/VexFlow/VexFlowInstantaniousDynamicExpression.ts

@@ -6,6 +6,10 @@ import { Label } from "../../Label";
 import { TextAlignment } from "../../../Common/Enums/TextAlignment";
 import { EngravingRules } from "../EngravingRules";
 import { FontStyles } from "../../../Common/Enums/FontStyles";
+import { SkyBottomLineCalculator } from "../SkyBottomLineCalculator";
+import { StaffLine } from "../StaffLine";
+import { GraphicalMeasure } from "../GraphicalMeasure";
+import { MusicSystem } from "../MusicSystem";
 
 export class VexFlowInstantaniousDynamicExpression extends GraphicalInstantaniousDynamicExpression {
     private mInstantaniousDynamicExpression: InstantaniousDynamicExpression;
@@ -25,6 +29,37 @@ export class VexFlowInstantaniousDynamicExpression extends GraphicalInstantaniou
         this.mLabel.Label.fontStyle = FontStyles.BoldItalic;
     }
 
+    public calculcateBottomLine(measure: GraphicalMeasure): void {
+        const skyBottomLineCalculator: SkyBottomLineCalculator = measure.ParentStaffLine.SkyBottomLineCalculator;
+        const staffLine: StaffLine = measure.ParentStaffLine;
+        const musicSystem: MusicSystem = measure.parentMusicSystem;
+
+        // calculate LabelBoundingBox and set PSI parent
+        this.mLabel.setLabelPositionAndShapeBorders();
+        this.mLabel.PositionAndShape.Parent = musicSystem.PositionAndShape;
+
+        // calculate relative Position
+        const relativeX: number = staffLine.PositionAndShape.RelativePosition.x +
+        measure.PositionAndShape.RelativePosition.x - this.mLabel.PositionAndShape.BorderMarginLeft;
+        let relativeY: number;
+
+        // and the corresponding SkyLine indeces
+        let start: number = relativeX;
+        let end: number = relativeX - this.mLabel.PositionAndShape.BorderLeft + this.mLabel.PositionAndShape.BorderMarginRight;
+
+          // take into account the InstrumentNameLabel's at the beginning of the first MusicSystem
+        if (staffLine === musicSystem.StaffLines[0] && musicSystem === musicSystem.Parent.MusicSystems[0]) {
+              start -= staffLine.PositionAndShape.RelativePosition.x;
+              end -= staffLine.PositionAndShape.RelativePosition.x;
+          }
+
+          // get the minimum corresponding SkyLine value
+        const bottomLineMaxValue: number = skyBottomLineCalculator.getBottomLineMaxInRange(start, end);
+        relativeY = bottomLineMaxValue;
+        console.log(start, end, relativeY, this.mLabel.PositionAndShape.BorderMarginBottom)
+        skyBottomLineCalculator.updateBottomLineInRange(start, end, relativeY + this.mLabel.PositionAndShape.BorderMarginBottom);
+    }
+
     get Expression(): string {
         return DynamicEnum[this.mInstantaniousDynamicExpression.DynEnum];
     }

+ 2 - 0
src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator.ts

@@ -250,11 +250,13 @@ export class VexFlowMusicSheetCalculator extends MusicSheetCalculator {
   }
 
   protected calculateDynamicExpressionsForSingleMultiExpression(multiExpression: MultiExpression, measureIndex: number, staffIndex: number): void {
+
     if (multiExpression.InstantaniousDynamic) {
         const timeStamp: Fraction = multiExpression.Timestamp;
         const measure: GraphicalMeasure = this.graphicalMusicSheet.MeasureList[measureIndex][staffIndex];
         const startStaffEntry: GraphicalStaffEntry = measure.findGraphicalStaffEntryFromTimestamp(timeStamp);
         const idx: VexFlowInstantaniousDynamicExpression = new VexFlowInstantaniousDynamicExpression(multiExpression.InstantaniousDynamic, startStaffEntry);
+        idx.calculcateBottomLine(measure);
         (measure as VexFlowMeasure).instantaniousDynamics.push(idx);
     }
   }