vibe-editor 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-editor",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "main": "src/scripts/js/scripts/VIBE.js",
5
5
  "keywords": [],
6
6
  "author": "Matthias Nowakowski",
@@ -15,7 +15,8 @@
15
15
  "files": [
16
16
  "src/images/*/*",
17
17
  "src/scripts/js/*",
18
- "src/fonts/*"
18
+ "src/fonts/*",
19
+ "src/styles/*.css"
19
20
  ],
20
21
  "dependencies": {
21
22
  "@babel/plugin-transform-classes": "^7.16.7",
@@ -104,7 +104,7 @@ class Core {
104
104
  this.undoAnnotationStacks.push([annotCanvas, annotList]);
105
105
  annotCanvas.replaceWith(annotstate[0]);
106
106
  annotList.replaceWith(annotstate[1]);
107
- this.keyboardHandler.resetListeners();
107
+ this.globalKeyboardHandler.resetListeners();
108
108
  this.container.dispatchEvent(new Event("annotationCanvasChanged"));
109
109
  }
110
110
  resolve(true);
@@ -136,7 +136,7 @@ class Core {
136
136
  this.undoAnnotationStacks.push([annotCanvas, annotList]);
137
137
  annotCanvas.replaceWith(annotstate[0]);
138
138
  annotList.replaceWith(annotstate[1]);
139
- this.keyboardHandler.resetListeners();
139
+ this.globalKeyboardHandler.resetListeners();
140
140
  }
141
141
  resolve(true);
142
142
  return;
@@ -303,6 +303,7 @@ class Core {
303
303
  d = new XMLSerializer().serializeToString(data);
304
304
  u = false;
305
305
  break;
306
+ case null:
306
307
  case undefined:
307
308
  d = new mei_template_1.default().emptyMEI();
308
309
  u = false;
@@ -472,6 +473,7 @@ class Core {
472
473
  this.labelHandler
473
474
  .setContainerId(this.containerId)
474
475
  .setCurrentMEI(this.currentMEIDoc)
476
+ .setm2s(this.m2s)
475
477
  .reset();
476
478
  this.insertModeHandler
477
479
  .setContainerId(this.containerId)
@@ -480,7 +482,7 @@ class Core {
480
482
  .setMusicProcessor(this.musicProcessor)
481
483
  .setDeleteHandler(this.deleteHandler)
482
484
  .setLabelHandler(this.labelHandler)
483
- .activateHarmonyMode()
485
+ //.activateHarmonyMode()
484
486
  //.activateSelectionMode()
485
487
  .setInsertCallback(this.insert)
486
488
  .setDeleteCallback(this.delete)
@@ -634,7 +636,6 @@ class Core {
634
636
  (_a = document.getElementById(this.containerId).querySelector("#interactionOverlay #scoreRects")) === null || _a === void 0 ? void 0 : _a.remove();
635
637
  var scoreRects = document.createElementNS(constants_1.constants._SVGNS_, "svg");
636
638
  scoreRects.setAttribute("id", "scoreRects");
637
- //scoreRects.setAttribute("viewBox", ["0", "0", rootWidth.toString(), rootHeigth.toString()].join(" "))
638
639
  Array.from(refSVG.attributes).forEach(a => {
639
640
  if (!["id", "width", "height"].includes(a.name)) {
640
641
  this.interactionOverlay.setAttribute(a.name, a.value);
@@ -644,20 +645,28 @@ class Core {
644
645
  refSVG.insertAdjacentElement("beforebegin", this.interactionOverlay);
645
646
  if (loadBBoxes) {
646
647
  var svgBoxes = Array.from(document.getElementById(this.containerId)
647
- .querySelectorAll(".definition-scale :is(g,path)")) //".definition-scale path, .definition-scale .bounding-box"))
648
+ .querySelectorAll(".definition-scale :is(g,path)"))
648
649
  .filter(el => {
649
650
  var condition = !["system", "measure", "layer", "ledgerLines", "flag"].some(cn => el.classList.contains(cn));
650
651
  return condition;
651
652
  });
652
653
  var reorderedBoxes = new Array(); // reorder so that dependent elements are already in array
653
- svgBoxes.forEach(sb => {
654
- if (sb.querySelector(":scope > use, :scope > rect, :scope > path") === null) {
655
- reorderedBoxes.push(sb);
656
- }
657
- else {
658
- reorderedBoxes.unshift(sb);
659
- }
654
+ var classOrder = ["harm", "slur", "tie", "tupleNum", "tupletBracket", "clef", "meterSig", "keySig", "notehead", "stem", "rest", "barLine", "staff"];
655
+ let filteredElements;
656
+ classOrder.forEach(c => {
657
+ filteredElements = svgBoxes.filter(e => e.classList.contains(c));
658
+ reorderedBoxes.push(...filteredElements);
660
659
  });
660
+ filteredElements = svgBoxes.filter(e => e.classList.length === 0 || !classOrder.some(c => e.classList.contains(c)));
661
+ // {
662
+ // if(e.classList.length === 0){
663
+ // return e
664
+ // }
665
+ // if(!classOrder.some(c => e.classList.contains(c))){
666
+ // return e
667
+ // }
668
+ // })
669
+ reorderedBoxes.push(...filteredElements);
661
670
  // staff always has to be on top of sibling elements, so that one can interact with score elements
662
671
  reorderedBoxes = reorderedBoxes.reverse();
663
672
  async function computeCoords(box, interactionOverlay) {
@@ -182,7 +182,7 @@ class VIBE {
182
182
  });
183
183
  }
184
184
  this.tabbar
185
- .setImportCallback(this.coreInstance.loadDataHandler)
185
+ .setLoadDataCallback(this.coreInstance.loadDataHandler)
186
186
  .setAlignCallback(this.coreInstance.alignFunctionHandler)
187
187
  .setGetMEICallback(this.coreInstance.getMEI.bind(this.coreInstance));
188
188
  //block everthing when firefox is not at least version 114.0
@@ -25,7 +25,7 @@ class HarmonyLabel {
25
25
  this.isText = true;
26
26
  }
27
27
  else if (isEmpty) {
28
- this.element.dispatchEvent(new Event("emptyHarmonyText"));
28
+ this.element.textContent = "";
29
29
  }
30
30
  else {
31
31
  this.isBassoContinuo = true;
@@ -366,6 +366,7 @@ class Tabbar {
366
366
  }
367
367
  this.colorGroup.append(ReactWrapper.createColorPicker("colorPicker", handleColor.bind(this)));
368
368
  this.fileSelectGroup = cq.getContainer(this.containerId).querySelector("#fileSelectGroup");
369
+ this.fileSelectGroup.append(dc.makeNewButton("Empty Score", "emptyScoreBtn", buttonStyleDarkOutline));
369
370
  this.fileSelectGroup.append(dc.makeNewInput("importAudioFile", "file", ""));
370
371
  this.fileSelectGroup.append(dc.makeNewButton("Import Audiofile", "importAudioFileBtn", buttonStyleDarkOutline));
371
372
  this.fileSelectGroup.append(dc.makeNewInput("importXML", "file", ""));
@@ -516,10 +517,11 @@ class Tabbar {
516
517
  cq.getContainer(this.containerId).querySelector("#importXML").addEventListener("input", function (e) {
517
518
  var fr = new FileReader();
518
519
  fr.onload = function () {
519
- that.importCallback("", fr.result, false, constants_1.constants._TARGETDIVID_).then(mei => {
520
+ that.loadDataCallback("", fr.result, false, constants_1.constants._TARGETDIVID_).then(mei => {
520
521
  var meiXml = meioperations.mergeSectionScoreDefToLayer(mei);
521
- meiXml = meioperations.mergeArticToParent(meiXml);
522
- that.importCallback("", meiXml, false, constants_1.constants._TARGETDIVID_);
522
+ meiXml = meioperations.mergeNotechildrenToAttributes(meiXml);
523
+ meiXml = meioperations.adjustOrderNumbers(meiXml);
524
+ that.loadDataCallback("", meiXml, false, constants_1.constants._TARGETDIVID_);
523
525
  that.align(null, null);
524
526
  });
525
527
  };
@@ -560,6 +562,9 @@ class Tabbar {
560
562
  that.download(fileName, mei);
561
563
  });
562
564
  });
565
+ cq.getContainer(this.containerId).querySelector("#emptyScoreBtn").addEventListener("click", function () {
566
+ that.loadDataCallback("", null, false, constants_1.constants._TARGETDIVID_).then(() => cq.getContainer(that.containerId).querySelectorAll("#annotationCanvas > g").forEach(g => g.remove()));
567
+ });
563
568
  }
564
569
  /**
565
570
  * Call the alignCallback with parameters. Only when the audioBlob and audioFile are defined, an alignment can take place.
@@ -673,8 +678,8 @@ class Tabbar {
673
678
  * Callback from Core, so that imported mei or musicxml can be loaded in the editor
674
679
  * @param importCallback
675
680
  */
676
- setImportCallback(importCallback) {
677
- this.importCallback = importCallback;
681
+ setLoadDataCallback(loadDataCallback) {
682
+ this.loadDataCallback = loadDataCallback;
678
683
  return this;
679
684
  }
680
685
  setAlignCallback(alignCallback) {
@@ -27,6 +27,8 @@ class AnnotationChangeHandler {
27
27
  this.dragAnnotEndEvent = new Event("dragAnnotEnd");
28
28
  this.isInteracting = false;
29
29
  this.factor = 100;
30
+ this.positionx = 0;
31
+ this.positiony = 0;
30
32
  }
31
33
  setListeners() {
32
34
  //if(document.getElementById(this.containerId).querySelector(".sidebar.openSidebar") != null) return
@@ -74,7 +76,7 @@ class AnnotationChangeHandler {
74
76
  that.interactTarget.dispatchEvent(that.annotResizedEvent);
75
77
  that.isInteracting = false;
76
78
  }
77
- },
79
+ }
78
80
  })
79
81
  .draggable({
80
82
  listeners: {
@@ -86,12 +88,12 @@ class AnnotationChangeHandler {
86
88
  that.isInteracting = false;
87
89
  }
88
90
  },
89
- modifiers: [
90
- interactjs_1.default.modifiers.restrictRect({
91
- restriction: 'parent',
92
- endOnly: true
93
- })
94
- ]
91
+ // modifiers: [
92
+ // interact.modifiers.restrictRect({
93
+ // restriction: 'parent',
94
+ // endOnly: true
95
+ // })
96
+ // ]
95
97
  });
96
98
  this.lineListener = interactjs_1.default("#" + this.containerId + " #interactionOverlay .lineDragRect.x1")
97
99
  .draggable({
@@ -29,6 +29,8 @@ class DeleteHandler {
29
29
  this.backSpaceHandler = (function backSpaceHandler(e) {
30
30
  if (!cq.hasActiveElement(this.containerId))
31
31
  return;
32
+ if (cq.getContainer(this.containerId).querySelector("[contenteditable=\"true\"]"))
33
+ return;
32
34
  if (e.code !== "Backspace")
33
35
  return;
34
36
  var hasRests = false;
@@ -63,52 +63,65 @@ class InsertModeHandler {
63
63
  .resetListeners();
64
64
  this.deleteHandler.setListeners();
65
65
  (_a = this.annotations) === null || _a === void 0 ? void 0 : _a.setm2s(this.m2s);
66
+ this.labelHandler.deactivateHarmonyHighlight();
66
67
  //this.annotations?.updateCanvas()
67
68
  //this.annotations?.resetTextListeners() // annotations should also be interactable when in notation mode
68
69
  //this.activateSelectionMode()
69
70
  }
70
71
  activateAnnotationMode() {
71
- var _a;
72
+ var _a, _b;
72
73
  this.insertDeactivate();
73
74
  var that = this;
74
75
  this.keyMode = false;
75
76
  this.clickInsertMode = false;
76
- var selectedButton = (_a = this.container.querySelector("#annotGroupKM button.selected")) === null || _a === void 0 ? void 0 : _a.id;
77
- switch (selectedButton) {
78
- case "harmonyAnnotButton":
79
- this.activateHarmonyMode();
80
- this.harmonyMode = true;
81
- this.annotationMode = false;
82
- break;
83
- case "staticTextButton":
84
- case "linkedAnnotButton":
85
- this.container.classList.remove("harmonyMode");
86
- this.annotationMode = true;
87
- this.harmonyMode = false;
88
- if (this.annotations == undefined) {
89
- this.annotations = new Annotations_1.default(this.containerId);
90
- }
91
- else {
92
- this.annotations.updateCanvas();
93
- }
94
- this.annotations.setAnnotationCanvas(cq.getInteractOverlay(this.containerId).querySelector("#annotationCanvas"));
95
- this.annotations.updateLinkedTexts();
96
- break;
77
+ var selectedButtonId = (_a = this.container.querySelector("#annotGroupKM button.selected")) === null || _a === void 0 ? void 0 : _a.id;
78
+ setAnnotationState(selectedButtonId);
79
+ // the annotationgroup buttons are just created, when AnnnotationTabBtn is clicked
80
+ (_b = Array.from(this.container.querySelectorAll("#annotGroupKM button"))) === null || _b === void 0 ? void 0 : _b.forEach(b => {
81
+ b.addEventListener("click", setButtonId);
82
+ });
83
+ function setButtonId(e) {
84
+ selectedButtonId = e.target.id;
85
+ setAnnotationState(selectedButtonId);
86
+ }
87
+ function setAnnotationState(selectedButtonId) {
88
+ switch (selectedButtonId) {
89
+ case "harmonyAnnotButton":
90
+ that.harmonyMode = true;
91
+ that.annotationMode = false;
92
+ that.isGlobal = false;
93
+ that.activateHarmonyMode();
94
+ break;
95
+ case "staticTextButton":
96
+ case "linkedAnnotButton":
97
+ that.container.classList.remove("harmonyMode");
98
+ that.annotationMode = true;
99
+ that.harmonyMode = false;
100
+ if (that.annotations == undefined) {
101
+ that.annotations = new Annotations_1.default(that.containerId);
102
+ }
103
+ else {
104
+ that.annotations.updateCanvas();
105
+ }
106
+ that.annotations.setAnnotationCanvas(cq.getInteractOverlay(that.containerId).querySelector("#annotationCanvas"));
107
+ that.annotations.updateLinkedTexts();
108
+ break;
109
+ }
110
+ that.annotations
111
+ .setContainerId(that.containerId)
112
+ .setm2s(that.m2s)
113
+ .setMusicProcessor(that.musicPlayer)
114
+ //.setToFront()
115
+ .setListeners()
116
+ .setMenuClickHandler();
97
117
  }
98
- this.annotations
99
- .setContainerId(this.containerId)
100
- .setm2s(this.m2s)
101
- .setMusicProcessor(this.musicPlayer)
102
- //.setToFront()
103
- .setListeners()
104
- .setMenuClickHandler();
105
118
  }
106
119
  activateHarmonyMode() {
107
120
  if (this.labelHandler == undefined) {
108
121
  this.labelHandler = new LabelHandler_1.default(this.containerId);
109
122
  }
110
123
  //Activate/ Deactivate Global functions according to selected harmonymode
111
- if (this.container.querySelector("#activateHarm.selected, #harmonyAnnotButton.selected") !== null) {
124
+ if (!this.isGlobal) {
112
125
  this.insertDeactivate();
113
126
  this.container.classList.add("harmonyMode");
114
127
  this.isGlobal = false;
@@ -183,7 +183,7 @@ class LabelHandler {
183
183
  * Open Inputbox for (first) selected Note
184
184
  */
185
185
  harmonyLabelHandler(e) {
186
- var nextNote = this.vrvSVG.querySelector(".note.marked, .chord.marked");
186
+ var nextNote = this.vrvSVG.querySelector(".note.marked, .chord.marked, .rest.marked");
187
187
  if (nextNote === null) {
188
188
  return;
189
189
  }
@@ -328,7 +328,7 @@ class LabelHandler {
328
328
  if (refElementClass === "harm") { // change existing harm
329
329
  let harmLabel = label;
330
330
  harmLabel.modifyLabel(text);
331
- //this.currentMEI.getElementById(harmLabel.getElement().id).replaceWith(harmLabel.getElement())
331
+ this.currentMEI.getElementById(harmLabel.getElement().id).replaceWith(harmLabel.getElement());
332
332
  }
333
333
  else if (["note", "chord"].some(cn => refElementClass === cn)) { //create new harm
334
334
  let harmLabel = this.setLabel(labelDiv.textContent, labelDiv.closest("g").getAttribute("refElementId"));
@@ -382,8 +382,8 @@ class LabelHandler {
382
382
  text.setAttribute("y", (posy).toString());
383
383
  textForeignObject.setAttribute("x", "0");
384
384
  textForeignObject.setAttribute("y", "0");
385
- textForeignObject.setAttribute("height", "1000"); //(textDiv.clientHeight + 2 * rectPadding).toString())
386
- textForeignObject.setAttribute("width", "1000"); //(textDiv.clientHeight + 2 * rectPadding).toString())
385
+ // textForeignObject.setAttribute("height", "1000") //(textDiv.clientHeight + 2 * rectPadding).toString())
386
+ // textForeignObject.setAttribute("width", "1000")//(textDiv.clientHeight + 2 * rectPadding).toString())
387
387
  this.labelCanvas.appendChild(textGroup);
388
388
  textGroup.appendChild(text);
389
389
  textForeignObject.appendChild(textDiv);
@@ -76,24 +76,26 @@ class PhantomElementHandler {
76
76
  var _a, _b, _c, _d, _e;
77
77
  if (this.m2s.getLastMouseEnter().staff === null)
78
78
  return;
79
- // var pt = coordinates.transformToDOMMatrixCoordinates(e.clientX, e.clientY, this.interactionOverlay)
80
- // var relX = pt.x
81
- // var relY = pt.y
82
79
  var definitionScale = (_b = cq.getVrvSVG(this.containerId).querySelector("#" + ((_a = this.m2s.getLastMouseEnter().staff) === null || _a === void 0 ? void 0 : _a.getAttribute("refId")))) === null || _b === void 0 ? void 0 : _b.closest(".definition-scale");
83
- if (definitionScale == undefined || definitionScale == null)
80
+ if (!definitionScale)
84
81
  return;
85
- var pt = coordinates.transformToDOMMatrixCoordinates(e.clientX, e.clientY, this.interactionOverlay);
82
+ var pt = coordinates.transformToDOMMatrixCoordinates(e.clientX, e.clientY, cq.getInteractOverlay(this.containerId));
86
83
  var relX = pt.x;
87
84
  var relY = pt.y;
88
- var dsCoords = coordinates.getDOMMatrixCoordinates(definitionScale, definitionScale.closest(".page"));
89
- //console.log(relX, dsCoords, definitionScale.getBoundingClientRect())
85
+ var dsCoords = coordinates.getDOMMatrixCoordinates(definitionScale, cq.getInteractOverlay(this.containerId));
90
86
  if (relX < dsCoords.left || relX > dsCoords.right) {
91
87
  this.isTrackingMouse = false;
92
88
  return;
93
89
  }
94
90
  this.isTrackingMouse = true;
95
91
  var target = e.target;
96
- target = target.closest("g");
92
+ try {
93
+ target = target.closest("g");
94
+ }
95
+ catch (error) {
96
+ console.log(e, target);
97
+ return;
98
+ }
97
99
  var options = {};
98
100
  if (target === null || target === void 0 ? void 0 : target.classList.contains("staffLine")) {
99
101
  options["staffLineId"] = target.id;
@@ -117,9 +119,6 @@ class PhantomElementHandler {
117
119
  });
118
120
  this.setPhantomLineListeners();
119
121
  }
120
- // if(e.type === "draggingNote"){
121
- // console.log(phantomNoteElement, this.phantomLines)
122
- // }
123
122
  }
124
123
  removeLines() {
125
124
  var lines = this.interactionOverlay.querySelectorAll(".phantomLine");
@@ -4,10 +4,6 @@ const cq = require("../utils/convenienceQueries");
4
4
  const meiConverter = require("../utils/MEIConverter");
5
5
  class WindowHandler {
6
6
  constructor() {
7
- /**
8
- * Update all elements that are affected by a window size change
9
- */
10
- this.scrollingTimer = new Array();
11
7
  this.updateFunction = this.update.bind(this);
12
8
  /**
13
9
  * Reload svg when registered events ended
@@ -26,17 +22,18 @@ class WindowHandler {
26
22
  while (this.w !== this.w.parent) {
27
23
  this.w = this.w.parent;
28
24
  }
25
+ this.scrollingTimer = new Array();
29
26
  }
30
27
  setListeners() {
31
28
  this.eventContainer = this.container;
32
29
  window.addEventListener("scroll", this.updateFunction);
33
30
  //window.addEventListener("resize", this.update)
34
- this.w.addEventListener("resize", this.reloadSVGFunction);
31
+ //this.w.addEventListener("resize", this.reloadSVGFunction)
35
32
  this.w.addEventListener("deviceorientation", this.updateFunction);
36
33
  this.eventContainer.querySelector("#sidebarContainer").addEventListener("transitionend", this.updateFunction);
37
- this.eventContainer.querySelector("#sidebarContainer").addEventListener("transitionend", this.reloadSVGFunction);
34
+ //this.eventContainer.querySelector("#sidebarContainer").addEventListener("transitionend", this.reloadSVGFunction)
38
35
  this.eventContainer.querySelector("#sidebarContainer").addEventListener("resizemove", this.updateFunction);
39
- this.eventContainer.querySelector("#sidebarContainer").addEventListener("resizemove", this.reloadSVGFunction);
36
+ //this.eventContainer.querySelector("#sidebarContainer").addEventListener("resizemove", this.reloadSVGFunction)
40
37
  this.vrvSVG.addEventListener("scroll", this.updateFunction);
41
38
  //this.vrvSVG.addEventListener("resize", this.update)
42
39
  this.vrvSVG.addEventListener("deviceorientation", this.updateFunction);
@@ -71,6 +68,9 @@ class WindowHandler {
71
68
  (_h = this.eventContainer) === null || _h === void 0 ? void 0 : _h.removeEventListener("loadingEnd", this.loadContainerAttrFunction);
72
69
  return this;
73
70
  }
71
+ /**
72
+ * Update all elements that are affected by a window size change
73
+ */
74
74
  update(e) {
75
75
  var _a;
76
76
  // special rule for transition events since so much with different propertynames are fired
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setArticulation = exports.getTimestamp = exports.getElementTimestampById = exports.insertTempo = exports.insertMeter = exports.replaceMeterInScoreDef = exports.insertKey = exports.replaceKeyInScoreDef = exports.insertClef = exports.replaceClefinScoreDef = exports.paste = exports.createTuplet = exports.addLayerForStaff = exports.removeStaff = exports.addStaff = exports.removeMeasure = exports.addMeasure = exports.cleanUp = exports.elementIsOverfilling = exports.changeDur = exports.changeDurationsInLayer = exports.fillLayerWithRests = exports.fillWithRests = exports.disableFeatures = exports.changeMeter = exports.transposeByStep = exports.mergeArticToParent = exports.mergeSectionScoreDefToLayer = exports.adjustAccids = exports.extrapolateMeter = exports.getAbsoluteRatio = exports.connectNotes = exports.addToMEI = exports.getMeterRatioLocal = exports.removeFromMEI = void 0;
3
+ exports.setArticulation = exports.getTimestamp = exports.getElementTimestampById = exports.insertTempo = exports.insertMeter = exports.replaceMeterInScoreDef = exports.insertKey = exports.replaceKeyInScoreDef = exports.insertClef = exports.replaceClefinScoreDef = exports.paste = exports.createTuplet = exports.addLayerForStaff = exports.removeStaff = exports.addStaff = exports.removeMeasure = exports.addMeasure = exports.adjustOrderNumbers = exports.cleanUp = exports.elementIsOverfilling = exports.changeDur = exports.changeDurationsInLayer = exports.fillLayerWithRests = exports.fillWithRests = exports.disableFeatures = exports.changeMeter = exports.transposeByStep = exports.mergeNotechildrenToAttributes = exports.mergeArticToParent = exports.mergeSectionScoreDefToLayer = exports.adjustAccids = exports.extrapolateMeter = exports.getAbsoluteRatio = exports.connectNotes = exports.addToMEI = exports.getMeterRatioLocal = exports.removeFromMEI = void 0;
4
4
  const meiConverter = require("./MEIConverter");
5
5
  const random_1 = require("./random");
6
6
  const constants_1 = require("../constants");
@@ -980,6 +980,14 @@ function mergeArticToParent(currentMEI) {
980
980
  return currentMEI;
981
981
  }
982
982
  exports.mergeArticToParent = mergeArticToParent;
983
+ function mergeNotechildrenToAttributes(currentMEI) {
984
+ currentMEI.querySelectorAll("note > *").forEach(a => {
985
+ a.parentElement.setAttribute(a.tagName, a.getAttribute(a.tagName));
986
+ a.remove();
987
+ });
988
+ return currentMEI;
989
+ }
990
+ exports.mergeNotechildrenToAttributes = mergeNotechildrenToAttributes;
983
991
  /**
984
992
  * Transpose marked notes according to direcion (up or down)
985
993
  * @param currentMEI
@@ -1137,65 +1145,6 @@ function fillLayerWithRests(layer, currentMEI) {
1137
1145
  }
1138
1146
  }
1139
1147
  exports.fillLayerWithRests = fillLayerWithRests;
1140
- /**
1141
- * Fill Empty Space with rest
1142
- * @deprecated
1143
- * @param currentMEI
1144
- */
1145
- function _fillWithRests(currentMEI) {
1146
- var staffDef = currentMEI.getElementsByTagName("staffDef").item(0);
1147
- var meterCount;
1148
- var meterUnit;
1149
- var meterRatio;
1150
- if (staffDef.getAttribute(constants_1.constants._METERCOUNT_) !== null && staffDef.getAttribute(constants_1.constants._METERUNIT_) !== null) {
1151
- meterCount = staffDef.getAttribute(constants_1.constants._METERCOUNT_);
1152
- meterUnit = staffDef.getAttribute(constants_1.constants._METERUNIT_);
1153
- meterRatio = parseInt(meterCount) / parseInt(meterUnit);
1154
- }
1155
- else {
1156
- var meterRatio = getMeterRatioGlobal(currentMEI);
1157
- meterCount = (meterRatio * 4).toString();
1158
- meterUnit = "4";
1159
- }
1160
- currentMEI.querySelectorAll("measure").forEach(m => {
1161
- m.querySelectorAll("staff").forEach(s => {
1162
- s.querySelectorAll("layer").forEach((l, idx) => {
1163
- //mRest for empty Layer
1164
- if (l.childElementCount === 0) {
1165
- if (idx === 0) {
1166
- var restEl = document.createElementNS(constants_1.constants._MEINS_, "mRest");
1167
- l.appendChild(restEl);
1168
- }
1169
- else { // remove 1+ empty layer
1170
- l.remove();
1171
- }
1172
- }
1173
- else {
1174
- var actualMeterFill = getAbsoluteRatio(l);
1175
- var ratioDiff = Math.abs(actualMeterFill - meterRatio);
1176
- var smallestValue = gcd(ratioDiff);
1177
- //var restDurs = findDotsRecursive(ratioDiff, gcd(ratioDiff))
1178
- if (Number.isInteger(ratioDiff / smallestValue) && ratioDiff > 0) {
1179
- var leftRatio = ratioDiff;
1180
- var durArr = new Array();
1181
- while (!Number.isInteger(1 / leftRatio)) {
1182
- var leftRatio = ratioDiff - smallestValue;
1183
- durArr.push(1 / smallestValue);
1184
- }
1185
- durArr.push(1 / leftRatio);
1186
- durArr = durArr.reverse();
1187
- durArr.forEach(dur => {
1188
- var newRest = currentMEI.createElementNS(constants_1.constants._MEINS_, "rest");
1189
- newRest.setAttribute("dur", dur.toString());
1190
- l.appendChild(newRest);
1191
- });
1192
- }
1193
- //console.log(document.getElementById(l.id), ratioDiff, gcd(ratioDiff), durArr)
1194
- }
1195
- });
1196
- });
1197
- });
1198
- }
1199
1148
  /**
1200
1149
  * Replace given id with rest
1201
1150
  * @param element element from svg
@@ -1519,6 +1468,27 @@ function adjustRests(currentMEI) {
1519
1468
  }
1520
1469
  });
1521
1470
  }
1471
+ function adjustOrderNumbers(currentMEI) {
1472
+ function setN(nodeList) {
1473
+ var tagCounter = new Map();
1474
+ nodeList.forEach(n => {
1475
+ if (!tagCounter.has(n.tagName)) {
1476
+ tagCounter.set(n.tagName, 1);
1477
+ }
1478
+ n.setAttribute("n", tagCounter.get(n.tagName).toString());
1479
+ tagCounter.set(n.tagName, tagCounter.get(n.tagName) + 1);
1480
+ });
1481
+ }
1482
+ setN(currentMEI.querySelectorAll("measure"));
1483
+ currentMEI.querySelectorAll("measure").forEach(m => {
1484
+ setN(m.querySelectorAll("staff"));
1485
+ });
1486
+ currentMEI.querySelectorAll("staff").forEach(s => {
1487
+ setN(s.querySelectorAll("layer"));
1488
+ });
1489
+ return currentMEI;
1490
+ }
1491
+ exports.adjustOrderNumbers = adjustOrderNumbers;
1522
1492
  /**
1523
1493
  * Give harm new start id if related note was included in chord during process
1524
1494
  * @param currentMEI
@@ -427,9 +427,24 @@ class SVGEditor {
427
427
  }
428
428
  setActiveLayer() {
429
429
  var container = cq.getContainer(this.containerId);
430
- if (!container.querySelector(".layer.activeLayer")) {
431
- container.querySelectorAll(".layer[n='1']").forEach(l => l.classList.add("activeLayer"));
432
- }
430
+ var staffN = "0";
431
+ // find out if all staves have at least one active layer
432
+ container.querySelectorAll(".staff").forEach(s => {
433
+ var n = s.getAttribute("n");
434
+ if (parseInt(n) > parseInt(staffN))
435
+ staffN = n;
436
+ });
437
+ var i = 1;
438
+ do {
439
+ let activeLayer = container.querySelector(`.staff[n='${i}'] > .layer.activeLayer`);
440
+ if (!activeLayer) {
441
+ container.querySelectorAll(`.staff[n='${i}'] > .layer[n='1']`).forEach(l => l.classList.add("activeLayer"));
442
+ }
443
+ i += 1;
444
+ } while (i <= parseInt(staffN));
445
+ // if (!container.querySelector(".layer.activeLayer")) {
446
+ // container.querySelectorAll(".layer[n='1']").forEach(l => l.classList.add("activeLayer"))
447
+ // }
433
448
  container.querySelectorAll(".activeLayer").forEach(al => {
434
449
  var staffN = al.closest(".staff").getAttribute("n");
435
450
  var layerN = al.getAttribute("n");
@@ -12,9 +12,9 @@ class VerovioWrapper {
12
12
  //@ts-ignore
13
13
  this.vrvToolkit = new verovio.toolkit() || null;
14
14
  this.r = 1;
15
- // if (this.isRetina()) {
16
- // this.r = 2
17
- // }
15
+ if (this.isRetina()) {
16
+ this.r = 2;
17
+ }
18
18
  this.widthValue = 1500;
19
19
  var pageWidth = (this.widthValue / (window.devicePixelRatio / this.r)) / (screen.availHeight / window.innerWidth);
20
20
  this.options = {
@@ -24,7 +24,7 @@ class VerovioWrapper {
24
24
  pageMarginTop: 50,
25
25
  adjustPageHeight: true,
26
26
  font: 'Bravura',
27
- pageWidth: pageWidth,
27
+ //pageWidth: pageWidth, // adjust size with window size
28
28
  //pageHeight: pageWidth / 4,
29
29
  //justifyVertically: true,
30
30
  svgViewBox: true,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.transformToDOMMatrixCoordinates = exports.getDOMMatrixCoordinates = void 0;
3
+ exports.transformToDOMMatrixCoordinates = exports.getCanvasCordinates = exports.getDOMMatrixCoordinates = void 0;
4
4
  /**
5
5
  * Get DOMMatrix coordnates of element according to parent canvas class. Returns null if no canvas is found. If element is DOMRect, canvas must be provided
6
6
  * @param element
@@ -33,9 +33,33 @@ function getDOMMatrixCoordinates(element, canvas = null) {
33
33
  ptRB = ptRB.matrixTransform(canvasMatrix);
34
34
  var width = ptRB.x - ptLT.x;
35
35
  var height = ptRB.y - ptLT.y;
36
- return { left: ptLT.x, top: ptLT.y, right: ptRB.x, bottom: ptRB.y, width: width, height: height, x: ptLT.x, y: ptLT.y };
36
+ return { left: ptLT.x, top: ptLT.y, right: ptRB.x, bottom: ptRB.y, width: width, height: height, x: ptLT.x, y: ptLT.y, matrix: canvasMatrix };
37
37
  }
38
38
  exports.getDOMMatrixCoordinates = getDOMMatrixCoordinates;
39
+ function getCanvasCordinates(coords, canvas = null) {
40
+ if (!coords.matrix) {
41
+ throw new Error("DOMMatrix is missing.");
42
+ }
43
+ if (canvas === null) {
44
+ canvas = canvas instanceof Element ? canvas.closest(".canvas") : null;
45
+ if (canvas instanceof DOMRect) {
46
+ throw new Error("Canvas must be provided, if input is instance of DOMRect. Actual instance: " + canvas.constructor.name);
47
+ }
48
+ if (canvas === null)
49
+ return;
50
+ }
51
+ // Reverse the transformation
52
+ var canvasMatrix = coords.matrix.inverse();
53
+ var ptLT = new DOMPoint(coords.left, coords.top);
54
+ ptLT = ptLT.matrixTransform(canvasMatrix);
55
+ var ptRB = new DOMPoint(coords.right, coords.bottom);
56
+ ptRB = ptRB.matrixTransform(canvasMatrix);
57
+ var width = ptRB.x - ptLT.x;
58
+ var height = ptRB.y - ptLT.y;
59
+ // Create and return the DOMRect
60
+ return new DOMRect(ptLT.x, ptLT.y, width, height);
61
+ }
62
+ exports.getCanvasCordinates = getCanvasCordinates;
39
63
  /**
40
64
  * Transforms the given coordinates for a given canvas
41
65
  * @param x