vibe-editor 0.0.4 → 0.0.5

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 (78) hide show
  1. package/package.json +65 -61
  2. package/src/scripts/js/Core.js +28 -9
  3. package/src/scripts/js/entry.js +6 -5
  4. package/src/scripts/js/gui/Annotations.js +27 -12
  5. package/src/scripts/js/gui/ScoreManipulator.js +6 -4
  6. package/src/scripts/js/gui/Tabbar.js +13 -4
  7. package/src/scripts/js/handlers/AnnotationChangeHandler.js +13 -1
  8. package/src/scripts/js/handlers/InsertModeHandler.js +3 -3
  9. package/src/scripts/js/handlers/PhantomElementHandler.js +3 -10
  10. package/src/scripts/js/handlers/WindowHandler.js +7 -7
  11. package/src/scripts/js/scripts/Core.js +932 -0
  12. package/src/scripts/js/scripts/MusicProcessor.js +810 -0
  13. package/src/scripts/js/scripts/VIBE.js +219 -0
  14. package/src/scripts/js/scripts/datastructures/MeasureMatrix.js +156 -0
  15. package/src/scripts/js/scripts/gui/Annotations.js +549 -0
  16. package/src/scripts/js/scripts/gui/Cursor.js +203 -0
  17. package/src/scripts/js/scripts/gui/PhantomElement.js +132 -0
  18. package/src/scripts/js/scripts/gui/ScoreManipulator.js +188 -0
  19. package/src/scripts/js/scripts/gui/Tabbar.js +705 -0
  20. package/src/scripts/js/{gui/Toolbar copy.js → scripts/gui/Toolbar.js} +15 -11
  21. package/src/scripts/js/scripts/handlers/AnnotationChangeHandler.js +650 -0
  22. package/src/scripts/js/scripts/handlers/ClickModeHandler.js +535 -0
  23. package/src/scripts/js/{gui → scripts/handlers}/CustomAnnotationShapeDrawer.js +34 -17
  24. package/src/scripts/js/{handlers/ModHandler.js → scripts/handlers/CustomToolbarHandler.js} +54 -66
  25. package/src/scripts/js/scripts/handlers/GlobalKeyboardHandler.js +372 -0
  26. package/src/scripts/js/scripts/handlers/Handler.js +2 -0
  27. package/src/scripts/js/{handlers/InsertModeHandler_deprecated.js → scripts/handlers/InsertModeHandler.js} +117 -164
  28. package/src/scripts/js/scripts/handlers/KeyModeHandler.js +405 -0
  29. package/src/scripts/js/scripts/handlers/LabelHandler.js +463 -0
  30. package/src/scripts/js/scripts/handlers/NoteDragHandler.js +97 -0
  31. package/src/scripts/js/scripts/handlers/PhantomElementHandler.js +168 -0
  32. package/src/scripts/js/scripts/handlers/ScoreManipulatorHandler.js +233 -0
  33. package/src/scripts/js/scripts/handlers/SidebarHandler.js +506 -0
  34. package/src/scripts/js/scripts/handlers/TooltipHandler.js +132 -0
  35. package/src/scripts/js/scripts/handlers/WindowHandler.js +278 -0
  36. package/src/scripts/js/scripts/utils/MEIOperations.js +2121 -0
  37. package/src/scripts/js/{utils/Mouse2MEI.js → scripts/utils/Mouse2SVG.js} +225 -57
  38. package/src/scripts/js/scripts/utils/SVGEditor.js +453 -0
  39. package/src/scripts/js/scripts/utils/Types.js +2 -0
  40. package/src/scripts/js/{utils/VerovioWrapper copy.js → scripts/utils/VerovioWrapper.js} +35 -21
  41. package/src/scripts/js/scripts/utils/coordinates.js +54 -0
  42. package/src/scripts/js/utils/Mouse2SVG.js +11 -4
  43. package/src/scripts/js/utils/VerovioWrapper.js +4 -4
  44. package/src/scripts/js/utils/coordinates.js +26 -2
  45. package/src/scripts/js/.DS_Store +0 -0
  46. package/src/scripts/js/MusicPlayer.js +0 -572
  47. package/src/scripts/js/datastructures/ScoreGraph copy.js +0 -432
  48. package/src/scripts/js/gui/CustomAnnotationDrawer.js +0 -114
  49. package/src/scripts/js/handlers/AnnotationDragHandler.js +0 -113
  50. package/src/scripts/js/handlers/AnnotationLineHandler.js +0 -113
  51. package/src/scripts/js/handlers/ArticulationHandler.js +0 -20
  52. package/src/scripts/js/handlers/HarmonyHandler.js +0 -282
  53. package/src/scripts/js/handlers/InsertModeHandler copy.js +0 -423
  54. package/src/scripts/js/handlers/KeyModeHandler copy.js +0 -407
  55. package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +0 -411
  56. package/src/scripts/js/handlers/NoteDragHandler copy.js +0 -148
  57. package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +0 -150
  58. package/src/scripts/js/handlers/SelectionHandler.js +0 -262
  59. package/src/scripts/js/utils/RectWrapper.js +0 -10
  60. package/src/scripts/js/utils/SVGFiller.js +0 -245
  61. package/src/scripts/js/utils/VerovioWrapperLocal.js +0 -156
  62. package/src/scripts/js/utils/firefoxBBoxes.js +0 -143
  63. package/src/styles/vibe.css +0 -785
  64. /package/src/scripts/js/{assets → scripts/assets}/mei_template.js +0 -0
  65. /package/src/scripts/js/{constants.js → scripts/constants.js} +0 -0
  66. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph.js +0 -0
  67. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph_deprecated.js +0 -0
  68. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreNode.js +0 -0
  69. /package/src/scripts/js/{gui → scripts/gui}/HarmonyLabel.js +0 -0
  70. /package/src/scripts/js/{gui → scripts/gui}/Label.js +0 -0
  71. /package/src/scripts/js/{gui → scripts/gui}/TempoLabel.js +0 -0
  72. /package/src/scripts/js/{handlers → scripts/handlers}/DeleteHandler.js +0 -0
  73. /package/src/scripts/js/{utils → scripts/utils}/DOMCreator.js +0 -0
  74. /package/src/scripts/js/{utils → scripts/utils}/MEIConverter.js +0 -0
  75. /package/src/scripts/js/{utils → scripts/utils}/ReactWrapper.js +0 -0
  76. /package/src/scripts/js/{utils → scripts/utils}/convenienceQueries.js +0 -0
  77. /package/src/scripts/js/{utils → scripts/utils}/mappings.js +0 -0
  78. /package/src/scripts/js/{utils → scripts/utils}/random.js +0 -0
@@ -0,0 +1,506 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mappings_1 = require("../utils/mappings");
4
+ const meiConverter = require("../utils/MEIConverter");
5
+ const meiOperation = require("../utils/MEIOperations");
6
+ const coordinates = require("../utils/coordinates");
7
+ const cq = require("../utils/convenienceQueries");
8
+ const mei_template_1 = require("../assets/mei_template");
9
+ const interactjs_1 = require("interactjs");
10
+ /**
11
+ * Handles all Events when interacting with the sidebar.
12
+ * There is only one instance necessary.
13
+ * Every change that results from a sidebar interaction is returned by a meiOperation
14
+ */
15
+ class SidebarHandler {
16
+ constructor() {
17
+ this.changeTimeHandler = (function changeTimeHandler(e) {
18
+ e.preventDefault();
19
+ this.setTimeForSelectedElements(e);
20
+ }).bind(this);
21
+ this.keySigSelectHandler = (function keySigSelectHandler(e) {
22
+ e.preventDefault();
23
+ this.setKeyGlobal(e);
24
+ }).bind(this);
25
+ this.keyChangeHandler = (function keyChangeHandler(e) {
26
+ e.preventDefault();
27
+ this.setKeyLocal(e);
28
+ }).bind(this);
29
+ /**
30
+ * Handler for changing Time Signatures (+ Loading)
31
+ */
32
+ this.changeMeterHandler = (function changeMeter(e) {
33
+ var mei = meiOperation.changeMeter(this.currentMEI);
34
+ if (mei !== null) {
35
+ mei = meiConverter.restoreXmlIdTags(mei);
36
+ this.loadDataCallback("", mei, false);
37
+ }
38
+ }).bind(this);
39
+ this.clefChangeHandler = (function clefChangeHandler(e) {
40
+ e.preventDefault();
41
+ this.setClef(e);
42
+ }).bind(this);
43
+ this.resizeSidebarFunction = this.resizeSidebar.bind(this);
44
+ this.findDropTargetFunction = (function findBarline(e) {
45
+ e.target.removeEventListener("drag", this.findDropTargetFunction);
46
+ clearInterval(this.dropInterval);
47
+ this.dropInterval = setInterval(this.findDropTarget(e), 50);
48
+ }).bind(this);
49
+ this.dropOnTargetFunction = (function dropOnBarline(e) {
50
+ this.dropOnTarget(e);
51
+ }).bind(this);
52
+ //this.setListeners()
53
+ document.addEventListener("dragover", (e) => {
54
+ e.preventDefault();
55
+ });
56
+ }
57
+ setListeners() {
58
+ this.setSelectListeners();
59
+ //this.setChangeMeterListeners()
60
+ // Controll dpossible drag and drop zones on screen
61
+ var that = this;
62
+ var dragTarget = this.interactionOverlay.querySelector("#scoreRects"); //document.getElementById("vrvSVG")
63
+ this.interactionOverlay.addEventListener("dragleave", function (event) {
64
+ event.preventDefault();
65
+ event.stopPropagation();
66
+ if (event.target === dragTarget) {
67
+ that.removeSelectListeners();
68
+ }
69
+ }, false);
70
+ this.interactionOverlay.addEventListener("dragenter", function (event) {
71
+ event.preventDefault();
72
+ event.stopPropagation();
73
+ if (Array.from(dragTarget.querySelectorAll("*")).every(c => c !== event.target)) {
74
+ that.setSelectListeners();
75
+ }
76
+ }, false);
77
+ this.resizeListener = interactjs_1.default("#" + this.containerId + " #sidebarContainer")
78
+ .resizable({
79
+ edges: { left: false, right: true, bottom: false, top: false },
80
+ listeners: {
81
+ move: this.resizeSidebarFunction,
82
+ end(e) {
83
+ var target = e.target;
84
+ target.style.transition = "0.5s";
85
+ target.parentElement.querySelectorAll(":scope > div:not(#sidebarContainer)").forEach(d => {
86
+ var ds = d;
87
+ ds.style.transition = "0.5s";
88
+ });
89
+ }
90
+ }
91
+ });
92
+ return this;
93
+ }
94
+ removeListeners() {
95
+ this.removeSelectListeners();
96
+ //this.resizeListener?.unset()
97
+ return this;
98
+ }
99
+ removeSelectListeners() {
100
+ this.container.querySelectorAll("*[id*=keyList] > *").forEach(k => {
101
+ if (k.tagName === "A") {
102
+ k.removeEventListener("dblclick", this.keySigSelectHandler);
103
+ k.removeEventListener("click", this.keyChangeHandler);
104
+ }
105
+ });
106
+ this.container.querySelectorAll("*[id*=clefList] > *").forEach(k => {
107
+ if (k.tagName === "A") {
108
+ k.removeEventListener("click", this.clefChangeHandler);
109
+ }
110
+ });
111
+ document.removeEventListener("dragover", (e) => {
112
+ e.preventDefault();
113
+ });
114
+ this.container.querySelectorAll("#sidebarList a, #timeDiv").forEach(sa => {
115
+ sa.removeEventListener("drag", this.findDropTargetFunction);
116
+ sa.removeEventListener("dragend", this.dropOnTargetFunction);
117
+ });
118
+ this.container.querySelectorAll("#timeUnit, #timeCount").forEach(t => {
119
+ t.removeEventListener("change", this.changeTimeHandler);
120
+ });
121
+ return this;
122
+ }
123
+ resetListeners() {
124
+ this.removeListeners();
125
+ this.setListeners();
126
+ }
127
+ setSelectListeners() {
128
+ this.container.querySelectorAll("*[id*=keyList] > *").forEach(k => {
129
+ if (k.tagName === "A") {
130
+ k.addEventListener("dblclick", this.keySigSelectHandler);
131
+ k.addEventListener("click", this.keyChangeHandler);
132
+ }
133
+ });
134
+ this.container.querySelectorAll("*[id*=clefList] > *").forEach(k => {
135
+ if (k.tagName === "A") {
136
+ k.addEventListener("click", this.clefChangeHandler);
137
+ }
138
+ });
139
+ this.container.querySelectorAll("#sidebarList a, #timeDiv, #tempoDiv").forEach(sa => {
140
+ sa.addEventListener("drag", this.findDropTargetFunction);
141
+ sa.addEventListener("dragend", this.dropOnTargetFunction);
142
+ });
143
+ this.container.querySelectorAll("#timeUnit, #timeCount").forEach(t => {
144
+ t.addEventListener("change", this.changeTimeHandler);
145
+ });
146
+ return this;
147
+ }
148
+ /**
149
+ * Make Score Elements Clickable (and mark them), which are important for functions in the sidebar
150
+ * Has to be called externally, when new Score is Loaded
151
+ * @returns this
152
+ */
153
+ makeScoreElementsClickable() {
154
+ var that = this;
155
+ // Clefs are clickable and will be filled red (see css)
156
+ cq.getInteractOverlay(this.containerId).querySelectorAll(".clef, .keySig, .meterSig").forEach(c => {
157
+ //this.interactionOverlay.querySelectorAll(".clef, .keySig, .meterSig").forEach(c => {
158
+ //this.interactionOverlay.querySelectorAll("*").forEach(c => {
159
+ c.addEventListener("click", function (e) {
160
+ var _a, _b;
161
+ cq.getContainer(that.containerId).querySelectorAll(".marked").forEach(m => m.classList.remove("marked"));
162
+ if (c.classList.contains("marked")) {
163
+ c.classList.remove("marked");
164
+ (_a = that.getElementInSVG(c.getAttribute("refId"))) === null || _a === void 0 ? void 0 : _a.classList.remove("marked");
165
+ }
166
+ else {
167
+ c.classList.add("marked");
168
+ (_b = that.getElementInSVG(c.getAttribute("refId"))) === null || _b === void 0 ? void 0 : _b.classList.add("marked");
169
+ that.changeSelectedElementInSidebar(c);
170
+ }
171
+ });
172
+ });
173
+ return this;
174
+ }
175
+ /**
176
+ * Change Values in Sidebar to match the selected element in the score.
177
+ * Currently only for time
178
+ * @param element
179
+ */
180
+ changeSelectedElementInSidebar(element) {
181
+ var _a, _b;
182
+ if (!element.classList.contains("meterSig"))
183
+ return;
184
+ var baseEl = this.vrvSVG.querySelector("#" + element.getAttribute("refId"));
185
+ var tempY;
186
+ var count = "";
187
+ var unit = "";
188
+ baseEl.querySelectorAll("use").forEach(u => {
189
+ var num = mappings_1.unicodeToTimesig.get(u.getAttribute("xlink:href").slice(1, 5));
190
+ if (count === "") {
191
+ count = num;
192
+ }
193
+ else if (u.getAttribute("y") === tempY && count !== "") {
194
+ count += num;
195
+ }
196
+ else if (u.getAttribute("y") === tempY && unit !== "") {
197
+ unit += num;
198
+ }
199
+ else {
200
+ unit = num;
201
+ }
202
+ tempY = u.getAttribute("y");
203
+ });
204
+ cq.getContainer(this.containerId).querySelectorAll("#timeDiv .selected").forEach(s => s.removeAttribute("selected"));
205
+ (_a = cq.getContainer(this.containerId).querySelector(`#timeCount > [value='${count}']`)) === null || _a === void 0 ? void 0 : _a.setAttribute("selected", "");
206
+ (_b = cq.getContainer(this.containerId).querySelector(`#timeUnit > [value='${unit}']`)) === null || _b === void 0 ? void 0 : _b.setAttribute("selected", "");
207
+ }
208
+ setTimeForSelectedElements(e) {
209
+ var target = e.target;
210
+ var changeCount = false;
211
+ var changeUnit = false;
212
+ if (target.id.includes("Count")) {
213
+ changeCount = true;
214
+ }
215
+ if (target.id.includes("Unit")) {
216
+ changeUnit = true;
217
+ }
218
+ var count = this.container.querySelector("#timeCount").value;
219
+ var unit = this.container.querySelector("#timeUnit").value;
220
+ var markedTimes = Array.from(this.vrvSVG.querySelectorAll(".meterSig.marked"));
221
+ var reload = false;
222
+ markedTimes.forEach(mt => {
223
+ var _a;
224
+ var meiMt = this.currentMEI.getElementById(mt.id);
225
+ var isInStaffDef = this.currentMEI.querySelector("#" + mt.id) === null;
226
+ if (isInStaffDef) {
227
+ //var myRownum = parseInt(mt.closest(".staff").getAttribute("n")) - 1
228
+ //var rowNums = new Array()
229
+ this.currentMEI.querySelector("measure").querySelectorAll("staff").forEach(s => {
230
+ var rowNum = parseInt(s.getAttribute("n")) - 1;
231
+ var targetMeterSigDef = this.currentMEI.querySelectorAll("staffDef")[rowNum];
232
+ if (targetMeterSigDef.getAttribute("meter.count") !== count && changeCount) {
233
+ targetMeterSigDef.setAttribute("meter.count", count);
234
+ reload = true;
235
+ }
236
+ if (targetMeterSigDef.getAttribute("meter.unit") !== unit && changeUnit) {
237
+ targetMeterSigDef.setAttribute("meter.unit", unit);
238
+ reload = true;
239
+ }
240
+ });
241
+ }
242
+ else {
243
+ this.currentMEI.querySelector("#" + mt.id).setAttribute("count", count);
244
+ this.currentMEI.querySelector("#" + mt.id).setAttribute("unit", unit);
245
+ var siblingLayers = (_a = meiMt.closest("measure")) === null || _a === void 0 ? void 0 : _a.querySelectorAll("layer");
246
+ var myLayer = meiMt.closest("layer");
247
+ siblingLayers.forEach(sl => {
248
+ if (sl.id !== myLayer.id) {
249
+ var ms = sl.querySelector("meterSig");
250
+ if (ms === null) {
251
+ ms = new mei_template_1.default().createMeterSig(count, unit);
252
+ sl.firstElementChild.prepend(ms);
253
+ }
254
+ else {
255
+ ms.setAttribute("count", count);
256
+ ms.setAttribute("unit", unit);
257
+ }
258
+ }
259
+ });
260
+ reload = true;
261
+ }
262
+ });
263
+ if (reload) {
264
+ meiOperation.cleanUp(this.currentMEI);
265
+ this.loadDataCallback("", meiConverter.restoreXmlIdTags(this.currentMEI), false);
266
+ }
267
+ }
268
+ // changeParameters by interacting with sidebar
269
+ setKeyGlobal(e) {
270
+ var target = e.target;
271
+ this.currentMEI.querySelectorAll("staffDef > keySig").forEach(s => {
272
+ s.setAttribute("sig", mappings_1.keyIdToSig.get(target.id));
273
+ });
274
+ var mei = meiOperation.adjustAccids(this.currentMEI);
275
+ meiOperation.cleanUp(mei);
276
+ mei = meiConverter.restoreXmlIdTags(mei);
277
+ this.loadDataCallback("", mei, false);
278
+ return this;
279
+ }
280
+ setKeyLocal(e) {
281
+ var target = e.target;
282
+ var markedClefs = Array.from(this.vrvSVG.querySelectorAll(".keySig.marked"));
283
+ var reload = false;
284
+ markedClefs.forEach(mc => {
285
+ var isInStaffDef = this.currentMEI.querySelector("#" + mc.id) === null;
286
+ if (isInStaffDef) {
287
+ var rowNum = parseInt(mc.closest(".staff").getAttribute("n")) - 1;
288
+ var targetKeySigDef = this.currentMEI.querySelectorAll("staffDef > keySig")[rowNum];
289
+ if (targetKeySigDef.getAttribute("sig") !== mappings_1.keyIdToSig.get(target.id)) {
290
+ targetKeySigDef.setAttribute("sig", mappings_1.keyIdToSig.get(target.id));
291
+ reload = true;
292
+ }
293
+ }
294
+ else {
295
+ this.currentMEI.querySelector("#" + mc.id).setAttribute("sig", mappings_1.keyIdToSig.get(target.id));
296
+ reload = true;
297
+ }
298
+ });
299
+ if (reload) {
300
+ meiOperation.cleanUp(this.currentMEI);
301
+ this.loadDataCallback("", meiConverter.restoreXmlIdTags(this.currentMEI), false);
302
+ }
303
+ }
304
+ /**
305
+ * If Meter is already present in MEI, load it in input for time signature
306
+ * @returns
307
+ */
308
+ loadMeter() {
309
+ var staffDef = this.currentMEI.querySelector("staffDef");
310
+ if (staffDef !== null) {
311
+ var hasMeter = staffDef.getAttribute("meter.count") !== null && staffDef.getAttribute("meter.unit") !== null;
312
+ if (hasMeter) {
313
+ this.container.querySelector("#timeCount").setAttribute("value", staffDef.getAttribute("meter.count"));
314
+ this.container.querySelector("#timeUnit").setAttribute("value", staffDef.getAttribute("meter.unit"));
315
+ }
316
+ }
317
+ return this;
318
+ }
319
+ /**
320
+ * Listen on Change when input is changed for Time Signatures
321
+ */
322
+ setChangeMeterListeners() {
323
+ this.container.querySelector("#timeCount").addEventListener("change", this.changeMeterHandler);
324
+ this.container.querySelector("#timeUnit").addEventListener("change", this.changeMeterHandler);
325
+ }
326
+ /**
327
+ * Set Clefshape for all marked clefelements
328
+ * @param e MouseEvent
329
+ */
330
+ setClef(e) {
331
+ var target = e.target;
332
+ var markedClefs = Array.from(this.vrvSVG.querySelectorAll(".clef.marked"));
333
+ var reload = false;
334
+ markedClefs.forEach(mc => {
335
+ var isInStaffDef = this.currentMEI.querySelector("#" + mc.id) === null;
336
+ if (isInStaffDef) {
337
+ var rowNum = parseInt(mc.closest(".staff").getAttribute("n")) - 1;
338
+ var targetClefDef = this.currentMEI.querySelectorAll("staffDef > clef")[rowNum];
339
+ if (targetClefDef.getAttribute("shape") !== target.id.charAt(0)) {
340
+ targetClefDef.setAttribute("shape", target.id.charAt(0));
341
+ targetClefDef.setAttribute("line", mappings_1.clefToLine.get(target.id.charAt(0)));
342
+ reload = true;
343
+ }
344
+ }
345
+ else {
346
+ this.currentMEI.querySelector("#" + mc.id).setAttribute("shape", target.id.charAt(0));
347
+ this.currentMEI.querySelector("#" + mc.id).setAttribute("line", mappings_1.clefToLine.get(target.id.charAt(0)));
348
+ reload = true;
349
+ }
350
+ });
351
+ if (reload) {
352
+ meiOperation.cleanUp(this.currentMEI);
353
+ this.loadDataCallback("", meiConverter.restoreXmlIdTags(this.currentMEI), false);
354
+ }
355
+ }
356
+ resizeSidebar(e) {
357
+ var that = this;
358
+ var target = e.target;
359
+ target.style.transition = "0s";
360
+ target.style.width = e.clientX.toString() + "px";
361
+ target.parentElement.querySelectorAll(":scope > div:not(#sidebarContainer)").forEach(d => {
362
+ var ds = d;
363
+ ds.style.transition = "0s";
364
+ ds.style.marginLeft = (target.getBoundingClientRect().right).toString() + "px";
365
+ ds.style.width = (that.container.getBoundingClientRect().right - target.getBoundingClientRect().right).toString() + "px";
366
+ });
367
+ }
368
+ /**
369
+ * Find next possible element to drop element from sidebar on
370
+ * @param e
371
+ */
372
+ findDropTarget(e) {
373
+ /** TODO: dropflags müssen auch in scoreRects eigegeben werden */
374
+ e.preventDefault();
375
+ var pt = coordinates.transformToDOMMatrixCoordinates(e.clientX, e.clientY, this.interactionOverlay);
376
+ var posx = pt.x;
377
+ var posy = pt.y;
378
+ var eventTarget = e.target;
379
+ var eventTargetParent = eventTarget.parentElement;
380
+ var eventTargetIsClef = eventTargetParent.id.toLowerCase().includes("clef");
381
+ var eventTargetIsKey = eventTargetParent.id.toLowerCase().includes("key");
382
+ var eventTargetIsTime = eventTarget.id.toLocaleLowerCase().includes("time");
383
+ var eventTargetIsTempo = eventTarget.id.toLocaleLowerCase().includes("tempo");
384
+ var dropTargets; //NodeListOf<Element>
385
+ var dropFlag;
386
+ if (eventTargetIsClef) {
387
+ dropTargets = Array.from(this.vrvSVG.querySelectorAll(".clef, .barLine > path"));
388
+ dropFlag = "dropClef";
389
+ }
390
+ else if (eventTargetIsKey) {
391
+ dropTargets = Array.from(this.vrvSVG.querySelectorAll(".keySig, .barLine > path, .clef"));
392
+ dropFlag = "dropKey";
393
+ }
394
+ else if (eventTargetIsTime) {
395
+ dropTargets = Array.from(this.vrvSVG.querySelectorAll(".meterSig, .barLine > path, .clef"));
396
+ dropFlag = "dropTime";
397
+ }
398
+ else if (eventTargetIsTempo) {
399
+ dropTargets = Array.from(this.vrvSVG.querySelectorAll(".note, .chord, .rest, .mRest"));
400
+ dropFlag = "dropTempo";
401
+ }
402
+ else {
403
+ return;
404
+ }
405
+ dropTargets.push(this.container.querySelector("#sidebarContainer"));
406
+ dropTargets.push(this.container.querySelector("#btnToolbar"));
407
+ dropTargets.push(this.container.querySelector("#customToolbar"));
408
+ var tempDist = Math.pow(10, 10);
409
+ dropTargets.forEach(dt => {
410
+ var _a;
411
+ var interacationElement = this.interactionOverlay.querySelector("[refId=" + dt.id + "]") || this.container.querySelector("#" + dt.id);
412
+ var blbbox = interacationElement.getBoundingClientRect();
413
+ var ptdt = coordinates.getDOMMatrixCoordinates(blbbox, this.interactionOverlay);
414
+ var bbx = ptdt.left;
415
+ var bby = ptdt.top;
416
+ var dist = Math.sqrt(Math.abs(bbx - posx) ** 2 + Math.abs(bby - posy) ** 2);
417
+ if (dist < tempDist) {
418
+ dropTargets.forEach(_dt => {
419
+ var _a;
420
+ _dt.classList.remove(dropFlag);
421
+ (_a = this.getElementInInteractOverlay(_dt.id)) === null || _a === void 0 ? void 0 : _a.classList.remove(dropFlag);
422
+ });
423
+ tempDist = dist;
424
+ dt.classList.add(dropFlag);
425
+ (_a = this.getElementInInteractOverlay(dt.id)) === null || _a === void 0 ? void 0 : _a.classList.add(dropFlag);
426
+ }
427
+ });
428
+ }
429
+ /**
430
+ * Determine action on drop elemnt from sidebar on score
431
+ * @param e
432
+ */
433
+ dropOnTarget(e) {
434
+ var _a;
435
+ e.preventDefault();
436
+ var selectedElement = this.getElementInSVG((_a = this.interactionOverlay.querySelector(".dropClef, .dropKey, .dropTime, .dropTempo")) === null || _a === void 0 ? void 0 : _a.getAttribute("refId"));
437
+ var t = e.target;
438
+ var mei;
439
+ var isFirstClef = Array.from(this.vrvSVG.querySelectorAll(".measure[n=\"1\"] .clef")).some(mc => (mc === null || mc === void 0 ? void 0 : mc.id) === (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.id));
440
+ var isFirstKey = Array.from(this.vrvSVG.querySelectorAll(".measure[n=\"1\"] .keySig")).some(mc => (mc === null || mc === void 0 ? void 0 : mc.id) === (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.id));
441
+ var isFirstMeter = Array.from(this.vrvSVG.querySelectorAll(".measure[n=\"1\"] .meterSig")).some(mc => (mc === null || mc === void 0 ? void 0 : mc.id) === (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.id));
442
+ if (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.classList.contains("dropClef")) {
443
+ if (isFirstClef) {
444
+ mei = meiOperation.replaceClefinScoreDef(selectedElement, t.id, this.currentMEI);
445
+ }
446
+ else {
447
+ mei = meiOperation.insertClef(selectedElement, t.id, this.currentMEI);
448
+ }
449
+ }
450
+ else if (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.classList.contains("dropKey")) {
451
+ if (isFirstKey || isFirstClef) {
452
+ mei = meiOperation.replaceKeyInScoreDef(selectedElement, t.id, this.currentMEI);
453
+ }
454
+ else {
455
+ mei = meiOperation.insertKey(selectedElement, t.id, this.currentMEI);
456
+ }
457
+ }
458
+ else if (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.classList.contains("dropTime")) {
459
+ if (isFirstMeter || isFirstClef) {
460
+ mei = meiOperation.replaceMeterInScoreDef(selectedElement, this.currentMEI);
461
+ }
462
+ else {
463
+ mei = meiOperation.insertMeter(selectedElement, this.currentMEI);
464
+ }
465
+ }
466
+ else if (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.classList.contains("dropTempo")) {
467
+ mei = meiOperation.insertTempo(selectedElement, this.currentMEI);
468
+ }
469
+ else {
470
+ return;
471
+ }
472
+ this.loadDataCallback("", mei, false);
473
+ }
474
+ getElementInSVG(id) {
475
+ if (id === "")
476
+ return;
477
+ return this.vrvSVG.querySelector("#" + id);
478
+ }
479
+ getElementInInteractOverlay(id) {
480
+ if (id === "")
481
+ return;
482
+ return this.interactionOverlay.querySelector("*[refId=\"" + id + "\"]");
483
+ }
484
+ //////// GETTER / SETTER /////////////
485
+ setCurrentMei(mei) {
486
+ this.currentMEI = mei;
487
+ return this;
488
+ }
489
+ setm2s(m2s) {
490
+ this.m2s = m2s;
491
+ return this;
492
+ }
493
+ setLoadDataCallback(loadDataCallback) {
494
+ this.loadDataCallback = loadDataCallback;
495
+ return this;
496
+ }
497
+ setContainerId(containerId) {
498
+ this.containerId = containerId;
499
+ this.vrvSVG = cq.getVrvSVG(containerId);
500
+ this.interactionOverlay = cq.getInteractOverlay(containerId);
501
+ this.container = document.getElementById(containerId);
502
+ this.sidebarContainer = this.container.querySelector("#sidebarContainer");
503
+ return this;
504
+ }
505
+ }
506
+ exports.default = SidebarHandler;
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cq = require("../utils/convenienceQueries");
4
+ const core_1 = require("@popperjs/core");
5
+ class TooltipHandler {
6
+ constructor() {
7
+ this.ttQuerySelector = "#btnToolbar button, #customToolbar button, #sidebarContainer a, #manipulatorCanvas svg";
8
+ /**
9
+ * Create a list of opened timeouts
10
+ */
11
+ this.enterHoverListener = (function enterHoverListener(e) {
12
+ this.createTooltip(e.target);
13
+ setTimeout(() => {
14
+ var _a;
15
+ var t = e.target;
16
+ var tt = (_a = this.container) === null || _a === void 0 ? void 0 : _a.querySelector("#" + t.getAttribute("aria-describedby"));
17
+ tt === null || tt === void 0 ? void 0 : tt.classList.remove("hide");
18
+ tt === null || tt === void 0 ? void 0 : tt.classList.add("show");
19
+ }, 1000);
20
+ }).bind(this);
21
+ /**
22
+ * Destroy tooltip on leaving element.
23
+ */
24
+ this.leaveHoverListener = (function leaveHoverListener(e) {
25
+ var _a;
26
+ var t = e.target;
27
+ var tt = (_a = this.container) === null || _a === void 0 ? void 0 : _a.querySelector("#" + t.getAttribute("aria-describedby"));
28
+ tt === null || tt === void 0 ? void 0 : tt.remove();
29
+ }).bind(this);
30
+ this.timeOuts = new Array();
31
+ this.removeListeners();
32
+ }
33
+ setContainerId(containerId) {
34
+ this.containerId = containerId;
35
+ this.interactionOverlay = cq.getInteractOverlay(containerId);
36
+ this.vrvSVG = cq.getVrvSVG(containerId);
37
+ this.container = document.getElementById(containerId);
38
+ return this;
39
+ }
40
+ setListeners() {
41
+ this.setTTListeners();
42
+ this.resetTTListeners();
43
+ return this;
44
+ }
45
+ /**
46
+ * Create a tooltip for every button in queryselectot.
47
+ * Set Listeners to display TT for every element
48
+ */
49
+ setTTListeners() {
50
+ var _a;
51
+ var that = this;
52
+ (_a = this.container) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.ttQuerySelector).forEach(btn => {
53
+ btn.addEventListener("mouseenter", that.enterHoverListener);
54
+ btn.addEventListener("mouseleave", that.leaveHoverListener);
55
+ });
56
+ }
57
+ /**
58
+ * Resetting TT listeners might be wanted when Elements are collapsable since position of the elements will change
59
+ */
60
+ resetTTListeners() {
61
+ var _a, _b;
62
+ var that = this;
63
+ (_a = this.container) === null || _a === void 0 ? void 0 : _a.querySelectorAll(".accordion-collapse").forEach(ac => {
64
+ ac.addEventListener("hidden.bs.collapse", function (e) {
65
+ that.removeListeners();
66
+ that.setTTListeners();
67
+ });
68
+ ac.addEventListener("shown.bs.collapse", function (e) {
69
+ that.removeListeners();
70
+ that.setTTListeners();
71
+ });
72
+ });
73
+ (_b = this.container) === null || _b === void 0 ? void 0 : _b.querySelectorAll(".manipulator").forEach(m => {
74
+ m.addEventListener("click", function (e) {
75
+ that.removeListeners();
76
+ that.setTTListeners();
77
+ });
78
+ });
79
+ }
80
+ /**
81
+ * create actual tooltip as element
82
+ */
83
+ createTooltip(el) {
84
+ var ttid = "tt-" + el.id + "-" + this.containerId;
85
+ el.setAttribute("aria-describedby", ttid);
86
+ var tt = document.createElement("div");
87
+ tt.setAttribute("role", "tooltip");
88
+ tt.setAttribute("id", ttid);
89
+ tt.textContent = el.id;
90
+ tt.classList.add("tooltip");
91
+ tt.classList.add("hide");
92
+ var arrow = document.createElement("div");
93
+ arrow.setAttribute("data-popper-arrow", "");
94
+ tt.append(arrow);
95
+ this.container.prepend(tt);
96
+ core_1.createPopper(el, tt, {
97
+ placement: 'top-start',
98
+ modifiers: [
99
+ {
100
+ name: 'offset',
101
+ options: {
102
+ offset: [0, -el.getBoundingClientRect().height],
103
+ },
104
+ },
105
+ // {
106
+ // name: 'arrow',
107
+ // options: {
108
+ // element: arrow,
109
+ // padding: 2,
110
+ // },
111
+ // },
112
+ ],
113
+ });
114
+ }
115
+ removeListeners() {
116
+ var _a, _b, _c;
117
+ var that = this;
118
+ (_a = this.container) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.ttQuerySelector).forEach(btn => {
119
+ btn.removeEventListener("mouseenter", that.enterHoverListener);
120
+ btn.removeEventListener("mouseleave", that.leaveHoverListener);
121
+ });
122
+ (_b = this.timeOuts) === null || _b === void 0 ? void 0 : _b.forEach(to => {
123
+ clearTimeout(to);
124
+ that.timeOuts.pop();
125
+ });
126
+ (_c = this.container) === null || _c === void 0 ? void 0 : _c.querySelectorAll(".tooltip").forEach(tt => {
127
+ tt.remove();
128
+ });
129
+ return this;
130
+ }
131
+ }
132
+ exports.default = TooltipHandler;