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,311 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("../constants");
4
+ const random_1 = require("../utils/random");
5
+ const meiConverter = require("../utils/MEIConverter");
6
+ const meiOperation = require("../utils/MEIOperations");
7
+ const cq = require("../utils/convenienceQueries");
8
+ const modSelector = ".slur, .tie, .accid";
9
+ /**
10
+ * Handler for all options which could modulate the given score. These functions are related to all buttons in the sidebar and toolbar
11
+ */
12
+ class ModHandler {
13
+ constructor(containerId) {
14
+ this.resetListenerFunction = (function resetListenerFunction(e) {
15
+ e.preventDefault();
16
+ this.resetListeners();
17
+ }).bind(this);
18
+ /** Wrapperfunction for Eventslistener */
19
+ this.connectNotesFunction = (function connectNotesFunction(e) {
20
+ e.preventDefault();
21
+ this.connectNotes(e);
22
+ }).bind(this);
23
+ /** Wrapperfunction for Eventslistener */
24
+ this.organizeBeamsFunction = (function organizeBeamsFunction(e) {
25
+ e.preventDefault();
26
+ this.organizeBeams(e);
27
+ }).bind(this);
28
+ this.alterFunction = (function alterFunction(e) {
29
+ e.preventDefault();
30
+ e.stopPropagation();
31
+ this.alterNotes(e);
32
+ }).bind(this);
33
+ this.articulationHandlerFunction = (function articulationHandlerFunction(e) {
34
+ e.preventDefault();
35
+ this.articulationHandler(e);
36
+ }).bind(this);
37
+ this.setContainerId(containerId);
38
+ this.tieNotesButton = this.container.querySelector("#tieNotes");
39
+ this.organizeBeamsButton = this.container.querySelector("#organizeBeams");
40
+ var a = this.alterUpButton = this.container.querySelector("#alterUp");
41
+ var b = this.alterDownButton = this.container.querySelector("#alterDown");
42
+ var c = this.alterNeutralButton = this.container.querySelector("#alterNeutral");
43
+ var d = this.alterDUpButton = this.container.querySelector("#alterDUp");
44
+ var e = this.alterDDownButton = this.container.querySelector("#alterDDown");
45
+ this.alterButtons = [a, b, c, d, e];
46
+ this.articButtons = new Array();
47
+ this.tabButtons = Array.from(this.container.querySelectorAll(".tabBtn"));
48
+ }
49
+ setListeners() {
50
+ this.tabButtons.forEach(tb => {
51
+ tb.addEventListener("click", this.resetListenerFunction);
52
+ });
53
+ this.tieNotesButton.addEventListener("click", this.connectNotesFunction);
54
+ this.organizeBeamsButton.addEventListener("click", this.organizeBeamsFunction);
55
+ this.alterButtons.forEach(ab => {
56
+ ab.addEventListener("click", this.alterFunction);
57
+ });
58
+ if (this.articButtons.length === 0) {
59
+ cq.getContainer(this.containerId).querySelectorAll("#articGroup .btn").forEach(btn => this.articButtons.push(btn));
60
+ }
61
+ this.articButtons.forEach(ab => {
62
+ ab.addEventListener("click", this.articulationHandlerFunction);
63
+ });
64
+ this.makeScoreElementsClickable();
65
+ }
66
+ removeListeners() {
67
+ this.tabButtons.forEach(tb => {
68
+ tb.removeEventListener("click", this.resetListenerFunction);
69
+ });
70
+ this.tieNotesButton.removeEventListener("click", this.connectNotesFunction);
71
+ this.organizeBeamsButton.removeEventListener("click", this.organizeBeamsFunction);
72
+ this.alterButtons.forEach(ab => {
73
+ ab.removeEventListener("click", this.alterFunction);
74
+ });
75
+ this.articButtons.forEach(ab => {
76
+ ab.removeEventListener("click", this.articulationHandlerFunction);
77
+ });
78
+ }
79
+ resetListeners() {
80
+ this.removeListeners();
81
+ this.setListeners();
82
+ return this;
83
+ }
84
+ /**
85
+ * Make slur or tie for 2 or more elements when tie button is clicked
86
+ * Tie, only when there are two selected elemets which are the same pitch
87
+ * Delete otherwise
88
+ * @param e
89
+ */
90
+ connectNotes(e) {
91
+ var markedElements = Array.from(this.vrvSVG.querySelectorAll(".note.marked"));
92
+ markedElements = markedElements.filter(me => me.closest(".layer").getAttribute("n") === markedElements[0].closest(".layer").getAttribute("n"));
93
+ if (markedElements.length <= 1) {
94
+ return;
95
+ }
96
+ var makeSlur = markedElements.length > 2;
97
+ //if(!makeSlur && markedElements.length > 1){ // assert only 2 items
98
+ var leftId = markedElements[0].id;
99
+ var rightId = markedElements.reverse()[0].id;
100
+ var leftMeiElement = this.currentMEI.getElementById(leftId);
101
+ var rightMeiElement = this.currentMEI.getElementById(rightId);
102
+ var leftpname = leftMeiElement.getAttribute("pname");
103
+ var leftoct = leftMeiElement.getAttribute("oct");
104
+ var leftAccid = leftMeiElement.getAttribute("accid") || leftMeiElement.getAttribute("accid.ges");
105
+ var rightpname = rightMeiElement.getAttribute("pname");
106
+ var rightoct = rightMeiElement.getAttribute("oct");
107
+ var rightAccid = rightMeiElement.getAttribute("accid") || rightMeiElement.getAttribute("accid.ges");
108
+ if (!(leftpname === rightpname && leftoct === rightoct && leftAccid === rightAccid)) {
109
+ makeSlur = true;
110
+ }
111
+ //}
112
+ var connections = this.currentMEI.querySelectorAll("tie, slur");
113
+ var deleted = false;
114
+ connections.forEach(c => {
115
+ var sid = c.getAttribute("startid").replace("#", "");
116
+ var eid = c.getAttribute("endid").replace("#", "");
117
+ if (sid === leftId && eid === rightId) {
118
+ c.remove();
119
+ deleted = true;
120
+ }
121
+ });
122
+ if (!deleted) {
123
+ var tieElement;
124
+ if (makeSlur) {
125
+ tieElement = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "slur");
126
+ }
127
+ else {
128
+ tieElement = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "tie");
129
+ }
130
+ tieElement.setAttribute("startid", "#" + leftId);
131
+ tieElement.setAttribute("endid", "#" + rightId);
132
+ tieElement.setAttribute("id", random_1.uuidv4());
133
+ this.currentMEI.getElementById(leftId).closest("measure").append(tieElement);
134
+ }
135
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
136
+ this.loadDataCallback("", mei, false);
137
+ }
138
+ /**
139
+ * Pack selected elements in own beam element. Only for dur > 4
140
+ * @param e
141
+ */
142
+ organizeBeams(e) {
143
+ var markedElements = Array.from(this.vrvSVG.querySelectorAll(".marked")); // (".note.marked, .chord.marked"))
144
+ markedElements = markedElements.filter(me => {
145
+ var isInLayer = me.closest(".layer").getAttribute("n") === markedElements[0].closest(".layer").getAttribute("n");
146
+ var hasDur = this.currentMEI.getElementById(me.id) !== null ? this.currentMEI.getElementById(me.id).getAttribute("dur") !== null : false;
147
+ return isInLayer && hasDur;
148
+ });
149
+ if (markedElements.length === 0) {
150
+ return;
151
+ }
152
+ var haveRightDur = markedElements.filter(me => {
153
+ var _a;
154
+ var dur = (_a = this.currentMEI.getElementById(me.id)) === null || _a === void 0 ? void 0 : _a.getAttribute("dur");
155
+ return parseInt(dur) > 4;
156
+ }).length >= 2;
157
+ if (haveRightDur) {
158
+ var firstMeiElement = this.currentMEI.getElementById(markedElements[0].id);
159
+ var newBeam = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "beam");
160
+ var oldBeam = firstMeiElement.closest("beam");
161
+ firstMeiElement.parentElement.insertBefore(newBeam, firstMeiElement);
162
+ markedElements.forEach(me => {
163
+ newBeam.append(this.currentMEI.getElementById(me.id));
164
+ });
165
+ if (oldBeam !== null && oldBeam.childElementCount > 1) {
166
+ var beamCandidates = new Array();
167
+ var bc;
168
+ oldBeam.querySelectorAll(":scope > *").forEach(cn => {
169
+ if (cn.tagName.toLowerCase() === "beam") {
170
+ if (beamCandidates.length > 0) {
171
+ if (beamCandidates.length === 1) {
172
+ bc = beamCandidates[0];
173
+ }
174
+ else if (beamCandidates.length > 1) {
175
+ bc = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "beam");
176
+ beamCandidates.forEach(b => bc.append(b));
177
+ }
178
+ oldBeam.parentElement.insertBefore(bc, oldBeam);
179
+ beamCandidates = new Array();
180
+ }
181
+ oldBeam.parentElement.insertBefore(cn, oldBeam);
182
+ }
183
+ else {
184
+ beamCandidates.push(cn);
185
+ }
186
+ });
187
+ if (beamCandidates.length > 0) { // if array is still full after loop
188
+ if (beamCandidates.length === 1) {
189
+ bc = beamCandidates[0];
190
+ }
191
+ else if (beamCandidates.length > 1) {
192
+ bc = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "beam");
193
+ beamCandidates.forEach(b => bc.append(b));
194
+ }
195
+ oldBeam.parentElement.insertBefore(bc, oldBeam);
196
+ }
197
+ }
198
+ else if ((oldBeam === null || oldBeam === void 0 ? void 0 : oldBeam.childElementCount) === 1) {
199
+ if (oldBeam.firstElementChild.tagName.toLowerCase() === "beam") {
200
+ Array.from(oldBeam.firstElementChild.children).forEach(c => {
201
+ oldBeam.parentElement.insertBefore(c, oldBeam);
202
+ });
203
+ }
204
+ else {
205
+ oldBeam.parentElement.insertBefore(oldBeam.firstElementChild, oldBeam);
206
+ }
207
+ oldBeam.remove();
208
+ }
209
+ meiOperation.cleanUp(this.currentMEI);
210
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
211
+ this.loadDataCallback("", mei, false);
212
+ }
213
+ }
214
+ /**
215
+ * Alter Notes (accid) according to button.
216
+ * @param e
217
+ * @returns
218
+ */
219
+ alterNotes(e) {
220
+ var target = e.target;
221
+ var accidSig;
222
+ switch (target.id) {
223
+ case "alterUp":
224
+ accidSig = "s";
225
+ break;
226
+ case "alterDown":
227
+ accidSig = "f";
228
+ break;
229
+ case "alterDUp":
230
+ accidSig = "ss";
231
+ break;
232
+ case "alterDDown":
233
+ accidSig = "ff";
234
+ break;
235
+ case "alterNeutral":
236
+ accidSig = "n";
237
+ break;
238
+ default:
239
+ console.error(target.id, "No such option for accid alteration");
240
+ return;
241
+ }
242
+ this.vrvSVG.querySelectorAll(".note.marked").forEach(nm => {
243
+ var meiElement = this.currentMEI.getElementById(nm.id);
244
+ meiElement.setAttribute("accid", accidSig);
245
+ meiElement.removeAttribute("accid.ges");
246
+ });
247
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
248
+ meiOperation.adjustAccids(mei);
249
+ this.loadDataCallback("", mei, false);
250
+ }
251
+ /**
252
+ * Make Score Elements Clickable (and mark them), which are important for functions in the modulation toolbar group
253
+ * @returns this
254
+ */
255
+ makeScoreElementsClickable() {
256
+ var that = this;
257
+ cq.getInteractOverlay(this.containerId).querySelectorAll(modSelector).forEach(c => {
258
+ c.addEventListener("click", function (e) {
259
+ e.preventDefault();
260
+ e.stopImmediatePropagation();
261
+ that.vrvSVG.querySelectorAll(modSelector).forEach(c => c.classList.remove("marked"));
262
+ var originSVG = that.vrvSVG.querySelector("#" + this.getAttribute("refId"));
263
+ if (originSVG.classList.contains("marked")) {
264
+ originSVG.classList.remove("marked");
265
+ }
266
+ else {
267
+ originSVG.classList.add("marked");
268
+ }
269
+ });
270
+ });
271
+ }
272
+ articulationHandler(e) {
273
+ var target = e.target;
274
+ var articulation = target.id.replace("Btn", "");
275
+ var artic;
276
+ switch (articulation) {
277
+ case "accent":
278
+ artic = "acc";
279
+ break;
280
+ case "tenuto":
281
+ artic = "ten";
282
+ break;
283
+ case "marcato":
284
+ artic = "marc";
285
+ break;
286
+ case "staccato":
287
+ artic = "stacc";
288
+ break;
289
+ }
290
+ meiOperation.setArticulation(this.currentMEI, artic);
291
+ var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
292
+ this.loadDataCallback("", mei, false);
293
+ }
294
+ //GETTER/ SETTER
295
+ setCurrentMEI(mei) {
296
+ this.currentMEI = mei;
297
+ return this;
298
+ }
299
+ setLoadDataCallback(loadDataCallback) {
300
+ this.loadDataCallback = loadDataCallback;
301
+ return this;
302
+ }
303
+ setContainerId(containerId) {
304
+ this.containerId = containerId;
305
+ this.interactionOverlay = cq.getInteractOverlay(containerId);
306
+ this.vrvSVG = cq.getVrvSVG(containerId);
307
+ this.container = document.getElementById(containerId);
308
+ return this;
309
+ }
310
+ }
311
+ exports.default = ModHandler;
@@ -0,0 +1,148 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const MeasureMatrix_1 = require("../datastructures/MeasureMatrix");
3
+ const d3 = require("d3");
4
+ const coordinates = require("../utils/coordinates");
5
+ const cq = require("../utils/convenienceQueries");
6
+ //@ts-ignore
7
+ //const $ = H5P.jQuery;
8
+ /**
9
+ * Class that handles insert mode, events, and actions.
10
+ */
11
+ class NoteDragHandler {
12
+ constructor(containerId) {
13
+ this.wasDragged = false;
14
+ this.setContainerId(containerId);
15
+ this.dragInit();
16
+ this.noteDraggedEvent = new Event("noteDragged");
17
+ }
18
+ setListeners() {
19
+ }
20
+ removeListeners() {
21
+ }
22
+ resetListeners() {
23
+ this.removeListeners();
24
+ this.setListeners();
25
+ }
26
+ /**
27
+ * Initialize the dragging action and handler for selected elements.
28
+ */
29
+ dragInit() {
30
+ // Adding listeners
31
+ const dragBehaviour = d3.drag()
32
+ .on('start', dragStarted.bind(this))
33
+ .on('drag', this.dragging.bind(this))
34
+ .on('end', this.dragEnded.bind(this));
35
+ this.notes = document.querySelectorAll(".note, .notehead"); //d3.select("#" + this.containerId).selectAll(".note, .notehead");
36
+ this.draggedOverlayElement = null;
37
+ this.notes.call(dragBehaviour);
38
+ // Drag effects
39
+ function dragStarted() {
40
+ var _a;
41
+ this.draggedOverlayElement = d3.event.sourceEvent.currentTarget;
42
+ this.draggedRootSVGElement = (_a = this.rootSVG.querySelector("#" + this.draggedOverlayElement.getAttribute("refId"))) === null || _a === void 0 ? void 0 : _a.closest(".note");
43
+ this.dragStartCoords = [d3.event.x, d3.event.y]; //coordinates.transformToDOMMatrixCoordinates(d3.event.sourceEvent.clientX, d3.event.sourceEvent.clientY, document.getElementById(c._ROOTSVGID_))
44
+ this.dx = 0; //this.dragStartCoords[0]
45
+ this.dy = 0; //this.dragStartCoords[1]
46
+ }
47
+ }
48
+ dragging() {
49
+ if (this.draggedOverlayElement === null || this.draggedRootSVGElement === null)
50
+ return;
51
+ this.dx = d3.event.x;
52
+ this.dy = d3.event.y;
53
+ var overlayCoords = coordinates.transformToDOMMatrixCoordinates(d3.event.sourceEvent.clientX, d3.event.sourceEvent.clientY, this.interactionOverlay);
54
+ var diffY = Math.abs(this.dy - this.dragStartCoords[1]);
55
+ if (diffY > 15) {
56
+ this.wasDragged = true;
57
+ }
58
+ //snap while dragging
59
+ this.m2m.defineNote(overlayCoords.x, overlayCoords.y, {});
60
+ var newNote = [this.m2m.getNewNote().pname, this.m2m.getNewNote().oct];
61
+ if (this.oldNote == undefined) {
62
+ this.oldNote = newNote;
63
+ }
64
+ const relativeY = d3.event.y - this.dragStartCoords[1]; //d3.event.y - this.dragStartCoords[1]
65
+ const relativeX = 0; //d3.event.x - this.dragStartCoords[0];
66
+ //overlay and defscale have completely different viewbox dimensions
67
+ var defScaleVBox = this.rootSVG.querySelector(".definition-scale").viewBox.baseVal;
68
+ var overlayVBox = this.interactionOverlay.viewBox.baseVal;
69
+ this.scaleX = defScaleVBox.width / overlayVBox.width;
70
+ this.scaleY = defScaleVBox.height / overlayVBox.height;
71
+ var shiftY = 10;
72
+ shiftY = relativeY < 0 ? -shiftY : shiftY;
73
+ if (!this.oldNote.every((v, i) => v === newNote[i])) {
74
+ this.draggedOverlayElement.setAttribute('transform', 'translate(' + [relativeX, relativeY + shiftY] + ')');
75
+ this.draggedRootSVGElement.setAttribute('transform', 'translate(' + [relativeX * this.scaleX, (relativeY + shiftY) * this.scaleY] + ')');
76
+ this.oldNote = newNote;
77
+ }
78
+ }
79
+ dragEnded() {
80
+ if (this.draggedOverlayElement === null || this.draggedRootSVGElement === null)
81
+ return;
82
+ if (this.wasDragged) {
83
+ this.notes.on("drag", null);
84
+ this.wasDragged = false;
85
+ this.draggedOverlayElement.dispatchEvent(this.noteDraggedEvent);
86
+ this.container.querySelector("#" + this.draggedRootSVGElement.id).classList.remove(this.deleteHandler.getDeleteFlag()); //remove flag to delete after dragging
87
+ const action = {
88
+ action: "drag",
89
+ param: { elementId: this.draggedRootSVGElement.id,
90
+ //x: this.dx,
91
+ //y: this.dy
92
+ }
93
+ };
94
+ this.editCallback(action).then(() => {
95
+ var attr = this.elementAttrCallback(this.draggedRootSVGElement.id);
96
+ var mm = new MeasureMatrix_1.default();
97
+ //mm.populateFromSVG(svg)
98
+ mm.populateFromMEI(this.currentMEI);
99
+ var staff = this.currentMEI.getElementById(this.draggedRootSVGElement.id).closest("staff");
100
+ var measure = staff.closest("measure");
101
+ var staffIdx = parseInt(staff.getAttribute("n")) - 1;
102
+ var measureIdx = parseInt(measure.getAttribute("n")) - 1;
103
+ var dur = this.currentMEI.getElementById(this.draggedRootSVGElement.id).closest("chord") !== null ? this.currentMEI.getElementById(this.draggedRootSVGElement.id).closest("chord").getAttribute("dur") : attr.dur;
104
+ let newNote = {
105
+ pname: attr.pname,
106
+ oct: attr.oct.toString(),
107
+ dur: dur,
108
+ keysig: mm.get(measureIdx, staffIdx).keysig,
109
+ rest: false,
110
+ };
111
+ this.musicPlayer.generateTone(newNote);
112
+ });
113
+ }
114
+ }
115
+ //////////////// GETTER/ SETTER ////////////
116
+ setMusicPlayer(musicPlayer) {
117
+ this.musicPlayer = musicPlayer;
118
+ return this;
119
+ }
120
+ setCurrentMEI(xmlDoc) {
121
+ this.currentMEI = xmlDoc;
122
+ return this;
123
+ }
124
+ setM2M(m2m) {
125
+ this.m2m = m2m;
126
+ return this;
127
+ }
128
+ setDeleteHandler(deleteHandler) {
129
+ this.deleteHandler = deleteHandler;
130
+ return this;
131
+ }
132
+ setEditCallback(editCallback) {
133
+ this.editCallback = editCallback;
134
+ return this;
135
+ }
136
+ setElementAttrCallback(elementAttrCallback) {
137
+ this.elementAttrCallback = elementAttrCallback;
138
+ return this;
139
+ }
140
+ setContainerId(id) {
141
+ this.containerId = id;
142
+ this.container = document.getElementById(id);
143
+ this.interactionOverlay = cq.getInteractOverlay(id);
144
+ this.rootSVG = cq.getRootSVG(id);
145
+ return this;
146
+ }
147
+ }
148
+ exports.default = NoteDragHandler;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const coordinates = require("../utils/coordinates");
4
+ const cq = require("../utils/convenienceQueries");
5
+ const interactjs_1 = require("interactjs");
6
+ /**
7
+ * Class that handles insert mode, events, and actions.
8
+ */
9
+ class NoteDragHandler {
10
+ constructor(containerId) {
11
+ this.setContainerId(containerId);
12
+ }
13
+ setListeners() {
14
+ var that = this;
15
+ this.noteDragListener = interactjs_1.default("#" + this.containerId + " #interactionOverlay .notehead rect")
16
+ .draggable({
17
+ startAxis: "y",
18
+ lockAxis: "y",
19
+ listeners: {
20
+ move: this.dragNote.bind(this),
21
+ end(event) {
22
+ that.deleteTempDistances();
23
+ that.insertCallback(that.newNote, true);
24
+ }
25
+ },
26
+ modifiers: [
27
+ interactjs_1.default.modifiers.restrictRect({
28
+ endOnly: true
29
+ })
30
+ ]
31
+ });
32
+ }
33
+ removeListeners() {
34
+ var _a;
35
+ (_a = this.noteDragListener) === null || _a === void 0 ? void 0 : _a.unset();
36
+ }
37
+ resetListeners() {
38
+ this.removeListeners();
39
+ this.setListeners();
40
+ return this;
41
+ }
42
+ deleteTempDistances() {
43
+ var _a;
44
+ (_a = cq.getInteractOverlay(this.containerId)) === null || _a === void 0 ? void 0 : _a.querySelectorAll("*[distY]").forEach(d => {
45
+ d.removeAttribute("distY");
46
+ d.classList.remove("moving");
47
+ });
48
+ }
49
+ dragNote(e) {
50
+ var _a;
51
+ var noteHeadBBox = e.target;
52
+ this.noteDragEvent = new MouseEvent("draggingNote", e);
53
+ noteHeadBBox.dispatchEvent(this.noteDragEvent);
54
+ var refNote = cq.getVrvSVG(this.containerId).querySelector("#" + noteHeadBBox.parentElement.getAttribute("refId")).closest(".note");
55
+ var note = cq.getInteractOverlay(this.containerId).querySelector("*[refId=\"" + refNote.id + "\"] rect");
56
+ if (!noteHeadBBox.classList.contains("moving"))
57
+ noteHeadBBox.classList.add("moving");
58
+ var headPos = this.newPos(noteHeadBBox, e);
59
+ this.m2s.defineNote(headPos.x, headPos.y, {});
60
+ this.newNote = this.m2s.getNewNote();
61
+ if (refNote.closest(".chord") !== null) {
62
+ this.newNote.chordElement = refNote.closest(".chord");
63
+ (_a = this.currentMEI.querySelector("#" + refNote.id)) === null || _a === void 0 ? void 0 : _a.remove();
64
+ }
65
+ }
66
+ newPos(target, e) {
67
+ var pt = coordinates.transformToDOMMatrixCoordinates(e.clientX, e.clientY, target.closest("*[viewBox]"));
68
+ var edy = pt.y;
69
+ var ptDist = coordinates.transformToDOMMatrixCoordinates(target.getBoundingClientRect().x, target.getBoundingClientRect().y, target.closest("*[viewBox]"));
70
+ var distY = (parseFloat(target.getAttribute('distY'))) || edy - ptDist.y;
71
+ target.setAttribute("distY", distY.toString());
72
+ target.setAttribute("y", (edy - distY).toString());
73
+ return { x: pt.x, y: pt.y };
74
+ }
75
+ //////////////// GETTER/ SETTER ////////////
76
+ setMusicProcessor(musicPlayer) {
77
+ this.musicPlayer = musicPlayer;
78
+ return this;
79
+ }
80
+ setCurrentMEI(xmlDoc) {
81
+ this.currentMEI = xmlDoc;
82
+ return this;
83
+ }
84
+ setm2s(m2s) {
85
+ this.m2s = m2s;
86
+ return this;
87
+ }
88
+ setInsertCallback(insertCallback) {
89
+ this.insertCallback = insertCallback;
90
+ return this;
91
+ }
92
+ setContainerId(id) {
93
+ this.containerId = id;
94
+ return this;
95
+ }
96
+ }
97
+ exports.default = NoteDragHandler;