vibe-editor 0.0.0

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.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/package.json +56 -0
  4. package/src/fonts/bravura/FONTLOG.txt +243 -0
  5. package/src/fonts/bravura/OFL-FAQ.txt +369 -0
  6. package/src/fonts/bravura/OFL.txt +94 -0
  7. package/src/fonts/bravura/bravura-text.md +153 -0
  8. package/src/fonts/bravura/bravura_metadata.json +34718 -0
  9. package/src/fonts/bravura/eot/Bravura.eot +0 -0
  10. package/src/fonts/bravura/eot/BravuraText.eot +0 -0
  11. package/src/fonts/bravura/otf/Bravura.otf +0 -0
  12. package/src/fonts/bravura/otf/BravuraText.otf +0 -0
  13. package/src/fonts/bravura/svg/Bravura.svg +3517 -0
  14. package/src/fonts/bravura/svg/BravuraText.svg +18879 -0
  15. package/src/fonts/bravura/woff/Bravura.woff +0 -0
  16. package/src/fonts/bravura/woff/BravuraText.woff +0 -0
  17. package/src/fonts/colaborate/ColabBol-webfont.eot +0 -0
  18. package/src/fonts/colaborate/ColabBol-webfont.svg +976 -0
  19. package/src/fonts/colaborate/ColabBol-webfont.ttf +0 -0
  20. package/src/fonts/colaborate/ColabBol-webfont.woff +0 -0
  21. package/src/fonts/colaborate/ColabLig-webfont.eot +0 -0
  22. package/src/fonts/colaborate/ColabLig-webfont.svg +976 -0
  23. package/src/fonts/colaborate/ColabLig-webfont.ttf +0 -0
  24. package/src/fonts/colaborate/ColabLig-webfont.woff +0 -0
  25. package/src/fonts/colaborate/ColabMed-webfont.eot +0 -0
  26. package/src/fonts/colaborate/ColabMed-webfont.svg +976 -0
  27. package/src/fonts/colaborate/ColabMed-webfont.ttf +0 -0
  28. package/src/fonts/colaborate/ColabMed-webfont.woff +0 -0
  29. package/src/fonts/colaborate/ColabReg-webfont.eot +0 -0
  30. package/src/fonts/colaborate/ColabReg-webfont.svg +976 -0
  31. package/src/fonts/colaborate/ColabReg-webfont.ttf +0 -0
  32. package/src/fonts/colaborate/ColabReg-webfont.woff +0 -0
  33. package/src/fonts/colaborate/ColabThi-webfont.eot +0 -0
  34. package/src/fonts/colaborate/ColabThi-webfont.svg +970 -0
  35. package/src/fonts/colaborate/ColabThi-webfont.ttf +0 -0
  36. package/src/fonts/colaborate/ColabThi-webfont.woff +0 -0
  37. package/src/images/GUI/.DS_Store +0 -0
  38. package/src/images/GUI/backward-fast-solid.svg +1 -0
  39. package/src/images/GUI/bars-solid.svg +1 -0
  40. package/src/images/GUI/caret-left-solid.svg +1 -0
  41. package/src/images/GUI/caret-right-solid.svg +1 -0
  42. package/src/images/GUI/edit-solid.svg +1 -0
  43. package/src/images/GUI/pause-solid.svg +1 -0
  44. package/src/images/GUI/play-solid.svg +1 -0
  45. package/src/images/GUI/triplet.svg +21 -0
  46. package/src/images/GUI/zoomin.svg +1 -0
  47. package/src/images/GUI/zoomout.svg +1 -0
  48. package/src/images/bravura_notes/.DS_Store +0 -0
  49. package/src/images/bravura_notes/16th.svg +1 -0
  50. package/src/images/bravura_notes/32th.svg +1 -0
  51. package/src/images/bravura_notes/alterDDown.svg +1 -0
  52. package/src/images/bravura_notes/alterDUp.svg +1 -0
  53. package/src/images/bravura_notes/alterDown.svg +1 -0
  54. package/src/images/bravura_notes/alterNeutral.svg +1 -0
  55. package/src/images/bravura_notes/alterUp.svg +1 -0
  56. package/src/images/bravura_notes/beams.svg +1 -0
  57. package/src/images/bravura_notes/eigth.svg +1 -0
  58. package/src/images/bravura_notes/full.svg +1 -0
  59. package/src/images/bravura_notes/half.svg +1 -0
  60. package/src/images/bravura_notes/oneDot.svg +1 -0
  61. package/src/images/bravura_notes/pauseNote.svg +1 -0
  62. package/src/images/bravura_notes/quarter.svg +1 -0
  63. package/src/images/bravura_notes/tie.svg +1 -0
  64. package/src/images/bravura_notes/twoDot.svg +1 -0
  65. package/src/scripts/js/.DS_Store +0 -0
  66. package/src/scripts/js/Core.js +887 -0
  67. package/src/scripts/js/MusicPlayer.js +572 -0
  68. package/src/scripts/js/MusicProcessor.js +652 -0
  69. package/src/scripts/js/VerovioScoreEditor.js +183 -0
  70. package/src/scripts/js/assets/mei_template.js +161 -0
  71. package/src/scripts/js/constants.js +20 -0
  72. package/src/scripts/js/datastructures/MeasureMatrix.js +235 -0
  73. package/src/scripts/js/datastructures/ScoreGraph.js +432 -0
  74. package/src/scripts/js/datastructures/ScoreNode.js +78 -0
  75. package/src/scripts/js/entry.js +4 -0
  76. package/src/scripts/js/gui/Annotations.js +456 -0
  77. package/src/scripts/js/gui/Cursor.js +203 -0
  78. package/src/scripts/js/gui/CustomAnnotationDrawer.js +114 -0
  79. package/src/scripts/js/gui/CustomAnnotationShapeDrawer.js +114 -0
  80. package/src/scripts/js/gui/HarmonyLabel.js +104 -0
  81. package/src/scripts/js/gui/Label.js +2 -0
  82. package/src/scripts/js/gui/PhantomElement.js +132 -0
  83. package/src/scripts/js/gui/ScoreManipulator.js +156 -0
  84. package/src/scripts/js/gui/Tabbar.js +675 -0
  85. package/src/scripts/js/gui/TempoLabel.js +60 -0
  86. package/src/scripts/js/gui/Toolbar copy.js +614 -0
  87. package/src/scripts/js/gui/Toolbar.js +618 -0
  88. package/src/scripts/js/handlers/AnnotationChangeHandler.js +567 -0
  89. package/src/scripts/js/handlers/AnnotationDragHandler.js +113 -0
  90. package/src/scripts/js/handlers/AnnotationLineHandler.js +113 -0
  91. package/src/scripts/js/handlers/ArticulationHandler.js +20 -0
  92. package/src/scripts/js/handlers/ClickModeHandler.js +265 -0
  93. package/src/scripts/js/handlers/CustomAnnotationShapeDrawer.js +131 -0
  94. package/src/scripts/js/handlers/CustomToolbarHandler.js +297 -0
  95. package/src/scripts/js/handlers/DeleteHandler.js +102 -0
  96. package/src/scripts/js/handlers/GlobalKeyboardHandler.js +367 -0
  97. package/src/scripts/js/handlers/Handler.js +2 -0
  98. package/src/scripts/js/handlers/HarmonyHandler.js +282 -0
  99. package/src/scripts/js/handlers/InsertModeHandler copy.js +423 -0
  100. package/src/scripts/js/handlers/InsertModeHandler.js +380 -0
  101. package/src/scripts/js/handlers/InsertModeHandler_deprecated.js +424 -0
  102. package/src/scripts/js/handlers/KeyModeHandler copy.js +407 -0
  103. package/src/scripts/js/handlers/KeyModeHandler.js +456 -0
  104. package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +411 -0
  105. package/src/scripts/js/handlers/LabelHandler.js +461 -0
  106. package/src/scripts/js/handlers/ModHandler.js +311 -0
  107. package/src/scripts/js/handlers/NoteDragHandler copy.js +148 -0
  108. package/src/scripts/js/handlers/NoteDragHandler.js +97 -0
  109. package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +150 -0
  110. package/src/scripts/js/handlers/PhantomElementHandler.js +168 -0
  111. package/src/scripts/js/handlers/ScoreManipulatorHandler.js +135 -0
  112. package/src/scripts/js/handlers/SelectionHandler.js +218 -0
  113. package/src/scripts/js/handlers/SideBarHandler.js +499 -0
  114. package/src/scripts/js/handlers/TooltipHandler.js +132 -0
  115. package/src/scripts/js/handlers/WindowHandler.js +257 -0
  116. package/src/scripts/js/utils/DOMCreator.js +174 -0
  117. package/src/scripts/js/utils/MEIConverter.js +64 -0
  118. package/src/scripts/js/utils/MEIOperations.js +2112 -0
  119. package/src/scripts/js/utils/Mouse2MEI.js +735 -0
  120. package/src/scripts/js/utils/Mouse2SVG.js +737 -0
  121. package/src/scripts/js/utils/SVGEditor.js +352 -0
  122. package/src/scripts/js/utils/SVGFiller.js +245 -0
  123. package/src/scripts/js/utils/Types.js +2 -0
  124. package/src/scripts/js/utils/VerovioWrapper copy.js +156 -0
  125. package/src/scripts/js/utils/VerovioWrapper.js +165 -0
  126. package/src/scripts/js/utils/VerovioWrapperLocal.js +156 -0
  127. package/src/scripts/js/utils/convenienceQueries.js +37 -0
  128. package/src/scripts/js/utils/coordinates.js +54 -0
  129. package/src/scripts/js/utils/firefoxBBoxes.js +143 -0
  130. package/src/scripts/js/utils/mappings.js +332 -0
  131. package/src/scripts/js/utils/random.js +45 -0
  132. package/src/styles/VerovioScoreEditor.css +694 -0
@@ -0,0 +1,461 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const meiConverter = require("../utils/MEIConverter");
4
+ const meiOperation = require("../utils/MEIOperations");
5
+ const constants_1 = require("../constants");
6
+ const random_1 = require("../utils/random");
7
+ const HarmonyLabel_1 = require("../gui/HarmonyLabel");
8
+ const TempoLabel_1 = require("../gui/TempoLabel");
9
+ const cq = require("../utils/convenienceQueries");
10
+ const mappings_1 = require("../utils/mappings");
11
+ const labelClasses = ["harm", "tempo", "note", "chord", "fb"];
12
+ const labelSelectors = "." + labelClasses.join(",.");
13
+ class LabelHandler {
14
+ constructor(containerId) {
15
+ this.setHarmonyLabelHandlerClick = (function setHarmonyLabelHandler(e) {
16
+ if (this.container.classList.contains("harmonyMode")) {
17
+ this.harmonyLabelHandler(e);
18
+ }
19
+ }).bind(this);
20
+ this.setTempoLabelHandlerClick = (function setTempoLabelHandlerClick(e) {
21
+ this.tempoLabelHandler(e);
22
+ }).bind(this);
23
+ this.setHarmonyLabelHandlerKey = (function setHarmonyLabelHandler(e) {
24
+ if (!cq.hasActiveElement(this.containerId))
25
+ return;
26
+ var isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
27
+ var ctrl = e.ctrlKey;
28
+ if (isMac) {
29
+ ctrl = e.metaKey;
30
+ }
31
+ if (ctrl) {
32
+ if (e.key === "k" && Array.from(this.vrvSVG.querySelectorAll(".note, .chord, .rest, .mrest")).some(el => el.classList.contains("marked"))) {
33
+ e.preventDefault();
34
+ this.harmonyLabelHandler(e);
35
+ }
36
+ }
37
+ }).bind(this);
38
+ this.activateHarmonyHighlight = (function highlightNextHarmonyHandler(e) {
39
+ if (e.type === "mouseleave" && !this.isGlobal) {
40
+ this.interactionOverlay.addEventListener("mousemove", this.activateHarmonyHighlight);
41
+ }
42
+ if (!this.isGlobal) {
43
+ this.highlightNextHarmony(e);
44
+ }
45
+ }).bind(this);
46
+ this.deactivateHarmonyHighlight = (function deactivateHighlight(e) {
47
+ // document.querySelectorAll(".marked").forEach(m => {
48
+ // m.classList.remove("marked")
49
+ // })
50
+ this.interactionOverlay.removeEventListener("mousemove", this.activateHarmonyHighlight);
51
+ }).bind(this);
52
+ this.modifyLabelHandler = (function modifyLabelHandler(e) {
53
+ e.stopImmediatePropagation();
54
+ this.vrvSVG.querySelectorAll(".marked").forEach(m => {
55
+ var _a;
56
+ m.classList.remove("marked");
57
+ (_a = this.interactionOverlay.querySelector("*[refId=" + m.id + "]")) === null || _a === void 0 ? void 0 : _a.classList.remove("marked");
58
+ });
59
+ this.modifyLabel(e);
60
+ }).bind(this);
61
+ /**
62
+ * Wrapper function for submitlabel()
63
+ */
64
+ this.submitLabelHandler = (function submitHandler(e) {
65
+ if (!cq.hasActiveElement(this.containerId))
66
+ return;
67
+ if (e.key === "Enter" && this.labelCanvas.hasChildNodes()) {
68
+ e.target.removeEventListener("keydown", this.submitLabelHandler);
69
+ this.submitLabel();
70
+ }
71
+ }).bind(this);
72
+ this.typeLabelHandler = (function (e) {
73
+ if (!cq.hasActiveElement(this.containerId))
74
+ return;
75
+ var factor = 1.3;
76
+ var t = e.target;
77
+ var parent = t.parentElement;
78
+ var tWidth = (t.getBoundingClientRect().width * factor).toString();
79
+ var tHeigth = (t.getBoundingClientRect().height * factor).toString();
80
+ parent.setAttribute("width", tWidth);
81
+ parent.setAttribute("height", tHeigth);
82
+ }).bind(this);
83
+ this.closeModifyWindowHandler = (function closeModifyWindow(e) {
84
+ if (e instanceof KeyboardEvent) {
85
+ if (e.key === "Escape") {
86
+ this.closeModifyWindow();
87
+ }
88
+ }
89
+ else if (e instanceof MouseEvent && !e.target.classList.contains("labelFO")) {
90
+ this.closeModifyWindow();
91
+ }
92
+ }).bind(this);
93
+ this.setContainerId(containerId);
94
+ this.addCanvas();
95
+ }
96
+ /**
97
+ * Set own canvas for manipulating labels
98
+ */
99
+ addCanvas() {
100
+ this.rootBBox = this.interactionOverlay.getBoundingClientRect();
101
+ var rootWidth = this.rootBBox.width.toString();
102
+ var rootHeigth = this.rootBBox.height.toString();
103
+ var vb = this.interactionOverlay.getAttribute("viewBox");
104
+ if (this.labelCanvas == undefined) {
105
+ this.labelCanvas = document.createElementNS(constants_1.constants._SVGNS_, "svg");
106
+ this.labelCanvas.setAttribute("id", "labelCanvas");
107
+ this.labelCanvas.classList.add("canvas");
108
+ //this.labelCanvas.setAttribute("viewBox", ["0", "0", rootWidth, rootHeigth].join(" "))
109
+ }
110
+ this.labelCanvas.setAttribute("viewBox", vb);
111
+ this.interactionOverlay.insertBefore(this.labelCanvas, this.interactionOverlay.firstChild);
112
+ return this;
113
+ }
114
+ /**
115
+ * Create label instances for elements already present in the score.
116
+ */
117
+ initLabels() {
118
+ this.labels = new Map();
119
+ this.vrvSVG.querySelectorAll(labelSelectors).forEach(el => {
120
+ var _a;
121
+ var className = labelClasses.filter(l => this.vrvSVG.querySelector("#" + el.id).classList.contains(l))[0];
122
+ var inputString = "";
123
+ switch (className) {
124
+ case "harm":
125
+ if (el.querySelector(".fb") !== null) {
126
+ this.currentMEI.querySelectorAll("#" + el.id + " f").forEach(f => {
127
+ inputString += " " + f.textContent;
128
+ });
129
+ inputString = inputString.trim();
130
+ }
131
+ else {
132
+ inputString = this.currentMEI.getElementById(el.id).textContent;
133
+ }
134
+ this.labels.set(el.id, new HarmonyLabel_1.default(inputString, el.id, this.currentMEI));
135
+ break;
136
+ case "tempo":
137
+ inputString = ((_a = Array.from(this.vrvSVG.querySelector("#" + el.id).querySelectorAll(".text")).filter(e => /\d+/.test(e.textContent))[0]) === null || _a === void 0 ? void 0 : _a.textContent.match(/\d+/).join("")) || "";
138
+ this.labels.set(el.id, new TempoLabel_1.default(inputString, el.id, this.currentMEI));
139
+ break;
140
+ }
141
+ });
142
+ }
143
+ setListeners() {
144
+ document.querySelectorAll(".sylTextRect").forEach(s => {
145
+ s.remove();
146
+ });
147
+ // isGlobal = false: Editor is not in harmony mode
148
+ if (!this.isGlobal) {
149
+ this.interactionOverlay.addEventListener("click", this.setHarmonyLabelHandlerClick, true);
150
+ this.interactionOverlay.addEventListener("mousemove", this.activateHarmonyHighlight);
151
+ this.interactionOverlay.addEventListener("keydown", this.closeModifyWindowHandler, true);
152
+ }
153
+ this.interactionOverlay.addEventListener("click", this.closeModifyWindowHandler);
154
+ document.addEventListener("keydown", this.setHarmonyLabelHandlerKey);
155
+ this.interactionOverlay.querySelectorAll(labelSelectors).forEach(h => {
156
+ h.addEventListener("mouseover", this.deactivateHarmonyHighlight);
157
+ h.addEventListener("mouseleave", this.activateHarmonyHighlight);
158
+ h.addEventListener("dblclick", this.modifyLabelHandler);
159
+ });
160
+ this.interactionOverlay.querySelectorAll(".harm, .label, .manipulator").forEach(h => h.addEventListener("click", (e) => {
161
+ e.stopImmediatePropagation();
162
+ e.stopPropagation();
163
+ })); // prevent inseerting notes, wenn cursor is over a harm symbol
164
+ return this;
165
+ }
166
+ removeListeners() {
167
+ this.interactionOverlay.removeEventListener("click", this.closeModifyWindowHandler);
168
+ this.interactionOverlay.removeEventListener("click", this.setHarmonyLabelHandlerClick);
169
+ document.removeEventListener("keydown", this.setHarmonyLabelHandlerKey);
170
+ this.interactionOverlay.removeEventListener("mousemove", this.activateHarmonyHighlight);
171
+ this.interactionOverlay.removeEventListener("keydown", this.closeModifyWindowHandler);
172
+ this.interactionOverlay.querySelectorAll(labelSelectors).forEach(h => {
173
+ h.removeEventListener("mouseenter", this.deactivateHarmonyHighlight);
174
+ h.removeEventListener("mouseleave", this.activateHarmonyHighlight);
175
+ h.removeEventListener("dblclick", this.modifyLabelHandler);
176
+ });
177
+ return this;
178
+ }
179
+ // HARMONY LABELS
180
+ /**
181
+ * Open Inputbox for (first) selected Note
182
+ */
183
+ harmonyLabelHandler(e) {
184
+ var nextNote = this.vrvSVG.querySelector(".note.marked, .chord.marked");
185
+ if (nextNote === null) {
186
+ return;
187
+ }
188
+ var nextNoteBBox = nextNote.getBoundingClientRect();
189
+ var staffBBox = nextNote.closest(".staff").getBoundingClientRect();
190
+ var canvasMatrix = this.labelCanvas.getScreenCTM().inverse();
191
+ var ptNoteLT = new DOMPoint(nextNoteBBox.left, nextNoteBBox.top);
192
+ ptNoteLT = ptNoteLT.matrixTransform(canvasMatrix);
193
+ var ptNoteRB = new DOMPoint(nextNoteBBox.right, nextNoteBBox.bottom);
194
+ ptNoteRB = ptNoteRB.matrixTransform(canvasMatrix);
195
+ var ptNoteWidth = Math.abs(ptNoteRB.x - ptNoteLT.x);
196
+ var ptNoteHeight = Math.abs(ptNoteRB.y - ptNoteLT.y);
197
+ var ptStaffLT = new DOMPoint(staffBBox.left, staffBBox.top);
198
+ ptStaffLT = ptStaffLT.matrixTransform(canvasMatrix);
199
+ var ptStaffRB = new DOMPoint(staffBBox.right, staffBBox.bottom);
200
+ ptStaffRB = ptStaffRB.matrixTransform(canvasMatrix);
201
+ var ptStaffWidth = Math.abs(ptStaffRB.x - ptStaffLT.x);
202
+ var ptStaffHeight = Math.abs(ptStaffRB.y - ptStaffLT.y);
203
+ var posx = ptNoteLT.x - ptNoteWidth / 2; //nextNoteBBox.left - nextNoteBBox.width/2 - window.scrollX - rootBBox.x - root.scrollLeft
204
+ var posy = ptStaffRB.y; //staffBBox.bottom - window.scrollY - rootBBox.y - root.scrollLeft
205
+ var tstamp = meiOperation.getElementTimestampById(nextNote.id, this.currentMEI);
206
+ var existsTstamp = Array.from(this.currentMEI.getElementById(nextNote.id).closest("measure").querySelectorAll("harm")).some(h => {
207
+ if (h.getAttribute("tstamp") !== null) {
208
+ return parseFloat(h.getAttribute("tstamp")) === tstamp;
209
+ }
210
+ else {
211
+ return false;
212
+ }
213
+ });
214
+ var hasStartId = this.currentMEI.querySelector("harm[startid=\"" + nextNote.id + "\"]") !== null;
215
+ var isEmptyLabelCanvas = !this.labelCanvas.hasChildNodes();
216
+ if (!hasStartId && isEmptyLabelCanvas && !existsTstamp) {
217
+ this.createInputBox(posx, posy, nextNote.id, "harm");
218
+ }
219
+ else if (!isEmptyLabelCanvas) {
220
+ this.closeModifyWindow();
221
+ }
222
+ }
223
+ setLabel(labelString, bboxId) {
224
+ var className = labelClasses.filter(l => this.vrvSVG.querySelector("#" + bboxId).classList.contains(l))[0];
225
+ var label;
226
+ switch (className) {
227
+ case "note":
228
+ case "chord":
229
+ case "harm":
230
+ label = new HarmonyLabel_1.default(labelString, bboxId, this.currentMEI);
231
+ break;
232
+ case "tempo":
233
+ label = new TempoLabel_1.default(labelString, bboxId, this.currentMEI);
234
+ break;
235
+ default:
236
+ return;
237
+ }
238
+ if (this.labels.get(label.getElement().id) == undefined) {
239
+ this.labels.set(label.getElement().id, label);
240
+ }
241
+ return label;
242
+ }
243
+ highlightNextHarmony(e, active = true) {
244
+ if (!active) {
245
+ return;
246
+ }
247
+ var pt = new DOMPoint(e.clientX, e.clientY);
248
+ var rootMatrix = this.labelCanvas.getScreenCTM().inverse();
249
+ pt = pt.matrixTransform(rootMatrix);
250
+ var posx = pt.x;
251
+ var posy = pt.y;
252
+ var nextNoteBBox = this.m2s.findScoreTarget(posx, posy);
253
+ if (nextNoteBBox == undefined) {
254
+ return;
255
+ }
256
+ var el = this.vrvSVG.querySelector("#" + nextNoteBBox.id);
257
+ if (el.closest(".chord") !== null) {
258
+ el = el.closest(".chord");
259
+ }
260
+ if (!el.classList.contains("marked")) {
261
+ this.vrvSVG.querySelectorAll(".marked").forEach(m => {
262
+ var _a;
263
+ m.classList.remove("marked");
264
+ (_a = this.interactionOverlay.querySelector("[refId=" + m.id + "]")) === null || _a === void 0 ? void 0 : _a.classList.remove("marked");
265
+ });
266
+ el.classList.add("marked");
267
+ }
268
+ }
269
+ /**
270
+ * modify existing label
271
+ * @param e
272
+ * @returns
273
+ */
274
+ modifyLabel(e) {
275
+ var _a, _b;
276
+ this.closeModifyWindow();
277
+ var target = e.target;
278
+ if (target.id === "") {
279
+ var refId = (_a = target.closest("[refId]")) === null || _a === void 0 ? void 0 : _a.getAttribute("refId");
280
+ if (refId === null)
281
+ return;
282
+ target = (_b = this.vrvSVG.querySelector("#" + refId)) === null || _b === void 0 ? void 0 : _b.closest(".harm");
283
+ }
284
+ target = target.closest(labelSelectors);
285
+ target.setAttribute("visibility", "hidden");
286
+ var targetBBox = target.getBoundingClientRect();
287
+ var pt = new DOMPoint(targetBBox.x, targetBBox.y);
288
+ var rootMatrix = this.labelCanvas.getScreenCTM().inverse();
289
+ pt = pt.matrixTransform(rootMatrix);
290
+ var posx = pt.x - 5;
291
+ var posy = pt.y - 5;
292
+ // prevent double input boxes for same Element
293
+ this.elementId = target.id;
294
+ if (this.container.querySelector("*[refElementId=\"" + target.id + "\"]") !== null) {
295
+ return;
296
+ }
297
+ var className = labelClasses.filter(l => target.classList.contains(l))[0]; //assume only one output, therefore alway return idx 0
298
+ this.createInputBox(posx, posy, target.id, className);
299
+ }
300
+ /**
301
+ * Close the modifier Window and make the hidden Element visible again
302
+ */
303
+ closeModifyWindow() {
304
+ try {
305
+ Array.from(this.labelCanvas.children).forEach(c => {
306
+ c === null || c === void 0 ? void 0 : c.remove();
307
+ });
308
+ }
309
+ catch (_a) { }
310
+ // clean MEI from empty harm Elements
311
+ this.currentMEI.querySelectorAll(labelClasses.join(",")).forEach(h => {
312
+ var _a;
313
+ if (h.id === "")
314
+ return;
315
+ (_a = this.container.querySelector("#" + h.id)) === null || _a === void 0 ? void 0 : _a.setAttribute("visibility", "visible");
316
+ });
317
+ }
318
+ /**
319
+ * Save label information in current MEI
320
+ */
321
+ submitLabel() {
322
+ var labelDiv = this.labelCanvas.getElementsByClassName("labelDiv")[0];
323
+ var text = labelDiv.textContent;
324
+ var refElementClass = labelClasses.filter(l => this.container.querySelector("#" + labelDiv.closest("g").getAttribute("refElementId")).classList.contains(l))[0]; // assume only one result
325
+ var label = this.labels.get(labelDiv.closest("g").getAttribute("refElementId"));
326
+ if (refElementClass === "harm") { // change existing harm
327
+ let harmLabel = label;
328
+ harmLabel.modifyLabel(text);
329
+ //this.currentMEI.getElementById(harmLabel.getElement().id).replaceWith(harmLabel.getElement())
330
+ }
331
+ else if (["note", "chord"].some(cn => refElementClass === cn)) { //create new harm
332
+ let harmLabel = this.setLabel(labelDiv.textContent, labelDiv.closest("g").getAttribute("refElementId"));
333
+ this.currentMEI.getElementById(harmLabel.getStartId()).closest("measure").append(harmLabel.getElement());
334
+ }
335
+ else if (refElementClass === "tempo") { // change existing tempo
336
+ var tempoLabel = label;
337
+ tempoLabel.modifyLabel(text);
338
+ }
339
+ this.closeModifyWindow();
340
+ meiOperation.cleanUp(this.currentMEI);
341
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
342
+ this.loadDataCallback("", mei, false).then(() => {
343
+ this.reset();
344
+ });
345
+ }
346
+ createInputBox(posx, posy, targetId, targetClass) {
347
+ var textGroup = document.createElementNS(constants_1.constants._SVGNS_, "g");
348
+ textGroup.setAttribute("id", random_1.uuidv4());
349
+ textGroup.setAttribute("refElementId", targetId);
350
+ var text = document.createElementNS(constants_1.constants._SVGNS_, "svg");
351
+ text.classList.add("labelText");
352
+ var textForeignObject = document.createElementNS(constants_1.constants._SVGNS_, "foreignObject");
353
+ textForeignObject.classList.add("labelFO");
354
+ var textDiv = document.createElement("div");
355
+ textDiv.setAttribute("contenteditable", "true");
356
+ switch (targetClass) {
357
+ case "harm":
358
+ if (this.labels.get(targetId) != undefined) {
359
+ var t = this.labels.get(targetId).getInput();
360
+ for (const [key, value] of mappings_1.unicodeToKey.entries()) {
361
+ t = t.replace(key, value);
362
+ }
363
+ textDiv.textContent = t;
364
+ }
365
+ else {
366
+ textDiv.textContent = "";
367
+ }
368
+ break;
369
+ case "tempo":
370
+ textDiv.textContent = Array.from(this.container.querySelector("#" + targetId).querySelectorAll(".text")).filter(el => /\d+/.test(el.textContent))[0].textContent.match(/\d+/).join("") || "";
371
+ break;
372
+ default:
373
+ return;
374
+ }
375
+ textDiv.classList.add("labelDiv");
376
+ text.append(textForeignObject);
377
+ this.container.appendChild(textDiv);
378
+ var rectPadding = 5;
379
+ text.setAttribute("x", (posx + rectPadding).toString());
380
+ text.setAttribute("y", (posy).toString());
381
+ textForeignObject.setAttribute("x", "0");
382
+ textForeignObject.setAttribute("y", "0");
383
+ textForeignObject.setAttribute("height", "1000"); //(textDiv.clientHeight + 2 * rectPadding).toString())
384
+ textForeignObject.setAttribute("width", "1000"); //(textDiv.clientHeight + 2 * rectPadding).toString())
385
+ this.labelCanvas.appendChild(textGroup);
386
+ textGroup.appendChild(text);
387
+ textForeignObject.appendChild(textDiv);
388
+ // Special Listeners while Editing Harmonies
389
+ var that = this;
390
+ textDiv.addEventListener("focus", function () {
391
+ that.removeListeners();
392
+ that.musicPlayer.removePlayListener();
393
+ });
394
+ textDiv.addEventListener("blur", function () {
395
+ textDiv.dispatchEvent(new KeyboardEvent("keydown", { "key": "Enter" })); // trigger submitLabel when bluring
396
+ that.setListeners();
397
+ that.musicPlayer.setPlayListener();
398
+ });
399
+ textDiv.addEventListener("keydown", this.submitLabelHandler);
400
+ textDiv.addEventListener("keydown", this.typeLabelHandler);
401
+ textDiv.focus();
402
+ }
403
+ getTimestamp(note) {
404
+ var layer = note.closest("layer");
405
+ var elements = Array.from(layer.querySelectorAll("*[dur]"));
406
+ elements = elements.filter((v, i) => i <= elements.indexOf(note));
407
+ var tstamp = 0;
408
+ elements.forEach(e => {
409
+ var dur = parseInt(e.getAttribute("dur"));
410
+ tstamp += 4 / dur;
411
+ var dots = e.getAttribute("dots");
412
+ var add = dur;
413
+ if (dots !== null) {
414
+ for (var i = 0; i < parseInt(dots); i++) {
415
+ add = add / 2;
416
+ tstamp += add;
417
+ }
418
+ }
419
+ });
420
+ return tstamp;
421
+ }
422
+ reset() {
423
+ this.setContainerId(this.containerId);
424
+ this.addCanvas();
425
+ this.initLabels();
426
+ this.removeListeners();
427
+ this.setListeners();
428
+ return this;
429
+ }
430
+ setm2s(m2s) {
431
+ this.m2s = m2s;
432
+ return this;
433
+ }
434
+ setCurrentMEI(mei) {
435
+ this.currentMEI = mei;
436
+ return this;
437
+ }
438
+ setMusicProcessor(musicPlayer) {
439
+ this.musicPlayer = musicPlayer;
440
+ return this;
441
+ }
442
+ setGlobal(global) {
443
+ this.isGlobal = global;
444
+ return this;
445
+ }
446
+ getGlobal() {
447
+ return this.isGlobal;
448
+ }
449
+ setLoadDataCallback(loadDataCallback) {
450
+ this.loadDataCallback = loadDataCallback;
451
+ return this;
452
+ }
453
+ setContainerId(id) {
454
+ this.containerId = id;
455
+ this.container = document.getElementById(id);
456
+ this.vrvSVG = cq.getVrvSVG(id);
457
+ this.interactionOverlay = cq.getInteractOverlay(id);
458
+ return this;
459
+ }
460
+ }
461
+ exports.default = LabelHandler;