Selaa lähdekoodia

fix(Layout): more lenient Measure Number Label collision checks, place them slightly to left (#782)

fix #782
sschmid 5 vuotta sitten
vanhempi
commit
616de1738b

+ 8 - 0
src/MusicalScore/Graphical/EngravingRules.ts

@@ -97,6 +97,7 @@ export class EngravingRules {
     private chordSymbolYOffset: number;
     private measureNumberLabelHeight: number;
     private measureNumberLabelOffset: number;
+    private measureNumberLabelXOffset: number;
     /** Whether tuplets should display ratio (3:2 instead of 3 for triplet). Default false. */
     private tupletsRatioed: boolean;
     /** Whether all tuplets should be bracketed (e.g. |--5--| instead of 5). Default false.
@@ -349,6 +350,7 @@ export class EngravingRules {
         // Tuplets, MeasureNumber and TupletNumber Labels
         this.measureNumberLabelHeight = 1.5 * EngravingRules.unit;
         this.measureNumberLabelOffset = 2;
+        this.measureNumberLabelXOffset = -0.5;
         this.tupletsRatioed = false;
         this.tupletsBracketed = false;
         this.tripletsBracketed = false; // special setting for triplets, overrides tuplet setting (for triplets only)
@@ -984,6 +986,12 @@ export class EngravingRules {
     public set MeasureNumberLabelOffset(value: number) {
         this.measureNumberLabelOffset = value;
     }
+    public get MeasureNumberLabelXOffset(): number {
+        return this.measureNumberLabelXOffset;
+    }
+    public set MeasureNumberLabelXOffset(value: number) {
+        this.measureNumberLabelXOffset = value;
+    }
     public get TupletsRatioed(): boolean {
         return this.tupletsRatioed;
     }

+ 17 - 5
src/MusicalScore/Graphical/MusicSheetCalculator.ts

@@ -327,17 +327,23 @@ export abstract class MusicSheetCalculator {
     protected calculateMeasureNumberPlacement(musicSystem: MusicSystem): void {
         const staffLine: StaffLine = musicSystem.StaffLines[0];
         let currentMeasureNumber: number = staffLine.Measures[0].MeasureNumber;
+        let labelOffsetX: number = 0;
         for (const measure of staffLine.Measures) {
             if (measure.MeasureNumber === 0 || measure.MeasureNumber === 1) {
                 currentMeasureNumber = measure.MeasureNumber;
             }
+            if (measure !== staffLine.Measures[0] && this.rules.MeasureNumberLabelXOffset) {
+                labelOffsetX = this.rules.MeasureNumberLabelXOffset;
+            } else {
+                labelOffsetX = 0; // don't offset label for first measure in staffline
+            }
 
             if ((measure.MeasureNumber === currentMeasureNumber ||
                 measure.MeasureNumber === currentMeasureNumber + this.rules.MeasureNumberLabelOffset) &&
                 !measure.parentSourceMeasure.ImplicitMeasure) {
                 if (measure.MeasureNumber !== 1 ||
                     (measure.MeasureNumber === 1 && measure !== staffLine.Measures[0])) {
-                    this.calculateSingleMeasureNumberPlacement(measure, staffLine, musicSystem);
+                    this.calculateSingleMeasureNumberPlacement(measure, staffLine, musicSystem, labelOffsetX);
                 }
                 currentMeasureNumber = measure.MeasureNumber;
             }
@@ -350,7 +356,8 @@ export abstract class MusicSheetCalculator {
     /// <param name="measure"></param>
     /// <param name="staffLine"></param>
     /// <param name="musicSystem"></param>
-    private calculateSingleMeasureNumberPlacement(measure: GraphicalMeasure, staffLine: StaffLine, musicSystem: MusicSystem): void {
+    private calculateSingleMeasureNumberPlacement(measure: GraphicalMeasure, staffLine: StaffLine, musicSystem: MusicSystem,
+                                                  labelOffsetX: number = 0): void {
         const labelNumber: string = measure.MeasureNumber.toString();
         const label: Label = new Label(labelNumber);
         // maybe give rules as argument instead of just setting fontStyle and maybe other settings manually afterwards
@@ -365,7 +372,8 @@ export abstract class MusicSheetCalculator {
 
         // calculate relative Position
         const relativeX: number = staffLine.PositionAndShape.RelativePosition.x +
-            measure.PositionAndShape.RelativePosition.x - graphicalLabel.PositionAndShape.BorderMarginLeft;
+            measure.PositionAndShape.RelativePosition.x - graphicalLabel.PositionAndShape.BorderMarginLeft +
+            labelOffsetX;
         let relativeY: number;
 
         // and the corresponding SkyLine indices
@@ -375,11 +383,15 @@ export abstract class MusicSheetCalculator {
         start -= staffLine.PositionAndShape.RelativePosition.x;
         end -= staffLine.PositionAndShape.RelativePosition.x;
 
+        // correct for hypersensitive collision checks, notes having skyline extend too far to left and right
+        const startCollisionCheck: number = start + 0.5;
+        const endCollisionCheck: number = end - 0.5;
+
         // get the minimum corresponding SkyLine value
-        const skyLineMinValue: number = skyBottomLineCalculator.getSkyLineMinInRange(start, end);
+        const skyLineMinValue: number = skyBottomLineCalculator.getSkyLineMinInRange(startCollisionCheck, endCollisionCheck);
 
         if (measure === staffLine.Measures[0]) {
-            // must take into account possible MusicSystem Bracket's
+            // must take into account possible MusicSystem Brackets
             let minBracketTopBorder: number = 0;
             if (musicSystem.GroupBrackets.length > 0) {
                 for (const groupBracket of musicSystem.GroupBrackets) {