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,297 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("../constants");
4
+ const meiConverter = require("../utils/MEIConverter");
5
+ const meiOperation = require("../utils/MEIOperations");
6
+ const cq = require("../utils/convenienceQueries");
7
+ const modSelector = ".slur, .tie, .accid, .artic, .tupletNum, .tupletBracket";
8
+ /**
9
+ * Handler for all options which could modulate the given score. These functions are related to all buttons in the sidebar and toolbar
10
+ */
11
+ class CustomToolbarHandler {
12
+ constructor(containerId) {
13
+ this.resetListenerFunction = (function resetListenerFunction(e) {
14
+ e.preventDefault();
15
+ this.resetListeners();
16
+ }).bind(this);
17
+ this.createTupletFunction = (function createTupletFunction(e) {
18
+ e.preventDefault();
19
+ this.createTuplet(e);
20
+ }).bind(this);
21
+ /** Wrapperfunction for Eventslistener */
22
+ this.connectNotesFunction = (function connectNotesFunction(e) {
23
+ e.preventDefault();
24
+ this.connectNotes(e);
25
+ }).bind(this);
26
+ /** Wrapperfunction for Eventslistener */
27
+ this.organizeBeamsFunction = (function organizeBeamsFunction(e) {
28
+ e.preventDefault();
29
+ this.organizeBeams(e);
30
+ }).bind(this);
31
+ this.alterFunction = (function alterFunction(e) {
32
+ e.preventDefault();
33
+ e.stopPropagation();
34
+ this.alterNotes(e);
35
+ }).bind(this);
36
+ this.articulationHandlerFunction = (function articulationHandlerFunction(e) {
37
+ e.preventDefault();
38
+ this.articulationHandler(e);
39
+ }).bind(this);
40
+ this.setContainerId(containerId);
41
+ this.tupletButton = this.container.querySelector("#tupletBtn");
42
+ this.tieNotesButton = this.container.querySelector("#tieNotes");
43
+ this.organizeBeamsButton = this.container.querySelector("#organizeBeams");
44
+ var a = this.alterUpButton = this.container.querySelector("#alterUp");
45
+ var b = this.alterDownButton = this.container.querySelector("#alterDown");
46
+ var c = this.alterNeutralButton = this.container.querySelector("#alterNeutral");
47
+ var d = this.alterDUpButton = this.container.querySelector("#alterDUp");
48
+ var e = this.alterDDownButton = this.container.querySelector("#alterDDown");
49
+ this.alterButtons = [a, b, c, d, e];
50
+ this.articButtons = new Array();
51
+ this.tabButtons = Array.from(this.container.querySelectorAll(".tabBtn"));
52
+ }
53
+ setListeners() {
54
+ this.tabButtons.forEach(tb => {
55
+ tb.addEventListener("click", this.resetListenerFunction);
56
+ });
57
+ this.tupletButton.addEventListener("click", this.createTupletFunction);
58
+ this.tieNotesButton.addEventListener("click", this.connectNotesFunction);
59
+ this.organizeBeamsButton.addEventListener("click", this.organizeBeamsFunction);
60
+ this.alterButtons.forEach(ab => {
61
+ ab.addEventListener("click", this.alterFunction);
62
+ });
63
+ if (this.articButtons.length === 0) {
64
+ cq.getContainer(this.containerId).querySelectorAll("#articGroup .btn").forEach(btn => this.articButtons.push(btn));
65
+ }
66
+ this.articButtons.forEach(ab => {
67
+ ab.addEventListener("click", this.articulationHandlerFunction);
68
+ });
69
+ this.makeScoreElementsClickable();
70
+ }
71
+ removeListeners() {
72
+ this.tabButtons.forEach(tb => {
73
+ tb.removeEventListener("click", this.resetListenerFunction);
74
+ });
75
+ this.tupletButton.removeEventListener("click", this.createTupletFunction);
76
+ this.tieNotesButton.removeEventListener("click", this.connectNotesFunction);
77
+ this.organizeBeamsButton.removeEventListener("click", this.organizeBeamsFunction);
78
+ this.alterButtons.forEach(ab => {
79
+ ab.removeEventListener("click", this.alterFunction);
80
+ });
81
+ this.articButtons.forEach(ab => {
82
+ ab.removeEventListener("click", this.articulationHandlerFunction);
83
+ });
84
+ }
85
+ resetListeners() {
86
+ this.removeListeners();
87
+ this.setListeners();
88
+ return this;
89
+ }
90
+ createTuplet(e) {
91
+ var meiElements = Array.from(cq.getContainer(this.containerId).querySelectorAll(".marked")).map(m => {
92
+ if (this.currentMEI.querySelector("#" + m.id) !== null) {
93
+ return this.currentMEI.querySelector("#" + m.id);
94
+ }
95
+ });
96
+ meiOperation.createTuplet(meiElements, this.currentMEI);
97
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
98
+ this.loadDataCallback("", mei, false);
99
+ }
100
+ /**
101
+ * Make slur or tie for 2 or more elements when tie button is clicked
102
+ * Tie, only when there are two selected elemets which are the same pitch
103
+ * Delete otherwise
104
+ * @param e
105
+ */
106
+ connectNotes(e) {
107
+ var markedElements = Array.from(this.vrvSVG.querySelectorAll(".note.marked"));
108
+ markedElements = markedElements.filter(me => me.closest(".layer").getAttribute("n") === markedElements[0].closest(".layer").getAttribute("n"));
109
+ if (markedElements.length <= 1) {
110
+ return;
111
+ }
112
+ var makeSlur = markedElements.length > 2 ? "slur" : "tie";
113
+ //if(!makeSlur && markedElements.length > 1){ // assert only 2 items
114
+ var leftId = markedElements[0].id;
115
+ var rightId = markedElements.reverse()[0].id;
116
+ var leftMeiElement = this.currentMEI.getElementById(leftId);
117
+ var rightMeiElement = this.currentMEI.getElementById(rightId);
118
+ meiOperation.connectNotes(leftMeiElement, rightMeiElement, makeSlur);
119
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
120
+ this.loadDataCallback("", mei, false);
121
+ }
122
+ /**
123
+ * Pack selected elements in own beam element. Only for dur > 4
124
+ * @param e
125
+ */
126
+ organizeBeams(e) {
127
+ var markedElements = Array.from(this.vrvSVG.querySelectorAll(".marked")); // (".note.marked, .chord.marked"))
128
+ markedElements = markedElements.filter(me => {
129
+ var isInLayer = me.closest(".layer").getAttribute("n") === markedElements[0].closest(".layer").getAttribute("n");
130
+ var hasDur = this.currentMEI.getElementById(me.id) !== null ? this.currentMEI.getElementById(me.id).getAttribute("dur") !== null : false;
131
+ return isInLayer && hasDur;
132
+ });
133
+ if (markedElements.length === 0) {
134
+ return;
135
+ }
136
+ var haveRightDur = markedElements.filter(me => {
137
+ var _a;
138
+ var dur = (_a = this.currentMEI.getElementById(me.id)) === null || _a === void 0 ? void 0 : _a.getAttribute("dur");
139
+ return parseInt(dur) > 4;
140
+ }).length >= 2;
141
+ if (haveRightDur) {
142
+ var firstMeiElement = this.currentMEI.getElementById(markedElements[0].id);
143
+ var newBeam = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "beam");
144
+ var oldBeam = firstMeiElement.closest("beam");
145
+ firstMeiElement.parentElement.insertBefore(newBeam, firstMeiElement);
146
+ markedElements.forEach(me => {
147
+ newBeam.append(this.currentMEI.getElementById(me.id));
148
+ });
149
+ if (oldBeam !== null && oldBeam.childElementCount > 1) {
150
+ var beamCandidates = new Array();
151
+ var bc;
152
+ oldBeam.querySelectorAll(":scope > *").forEach(cn => {
153
+ if (cn.tagName.toLowerCase() === "beam") {
154
+ if (beamCandidates.length > 0) {
155
+ if (beamCandidates.length === 1) {
156
+ bc = beamCandidates[0];
157
+ }
158
+ else if (beamCandidates.length > 1) {
159
+ bc = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "beam");
160
+ beamCandidates.forEach(b => bc.append(b));
161
+ }
162
+ oldBeam.parentElement.insertBefore(bc, oldBeam);
163
+ beamCandidates = new Array();
164
+ }
165
+ oldBeam.parentElement.insertBefore(cn, oldBeam);
166
+ }
167
+ else {
168
+ beamCandidates.push(cn);
169
+ }
170
+ });
171
+ if (beamCandidates.length > 0) { // if array is still full after loop
172
+ if (beamCandidates.length === 1) {
173
+ bc = beamCandidates[0];
174
+ }
175
+ else if (beamCandidates.length > 1) {
176
+ bc = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "beam");
177
+ beamCandidates.forEach(b => bc.append(b));
178
+ }
179
+ oldBeam.parentElement.insertBefore(bc, oldBeam);
180
+ }
181
+ }
182
+ else if ((oldBeam === null || oldBeam === void 0 ? void 0 : oldBeam.childElementCount) === 1) {
183
+ if (oldBeam.firstElementChild.tagName.toLowerCase() === "beam") {
184
+ Array.from(oldBeam.firstElementChild.children).forEach(c => {
185
+ oldBeam.parentElement.insertBefore(c, oldBeam);
186
+ });
187
+ }
188
+ else {
189
+ oldBeam.parentElement.insertBefore(oldBeam.firstElementChild, oldBeam);
190
+ }
191
+ oldBeam.remove();
192
+ }
193
+ meiOperation.cleanUp(this.currentMEI);
194
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
195
+ this.loadDataCallback("", mei, false);
196
+ }
197
+ }
198
+ /**
199
+ * Alter Notes (accid) according to button.
200
+ * @param e
201
+ * @returns
202
+ */
203
+ alterNotes(e) {
204
+ var target = e.target;
205
+ var accidSig;
206
+ switch (target.id) {
207
+ case "alterUp":
208
+ accidSig = "s";
209
+ break;
210
+ case "alterDown":
211
+ accidSig = "f";
212
+ break;
213
+ case "alterDUp":
214
+ accidSig = "ss";
215
+ break;
216
+ case "alterDDown":
217
+ accidSig = "ff";
218
+ break;
219
+ case "alterNeutral":
220
+ accidSig = "n";
221
+ break;
222
+ default:
223
+ console.error(target.id, "No such option for accid alteration");
224
+ return;
225
+ }
226
+ this.vrvSVG.querySelectorAll(".note.marked").forEach(nm => {
227
+ var meiElement = this.currentMEI.getElementById(nm.id);
228
+ meiElement.setAttribute("accid", accidSig);
229
+ meiElement.removeAttribute("accid.ges");
230
+ });
231
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
232
+ meiOperation.adjustAccids(mei);
233
+ this.loadDataCallback("", mei, false);
234
+ }
235
+ /**
236
+ * Make Score Elements Clickable (and mark them), which are important for functions in the modulation toolbar group
237
+ * @returns this
238
+ */
239
+ makeScoreElementsClickable() {
240
+ var that = this;
241
+ cq.getInteractOverlay(this.containerId).querySelectorAll(modSelector).forEach(c => {
242
+ if (c.classList.contains("tuplet"))
243
+ console.log(c);
244
+ c.addEventListener("click", function (e) {
245
+ e.preventDefault();
246
+ e.stopImmediatePropagation();
247
+ that.vrvSVG.querySelectorAll(modSelector).forEach(c => c.classList.remove("marked"));
248
+ var originSVG = that.vrvSVG.querySelector("#" + this.getAttribute("refId"));
249
+ if (originSVG.classList.contains("marked")) {
250
+ originSVG.classList.remove("marked");
251
+ }
252
+ else {
253
+ originSVG.classList.add("marked");
254
+ }
255
+ });
256
+ });
257
+ }
258
+ articulationHandler(e) {
259
+ var target = e.target;
260
+ var articulation = target.id.replace("Btn", "");
261
+ var artic;
262
+ switch (articulation) {
263
+ case "accent":
264
+ artic = "acc";
265
+ break;
266
+ case "tenuto":
267
+ artic = "ten";
268
+ break;
269
+ case "marcato":
270
+ artic = "marc";
271
+ break;
272
+ case "staccato":
273
+ artic = "stacc";
274
+ break;
275
+ }
276
+ meiOperation.setArticulation(this.currentMEI, artic);
277
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
278
+ this.loadDataCallback("", mei, false);
279
+ }
280
+ //GETTER/ SETTER
281
+ setCurrentMEI(mei) {
282
+ this.currentMEI = mei;
283
+ return this;
284
+ }
285
+ setLoadDataCallback(loadDataCallback) {
286
+ this.loadDataCallback = loadDataCallback;
287
+ return this;
288
+ }
289
+ setContainerId(containerId) {
290
+ this.containerId = containerId;
291
+ this.interactionOverlay = cq.getInteractOverlay(containerId);
292
+ this.vrvSVG = cq.getVrvSVG(containerId);
293
+ this.container = document.getElementById(containerId);
294
+ return this;
295
+ }
296
+ }
297
+ exports.default = CustomToolbarHandler;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cq = require("../utils/convenienceQueries");
4
+ const action = "mousedown";
5
+ class DeleteHandler {
6
+ constructor(containerId) {
7
+ this.primaryDeleteFlag = "marked";
8
+ this.secondaryDeleteFlag = "lastAdded";
9
+ this.clickHandler = (function clickHandler(e) {
10
+ var target = e.target;
11
+ target = target.closest(".note");
12
+ let stem = target.querySelector(".stem");
13
+ if (!target.classList.contains(this.primaryDeleteFlag)) {
14
+ target.classList.add(this.primaryDeleteFlag);
15
+ if (stem !== null) {
16
+ stem.classList.add(this.primaryDeleteFlag);
17
+ }
18
+ }
19
+ else {
20
+ target.classList.remove(this.primaryDeleteFlag);
21
+ if (stem !== null) {
22
+ stem.classList.remove(this.primaryDeleteFlag);
23
+ }
24
+ }
25
+ }).bind(this);
26
+ /**
27
+ * Delete all Elements which are marked
28
+ */
29
+ this.backSpaceHandler = (function backSpaceHandler(e) {
30
+ if (!cq.hasActiveElement(this.containerId))
31
+ return;
32
+ if (e.code !== "Backspace")
33
+ return;
34
+ var hasRests = false;
35
+ var hasNotes = false;
36
+ if (cq.getVrvSVG(this.containerId).querySelectorAll("." + this.primaryDeleteFlag + ".rest, ." + this.secondaryDeleteFlag + ".rest").length > 0) {
37
+ hasRests = true;
38
+ }
39
+ if (cq.getVrvSVG(this.containerId).querySelectorAll("." + this.primaryDeleteFlag + ":not(.rest), ." + this.secondaryDeleteFlag + ":not(.rest)").length > 0) {
40
+ hasNotes = true;
41
+ }
42
+ Array.from(cq.getVrvSVG(this.containerId).querySelectorAll("." + this.primaryDeleteFlag + ", ." + this.secondaryDeleteFlag)).forEach(el => {
43
+ if (hasNotes && hasRests) {
44
+ if (!el.classList.contains("rest")) {
45
+ this.selectedElements.push(el);
46
+ }
47
+ }
48
+ else {
49
+ this.selectedElements.push(el);
50
+ }
51
+ });
52
+ if ((e.code === "Backspace" || e.code === "Delete") && this.selectedElements.length > 0 && this.container.querySelectorAll(".harmonyDiv").length === 0) {
53
+ this.deleteCallback(this.selectedElements).then(() => {
54
+ this.selectedElements.length = 0;
55
+ cq.getVrvSVG(this.containerId).querySelectorAll("." + this.primaryDeleteFlag + ", ." + this.secondaryDeleteFlag).forEach(el => {
56
+ el.classList.remove(this.primaryDeleteFlag);
57
+ el.classList.remove(this.secondaryDeleteFlag);
58
+ });
59
+ });
60
+ }
61
+ }).bind(this);
62
+ this.setContainerId(containerId);
63
+ }
64
+ setListeners() {
65
+ // Listenere for whole SVG (maybe just layer?)
66
+ var notes = this.vrvSVG.querySelectorAll(".note");
67
+ Array.from(notes).forEach(element => {
68
+ element.addEventListener(action, this.clickHandler);
69
+ });
70
+ document.addEventListener("keyup", this.backSpaceHandler);
71
+ }
72
+ removeListeners() {
73
+ var notes = this.vrvSVG.querySelectorAll(".note");
74
+ Array.from(notes).forEach(element => {
75
+ element.removeEventListener(action, this.clickHandler);
76
+ });
77
+ document.removeEventListener("keyup", this.backSpaceHandler);
78
+ }
79
+ update() {
80
+ this.selectedElements = new Array;
81
+ this.setContainerId(this.containerId);
82
+ this.removeListeners();
83
+ this.setListeners();
84
+ return this;
85
+ }
86
+ /////////// GETTER/ SETTER ////////////
87
+ setDeleteCallback(deleteCallback) {
88
+ this.deleteCallback = deleteCallback;
89
+ return this;
90
+ }
91
+ setContainerId(containerId) {
92
+ this.containerId = containerId;
93
+ this.container = cq.getContainer(containerId);
94
+ this.vrvSVG = cq.getVrvSVG(containerId);
95
+ this.interactionOverlay = cq.getInteractOverlay(containerId);
96
+ return this;
97
+ }
98
+ getDeleteFlag() {
99
+ return this.primaryDeleteFlag;
100
+ }
101
+ }
102
+ exports.default = DeleteHandler;