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.
Files changed (87) hide show
  1. package/package.json +65 -61
  2. package/src/scripts/js/Core.js +32 -13
  3. package/src/scripts/js/entry.js +6 -5
  4. package/src/scripts/js/gui/Annotations.js +28 -13
  5. package/src/scripts/js/gui/ScoreManipulator.js +13 -11
  6. package/src/scripts/js/gui/Tabbar.js +14 -5
  7. package/src/scripts/js/gui/Toolbar.js +1 -1
  8. package/src/scripts/js/handlers/AnnotationChangeHandler.js +16 -4
  9. package/src/scripts/js/handlers/CustomAnnotationShapeDrawer.js +2 -2
  10. package/src/scripts/js/handlers/InsertModeHandler.js +7 -7
  11. package/src/scripts/js/handlers/KeyModeHandler.js +1 -1
  12. package/src/scripts/js/handlers/LabelHandler.js +1 -1
  13. package/src/scripts/js/handlers/NoteDragHandler.js +1 -1
  14. package/src/scripts/js/handlers/PhantomElementHandler.js +3 -10
  15. package/src/scripts/js/handlers/{SideBarHandler.js → SidebarHandler.js} +1 -1
  16. package/src/scripts/js/handlers/TooltipHandler.js +1 -1
  17. package/src/scripts/js/handlers/WindowHandler.js +7 -7
  18. package/src/scripts/js/scripts/Core.js +932 -0
  19. package/src/scripts/js/scripts/MusicProcessor.js +810 -0
  20. package/src/scripts/js/scripts/VIBE.js +219 -0
  21. package/src/scripts/js/{assets → scripts/assets}/mei_template.js +2 -2
  22. package/src/scripts/js/scripts/datastructures/MeasureMatrix.js +156 -0
  23. package/src/scripts/js/scripts/gui/Annotations.js +549 -0
  24. package/src/scripts/js/scripts/gui/Cursor.js +203 -0
  25. package/src/scripts/js/{gui → scripts/gui}/HarmonyLabel.js +1 -1
  26. package/src/scripts/js/scripts/gui/PhantomElement.js +132 -0
  27. package/src/scripts/js/scripts/gui/ScoreManipulator.js +188 -0
  28. package/src/scripts/js/scripts/gui/Tabbar.js +705 -0
  29. package/src/scripts/js/{gui → scripts/gui}/TempoLabel.js +1 -1
  30. package/src/scripts/js/{gui/Toolbar copy.js → scripts/gui/Toolbar.js} +15 -11
  31. package/src/scripts/js/scripts/handlers/AnnotationChangeHandler.js +650 -0
  32. package/src/scripts/js/scripts/handlers/ClickModeHandler.js +535 -0
  33. package/src/scripts/js/{gui → scripts/handlers}/CustomAnnotationShapeDrawer.js +34 -17
  34. package/src/scripts/js/{handlers/ModHandler.js → scripts/handlers/CustomToolbarHandler.js} +54 -66
  35. package/src/scripts/js/scripts/handlers/GlobalKeyboardHandler.js +372 -0
  36. package/src/scripts/js/scripts/handlers/Handler.js +2 -0
  37. package/src/scripts/js/{handlers/InsertModeHandler_deprecated.js → scripts/handlers/InsertModeHandler.js} +117 -164
  38. package/src/scripts/js/scripts/handlers/KeyModeHandler.js +405 -0
  39. package/src/scripts/js/scripts/handlers/LabelHandler.js +463 -0
  40. package/src/scripts/js/scripts/handlers/NoteDragHandler.js +97 -0
  41. package/src/scripts/js/scripts/handlers/PhantomElementHandler.js +168 -0
  42. package/src/scripts/js/scripts/handlers/ScoreManipulatorHandler.js +233 -0
  43. package/src/scripts/js/scripts/handlers/SidebarHandler.js +506 -0
  44. package/src/scripts/js/scripts/handlers/TooltipHandler.js +132 -0
  45. package/src/scripts/js/scripts/handlers/WindowHandler.js +278 -0
  46. package/src/scripts/js/scripts/utils/MEIOperations.js +2121 -0
  47. package/src/scripts/js/{utils/Mouse2MEI.js → scripts/utils/Mouse2SVG.js} +225 -57
  48. package/src/scripts/js/{utils → scripts/utils}/ReactWrapper.js +1 -1
  49. package/src/scripts/js/scripts/utils/SVGEditor.js +453 -0
  50. package/src/scripts/js/scripts/utils/Types.js +2 -0
  51. package/src/scripts/js/{utils/VerovioWrapper copy.js → scripts/utils/VerovioWrapper.js} +35 -21
  52. package/src/scripts/js/scripts/utils/coordinates.js +54 -0
  53. package/src/scripts/js/utils/MEIOperations.js +22 -22
  54. package/src/scripts/js/utils/Mouse2SVG.js +13 -6
  55. package/src/scripts/js/utils/SVGEditor.js +2 -2
  56. package/src/scripts/js/utils/VerovioWrapper.js +4 -4
  57. package/src/scripts/js/utils/coordinates.js +26 -2
  58. package/src/scripts/js/.DS_Store +0 -0
  59. package/src/scripts/js/MusicPlayer.js +0 -572
  60. package/src/scripts/js/datastructures/ScoreGraph copy.js +0 -432
  61. package/src/scripts/js/gui/CustomAnnotationDrawer.js +0 -114
  62. package/src/scripts/js/handlers/AnnotationDragHandler.js +0 -113
  63. package/src/scripts/js/handlers/AnnotationLineHandler.js +0 -113
  64. package/src/scripts/js/handlers/ArticulationHandler.js +0 -20
  65. package/src/scripts/js/handlers/HarmonyHandler.js +0 -282
  66. package/src/scripts/js/handlers/InsertModeHandler copy.js +0 -423
  67. package/src/scripts/js/handlers/KeyModeHandler copy.js +0 -407
  68. package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +0 -411
  69. package/src/scripts/js/handlers/NoteDragHandler copy.js +0 -148
  70. package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +0 -150
  71. package/src/scripts/js/handlers/SelectionHandler.js +0 -262
  72. package/src/scripts/js/utils/RectWrapper.js +0 -10
  73. package/src/scripts/js/utils/SVGFiller.js +0 -245
  74. package/src/scripts/js/utils/VerovioWrapperLocal.js +0 -156
  75. package/src/scripts/js/utils/firefoxBBoxes.js +0 -143
  76. package/src/styles/vibe.css +0 -785
  77. /package/src/scripts/js/{constants.js → scripts/constants.js} +0 -0
  78. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph.js +0 -0
  79. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph_deprecated.js +0 -0
  80. /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreNode.js +0 -0
  81. /package/src/scripts/js/{gui → scripts/gui}/Label.js +0 -0
  82. /package/src/scripts/js/{handlers → scripts/handlers}/DeleteHandler.js +0 -0
  83. /package/src/scripts/js/{utils → scripts/utils}/DOMCreator.js +0 -0
  84. /package/src/scripts/js/{utils → scripts/utils}/MEIConverter.js +0 -0
  85. /package/src/scripts/js/{utils → scripts/utils}/convenienceQueries.js +0 -0
  86. /package/src/scripts/js/{utils → scripts/utils}/mappings.js +0 -0
  87. /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 ModHandler {
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 (this.articButtons.length === 0) {
59
- cq.getContainer(this.containerId).querySelectorAll("#articGroup .btn").forEach(btn => this.articButtons.push(btn));
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
- var leftpname = leftMeiElement.getAttribute("pname");
103
- var leftoct = leftMeiElement.getAttribute("oct");
104
- var leftAccid = leftMeiElement.getAttribute("accid") || leftMeiElement.getAttribute("accid.ges");
105
- var rightpname = rightMeiElement.getAttribute("pname");
106
- var rightoct = rightMeiElement.getAttribute("oct");
107
- var rightAccid = rightMeiElement.getAttribute("accid") || rightMeiElement.getAttribute("accid.ges");
108
- if (!(leftpname === rightpname && leftoct === rightoct && leftAccid === rightAccid)) {
109
- makeSlur = true;
110
- }
111
- //}
112
- var connections = this.currentMEI.querySelectorAll("tie, slur");
113
- var deleted = false;
114
- connections.forEach(c => {
115
- var sid = c.getAttribute("startid").replace("#", "");
116
- var eid = c.getAttribute("endid").replace("#", "");
117
- if (sid === leftId && eid === rightId) {
118
- c.remove();
119
- deleted = true;
120
- }
121
- });
122
- if (!deleted) {
123
- var tieElement;
124
- if (makeSlur) {
125
- tieElement = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "slur");
126
- }
127
- else {
128
- tieElement = this.currentMEI.createElementNS(constants_1.constants._MEINS_, "tie");
129
- }
130
- tieElement.setAttribute("startid", "#" + leftId);
131
- tieElement.setAttribute("endid", "#" + rightId);
132
- tieElement.setAttribute("id", random_1.uuidv4());
133
- this.currentMEI.getElementById(leftId).closest("measure").append(tieElement);
134
- }
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
- var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
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
- var target = e.target;
221
- var accidSig;
222
- switch (target.id) {
223
- case "alterUp":
224
- accidSig = "s";
225
- break;
226
- case "alterDown":
227
- accidSig = "f";
228
- break;
229
- case "alterDUp":
230
- accidSig = "ss";
231
- break;
232
- case "alterDDown":
233
- accidSig = "ff";
234
- break;
235
- case "alterNeutral":
236
- accidSig = "n";
237
- break;
238
- default:
239
- console.error(target.id, "No such option for accid alteration");
240
- return;
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
- var mei = meiConverter.restoreXmlIdTags(this.currentMEI);
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 = ModHandler;
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;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });