Browse Source

fix nothing rendered on very small widths, listener null errors (#52, #53)

fix #52

* fix rendering on very small widths (#52)
If the measure width is greater than available width, don't try to push to next system

* Clean-up code
Don't use variable for one time compare, move comment

* Fixes:
Render 1 measure per system when the available system space is smaller than the measure width
Add null checks for event listeners in PlaybackManager

Co-authored-by: Justin Litten <justinlitten77@gmail.com>
fredmeister77 3 năm trước cách đây
mục cha
commit
bebc68ed47

+ 8 - 3
src/MusicalScore/Graphical/JustifiedMusicSystemBuilder.ts

@@ -56,7 +56,6 @@ export class JustifiedMusicSystemBuilder extends MusicSystemBuilder {
         const systemsMeasureCount: number [] = [];
         const measureXWidths: number[] = [];
         const measureCenterXPositions: number[] = [];
-
         // 2. do the justification algorithm for every block:
         // The algo scales the whole chain of measures of the block up to fill up also the last system of the block
         for (const block of blocksToJustify) {
@@ -122,7 +121,6 @@ export class JustifiedMusicSystemBuilder extends MusicSystemBuilder {
             const systemSpace: number = systemMaxWidth - systemBeginInstructionDefaultWidth;
             const requiredNumSystems: number = Math.ceil(completeMeasuresXWidth / systemSpace);
             const scaleFactor: number = requiredNumSystems * systemSpace / completeMeasuresXWidth;
-
             // 2c. Find out to which system every measure shall belong now after the stretching
             //      and store the final number of measures for every system.
             //      This will be needed later for the build-up of the systems.
@@ -133,7 +131,14 @@ export class JustifiedMusicSystemBuilder extends MusicSystemBuilder {
                 if (measureCenterX === 0) { // measure not rendered (middle of multi rest)
                     continue;
                 }
-                const currentSystemNumber: number = Math.ceil(measureCenterX * scaleFactor / systemSpace);
+                const measureWidth: number = measureXWidths[idx];
+                let currentSystemNumber: number = measureCenterX * scaleFactor / systemSpace;
+                if(measureWidth > systemSpace){//Measure is bigger than the available system space
+                    //Simply have 1 measure per system
+                    currentSystemNumber = idx + 1;
+                } else {
+                    currentSystemNumber = Math.ceil(currentSystemNumber);
+                }
                 if (systemNumber === currentSystemNumber) {
                     currentSystemMeasureCount += 1;
                 } else {

+ 5 - 5
src/Playback/PlaybackManager.ts

@@ -363,7 +363,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
             try {
                 //bool endReached = this.iterator !== undefined && this.iterator.EndReached;
                 for (const listener of this.listeners) {
-                    listener.pauseOccurred(undefined);
+                    listener?.pauseOccurred(undefined);
                 }
             } catch (ex) {
                 log.debug("PlaybackManager.pause: ", ex);
@@ -388,7 +388,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
             //this.isPlaying = true;
         }
         for (const listener of this.listeners) {
-            listener.resetOccurred(undefined);
+            listener?.resetOccurred(undefined);
         }
         // }
     }
@@ -820,7 +820,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
                 if (endHasBeenReached && this.currentTimestamp.gte(this.cursorIterator.CurrentEnrolledTimestamp)) {
                     // notify possible listeners:
                     for (const listener of this.listeners) {
-                        listener.selectionEndReached(undefined);
+                        listener?.selectionEndReached(undefined);
                     }
                     this.handleEndReached();
                 } else {
@@ -864,7 +864,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
 
     private NotesPlaybackEventOccurred(notes: PlaybackNote[]): void {
         for (const listener of this.listeners) {
-            listener.notesPlaybackEventOccurred(notes);
+            listener?.notesPlaybackEventOccurred(notes);
         }
     }
 
@@ -1082,7 +1082,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
             this.scorePositionChangedData.CurrentBpm = this.musicPartManager.MusicSheet.SheetPlaybackSetting.BeatsPerMinute;
             this.scorePositionChangedData.ResetOccurred = resetOccurred;
             for (const listener of this.listeners) {
-                listener.cursorPositionChanged(this.currentIteratorSourceTimeStamp, this.scorePositionChangedData);
+                listener?.cursorPositionChanged(this.currentIteratorSourceTimeStamp, this.scorePositionChangedData);
             }
         }