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.
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/package.json +56 -0
- package/src/fonts/bravura/FONTLOG.txt +243 -0
- package/src/fonts/bravura/OFL-FAQ.txt +369 -0
- package/src/fonts/bravura/OFL.txt +94 -0
- package/src/fonts/bravura/bravura-text.md +153 -0
- package/src/fonts/bravura/bravura_metadata.json +34718 -0
- package/src/fonts/bravura/eot/Bravura.eot +0 -0
- package/src/fonts/bravura/eot/BravuraText.eot +0 -0
- package/src/fonts/bravura/otf/Bravura.otf +0 -0
- package/src/fonts/bravura/otf/BravuraText.otf +0 -0
- package/src/fonts/bravura/svg/Bravura.svg +3517 -0
- package/src/fonts/bravura/svg/BravuraText.svg +18879 -0
- package/src/fonts/bravura/woff/Bravura.woff +0 -0
- package/src/fonts/bravura/woff/BravuraText.woff +0 -0
- package/src/fonts/colaborate/ColabBol-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabBol-webfont.svg +976 -0
- package/src/fonts/colaborate/ColabBol-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabBol-webfont.woff +0 -0
- package/src/fonts/colaborate/ColabLig-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabLig-webfont.svg +976 -0
- package/src/fonts/colaborate/ColabLig-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabLig-webfont.woff +0 -0
- package/src/fonts/colaborate/ColabMed-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabMed-webfont.svg +976 -0
- package/src/fonts/colaborate/ColabMed-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabMed-webfont.woff +0 -0
- package/src/fonts/colaborate/ColabReg-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabReg-webfont.svg +976 -0
- package/src/fonts/colaborate/ColabReg-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabReg-webfont.woff +0 -0
- package/src/fonts/colaborate/ColabThi-webfont.eot +0 -0
- package/src/fonts/colaborate/ColabThi-webfont.svg +970 -0
- package/src/fonts/colaborate/ColabThi-webfont.ttf +0 -0
- package/src/fonts/colaborate/ColabThi-webfont.woff +0 -0
- package/src/images/GUI/.DS_Store +0 -0
- package/src/images/GUI/backward-fast-solid.svg +1 -0
- package/src/images/GUI/bars-solid.svg +1 -0
- package/src/images/GUI/caret-left-solid.svg +1 -0
- package/src/images/GUI/caret-right-solid.svg +1 -0
- package/src/images/GUI/edit-solid.svg +1 -0
- package/src/images/GUI/pause-solid.svg +1 -0
- package/src/images/GUI/play-solid.svg +1 -0
- package/src/images/GUI/triplet.svg +21 -0
- package/src/images/GUI/zoomin.svg +1 -0
- package/src/images/GUI/zoomout.svg +1 -0
- package/src/images/bravura_notes/.DS_Store +0 -0
- package/src/images/bravura_notes/16th.svg +1 -0
- package/src/images/bravura_notes/32th.svg +1 -0
- package/src/images/bravura_notes/alterDDown.svg +1 -0
- package/src/images/bravura_notes/alterDUp.svg +1 -0
- package/src/images/bravura_notes/alterDown.svg +1 -0
- package/src/images/bravura_notes/alterNeutral.svg +1 -0
- package/src/images/bravura_notes/alterUp.svg +1 -0
- package/src/images/bravura_notes/beams.svg +1 -0
- package/src/images/bravura_notes/eigth.svg +1 -0
- package/src/images/bravura_notes/full.svg +1 -0
- package/src/images/bravura_notes/half.svg +1 -0
- package/src/images/bravura_notes/oneDot.svg +1 -0
- package/src/images/bravura_notes/pauseNote.svg +1 -0
- package/src/images/bravura_notes/quarter.svg +1 -0
- package/src/images/bravura_notes/tie.svg +1 -0
- package/src/images/bravura_notes/twoDot.svg +1 -0
- package/src/scripts/js/.DS_Store +0 -0
- package/src/scripts/js/Core.js +887 -0
- package/src/scripts/js/MusicPlayer.js +572 -0
- package/src/scripts/js/MusicProcessor.js +652 -0
- package/src/scripts/js/VerovioScoreEditor.js +183 -0
- package/src/scripts/js/assets/mei_template.js +161 -0
- package/src/scripts/js/constants.js +20 -0
- package/src/scripts/js/datastructures/MeasureMatrix.js +235 -0
- package/src/scripts/js/datastructures/ScoreGraph.js +432 -0
- package/src/scripts/js/datastructures/ScoreNode.js +78 -0
- package/src/scripts/js/entry.js +4 -0
- package/src/scripts/js/gui/Annotations.js +456 -0
- package/src/scripts/js/gui/Cursor.js +203 -0
- package/src/scripts/js/gui/CustomAnnotationDrawer.js +114 -0
- package/src/scripts/js/gui/CustomAnnotationShapeDrawer.js +114 -0
- package/src/scripts/js/gui/HarmonyLabel.js +104 -0
- package/src/scripts/js/gui/Label.js +2 -0
- package/src/scripts/js/gui/PhantomElement.js +132 -0
- package/src/scripts/js/gui/ScoreManipulator.js +156 -0
- package/src/scripts/js/gui/Tabbar.js +675 -0
- package/src/scripts/js/gui/TempoLabel.js +60 -0
- package/src/scripts/js/gui/Toolbar copy.js +614 -0
- package/src/scripts/js/gui/Toolbar.js +618 -0
- package/src/scripts/js/handlers/AnnotationChangeHandler.js +567 -0
- package/src/scripts/js/handlers/AnnotationDragHandler.js +113 -0
- package/src/scripts/js/handlers/AnnotationLineHandler.js +113 -0
- package/src/scripts/js/handlers/ArticulationHandler.js +20 -0
- package/src/scripts/js/handlers/ClickModeHandler.js +265 -0
- package/src/scripts/js/handlers/CustomAnnotationShapeDrawer.js +131 -0
- package/src/scripts/js/handlers/CustomToolbarHandler.js +297 -0
- package/src/scripts/js/handlers/DeleteHandler.js +102 -0
- package/src/scripts/js/handlers/GlobalKeyboardHandler.js +367 -0
- package/src/scripts/js/handlers/Handler.js +2 -0
- package/src/scripts/js/handlers/HarmonyHandler.js +282 -0
- package/src/scripts/js/handlers/InsertModeHandler copy.js +423 -0
- package/src/scripts/js/handlers/InsertModeHandler.js +380 -0
- package/src/scripts/js/handlers/InsertModeHandler_deprecated.js +424 -0
- package/src/scripts/js/handlers/KeyModeHandler copy.js +407 -0
- package/src/scripts/js/handlers/KeyModeHandler.js +456 -0
- package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +411 -0
- package/src/scripts/js/handlers/LabelHandler.js +461 -0
- package/src/scripts/js/handlers/ModHandler.js +311 -0
- package/src/scripts/js/handlers/NoteDragHandler copy.js +148 -0
- package/src/scripts/js/handlers/NoteDragHandler.js +97 -0
- package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +150 -0
- package/src/scripts/js/handlers/PhantomElementHandler.js +168 -0
- package/src/scripts/js/handlers/ScoreManipulatorHandler.js +135 -0
- package/src/scripts/js/handlers/SelectionHandler.js +218 -0
- package/src/scripts/js/handlers/SideBarHandler.js +499 -0
- package/src/scripts/js/handlers/TooltipHandler.js +132 -0
- package/src/scripts/js/handlers/WindowHandler.js +257 -0
- package/src/scripts/js/utils/DOMCreator.js +174 -0
- package/src/scripts/js/utils/MEIConverter.js +64 -0
- package/src/scripts/js/utils/MEIOperations.js +2112 -0
- package/src/scripts/js/utils/Mouse2MEI.js +735 -0
- package/src/scripts/js/utils/Mouse2SVG.js +737 -0
- package/src/scripts/js/utils/SVGEditor.js +352 -0
- package/src/scripts/js/utils/SVGFiller.js +245 -0
- package/src/scripts/js/utils/Types.js +2 -0
- package/src/scripts/js/utils/VerovioWrapper copy.js +156 -0
- package/src/scripts/js/utils/VerovioWrapper.js +165 -0
- package/src/scripts/js/utils/VerovioWrapperLocal.js +156 -0
- package/src/scripts/js/utils/convenienceQueries.js +37 -0
- package/src/scripts/js/utils/coordinates.js +54 -0
- package/src/scripts/js/utils/firefoxBBoxes.js +143 -0
- package/src/scripts/js/utils/mappings.js +332 -0
- package/src/scripts/js/utils/random.js +45 -0
- package/src/styles/VerovioScoreEditor.css +694 -0
@@ -0,0 +1,499 @@
|
|
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
|
+
if (c.classList.contains("marked")) {
|
162
|
+
c.classList.remove("marked");
|
163
|
+
(_a = that.getElementInSVG(c.getAttribute("refId"))) === null || _a === void 0 ? void 0 : _a.classList.remove("marked");
|
164
|
+
}
|
165
|
+
else {
|
166
|
+
c.classList.add("marked");
|
167
|
+
(_b = that.getElementInSVG(c.getAttribute("refId"))) === null || _b === void 0 ? void 0 : _b.classList.add("marked");
|
168
|
+
that.changeSelectedElementInSidebar(c);
|
169
|
+
}
|
170
|
+
});
|
171
|
+
});
|
172
|
+
return this;
|
173
|
+
}
|
174
|
+
/**
|
175
|
+
* Change Values in Sidebar to match the selected element in the score.
|
176
|
+
* Currently only for time
|
177
|
+
* @param element
|
178
|
+
*/
|
179
|
+
changeSelectedElementInSidebar(element) {
|
180
|
+
if (!element.classList.contains("meterSig"))
|
181
|
+
return;
|
182
|
+
var baseEl = this.vrvSVG.querySelector("#" + element.getAttribute("refId"));
|
183
|
+
var tempY;
|
184
|
+
var count = "";
|
185
|
+
var unit = "";
|
186
|
+
baseEl.querySelectorAll("use").forEach(u => {
|
187
|
+
var num = mappings_1.unicodeToTimesig.get(u.getAttribute("href").slice(1, 5));
|
188
|
+
if (count === "") {
|
189
|
+
count = num;
|
190
|
+
}
|
191
|
+
else if (u.getAttribute("y") === tempY && count !== "") {
|
192
|
+
count += num;
|
193
|
+
}
|
194
|
+
else if (u.getAttribute("y") === tempY && unit !== "") {
|
195
|
+
unit += num;
|
196
|
+
}
|
197
|
+
else {
|
198
|
+
unit = num;
|
199
|
+
}
|
200
|
+
tempY = u.getAttribute("y");
|
201
|
+
});
|
202
|
+
this.container.querySelector("#timeCount").value = count;
|
203
|
+
this.container.querySelector("#timeUnit").value = unit;
|
204
|
+
}
|
205
|
+
setTimeForSelectedElements(e) {
|
206
|
+
var target = e.target;
|
207
|
+
var changeCount = false;
|
208
|
+
var changeUnit = false;
|
209
|
+
if (target.id.includes("Count")) {
|
210
|
+
changeCount = true;
|
211
|
+
}
|
212
|
+
if (target.id.includes("Unit")) {
|
213
|
+
changeUnit = true;
|
214
|
+
}
|
215
|
+
var count = this.container.querySelector("#timeCount").value;
|
216
|
+
var unit = this.container.querySelector("#timeUnit").value;
|
217
|
+
var markedTimes = Array.from(this.vrvSVG.querySelectorAll(".meterSig.marked"));
|
218
|
+
var reload = false;
|
219
|
+
markedTimes.forEach(mt => {
|
220
|
+
var _a;
|
221
|
+
var meiMt = this.currentMEI.getElementById(mt.id);
|
222
|
+
var isInStaffDef = this.currentMEI.querySelector("#" + mt.id) === null;
|
223
|
+
if (isInStaffDef) {
|
224
|
+
//var myRownum = parseInt(mt.closest(".staff").getAttribute("n")) - 1
|
225
|
+
//var rowNums = new Array()
|
226
|
+
this.currentMEI.querySelector("measure").querySelectorAll("staff").forEach(s => {
|
227
|
+
var rowNum = parseInt(s.getAttribute("n")) - 1;
|
228
|
+
var targetMeterSigDef = this.currentMEI.querySelectorAll("staffDef")[rowNum];
|
229
|
+
if (targetMeterSigDef.getAttribute("meter.count") !== count && changeCount) {
|
230
|
+
targetMeterSigDef.setAttribute("meter.count", count);
|
231
|
+
reload = true;
|
232
|
+
}
|
233
|
+
if (targetMeterSigDef.getAttribute("meter.unit") !== unit && changeUnit) {
|
234
|
+
targetMeterSigDef.setAttribute("meter.unit", unit);
|
235
|
+
reload = true;
|
236
|
+
}
|
237
|
+
});
|
238
|
+
}
|
239
|
+
else {
|
240
|
+
this.currentMEI.querySelector("#" + mt.id).setAttribute("count", count);
|
241
|
+
this.currentMEI.querySelector("#" + mt.id).setAttribute("unit", unit);
|
242
|
+
var siblingLayers = (_a = meiMt.closest("measure")) === null || _a === void 0 ? void 0 : _a.querySelectorAll("layer");
|
243
|
+
var myLayer = meiMt.closest("layer");
|
244
|
+
siblingLayers.forEach(sl => {
|
245
|
+
if (sl.id !== myLayer.id) {
|
246
|
+
var ms = sl.querySelector("meterSig");
|
247
|
+
if (ms === null) {
|
248
|
+
ms = new mei_template_1.default().createMeterSig(count, unit);
|
249
|
+
sl.firstElementChild.prepend(ms);
|
250
|
+
}
|
251
|
+
else {
|
252
|
+
ms.setAttribute("count", count);
|
253
|
+
ms.setAttribute("unit", unit);
|
254
|
+
}
|
255
|
+
}
|
256
|
+
});
|
257
|
+
reload = true;
|
258
|
+
}
|
259
|
+
});
|
260
|
+
if (reload) {
|
261
|
+
meiOperation.cleanUp(this.currentMEI);
|
262
|
+
this.loadDataCallback("", meiConverter.restoreXmlIdTags(this.currentMEI), false);
|
263
|
+
}
|
264
|
+
}
|
265
|
+
// changeParameters by interacting with sidebar
|
266
|
+
setKeyGlobal(e) {
|
267
|
+
var target = e.target;
|
268
|
+
this.currentMEI.querySelectorAll("staffDef > keySig").forEach(s => {
|
269
|
+
s.setAttribute("sig", mappings_1.keyIdToSig.get(target.id));
|
270
|
+
});
|
271
|
+
var mei = meiOperation.adjustAccids(this.currentMEI);
|
272
|
+
meiOperation.cleanUp(mei);
|
273
|
+
mei = meiConverter.restoreXmlIdTags(mei);
|
274
|
+
this.loadDataCallback("", mei, false);
|
275
|
+
return this;
|
276
|
+
}
|
277
|
+
setKeyLocal(e) {
|
278
|
+
var target = e.target;
|
279
|
+
var markedClefs = Array.from(this.vrvSVG.querySelectorAll(".keySig.marked"));
|
280
|
+
var reload = false;
|
281
|
+
markedClefs.forEach(mc => {
|
282
|
+
var isInStaffDef = this.currentMEI.querySelector("#" + mc.id) === null;
|
283
|
+
if (isInStaffDef) {
|
284
|
+
var rowNum = parseInt(mc.closest(".staff").getAttribute("n")) - 1;
|
285
|
+
var targetKeySigDef = this.currentMEI.querySelectorAll("staffDef > keySig")[rowNum];
|
286
|
+
if (targetKeySigDef.getAttribute("sig") !== mappings_1.keyIdToSig.get(target.id)) {
|
287
|
+
targetKeySigDef.setAttribute("sig", mappings_1.keyIdToSig.get(target.id));
|
288
|
+
reload = true;
|
289
|
+
}
|
290
|
+
}
|
291
|
+
else {
|
292
|
+
this.currentMEI.querySelector("#" + mc.id).setAttribute("sig", mappings_1.keyIdToSig.get(target.id));
|
293
|
+
reload = true;
|
294
|
+
}
|
295
|
+
});
|
296
|
+
if (reload) {
|
297
|
+
meiOperation.cleanUp(this.currentMEI);
|
298
|
+
this.loadDataCallback("", meiConverter.restoreXmlIdTags(this.currentMEI), false);
|
299
|
+
}
|
300
|
+
}
|
301
|
+
/**
|
302
|
+
* If Meter is already present in MEI, load it in input for time signature
|
303
|
+
* @returns
|
304
|
+
*/
|
305
|
+
loadMeter() {
|
306
|
+
var staffDef = this.currentMEI.querySelector("staffDef");
|
307
|
+
if (staffDef !== null) {
|
308
|
+
var hasMeter = staffDef.getAttribute("meter.count") !== null && staffDef.getAttribute("meter.unit") !== null;
|
309
|
+
if (hasMeter) {
|
310
|
+
this.container.querySelector("#timeCount").setAttribute("value", staffDef.getAttribute("meter.count"));
|
311
|
+
this.container.querySelector("#timeUnit").setAttribute("value", staffDef.getAttribute("meter.unit"));
|
312
|
+
}
|
313
|
+
}
|
314
|
+
return this;
|
315
|
+
}
|
316
|
+
/**
|
317
|
+
* Listen on Change when input is changed for Time Signatures
|
318
|
+
*/
|
319
|
+
setChangeMeterListeners() {
|
320
|
+
this.container.querySelector("#timeCount").addEventListener("change", this.changeMeterHandler);
|
321
|
+
this.container.querySelector("#timeUnit").addEventListener("change", this.changeMeterHandler);
|
322
|
+
}
|
323
|
+
/**
|
324
|
+
* Set Clefshape for all marked clefelements
|
325
|
+
* @param e MouseEvent
|
326
|
+
*/
|
327
|
+
setClef(e) {
|
328
|
+
var target = e.target;
|
329
|
+
var markedClefs = Array.from(this.vrvSVG.querySelectorAll(".clef.marked"));
|
330
|
+
var reload = false;
|
331
|
+
markedClefs.forEach(mc => {
|
332
|
+
var isInStaffDef = this.currentMEI.querySelector("#" + mc.id) === null;
|
333
|
+
if (isInStaffDef) {
|
334
|
+
var rowNum = parseInt(mc.closest(".staff").getAttribute("n")) - 1;
|
335
|
+
var targetClefDef = this.currentMEI.querySelectorAll("staffDef > clef")[rowNum];
|
336
|
+
if (targetClefDef.getAttribute("shape") !== target.id.charAt(0)) {
|
337
|
+
targetClefDef.setAttribute("shape", target.id.charAt(0));
|
338
|
+
targetClefDef.setAttribute("line", mappings_1.clefToLine.get(target.id.charAt(0)));
|
339
|
+
reload = true;
|
340
|
+
}
|
341
|
+
}
|
342
|
+
else {
|
343
|
+
this.currentMEI.querySelector("#" + mc.id).setAttribute("shape", target.id.charAt(0));
|
344
|
+
this.currentMEI.querySelector("#" + mc.id).setAttribute("line", mappings_1.clefToLine.get(target.id.charAt(0)));
|
345
|
+
reload = true;
|
346
|
+
}
|
347
|
+
});
|
348
|
+
if (reload) {
|
349
|
+
meiOperation.cleanUp(this.currentMEI);
|
350
|
+
this.loadDataCallback("", meiConverter.restoreXmlIdTags(this.currentMEI), false);
|
351
|
+
}
|
352
|
+
}
|
353
|
+
resizeSidebar(e) {
|
354
|
+
var that = this;
|
355
|
+
var target = e.target;
|
356
|
+
target.style.transition = "0s";
|
357
|
+
target.style.width = e.clientX.toString() + "px";
|
358
|
+
target.parentElement.querySelectorAll(":scope > div:not(#sidebarContainer)").forEach(d => {
|
359
|
+
var ds = d;
|
360
|
+
ds.style.transition = "0s";
|
361
|
+
ds.style.marginLeft = (target.getBoundingClientRect().right).toString() + "px";
|
362
|
+
ds.style.width = (that.container.getBoundingClientRect().right - target.getBoundingClientRect().right).toString() + "px";
|
363
|
+
});
|
364
|
+
}
|
365
|
+
findDropTarget(e) {
|
366
|
+
/** TODO: dropflags müssen auch in scoreRects eigegeben werden */
|
367
|
+
e.preventDefault();
|
368
|
+
var pt = coordinates.transformToDOMMatrixCoordinates(e.clientX, e.clientY, this.interactionOverlay);
|
369
|
+
var posx = pt.x;
|
370
|
+
var posy = pt.y;
|
371
|
+
var eventTarget = e.target;
|
372
|
+
var eventTargetParent = eventTarget.parentElement;
|
373
|
+
var eventTargetIsClef = eventTargetParent.id.toLowerCase().includes("clef");
|
374
|
+
var eventTargetIsKey = eventTargetParent.id.toLowerCase().includes("key");
|
375
|
+
var eventTargetIsTime = eventTarget.id.toLocaleLowerCase().includes("time");
|
376
|
+
var eventTargetIsTempo = eventTarget.id.toLocaleLowerCase().includes("tempo");
|
377
|
+
var dropTargets; //NodeListOf<Element>
|
378
|
+
var dropFlag;
|
379
|
+
if (eventTargetIsClef) {
|
380
|
+
dropTargets = Array.from(this.vrvSVG.querySelectorAll(".clef, .barLine > path"));
|
381
|
+
dropFlag = "dropClef";
|
382
|
+
}
|
383
|
+
else if (eventTargetIsKey) {
|
384
|
+
dropTargets = Array.from(this.vrvSVG.querySelectorAll(".keySig, .barLine > path, .clef"));
|
385
|
+
dropFlag = "dropKey";
|
386
|
+
}
|
387
|
+
else if (eventTargetIsTime) {
|
388
|
+
dropTargets = Array.from(this.vrvSVG.querySelectorAll(".meterSig, .barLine > path, .clef"));
|
389
|
+
dropFlag = "dropTime";
|
390
|
+
}
|
391
|
+
else if (eventTargetIsTempo) {
|
392
|
+
dropTargets = Array.from(this.vrvSVG.querySelectorAll(".note, .chord, .rest, .mRest"));
|
393
|
+
dropFlag = "dropTempo";
|
394
|
+
}
|
395
|
+
else {
|
396
|
+
return;
|
397
|
+
}
|
398
|
+
dropTargets.push(this.container.querySelector("#sidebarContainer"));
|
399
|
+
dropTargets.push(this.container.querySelector("#btnToolbar"));
|
400
|
+
dropTargets.push(this.container.querySelector("#customToolbar"));
|
401
|
+
var tempDist = Math.pow(10, 10);
|
402
|
+
dropTargets.forEach(dt => {
|
403
|
+
var _a;
|
404
|
+
var interacationElement = this.interactionOverlay.querySelector("[refId=" + dt.id + "]") || this.container.querySelector("#" + dt.id);
|
405
|
+
var blbbox = interacationElement.getBoundingClientRect();
|
406
|
+
var ptdt = coordinates.getDOMMatrixCoordinates(blbbox, this.interactionOverlay);
|
407
|
+
var bbx = ptdt.left;
|
408
|
+
var bby = ptdt.top;
|
409
|
+
var dist = Math.sqrt(Math.abs(bbx - posx) ** 2 + Math.abs(bby - posy) ** 2);
|
410
|
+
if (dist < tempDist) {
|
411
|
+
dropTargets.forEach(_dt => {
|
412
|
+
var _a;
|
413
|
+
_dt.classList.remove(dropFlag);
|
414
|
+
(_a = this.getElementInInteractOverlay(_dt.id)) === null || _a === void 0 ? void 0 : _a.classList.remove(dropFlag);
|
415
|
+
});
|
416
|
+
tempDist = dist;
|
417
|
+
dt.classList.add(dropFlag);
|
418
|
+
(_a = this.getElementInInteractOverlay(dt.id)) === null || _a === void 0 ? void 0 : _a.classList.add(dropFlag);
|
419
|
+
}
|
420
|
+
});
|
421
|
+
}
|
422
|
+
/**
|
423
|
+
* Determine action on drop elemnt from sidebar on score
|
424
|
+
* @param e
|
425
|
+
*/
|
426
|
+
dropOnTarget(e) {
|
427
|
+
var _a;
|
428
|
+
e.preventDefault();
|
429
|
+
var selectedElement = this.getElementInSVG((_a = this.interactionOverlay.querySelector(".dropClef, .dropKey, .dropTime, .dropTempo")) === null || _a === void 0 ? void 0 : _a.getAttribute("refId"));
|
430
|
+
var t = e.target;
|
431
|
+
var mei;
|
432
|
+
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));
|
433
|
+
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));
|
434
|
+
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));
|
435
|
+
if (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.classList.contains("dropClef")) {
|
436
|
+
if (isFirstClef) {
|
437
|
+
mei = meiOperation.replaceClefinScoreDef(selectedElement, t.id, this.currentMEI);
|
438
|
+
}
|
439
|
+
else {
|
440
|
+
mei = meiOperation.insertClef(selectedElement, t.id, this.currentMEI);
|
441
|
+
}
|
442
|
+
}
|
443
|
+
else if (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.classList.contains("dropKey")) {
|
444
|
+
if (isFirstKey || isFirstClef) {
|
445
|
+
mei = meiOperation.replaceKeyInScoreDef(selectedElement, t.id, this.currentMEI);
|
446
|
+
}
|
447
|
+
else {
|
448
|
+
mei = meiOperation.insertKey(selectedElement, t.id, this.currentMEI);
|
449
|
+
}
|
450
|
+
}
|
451
|
+
else if (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.classList.contains("dropTime")) {
|
452
|
+
if (isFirstMeter || isFirstClef) {
|
453
|
+
mei = meiOperation.replaceMeterInScoreDef(selectedElement, this.currentMEI);
|
454
|
+
}
|
455
|
+
else {
|
456
|
+
mei = meiOperation.insertMeter(selectedElement, this.currentMEI);
|
457
|
+
}
|
458
|
+
}
|
459
|
+
else if (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.classList.contains("dropTempo")) {
|
460
|
+
mei = meiOperation.insertTempo(selectedElement, this.currentMEI);
|
461
|
+
}
|
462
|
+
else {
|
463
|
+
return;
|
464
|
+
}
|
465
|
+
this.loadDataCallback("", mei, false);
|
466
|
+
}
|
467
|
+
getElementInSVG(id) {
|
468
|
+
if (id === "")
|
469
|
+
return;
|
470
|
+
return this.vrvSVG.querySelector("#" + id);
|
471
|
+
}
|
472
|
+
getElementInInteractOverlay(id) {
|
473
|
+
if (id === "")
|
474
|
+
return;
|
475
|
+
return this.interactionOverlay.querySelector("*[refId=\"" + id + "\"]");
|
476
|
+
}
|
477
|
+
//////// GETTER / SETTER /////////////
|
478
|
+
setCurrentMei(mei) {
|
479
|
+
this.currentMEI = mei;
|
480
|
+
return this;
|
481
|
+
}
|
482
|
+
setm2s(m2s) {
|
483
|
+
this.m2s = m2s;
|
484
|
+
return this;
|
485
|
+
}
|
486
|
+
setLoadDataCallback(loadDataCallback) {
|
487
|
+
this.loadDataCallback = loadDataCallback;
|
488
|
+
return this;
|
489
|
+
}
|
490
|
+
setContainerId(containerId) {
|
491
|
+
this.containerId = containerId;
|
492
|
+
this.vrvSVG = cq.getVrvSVG(containerId);
|
493
|
+
this.interactionOverlay = cq.getInteractOverlay(containerId);
|
494
|
+
this.container = document.getElementById(containerId);
|
495
|
+
this.sidebarContainer = this.container.querySelector("#sidebarContainer");
|
496
|
+
return this;
|
497
|
+
}
|
498
|
+
}
|
499
|
+
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;
|