vibe-editor 0.0.3 → 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.
- package/package.json +65 -61
- package/src/scripts/js/Core.js +32 -13
- package/src/scripts/js/entry.js +6 -5
- package/src/scripts/js/gui/Annotations.js +28 -13
- package/src/scripts/js/gui/ScoreManipulator.js +13 -11
- package/src/scripts/js/gui/Tabbar.js +14 -5
- package/src/scripts/js/gui/Toolbar.js +1 -1
- package/src/scripts/js/handlers/AnnotationChangeHandler.js +16 -4
- package/src/scripts/js/handlers/CustomAnnotationShapeDrawer.js +2 -2
- package/src/scripts/js/handlers/InsertModeHandler.js +7 -7
- package/src/scripts/js/handlers/KeyModeHandler.js +1 -1
- package/src/scripts/js/handlers/LabelHandler.js +1 -1
- package/src/scripts/js/handlers/NoteDragHandler.js +1 -1
- package/src/scripts/js/handlers/PhantomElementHandler.js +3 -10
- package/src/scripts/js/handlers/{SideBarHandler.js → SidebarHandler.js} +1 -1
- package/src/scripts/js/handlers/TooltipHandler.js +1 -1
- package/src/scripts/js/handlers/WindowHandler.js +7 -7
- package/src/scripts/js/scripts/Core.js +932 -0
- package/src/scripts/js/scripts/MusicProcessor.js +810 -0
- package/src/scripts/js/scripts/VIBE.js +219 -0
- package/src/scripts/js/{assets → scripts/assets}/mei_template.js +2 -2
- package/src/scripts/js/scripts/datastructures/MeasureMatrix.js +156 -0
- package/src/scripts/js/scripts/gui/Annotations.js +549 -0
- package/src/scripts/js/scripts/gui/Cursor.js +203 -0
- package/src/scripts/js/{gui → scripts/gui}/HarmonyLabel.js +1 -1
- package/src/scripts/js/scripts/gui/PhantomElement.js +132 -0
- package/src/scripts/js/scripts/gui/ScoreManipulator.js +188 -0
- package/src/scripts/js/scripts/gui/Tabbar.js +705 -0
- package/src/scripts/js/{gui → scripts/gui}/TempoLabel.js +1 -1
- package/src/scripts/js/{gui/Toolbar copy.js → scripts/gui/Toolbar.js} +15 -11
- package/src/scripts/js/scripts/handlers/AnnotationChangeHandler.js +650 -0
- package/src/scripts/js/scripts/handlers/ClickModeHandler.js +535 -0
- package/src/scripts/js/{gui → scripts/handlers}/CustomAnnotationShapeDrawer.js +34 -17
- package/src/scripts/js/{handlers/ModHandler.js → scripts/handlers/CustomToolbarHandler.js} +54 -66
- package/src/scripts/js/scripts/handlers/GlobalKeyboardHandler.js +372 -0
- package/src/scripts/js/scripts/handlers/Handler.js +2 -0
- package/src/scripts/js/{handlers/InsertModeHandler_deprecated.js → scripts/handlers/InsertModeHandler.js} +117 -164
- package/src/scripts/js/scripts/handlers/KeyModeHandler.js +405 -0
- package/src/scripts/js/scripts/handlers/LabelHandler.js +463 -0
- package/src/scripts/js/scripts/handlers/NoteDragHandler.js +97 -0
- package/src/scripts/js/scripts/handlers/PhantomElementHandler.js +168 -0
- package/src/scripts/js/scripts/handlers/ScoreManipulatorHandler.js +233 -0
- package/src/scripts/js/scripts/handlers/SidebarHandler.js +506 -0
- package/src/scripts/js/scripts/handlers/TooltipHandler.js +132 -0
- package/src/scripts/js/scripts/handlers/WindowHandler.js +278 -0
- package/src/scripts/js/scripts/utils/MEIOperations.js +2121 -0
- package/src/scripts/js/{utils/Mouse2MEI.js → scripts/utils/Mouse2SVG.js} +225 -57
- package/src/scripts/js/{utils → scripts/utils}/ReactWrapper.js +1 -1
- package/src/scripts/js/scripts/utils/SVGEditor.js +453 -0
- package/src/scripts/js/scripts/utils/Types.js +2 -0
- package/src/scripts/js/{utils/VerovioWrapper copy.js → scripts/utils/VerovioWrapper.js} +35 -21
- package/src/scripts/js/scripts/utils/coordinates.js +54 -0
- package/src/scripts/js/utils/MEIOperations.js +22 -22
- package/src/scripts/js/utils/Mouse2SVG.js +13 -6
- package/src/scripts/js/utils/SVGEditor.js +2 -2
- package/src/scripts/js/utils/VerovioWrapper.js +4 -4
- package/src/scripts/js/utils/coordinates.js +26 -2
- package/src/scripts/js/.DS_Store +0 -0
- package/src/scripts/js/MusicPlayer.js +0 -572
- package/src/scripts/js/datastructures/ScoreGraph copy.js +0 -432
- package/src/scripts/js/gui/CustomAnnotationDrawer.js +0 -114
- package/src/scripts/js/handlers/AnnotationDragHandler.js +0 -113
- package/src/scripts/js/handlers/AnnotationLineHandler.js +0 -113
- package/src/scripts/js/handlers/ArticulationHandler.js +0 -20
- package/src/scripts/js/handlers/HarmonyHandler.js +0 -282
- package/src/scripts/js/handlers/InsertModeHandler copy.js +0 -423
- package/src/scripts/js/handlers/KeyModeHandler copy.js +0 -407
- package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +0 -411
- package/src/scripts/js/handlers/NoteDragHandler copy.js +0 -148
- package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +0 -150
- package/src/scripts/js/handlers/SelectionHandler.js +0 -262
- package/src/scripts/js/utils/RectWrapper.js +0 -10
- package/src/scripts/js/utils/SVGFiller.js +0 -245
- package/src/scripts/js/utils/VerovioWrapperLocal.js +0 -156
- package/src/scripts/js/utils/firefoxBBoxes.js +0 -143
- package/src/styles/vibe.css +0 -785
- /package/src/scripts/js/{constants.js → scripts/constants.js} +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph.js +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph_deprecated.js +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreNode.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/Label.js +0 -0
- /package/src/scripts/js/{handlers → scripts/handlers}/DeleteHandler.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/DOMCreator.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/MEIConverter.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/convenienceQueries.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/mappings.js +0 -0
- /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;
|