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.
- package/package.json +65 -61
- package/src/scripts/js/Core.js +28 -9
- package/src/scripts/js/entry.js +6 -5
- package/src/scripts/js/gui/Annotations.js +27 -12
- package/src/scripts/js/gui/ScoreManipulator.js +6 -4
- package/src/scripts/js/gui/Tabbar.js +13 -4
- package/src/scripts/js/handlers/AnnotationChangeHandler.js +13 -1
- package/src/scripts/js/handlers/InsertModeHandler.js +3 -3
- package/src/scripts/js/handlers/PhantomElementHandler.js +3 -10
- 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/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/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/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/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/Mouse2SVG.js +11 -4
- 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/{assets → scripts/assets}/mei_template.js +0 -0
- /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}/HarmonyLabel.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/Label.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/TempoLabel.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}/ReactWrapper.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
@@ -1,20 +1,23 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const constants_1 = require("../constants");
|
4
|
-
const random_1 = require("../utils/random");
|
5
4
|
const meiConverter = require("../utils/MEIConverter");
|
6
5
|
const meiOperation = require("../utils/MEIOperations");
|
7
6
|
const cq = require("../utils/convenienceQueries");
|
8
|
-
const modSelector = ".slur, .tie, .accid";
|
7
|
+
const modSelector = ".slur, .tie, .accid, .artic, .tupletNum, .tupletBracket";
|
9
8
|
/**
|
10
9
|
* Handler for all options which could modulate the given score. These functions are related to all buttons in the sidebar and toolbar
|
11
10
|
*/
|
12
|
-
class
|
11
|
+
class CustomToolbarHandler {
|
13
12
|
constructor(containerId) {
|
14
13
|
this.resetListenerFunction = (function resetListenerFunction(e) {
|
15
14
|
e.preventDefault();
|
16
15
|
this.resetListeners();
|
17
16
|
}).bind(this);
|
17
|
+
this.createTupletFunction = (function createTupletFunction(e) {
|
18
|
+
e.preventDefault();
|
19
|
+
this.createTuplet(e);
|
20
|
+
}).bind(this);
|
18
21
|
/** Wrapperfunction for Eventslistener */
|
19
22
|
this.connectNotesFunction = (function connectNotesFunction(e) {
|
20
23
|
e.preventDefault();
|
@@ -35,6 +38,7 @@ class ModHandler {
|
|
35
38
|
this.articulationHandler(e);
|
36
39
|
}).bind(this);
|
37
40
|
this.setContainerId(containerId);
|
41
|
+
this.tupletButton = this.container.querySelector("#tupletBtn");
|
38
42
|
this.tieNotesButton = this.container.querySelector("#tieNotes");
|
39
43
|
this.organizeBeamsButton = this.container.querySelector("#organizeBeams");
|
40
44
|
var a = this.alterUpButton = this.container.querySelector("#alterUp");
|
@@ -43,21 +47,22 @@ class ModHandler {
|
|
43
47
|
var d = this.alterDUpButton = this.container.querySelector("#alterDUp");
|
44
48
|
var e = this.alterDDownButton = this.container.querySelector("#alterDDown");
|
45
49
|
this.alterButtons = [a, b, c, d, e];
|
46
|
-
this.articButtons = new Array()
|
50
|
+
this.articButtons = Array.from(this.container.querySelectorAll("#articGroup .btn")); //new Array()
|
47
51
|
this.tabButtons = Array.from(this.container.querySelectorAll(".tabBtn"));
|
48
52
|
}
|
49
53
|
setListeners() {
|
50
54
|
this.tabButtons.forEach(tb => {
|
51
55
|
tb.addEventListener("click", this.resetListenerFunction);
|
52
56
|
});
|
57
|
+
this.tupletButton.addEventListener("click", this.createTupletFunction);
|
53
58
|
this.tieNotesButton.addEventListener("click", this.connectNotesFunction);
|
54
59
|
this.organizeBeamsButton.addEventListener("click", this.organizeBeamsFunction);
|
55
60
|
this.alterButtons.forEach(ab => {
|
56
61
|
ab.addEventListener("click", this.alterFunction);
|
57
62
|
});
|
58
|
-
if
|
59
|
-
|
60
|
-
}
|
63
|
+
// if(this.articButtons.length === 0){
|
64
|
+
// cq.getContainer(this.containerId).querySelectorAll("#articGroup .btn").forEach(btn => this.articButtons.push(btn))
|
65
|
+
// }
|
61
66
|
this.articButtons.forEach(ab => {
|
62
67
|
ab.addEventListener("click", this.articulationHandlerFunction);
|
63
68
|
});
|
@@ -67,6 +72,7 @@ class ModHandler {
|
|
67
72
|
this.tabButtons.forEach(tb => {
|
68
73
|
tb.removeEventListener("click", this.resetListenerFunction);
|
69
74
|
});
|
75
|
+
this.tupletButton.removeEventListener("click", this.createTupletFunction);
|
70
76
|
this.tieNotesButton.removeEventListener("click", this.connectNotesFunction);
|
71
77
|
this.organizeBeamsButton.removeEventListener("click", this.organizeBeamsFunction);
|
72
78
|
this.alterButtons.forEach(ab => {
|
@@ -81,6 +87,16 @@ class ModHandler {
|
|
81
87
|
this.setListeners();
|
82
88
|
return this;
|
83
89
|
}
|
90
|
+
createTuplet(e) {
|
91
|
+
var meiElements = Array.from(cq.getContainer(this.containerId).querySelectorAll(".marked")).map(m => {
|
92
|
+
if (this.currentMEI.querySelector("#" + m.id) !== null) {
|
93
|
+
return this.currentMEI.querySelector("#" + m.id);
|
94
|
+
}
|
95
|
+
});
|
96
|
+
meiOperation.createTuplet(meiElements, this.currentMEI);
|
97
|
+
var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
|
98
|
+
this.loadDataCallback("", mei, false);
|
99
|
+
}
|
84
100
|
/**
|
85
101
|
* Make slur or tie for 2 or more elements when tie button is clicked
|
86
102
|
* Tie, only when there are two selected elemets which are the same pitch
|
@@ -93,45 +109,13 @@ class ModHandler {
|
|
93
109
|
if (markedElements.length <= 1) {
|
94
110
|
return;
|
95
111
|
}
|
96
|
-
var makeSlur = markedElements.length > 2;
|
112
|
+
var makeSlur = markedElements.length > 2 ? "slur" : "tie";
|
97
113
|
//if(!makeSlur && markedElements.length > 1){ // assert only 2 items
|
98
114
|
var leftId = markedElements[0].id;
|
99
115
|
var rightId = markedElements.reverse()[0].id;
|
100
116
|
var leftMeiElement = this.currentMEI.getElementById(leftId);
|
101
117
|
var rightMeiElement = this.currentMEI.getElementById(rightId);
|
102
|
-
|
103
|
-
var leftoct = leftMeiElement.getAttribute("oct");
|
104
|
-
var leftAccid = leftMeiElement.getAttribute("accid") || leftMeiElement.getAttribute("accid.ges");
|
105
|
-
var rightpname = rightMeiElement.getAttribute("pname");
|
106
|
-
var rightoct = rightMeiElement.getAttribute("oct");
|
107
|
-
var rightAccid = rightMeiElement.getAttribute("accid") || rightMeiElement.getAttribute("accid.ges");
|
108
|
-
if (!(leftpname === rightpname && leftoct === rightoct && leftAccid === rightAccid)) {
|
109
|
-
makeSlur = true;
|
110
|
-
}
|
111
|
-
//}
|
112
|
-
var connections = this.currentMEI.querySelectorAll("tie, slur");
|
113
|
-
var deleted = false;
|
114
|
-
connections.forEach(c => {
|
115
|
-
var sid = c.getAttribute("startid").replace("#", "");
|
116
|
-
var eid = c.getAttribute("endid").replace("#", "");
|
117
|
-
if (sid === leftId && eid === rightId) {
|
118
|
-
c.remove();
|
119
|
-
deleted = true;
|
120
|
-
}
|
121
|
-
});
|
122
|
-
if (!deleted) {
|
123
|
-
var tieElement;
|
124
|
-
if (makeSlur) {
|
125
|
-
tieElement = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "slur");
|
126
|
-
}
|
127
|
-
else {
|
128
|
-
tieElement = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "tie");
|
129
|
-
}
|
130
|
-
tieElement.setAttribute("startid", "#" + leftId);
|
131
|
-
tieElement.setAttribute("endid", "#" + rightId);
|
132
|
-
tieElement.setAttribute("id", random_1.uuidv4());
|
133
|
-
this.currentMEI.getElementById(leftId).closest("measure").append(tieElement);
|
134
|
-
}
|
118
|
+
meiOperation.connectNotes(leftMeiElement, rightMeiElement, makeSlur);
|
135
119
|
var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
|
136
120
|
this.loadDataCallback("", mei, false);
|
137
121
|
}
|
@@ -207,44 +191,46 @@ class ModHandler {
|
|
207
191
|
oldBeam.remove();
|
208
192
|
}
|
209
193
|
meiOperation.cleanUp(this.currentMEI);
|
210
|
-
|
194
|
+
const mei = meiConverter.restoreXmlIdTags(this.currentMEI);
|
211
195
|
this.loadDataCallback("", mei, false);
|
212
196
|
}
|
213
197
|
}
|
214
198
|
/**
|
215
|
-
* Alter Notes (accid) according to button.
|
199
|
+
* Alter Notes (accid) according to button. When Button is not Selected,
|
216
200
|
* @param e
|
217
201
|
* @returns
|
218
202
|
*/
|
219
203
|
alterNotes(e) {
|
220
|
-
|
221
|
-
var accidSig;
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
204
|
+
const target = e.target;
|
205
|
+
var accidSig = "n";
|
206
|
+
if (target.classList.contains("selected")) {
|
207
|
+
switch (target.id) {
|
208
|
+
case "alterUp":
|
209
|
+
accidSig = "s";
|
210
|
+
break;
|
211
|
+
case "alterDown":
|
212
|
+
accidSig = "f";
|
213
|
+
break;
|
214
|
+
case "alterDUp":
|
215
|
+
accidSig = "ss";
|
216
|
+
break;
|
217
|
+
case "alterDDown":
|
218
|
+
accidSig = "ff";
|
219
|
+
break;
|
220
|
+
case "alterNeutral":
|
221
|
+
accidSig = "n";
|
222
|
+
break;
|
223
|
+
default:
|
224
|
+
console.error(target.id, "No such option for accid alteration");
|
225
|
+
return;
|
226
|
+
}
|
241
227
|
}
|
242
228
|
this.vrvSVG.querySelectorAll(".note.marked").forEach(nm => {
|
243
229
|
var meiElement = this.currentMEI.getElementById(nm.id);
|
244
230
|
meiElement.setAttribute("accid", accidSig);
|
245
231
|
meiElement.removeAttribute("accid.ges");
|
246
232
|
});
|
247
|
-
|
233
|
+
const mei = meiConverter.restoreXmlIdTags(this.currentMEI);
|
248
234
|
meiOperation.adjustAccids(mei);
|
249
235
|
this.loadDataCallback("", mei, false);
|
250
236
|
}
|
@@ -255,6 +241,8 @@ class ModHandler {
|
|
255
241
|
makeScoreElementsClickable() {
|
256
242
|
var that = this;
|
257
243
|
cq.getInteractOverlay(this.containerId).querySelectorAll(modSelector).forEach(c => {
|
244
|
+
if (c.classList.contains("tuplet"))
|
245
|
+
console.log(c);
|
258
246
|
c.addEventListener("click", function (e) {
|
259
247
|
e.preventDefault();
|
260
248
|
e.stopImmediatePropagation();
|
@@ -308,4 +296,4 @@ class ModHandler {
|
|
308
296
|
return this;
|
309
297
|
}
|
310
298
|
}
|
311
|
-
exports.default =
|
299
|
+
exports.default = CustomToolbarHandler;
|
@@ -0,0 +1,372 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const meiOperation = require("../utils/MEIOperations");
|
4
|
+
const meiConverter = require("../utils/MEIConverter");
|
5
|
+
const cq = require("../utils/convenienceQueries");
|
6
|
+
const marked = "marked";
|
7
|
+
const lastAdded = "lastAdded";
|
8
|
+
const editStates = [marked, lastAdded];
|
9
|
+
const editStateSelector = "." + editStates.join(",.");
|
10
|
+
const noteEditStateSelector = editStateSelector.replace(".", ".note.");
|
11
|
+
class GlobalKeyboardHandler {
|
12
|
+
constructor(containerId) {
|
13
|
+
this.preventScroll = function (e) {
|
14
|
+
if (this.hasEditableOpen())
|
15
|
+
return;
|
16
|
+
if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].indexOf(e.code) > -1) {
|
17
|
+
e.preventDefault();
|
18
|
+
}
|
19
|
+
}.bind(this);
|
20
|
+
this.keydownHandler = (function keydownHandler(e) {
|
21
|
+
if (e.code === "Space")
|
22
|
+
return;
|
23
|
+
if (this.hasContainerFocus()) {
|
24
|
+
if (e.key == undefined) {
|
25
|
+
return;
|
26
|
+
}
|
27
|
+
if (this.hasEditableOpen())
|
28
|
+
return;
|
29
|
+
var that = this;
|
30
|
+
var isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
|
31
|
+
var ctrl = e.ctrlKey;
|
32
|
+
if (isMac) {
|
33
|
+
ctrl = e.metaKey;
|
34
|
+
}
|
35
|
+
if (ctrl) {
|
36
|
+
if (e.key === "z") {
|
37
|
+
this.undoHandler(e);
|
38
|
+
}
|
39
|
+
if (e.key === "y") {
|
40
|
+
this.redoHandler(e);
|
41
|
+
}
|
42
|
+
if (e.key === "a") {
|
43
|
+
this.selectAllHandler(e);
|
44
|
+
}
|
45
|
+
if (e.key === "c") {
|
46
|
+
this.copyHandler(e);
|
47
|
+
}
|
48
|
+
if (e.key === "v") {
|
49
|
+
this.pasteHandler(e);
|
50
|
+
}
|
51
|
+
// if(e.key === "k" && Array.from(document.querySelectorAll(".note, .chord, .rest, .mrest")).some(el => el.classList.contains(marked))){
|
52
|
+
// this.handleHarmony(e)
|
53
|
+
// }
|
54
|
+
}
|
55
|
+
else if (e.key.includes("Arrow")) {
|
56
|
+
//document.removeEventListener("keydown", this.keydownHandler)
|
57
|
+
this.transposeHandler(e);
|
58
|
+
}
|
59
|
+
else if (e.key === "Escape") {
|
60
|
+
this.resetHandler(e);
|
61
|
+
}
|
62
|
+
else if (e.key.match(/F\d/) !== null) { // interact with F-Keys
|
63
|
+
this.changeTab(e.key);
|
64
|
+
}
|
65
|
+
else if (e.key.match(/^\d+$/) !== null) { // interaction with numbers
|
66
|
+
this.changeCustomBtn(e.key);
|
67
|
+
}
|
68
|
+
else if (e.shiftKey) {
|
69
|
+
if (e.key !== "Shift" && cq.getContainer(this.containerId).classList.contains("clickMode")) { // may only be used during Notation Tab is open
|
70
|
+
// wait for a double keydown and cache input information
|
71
|
+
if (this.tempKey == undefined) {
|
72
|
+
this.tempKey = e.key;
|
73
|
+
}
|
74
|
+
else {
|
75
|
+
this.tempKey += e.key;
|
76
|
+
}
|
77
|
+
if (this.keyTimeOuts == undefined)
|
78
|
+
this.keyTimeOuts = new Array();
|
79
|
+
this.keyTimeOuts.forEach(to => {
|
80
|
+
clearTimeout(to);
|
81
|
+
});
|
82
|
+
var to = setTimeout(function () {
|
83
|
+
if (["B", "BB", "'", "''", "N", "T", "_"].some(k => that.tempKey === k)) {
|
84
|
+
that.changeCustomBtn(that.tempKey);
|
85
|
+
}
|
86
|
+
that.tempKey = undefined;
|
87
|
+
that.keyTimeOuts.forEach(to => {
|
88
|
+
clearTimeout(to);
|
89
|
+
});
|
90
|
+
that.keyTimeOuts = undefined;
|
91
|
+
}, 100);
|
92
|
+
this.keyTimeOuts.push(to);
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}).bind(this);
|
97
|
+
this.prolongHandler = (function prolongHandler(e) {
|
98
|
+
if (this.hasContainerFocus()) {
|
99
|
+
if (e.code === "Semicolon") { // Deutsch: Ä
|
100
|
+
this.reduceDur();
|
101
|
+
}
|
102
|
+
else if (e.code === "Quote") { // Deutsch: Ö
|
103
|
+
this.prolongDur();
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}).bind(this);
|
107
|
+
this.containerId = containerId;
|
108
|
+
this.container = document.getElementById(containerId);
|
109
|
+
this.setListeners();
|
110
|
+
}
|
111
|
+
setListeners() {
|
112
|
+
document.addEventListener("keydown", this.keydownHandler);
|
113
|
+
//document.addEventListener("keydown", this.prolongHandler)
|
114
|
+
window.addEventListener("keydown", this.preventScroll, false);
|
115
|
+
}
|
116
|
+
removeListeners() {
|
117
|
+
document.removeEventListener("keydown", this.keydownHandler);
|
118
|
+
//document.removeEventListener("keydown", this.prolongHandler)
|
119
|
+
window.removeEventListener("keydown", this.preventScroll, false);
|
120
|
+
}
|
121
|
+
undoHandler(e) {
|
122
|
+
e.preventDefault();
|
123
|
+
if (!this.hasContainerFocus())
|
124
|
+
return;
|
125
|
+
e.stopImmediatePropagation();
|
126
|
+
this.undoCallback();
|
127
|
+
//document.removeEventListener("keydown", this.keydownHandler)
|
128
|
+
}
|
129
|
+
redoHandler(e) {
|
130
|
+
e.preventDefault();
|
131
|
+
if (!this.hasContainerFocus())
|
132
|
+
return;
|
133
|
+
e.stopImmediatePropagation();
|
134
|
+
this.redoCallback();
|
135
|
+
//document.removeEventListener("keydown", this.keydownHandler)
|
136
|
+
}
|
137
|
+
selectAllHandler(e) {
|
138
|
+
if (!this.hasContainerFocus())
|
139
|
+
return;
|
140
|
+
e.preventDefault();
|
141
|
+
cq.getVrvSVG(this.containerId).querySelectorAll(".note").forEach(note => {
|
142
|
+
let stem = note.querySelector(".stem");
|
143
|
+
note.classList.add(marked);
|
144
|
+
if (stem !== null) {
|
145
|
+
stem.classList.add(marked);
|
146
|
+
}
|
147
|
+
var chord = note.closest(".chord");
|
148
|
+
if (chord !== null) {
|
149
|
+
if (!chord.classList.contains(marked))
|
150
|
+
chord.classList.add(marked);
|
151
|
+
}
|
152
|
+
});
|
153
|
+
}
|
154
|
+
/**
|
155
|
+
* Copy marked Elements only in active Layer (only monophonic copies are possible right now)
|
156
|
+
* @param e
|
157
|
+
*/
|
158
|
+
copyHandler(e) {
|
159
|
+
if (!this.hasContainerFocus())
|
160
|
+
return;
|
161
|
+
e.preventDefault();
|
162
|
+
this.copiedIds = new Array();
|
163
|
+
cq.getContainer(this.containerId).querySelectorAll(".activeLayer .marked").forEach(m => {
|
164
|
+
this.copiedIds.push(m.id);
|
165
|
+
});
|
166
|
+
this.copiedIds.filter(n => n); //undefined and null Elements will be excluded
|
167
|
+
console.log("Copied", this.copiedIds);
|
168
|
+
}
|
169
|
+
/**
|
170
|
+
* paste marked Elements
|
171
|
+
* @param e
|
172
|
+
*/
|
173
|
+
pasteHandler(e) {
|
174
|
+
var _a, _b;
|
175
|
+
//if(!this.hasContainerFocus()) return
|
176
|
+
//e.preventDefault()
|
177
|
+
const pastePosition = ((_a = this.container.querySelector(".chord.marked, .note.marked, .rest.marked, .mRest.marked")) === null || _a === void 0 ? void 0 : _a.id) || ((_b = this.container.querySelector("#cursor")) === null || _b === void 0 ? void 0 : _b.getAttribute("refId"));
|
178
|
+
if (this.copiedIds && pastePosition) {
|
179
|
+
const pasteResult = meiOperation.paste(this.copiedIds, pastePosition, this.currentMEI);
|
180
|
+
this.currentMEI = pasteResult[0];
|
181
|
+
const lastId = pasteResult[1];
|
182
|
+
const mei = meiConverter.restoreXmlIdTags(this.currentMEI);
|
183
|
+
this.loadDataCallback("", mei, false).then(mei => {
|
184
|
+
//Tell everyone that a past just occured to readjust certain elements e.g.
|
185
|
+
const pastedEvent = new CustomEvent("pasted", { detail: lastId });
|
186
|
+
document.dispatchEvent(pastedEvent);
|
187
|
+
});
|
188
|
+
}
|
189
|
+
}
|
190
|
+
resetHandler(e) {
|
191
|
+
if (!this.hasContainerFocus())
|
192
|
+
return;
|
193
|
+
e.preventDefault();
|
194
|
+
this.container.querySelectorAll(editStateSelector).forEach(el => {
|
195
|
+
editStates.forEach(es => {
|
196
|
+
el.classList.remove(es);
|
197
|
+
});
|
198
|
+
});
|
199
|
+
this.musicPlayer.rewindMidi();
|
200
|
+
this.resetLastInsertedNoteId();
|
201
|
+
this.container.querySelectorAll("#modGroup *").forEach(mg => mg.classList.remove("selected"));
|
202
|
+
}
|
203
|
+
transposeHandler(e) {
|
204
|
+
if (!this.hasContainerFocus())
|
205
|
+
return;
|
206
|
+
if (["annotMode", "harmonyMode"].some(cn => this.container.classList.contains(cn)))
|
207
|
+
return;
|
208
|
+
//e.preventDefault()
|
209
|
+
if (document.querySelectorAll(noteEditStateSelector).length === 0) {
|
210
|
+
return;
|
211
|
+
}
|
212
|
+
var mei;
|
213
|
+
switch (e.key) {
|
214
|
+
case "ArrowUp":
|
215
|
+
mei = meiOperation.transposeByStep(this.currentMEI, "up");
|
216
|
+
break;
|
217
|
+
case "ArrowDown":
|
218
|
+
mei = meiOperation.transposeByStep(this.currentMEI, "down");
|
219
|
+
break;
|
220
|
+
default:
|
221
|
+
//console.log(this, "Sorry, wrong turn")
|
222
|
+
}
|
223
|
+
if (mei != undefined) {
|
224
|
+
if (cq.getContainer(this.containerId).querySelector(".marked") !== null)
|
225
|
+
this.resetLastInsertedNoteId();
|
226
|
+
mei = meiConverter.restoreXmlIdTags(mei);
|
227
|
+
this.loadDataCallback("", mei, false);
|
228
|
+
}
|
229
|
+
}
|
230
|
+
/**
|
231
|
+
* Change tab according to F-Key. The mapping is based on the displayed order
|
232
|
+
* @param fkey
|
233
|
+
*/
|
234
|
+
changeTab(fkey) {
|
235
|
+
var cont = cq.getContainer(this.containerId);
|
236
|
+
var target;
|
237
|
+
switch (fkey) {
|
238
|
+
case "F1":
|
239
|
+
target = "notationTabBtn";
|
240
|
+
break;
|
241
|
+
case "F2":
|
242
|
+
target = "annotationTabBtn";
|
243
|
+
break;
|
244
|
+
case "F3":
|
245
|
+
target = "articulationTabBtn";
|
246
|
+
break;
|
247
|
+
default:
|
248
|
+
console.log("There is no Tab to be selected for KEY " + fkey);
|
249
|
+
}
|
250
|
+
try {
|
251
|
+
cont.querySelector("#" + target).dispatchEvent(new MouseEvent("click"));
|
252
|
+
}
|
253
|
+
catch (error) {
|
254
|
+
console.log(this.constructor.name, " has no implementation for " + target);
|
255
|
+
}
|
256
|
+
}
|
257
|
+
/**
|
258
|
+
* Change to the button in custom tool bar based on the key input.
|
259
|
+
* In the case of numbers: mapping is based on the displayed order. Everything else is mapped by key combinations
|
260
|
+
* @param key
|
261
|
+
*/
|
262
|
+
changeCustomBtn(key) {
|
263
|
+
var _a, _b;
|
264
|
+
if (key.match(/^\d+$/) !== null) {
|
265
|
+
var i = parseInt(key);
|
266
|
+
i = i === 0 ? 9 : i - 1;
|
267
|
+
var btn = cq.getContainer(this.containerId).querySelectorAll("#customToolbar button.btn");
|
268
|
+
(_a = btn[i]) === null || _a === void 0 ? void 0 : _a.dispatchEvent(new MouseEvent("click"));
|
269
|
+
}
|
270
|
+
else {
|
271
|
+
var id = "";
|
272
|
+
switch (key) {
|
273
|
+
case "B": //b
|
274
|
+
id = "alterDown";
|
275
|
+
break;
|
276
|
+
case "'": //#
|
277
|
+
id = "alterUp";
|
278
|
+
break;
|
279
|
+
case "BB": //bb
|
280
|
+
id = "alterDDown";
|
281
|
+
break;
|
282
|
+
case "''": //x
|
283
|
+
id = "alterDUp";
|
284
|
+
break;
|
285
|
+
case "N": //neutral
|
286
|
+
id = "alterNeutral";
|
287
|
+
break;
|
288
|
+
case "T": //tie /slur
|
289
|
+
id = "tieNotes";
|
290
|
+
break;
|
291
|
+
case "_": //beam
|
292
|
+
id = "organizeBeams";
|
293
|
+
break;
|
294
|
+
}
|
295
|
+
(_b = cq.getContainer(this.containerId).querySelector("#" + id)) === null || _b === void 0 ? void 0 : _b.dispatchEvent(new MouseEvent("click"));
|
296
|
+
}
|
297
|
+
}
|
298
|
+
handleHarmony(e) {
|
299
|
+
if (!this.hasContainerFocus())
|
300
|
+
return;
|
301
|
+
this.harmonyHandlerCallback(e);
|
302
|
+
}
|
303
|
+
// Helpers
|
304
|
+
reduceDur() {
|
305
|
+
var additionalElements = new Array();
|
306
|
+
additionalElements.push(document.getElementById(this.scoreGraph.nextRight().getId()));
|
307
|
+
//meiOperation.changeDuration(this.currentMEI, "reduce", additionalElements)
|
308
|
+
meiOperation.changeDurationsInLayer(this.currentMEI, additionalElements);
|
309
|
+
var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
|
310
|
+
this.loadDataCallback("", mei, false);
|
311
|
+
}
|
312
|
+
prolongDur() {
|
313
|
+
var additionalElements = new Array();
|
314
|
+
additionalElements.push(document.getElementById(this.scoreGraph.nextRight().getId()));
|
315
|
+
//meiOperation.changeDuration(this.currentMEI, "prolong", additionalElements)
|
316
|
+
meiOperation.changeDurationsInLayer(this.currentMEI, additionalElements);
|
317
|
+
var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
|
318
|
+
this.loadDataCallback("", mei, false);
|
319
|
+
}
|
320
|
+
resetListeners() {
|
321
|
+
this.removeListeners();
|
322
|
+
this.setListeners();
|
323
|
+
return this;
|
324
|
+
}
|
325
|
+
hasContainerFocus() {
|
326
|
+
return this.container.classList.contains("activeContainer");
|
327
|
+
}
|
328
|
+
hasEditableOpen() {
|
329
|
+
if (!document.getElementById(this.containerId))
|
330
|
+
return false;
|
331
|
+
return document.getElementById(this.containerId).querySelector(".canvas *[contenteditable=true]") !== null;
|
332
|
+
}
|
333
|
+
/////// GETTER/ SETTER ///////
|
334
|
+
setUndoCallback(undoCallback) {
|
335
|
+
this.undoCallback = undoCallback;
|
336
|
+
return this;
|
337
|
+
}
|
338
|
+
setRedoCallback(redoCallback) {
|
339
|
+
this.redoCallback = redoCallback;
|
340
|
+
return this;
|
341
|
+
}
|
342
|
+
setCurrentMei(mei) {
|
343
|
+
this.currentMEI = mei;
|
344
|
+
return this;
|
345
|
+
}
|
346
|
+
setMusicProcessor(musicPlayer) {
|
347
|
+
this.musicPlayer = musicPlayer;
|
348
|
+
return this;
|
349
|
+
}
|
350
|
+
setScoreGraph(scoreGraph) {
|
351
|
+
this.scoreGraph = scoreGraph;
|
352
|
+
return this;
|
353
|
+
}
|
354
|
+
resetLastInsertedNoteId() { }
|
355
|
+
setHarmonyHandlerCallback(harmonyHandlerCallback) {
|
356
|
+
this.harmonyHandlerCallback = harmonyHandlerCallback;
|
357
|
+
return this;
|
358
|
+
}
|
359
|
+
setLoadDataCallback(loadDataCallback) {
|
360
|
+
this.loadDataCallback = loadDataCallback;
|
361
|
+
return this;
|
362
|
+
}
|
363
|
+
setContainerId(containerId) {
|
364
|
+
this.containerId = containerId;
|
365
|
+
return this;
|
366
|
+
}
|
367
|
+
resetLastInsertedNoteCallback(resetLastInsertedNoteId) {
|
368
|
+
this.resetLastInsertedNoteId = resetLastInsertedNoteId;
|
369
|
+
return this;
|
370
|
+
}
|
371
|
+
}
|
372
|
+
exports.default = GlobalKeyboardHandler;
|