浏览代码

fix(Cursor): Fix cursor going over measure line. Add Rules.LimitCursorPositionToCurrentMeasure (#81)

previous cursor behavior can be re-enabled by setting osmd.EngravingRules.LimitCursorPositionToCurrentMeasure  = false
sschmidTU 2 年之前
父节点
当前提交
b003c76cf4
共有 2 个文件被更改,包括 11 次插入3 次删除
  1. 1 0
      src/MusicalScore/Graphical/EngravingRules.ts
  2. 10 3
      src/MusicalScore/Graphical/GraphicalMusicSheet.ts

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

@@ -383,6 +383,7 @@ export class EngravingRules {
     public PlaybackSkipNotesSafetyInterval: number = 0.02;
     /** Whether to use OSMD's default voice entry interaction listener that plays voice entry on click etc. */
     public UseDefaultVoiceInteractionListener: boolean = true;
+    public LimitCursorPositionToCurrentMeasure: boolean = true;
 
     constructor() {
         this.loadDefaultValues();

+ 10 - 3
src/MusicalScore/Graphical/GraphicalMusicSheet.ts

@@ -877,6 +877,7 @@ export class GraphicalMusicSheet {
         } else {
             nextStaffEntryMusicSystem = previousStaffEntry.parentMeasure.ParentStaffLine?.ParentMusicSystem;
         }
+        let prevMeasure: SourceMeasure;
         if (previousStaffEntryMusicSystem === nextStaffEntryMusicSystem) {
             currentMusicSystem = previousStaffEntryMusicSystem;
             let fraction: number;
@@ -888,12 +889,13 @@ export class GraphicalMusicSheet {
             } else if (!nextStaffEntry) {
                 previousStaffEntryPositionX = previousStaffEntry.PositionAndShape.AbsolutePosition.x;
                 nextStaffEntryPositionX = currentMusicSystem.GetRightBorderAbsoluteXPosition();
-                const sm: SourceMeasure = previousStaffEntry.parentMeasure.parentSourceMeasure;
+                prevMeasure = previousStaffEntry.parentMeasure.parentSourceMeasure;
                 fraction = (currentTimeStamp - previousStaffEntry.getAbsoluteTimestamp().RealValue) / (
-                    Fraction.plus(sm.AbsoluteTimestamp, sm.Duration).RealValue - previousStaffEntry.getAbsoluteTimestamp().RealValue);
+                    Fraction.plus(prevMeasure.AbsoluteTimestamp, prevMeasure.Duration).RealValue - previousStaffEntry.getAbsoluteTimestamp().RealValue);
             } else {
                 previousStaffEntryPositionX = previousStaffEntry.PositionAndShape.AbsolutePosition.x;
                 nextStaffEntryPositionX = nextStaffEntry.PositionAndShape.AbsolutePosition.x;
+                prevMeasure = previousStaffEntry.parentMeasure.parentSourceMeasure;
                 if (previousStaffEntry === nextStaffEntry) {
                     fraction = 0;
                 } else {
@@ -902,7 +904,12 @@ export class GraphicalMusicSheet {
                 }
             }
             fraction = Math.min(1, Math.max(0, fraction));
-            const interpolatedXPosition: number = previousStaffEntryPositionX + fraction * (nextStaffEntryPositionX - previousStaffEntryPositionX);
+            let limitX: number = nextStaffEntryPositionX;
+            if (prevMeasure?.Rules.LimitCursorPositionToCurrentMeasure) {
+                limitX = Math.min(previousStaffEntry.parentMeasure.PositionAndShape.AbsolutePosition.x +
+                    previousStaffEntry.parentMeasure.PositionAndShape.BorderRight, limitX);
+            }
+            const interpolatedXPosition: number = previousStaffEntryPositionX + fraction * (limitX - previousStaffEntryPositionX);
             return [interpolatedXPosition, currentMusicSystem, previousStaffEntry];
         } else {
             const nextSystemLeftBorderTimeStamp: number = nextStaffEntry.parentMeasure.parentSourceMeasure.AbsoluteTimestamp.RealValue;