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
@@ -0,0 +1,705 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dc = require("../utils/DOMCreator");
4
+ const bootstrap_1 = require("bootstrap");
5
+ //import Toggle from "bootstrap5-toggle"
6
+ const interactjs_1 = require("interactjs");
7
+ const constants_1 = require("../constants");
8
+ const meioperations = require("../utils/MEIOperations");
9
+ const cq = require("../utils/convenienceQueries");
10
+ const ReactWrapper = require("../utils/ReactWrapper");
11
+ const buttonStyleDarkOutline = "btn btn-outline-dark btn-md";
12
+ const buttonStyleDark = "btn btn-dark btn-md";
13
+ const smuflFont = "smufl";
14
+ const alterBtn = "alterBtn";
15
+ const selectedFlag = "selected";
16
+ const tabFlag = "tabBtn";
17
+ class Tabbar {
18
+ //private task: Evaluation
19
+ constructor(options = null, containerId) {
20
+ this.createAnnotListHandler = (function createAnnotListHandler(e) {
21
+ var t = e.target;
22
+ if (t.closest(".vibe-container").id !== this.containerId)
23
+ return;
24
+ this.createAnnotList(e);
25
+ }).bind(this);
26
+ this.closeHandlerMouse = (function closeHandlerMouse(e) {
27
+ e.preventDefault();
28
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
29
+ //this.closeDropdown(dd)
30
+ });
31
+ }).bind(this);
32
+ // Macht momentan nix
33
+ this.closeHandlerKey = (function closeHandlerMouse(e) {
34
+ if (!cq.hasActiveElement(this.containerId))
35
+ return;
36
+ if (e.key === "Escape") {
37
+ //e.preventDefault()
38
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
39
+ //this.closeDropdown(dd)
40
+ });
41
+ }
42
+ }).bind(this);
43
+ /**
44
+ * Make Buttons in Toolbar selectable exclusively
45
+ */
46
+ this.exclusiveSelectHandler = (function exclusiveSelectHandler(e) {
47
+ this.exclusiveSelect(e);
48
+ }).bind(this);
49
+ this.sidebarHandler = (function sidebarHandler(e) {
50
+ var _a, _b;
51
+ //toggle
52
+ var that = this;
53
+ var elParent;
54
+ // initial style caching
55
+ if (!this.styleCache) {
56
+ this.styleCache = new Map();
57
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".openSidebar, .closedSidebar")).forEach(el => {
58
+ elParent = el.parentElement;
59
+ elParent.querySelectorAll(":scope > div").forEach(d => {
60
+ that.styleCache.set(d.id, d.getAttribute("style"));
61
+ });
62
+ });
63
+ return;
64
+ }
65
+ if (this.sidebar.classList.contains("closedSidebar")) {
66
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".closedSidebar")).forEach(el => {
67
+ elParent = el.parentElement;
68
+ el.classList.remove("closedSidebar");
69
+ el.classList.add("openSidebar");
70
+ });
71
+ if (that.styleCache.size > 0) {
72
+ for (const [key, value] of that.styleCache.entries()) {
73
+ (_b = (_a = document.getElementById(that.containerId)) === null || _a === void 0 ? void 0 : _a.querySelector("#" + key)) === null || _b === void 0 ? void 0 : _b.setAttribute("style", value);
74
+ }
75
+ }
76
+ //that.styleCache = new Map<string, string>()
77
+ }
78
+ else {
79
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".openSidebar")).forEach(el => {
80
+ elParent = el.parentElement;
81
+ elParent.querySelectorAll(":scope > div").forEach(d => {
82
+ that.styleCache.set(d.id, d.getAttribute("style"));
83
+ //d.removeAttribute("style")
84
+ });
85
+ el.classList.add("closedSidebar");
86
+ el.classList.remove("openSidebar");
87
+ });
88
+ }
89
+ }).bind(this);
90
+ /**
91
+ * Creates second toolbar depending on selected option
92
+ */
93
+ this.customToolbarHandler = (function customToolbarHandler(e) {
94
+ var cont = cq.getContainer(this.containerId);
95
+ cont.querySelectorAll(["#insertDropdown a", "." + tabFlag].join(",")).forEach(a => {
96
+ a.classList.remove("selected");
97
+ });
98
+ var target = e.target;
99
+ var tID = target.id;
100
+ cont.querySelector("#" + tID).classList.add("selected");
101
+ this.removeAllCustomGroups();
102
+ switch (tID) {
103
+ case "notationTabBtn":
104
+ case "clickInsert":
105
+ this.clickInsertHandler();
106
+ break;
107
+ case "keyMode":
108
+ this.keyModeHandler();
109
+ break;
110
+ case "annotationTabBtn":
111
+ case "activateAnnot":
112
+ this.annotHandler();
113
+ break;
114
+ case "activateHarm":
115
+ this.harmHandler();
116
+ case "articulationTabBtn":
117
+ this.articulationHandler();
118
+ break;
119
+ }
120
+ }).bind(this);
121
+ this.containerId = containerId;
122
+ if (options !== null) {
123
+ this.options = options;
124
+ }
125
+ }
126
+ createToolbars() {
127
+ this.sideBarGroup = cq.getContainer(this.containerId).querySelector("#sideBarGroup");
128
+ var toggleBtn = dc.makeNewButton("", "toggleSidebar", buttonStyleDarkOutline + " closedSidebar");
129
+ this.sideBarGroup.append(toggleBtn);
130
+ this.createSideBar();
131
+ this.createMainToolbar();
132
+ this.createCustomToolbar();
133
+ this.addElementsToBootstrap();
134
+ this.setListeners();
135
+ }
136
+ createSideBar() {
137
+ this.createModList();
138
+ cq.getContainer(this.containerId).querySelectorAll("#sidebarList a, #timeDiv, #tempoDiv").forEach(sa => {
139
+ sa.setAttribute("draggable", "true");
140
+ });
141
+ this.createAnnotList();
142
+ this.optionalButtons();
143
+ }
144
+ createModList() {
145
+ this.sidebar = cq.getContainer(this.containerId).querySelector("#sidebarContainer");
146
+ var accordeon = dc.makeNewDiv("sidebarList", "accordion");
147
+ this.sidebar.appendChild(accordeon);
148
+ //Keysignatures
149
+ accordeon.appendChild(this.createKeySigAccItem());
150
+ //Music Key
151
+ accordeon.appendChild(this.createClefAccItem());
152
+ //Time Signature
153
+ accordeon.appendChild(this.createTimeSigAccItem());
154
+ //Tempo
155
+ //accordeon.appendChild(this.createTempoAccItem())
156
+ //midiSelect
157
+ accordeon.append(this.createMidiSelect());
158
+ }
159
+ createKeySigAccItem() {
160
+ var keySelectItem = dc.makeNewAccordionItem("sidebarList", "selectKey", "selectKeyHeader", "selectKeyBtn", "Key", buttonStyleDark, "selectKeyDiv");
161
+ var keyListCMajRow = dc.makeNewDiv("keyListCDIV", "row");
162
+ var keyListCMaj = dc.makeNewDiv("keyListC", "list-group flex-fill col");
163
+ keySelectItem.querySelector("#selectKeyDiv").appendChild(keyListCMajRow);
164
+ keyListCMajRow.appendChild(keyListCMaj);
165
+ keyListCMaj.appendChild(dc.makeNewAElement("=&#xE01A;&#xE050;&#xE014;", "KeyCMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
166
+ var keyListSignedRow = dc.makeNewDiv("keyListCrossDIV", "col row g-0");
167
+ var keyListCross = dc.makeNewDiv("keyListCross", "list-group flex-fill col");
168
+ keySelectItem.querySelector("#selectKeyDiv").appendChild(keyListSignedRow);
169
+ keyListSignedRow.appendChild(keyListCross);
170
+ keyListCross.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE014;&#xEB93;&#xE262;-&#xE014;&#xE014;&#xE014;&#xE014;&#xE014;", "KeyGMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
171
+ keyListCross.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE014;&#xEB93;&#xE262;-&#xE014;&#xEB90;&#xE262;-&#xE014;&#xE014;&#xE014;&#xE014;", "KeyDMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
172
+ keyListCross.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE014;&#xEB93;&#xE262;-&#xE014;&#xEB90;&#xE262;-&#xE014;&#xEB94;&#xE262;-&#xE014;&#xE014;&#xE014;", "KeyAMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
173
+ keyListCross.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE014;&#xEB93;&#xE262;-&#xE014;&#xEB90;&#xE262;-&#xE014;&#xEB94;&#xE262;-&#xE014;&#xEB91;&#xE262;-&#xE014;&#xE014;", "KeyEMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
174
+ keyListCross.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE014;&#xEB93;&#xE262;-&#xE014;&#xEB90;&#xE262;-&#xE014;&#xEB94;&#xE262;-&#xE014;&#xEB91;&#xE262;-&#xE014;&#xEB98;&#xE262;-&#xE014;", "KeyBMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
175
+ keyListCross.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE014;&#xEB93;&#xE262;-&#xE014;&#xEB90;&#xE262;-&#xE014;&#xEB94;&#xE262;-&#xE014;&#xEB91;&#xE262;-&#xE014;&#xEB98;&#xE262;-&#xE014;&#xEB92;&#xE262;-", "KeyF#Maj", "list-group-item list-group-item-action " + smuflFont, "#", true));
176
+ var keyListB = dc.makeNewDiv("keyListB", "list-group flex-fill col");
177
+ keyListSignedRow.appendChild(keyListB);
178
+ keyListB.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE01A;&#xE260;&#xE014;&#xE014;&#xE014;&#xE014;&#xE014;", "KeyFMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
179
+ keyListB.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE01A;&#xE260;&#xE014;&#xEB92;&#xE260;-&#xE014;&#xE014;&#xE014;&#xE014;", "KeyBbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
180
+ keyListB.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE01A;&#xE260;&#xE014;&#xEB92;&#xE260;-&#xE014;&#xEB98;&#xE260;-&#xE014;&#xE014;&#xE014;", "KeyEbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
181
+ keyListB.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE01A;&#xE260;&#xE014;&#xEB92;&#xE260;-&#xE014;&#xEB98;&#xE260;-&#xE014;&#xEB91;&#xE260;-&#xE014;&#xE014;", "KeyAbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
182
+ keyListB.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE01A;&#xE260;&#xE014;&#xEB92;&#xE260;-&#xE014;&#xEB98;&#xE260;-&#xE014;&#xEB91;&#xE260;-&#xE014;&#xEB99;&#xE260;-&#xE014;", "KeyDbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
183
+ keyListB.appendChild(dc.makeNewAElement("&#xE01A;&#xE050;&#xE01A;&#xE260;&#xE014;&#xEB92;&#xE260;-&#xE014;&#xEB98;&#xE260;-&#xE014;&#xEB91;&#xE260;-&#xE014;&#xEB99;&#xE260;-&#xE014;&#xEB90;&#xE260;-", "KeyGbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
184
+ return keySelectItem;
185
+ }
186
+ createClefAccItem() {
187
+ //Music Key
188
+ var clefSelectItem = dc.makeNewAccordionItem("sidebarList", "selectClef", "selectClefHeader", "selectClefBtn", "Clef", buttonStyleDark, "selectClefDiv");
189
+ var clefList = dc.makeNewDiv("clefList", "list-group flex-fill");
190
+ clefSelectItem.querySelector("#selectClefDiv").appendChild(clefList);
191
+ clefList.appendChild(dc.makeNewAElement("&#x1D11F", "GClefOctUp", "list-group-item list-group-item-action " + smuflFont, "#", true));
192
+ clefList.appendChild(dc.makeNewAElement("&#xE050", "GClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
193
+ clefList.appendChild(dc.makeNewAElement("&#x1D120", "GClefOctDown", "list-group-item list-group-item-action " + smuflFont, "#", true));
194
+ clefList.appendChild(dc.makeNewAElement("Soprano &#xE05C", "CClefSoprano", "list-group-item list-group-item-action " + smuflFont, "#", true));
195
+ clefList.appendChild(dc.makeNewAElement("Mezzo &#xE05C", "CClefMezzo", "list-group-item list-group-item-action " + smuflFont, "#", true));
196
+ clefList.appendChild(dc.makeNewAElement("Alto &#xE05C", "CClefAlto", "list-group-item list-group-item-action " + smuflFont, "#", true));
197
+ clefList.appendChild(dc.makeNewAElement("Tenor &#xE05C", "CClefTenor", "list-group-item list-group-item-action " + smuflFont, "#", true));
198
+ clefList.appendChild(dc.makeNewAElement("Bariton &#xE05C", "CClefBariton", "list-group-item list-group-item-action " + smuflFont, "#", true));
199
+ clefList.appendChild(dc.makeNewAElement("&#x1D123", "FClefOctUp", "list-group-item list-group-item-action " + smuflFont, "#", true));
200
+ clefList.appendChild(dc.makeNewAElement("&#xE062", "FClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
201
+ clefList.appendChild(dc.makeNewAElement("&#x1D124", "FClefOctDown", "list-group-item list-group-item-action " + smuflFont, "#", true));
202
+ return clefSelectItem;
203
+ }
204
+ createTimeSigAccItem() {
205
+ //Time Signature
206
+ var timeSelectItem = dc.makeNewAccordionItem("sidebarList", "selectTime", "selectTimeHeader", "selectTimeBtn", "Time", buttonStyleDark, "selectTimeDiv");
207
+ var timeDiv = dc.makeNewDiv("timeDiv", "row align-items-start");
208
+ var countDiv = dc.makeNewDiv("countDiv", "col");
209
+ var tcdatalistname = "timeCountDatalist";
210
+ var timeCount = dc.makeNewInput("timeCount", "text", "", null, tcdatalistname);
211
+ //create list for time code select
212
+ var tcOptionValues = new Array();
213
+ for (var i = 0; i < 16; i++) {
214
+ tcOptionValues.push((i + 1).toString());
215
+ }
216
+ var tcDatalist = dc.makeNewSelect("timeCount", tcOptionValues);
217
+ //countDiv.appendChild(timeCount)
218
+ countDiv.appendChild(tcDatalist);
219
+ var slashDiv = dc.makeNewDiv("slash", "col");
220
+ slashDiv.textContent = "/";
221
+ var unitDiv = dc.makeNewDiv("unitDiv", "col");
222
+ var tudatalistname = "timeUnitDatalist";
223
+ var timeUnit = dc.makeNewInput("timeUnit", "text", "", null, tudatalistname);
224
+ //create list for time units select
225
+ var tuOptionValues = new Array();
226
+ for (var i = 0; i <= 16; i++) {
227
+ if (Number.isInteger(Math.log2(i))) {
228
+ tuOptionValues.push(i.toString());
229
+ }
230
+ }
231
+ var tuDataList = dc.makeNewSelect("timeUnit", tuOptionValues);
232
+ unitDiv.appendChild(tuDataList);
233
+ timeSelectItem.querySelector("#selectTimeDiv").appendChild(timeDiv);
234
+ timeDiv.appendChild(countDiv);
235
+ timeDiv.appendChild(slashDiv);
236
+ timeDiv.appendChild(unitDiv);
237
+ return timeSelectItem;
238
+ }
239
+ createTempoAccItem() {
240
+ var tempoItem = dc.makeNewAccordionItem("sidebarList", "selectTempo", "selectTempoHeader", "selectTempoBtn", "Tempo", buttonStyleDark, "selectTempoDiv");
241
+ var tempoDiv = dc.makeNewDiv("tempoDiv", "row align-items-start");
242
+ var tempoRefDurDiv = dc.makeNewDiv("tempoRefDurDif", "col");
243
+ var tcdatalistname = "timeCountDatalist";
244
+ var timeCount = dc.makeNewInput("timeCount", "text", "", null, tcdatalistname);
245
+ //create list for time code select
246
+ var tcOptionValues = new Array();
247
+ for (var i = 0; i <= 16; i++) {
248
+ if (Number.isInteger(Math.log2(i))) {
249
+ tcOptionValues.push(i.toString());
250
+ tcOptionValues.push(i.toString() + ".");
251
+ }
252
+ }
253
+ var tcDatalist = dc.makeNewSelect("timeCount", tcOptionValues);
254
+ tempoRefDurDiv.appendChild(tcDatalist);
255
+ var equal = dc.makeNewDiv("equal", "col");
256
+ equal.textContent = "=";
257
+ var unitDiv = dc.makeNewDiv("unitDiv", "col");
258
+ var timeUnit = dc.makeNewInput("timeUnit", "text", "", null);
259
+ unitDiv.appendChild(timeUnit);
260
+ tempoItem.querySelector("#selectTempoDiv").appendChild(tempoDiv);
261
+ tempoDiv.appendChild(tempoRefDurDiv);
262
+ tempoDiv.appendChild(equal);
263
+ tempoDiv.appendChild(unitDiv);
264
+ return tempoItem;
265
+ }
266
+ createMidiSelect() {
267
+ var selectItem = dc.makeNewSelect("midiDeviceSelect", [], "MIDI Input Device");
268
+ // buttonStyleDark.split(" ").forEach(c => selectItem.classList.add(c))
269
+ selectItem.classList.add("accordion-header");
270
+ return selectItem;
271
+ }
272
+ optionalButtons() {
273
+ if (typeof this.sidebar === "undefined") {
274
+ return;
275
+ }
276
+ }
277
+ createAnnotList() {
278
+ var _a, _b;
279
+ (_a = cq.getContainer(this.containerId).querySelector("#annotList")) === null || _a === void 0 ? void 0 : _a.remove();
280
+ var annotList = document.createElement("div");
281
+ annotList.setAttribute("id", "annotList");
282
+ annotList.classList.add("list-group");
283
+ var that = this;
284
+ (_b = cq.getContainer(this.containerId).querySelectorAll("#annotationCanvas > g")) === null || _b === void 0 ? void 0 : _b.forEach(c => {
285
+ var text = c.querySelector(".annotDiv").textContent || c.querySelector(".annotDiv").getAttribute("data-text");
286
+ var a = dc.makeNewAElement(text, "", "list-group-item list-group-item-action list-group-item-primary", "#");
287
+ a.setAttribute("refId", c.id);
288
+ if (c.querySelector(".annotDiv").style.backgroundColor.length > 0) {
289
+ a.style.backgroundColor = c.querySelector(".annotDiv").style.backgroundColor;
290
+ }
291
+ //a.setAttribute("contenteditable", "true")
292
+ a.addEventListener("click", function () {
293
+ var _a;
294
+ a.setAttribute("contenteditable", "true");
295
+ Array.from(cq.getContainer(that.containerId).querySelectorAll(".selected")).forEach(s => s.classList.remove(selectedFlag));
296
+ cq.getContainer(that.containerId).querySelector("#" + c.id).focus();
297
+ (_a = cq.getContainer(that.containerId).querySelector("#" + c.id).querySelector(".annotLinkedText, .annotStaticText")) === null || _a === void 0 ? void 0 : _a.classList.add(selectedFlag);
298
+ });
299
+ a.addEventListener("blur", function (e) {
300
+ var t = e.target;
301
+ a.setAttribute("contenteditable", "false");
302
+ cq.getContainer(that.containerId).querySelector("#" + t.getAttribute("refid")).querySelector(".annotDiv").textContent = t.textContent;
303
+ });
304
+ a.addEventListener("keydown", function (e) {
305
+ var t = e.target;
306
+ if (e.code === "Enter") {
307
+ t.blur();
308
+ }
309
+ else if (e.code === "Space") {
310
+ e.preventDefault();
311
+ document.execCommand("insertText", false, ' ');
312
+ }
313
+ });
314
+ annotList.appendChild(a);
315
+ });
316
+ this.sidebar.appendChild(annotList);
317
+ }
318
+ createButtons() {
319
+ var that = this;
320
+ // and now the tabs
321
+ this.notationTab = cq.getContainer(this.containerId).querySelector("#notationTabGroup");
322
+ this.notationTab.append(dc.makeNewButton("Notation", "notationTabBtn", buttonStyleDarkOutline + " " + tabFlag));
323
+ //this.articulationTab = cq.getContainer(this.containerId).querySelector("#articulationTabGroup")
324
+ //this.articulationTab.append(dc.makeNewButton("Articulation", "articulationTabBtn", buttonStyleDarkOutline + " " + tabFlag))
325
+ //this.melismaTab = cq.getContainer(this.containerId).querySelector("#melismaTabGroup")
326
+ //this.melismaTab.append(dc.makeNewButton("Melisma", "melismaTabBtn", buttonStyleDarkOutline + " " + tabFlag))
327
+ this.annotationTab = cq.getContainer(this.containerId).querySelector("#annotationTabGroup");
328
+ this.annotationTab.append(dc.makeNewButton("Annotation", "annotationTabBtn", buttonStyleDarkOutline + " " + tabFlag));
329
+ this.noteButtonGroup = cq.getContainer(this.containerId).querySelector("#noteGroup");
330
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15C", "breveNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
331
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15D", "fullNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
332
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15E", "halfNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
333
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15F", "quarterNote", buttonStyleDarkOutline + " " + smuflFont + " selected", "", true));
334
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D160", "eigthNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
335
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D161", "sixteenthNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
336
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D162", "thirtysecondNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
337
+ this.dotButtonGroup = cq.getContainer(this.containerId).querySelector("#dotGroup");
338
+ this.dotButtonGroup.append(dc.makeNewButton(".", "oneDot", buttonStyleDarkOutline + " " + smuflFont, "", true));
339
+ this.dotButtonGroup.append(dc.makeNewButton(". .", "twoDot", buttonStyleDarkOutline + " " + smuflFont, "", true));
340
+ // mods for phrasing and rhythm
341
+ this.modButtonGroup = cq.getContainer(this.containerId).querySelector("#modGroup");
342
+ this.modButtonGroup.appendChild(dc.makeNewButton("____", "tupletBtn", buttonStyleDarkOutline + " " + smuflFont, "", true));
343
+ //this.modButtonGroup.appendChild(dc.makeNewButton("&#x1D13D;&#x1D13E;", "pauseNote", buttonStyleDarkOutline + " " + smuflFont, "", true))
344
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#8256", "tieNotes", buttonStyleDarkOutline + " " + smuflFont, "", true));
345
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#9835;", "organizeBeams", buttonStyleDarkOutline + " " + smuflFont, "", true));
346
+ //accidentals
347
+ this.accidButtonGroup = cq.getContainer(this.containerId).querySelector("#accidGroup");
348
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x266D;", "alterDown", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
349
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x266F;", "alterUp", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
350
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x266E;", "alterNeutral", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
351
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x1D12B", "alterDDown", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
352
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x1D12A", "alterDUp", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
353
+ this.accidButtonGroup.addEventListener("click", this.exclusiveSelectHandler);
354
+ this.createArticulationButtons();
355
+ this.soundGroup = cq.getContainer(this.containerId).querySelector("#soundGroup");
356
+ this.soundGroup.appendChild(dc.makeNewButton("", "playBtn", buttonStyleDarkOutline));
357
+ //this.soundGroup.appendChild(dc.makeNewButton("", "pauseBtn", buttonStyleDarkOutline))
358
+ this.soundGroup.appendChild(dc.makeNewButton("", "rewindBtn", buttonStyleDarkOutline));
359
+ this.zoomGroup = cq.getContainer(this.containerId).querySelector("#zoomGroup");
360
+ this.zoomGroup.append(dc.makeNewButton("", "zoomOutBtn", buttonStyleDarkOutline));
361
+ this.zoomGroup.append(dc.makeNewButton("", "zoomInBtn", buttonStyleDarkOutline));
362
+ this.colorGroup = cq.getContainer(this.containerId).querySelector("#colorGroup");
363
+ function handleColor(color) {
364
+ this.colorGroup.setAttribute("selectedColor", color);
365
+ this.colorGroup.dispatchEvent(new Event("change"));
366
+ }
367
+ this.colorGroup.append(ReactWrapper.createColorPicker("colorPicker", handleColor.bind(this)));
368
+ this.fileSelectGroup = cq.getContainer(this.containerId).querySelector("#fileSelectGroup");
369
+ this.fileSelectGroup.append(dc.makeNewInput("importAudioFile", "file", ""));
370
+ this.fileSelectGroup.append(dc.makeNewButton("Import Audiofile", "importAudioFileBtn", buttonStyleDarkOutline));
371
+ this.fileSelectGroup.append(dc.makeNewInput("importXML", "file", ""));
372
+ this.fileSelectGroup.append(dc.makeNewButton("Import Score", "importXMLBtn", buttonStyleDarkOutline));
373
+ this.fileSelectGroup.append(dc.makeNewButton("Export MEI", "exportFileBtn", buttonStyleDarkOutline));
374
+ var showBBToggle = dc.makeNewToggle("showBB", buttonStyleDark, "BBoxes", "showBBDiv");
375
+ this.setToggleLogic(showBBToggle, function () { cq.getContainer(that.containerId).classList.add("debug"); }, function () { cq.getContainer(that.containerId).classList.remove("debug"); });
376
+ this.fileSelectGroup.append(showBBToggle);
377
+ }
378
+ /**
379
+ *
380
+ * @param el element to set logic for
381
+ * @param callBackChecked additional code to execute when toggle is checked
382
+ * @param callBackUnchecked additional code to execute when toggle is unchecked
383
+ * @param switchPair pair of words to change between when toggled
384
+ */
385
+ setToggleLogic(el, callbackChecked = null, callbackUnchecked = null, switchPair = new Array()) {
386
+ if (switchPair.length > 2 || switchPair.length === 1) {
387
+ throw new Error("switchPair Array must have exaclty 2 strings");
388
+ }
389
+ el.addEventListener("click", function (e) {
390
+ e.preventDefault();
391
+ var target = e.target;
392
+ if (target.tagName.toLowerCase() !== "label")
393
+ return;
394
+ var label = e.target;
395
+ var input = label.previousElementSibling;
396
+ if (input.checked === true) {
397
+ if (switchPair.length > 0)
398
+ label.textContent = switchPair[0];
399
+ input.checked = false;
400
+ callbackUnchecked();
401
+ }
402
+ else {
403
+ if (switchPair.length > 0)
404
+ label.textContent = switchPair[1];
405
+ input.checked = true;
406
+ callbackChecked();
407
+ }
408
+ });
409
+ }
410
+ createInsertSelect() {
411
+ //InsertSelect DropdownMenu
412
+ this.insertSelectGroup = dc.makeNewDiv("insertGroup", "customGroup btn-group-md me-2 h-100", { role: "group" });
413
+ var toggle = dc.makeNewToggle("insertToggle", buttonStyleDarkOutline, "Replace", "insertToggleDiv");
414
+ toggle.addEventListener("click", function (e) {
415
+ e.preventDefault();
416
+ var target = e.target;
417
+ if (target.tagName.toLowerCase() !== "label")
418
+ return;
419
+ var label = e.target;
420
+ var input = label.previousElementSibling;
421
+ if (label.textContent === "Replace") {
422
+ label.textContent = "Insert";
423
+ input.checked = false;
424
+ }
425
+ else {
426
+ label.textContent = "Replace";
427
+ input.checked = true;
428
+ }
429
+ });
430
+ this.insertSelectGroup.append(toggle);
431
+ }
432
+ createButtonsAnnotationMode() {
433
+ this.annotGroupKM = dc.makeNewDiv("annotGroupKM", "customGroup btn-group-md me-2 h-100", { role: "group" });
434
+ this.annotGroupKM.append(dc.makeNewButton("Text", "staticTextButton", buttonStyleDarkOutline));
435
+ this.annotGroupKM.append(dc.makeNewButton("Sticky Text", "linkedAnnotButton", buttonStyleDarkOutline + " selected"));
436
+ this.annotGroupKM.append(dc.makeNewButton("Harmony", "harmonyAnnotButton", buttonStyleDarkOutline));
437
+ this.annotGroupKM.addEventListener("click", this.exclusiveSelectHandler);
438
+ }
439
+ createArticulationButtons() {
440
+ this.articGroup = cq.getContainer(this.containerId).querySelector("#articGroup"); //dc.makeNewDiv("articGroup", "customGroup btn-group-md me-2 h-100", { role: "group" }) as HTMLElement
441
+ this.articGroup.append(dc.makeNewButton(".", "staccatoBtn", buttonStyleDarkOutline));
442
+ this.articGroup.append(dc.makeNewButton("_", "tenutoBtn", buttonStyleDarkOutline));
443
+ this.articGroup.append(dc.makeNewButton("&#x1D17F;", "marcatoBtn", buttonStyleDarkOutline + " " + smuflFont, "", true));
444
+ this.articGroup.append(dc.makeNewButton("&#x1D17B;", "accentBtn", buttonStyleDarkOutline + " " + smuflFont, "", true));
445
+ //this.articGroup.addEventListener("click", this.exclusiveSelectHandler)
446
+ }
447
+ createMainToolbar() {
448
+ this.createButtons();
449
+ var btnToolbar = cq.getContainer(this.containerId).querySelector("#btnToolbar");
450
+ btnToolbar.appendChild(this.sideBarGroup);
451
+ btnToolbar.parentElement.insertBefore(this.sidebar, btnToolbar.parentElement.firstChild); // important for ~ selector
452
+ //btnToolbar.appendChild(this.handlerGroup) // invisible
453
+ //tabs
454
+ btnToolbar.appendChild(this.notationTab);
455
+ //btnToolbar.appendChild(this.articulationTab)
456
+ //btnToolbar.appendChild(this.melismaTab)
457
+ btnToolbar.appendChild(this.annotationTab);
458
+ //further utils
459
+ btnToolbar.appendChild(this.soundGroup);
460
+ btnToolbar.appendChild(this.zoomGroup);
461
+ btnToolbar.append(this.colorGroup);
462
+ //btnToolbar.appendChild(this.midiSelectGroup)
463
+ btnToolbar.appendChild(this.fileSelectGroup);
464
+ }
465
+ createCustomToolbar() {
466
+ this.customToolbar = cq.getContainer(this.containerId).querySelector("#customToolbar");
467
+ //this.createInsertSelect()
468
+ this.createButtonsAnnotationMode();
469
+ //this.createArticulationButtons()
470
+ }
471
+ removeAllCustomGroups() {
472
+ Array.from(this.customToolbar.children).forEach(c => {
473
+ c.remove();
474
+ });
475
+ }
476
+ addElementsToBootstrap() {
477
+ //attach bootstrap functionality to Elements
478
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
479
+ new bootstrap_1.Dropdown(dd);
480
+ });
481
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".collapsed")).forEach(c => {
482
+ new bootstrap_1.Collapse(c);
483
+ });
484
+ }
485
+ setListeners() {
486
+ cq.getContainer(this.containerId).querySelectorAll("#handlerGroup *").forEach(el => {
487
+ el.addEventListener("click", this.closeHandlerMouse);
488
+ });
489
+ // achtung: nie preventDefault in einem Document anwenden
490
+ document.addEventListener("keydown", this.closeHandlerKey);
491
+ //document.getElementsByClassName("vibe-container")[0]?.addEventListener("click", this.closeHandlerMouse)
492
+ cq.getContainer(this.containerId).querySelectorAll("#dotGroup button, #noteGroup button, #modGroup button, #accidGroup button, #articGroup button").forEach(el => {
493
+ el.addEventListener("click", this.exclusiveSelectHandler);
494
+ });
495
+ cq.getContainer(this.containerId).querySelector("#toggleSidebar").addEventListener("click", this.sidebarHandler);
496
+ cq.getContainer(this.containerId).querySelectorAll(["#insertDropdown a", "." + tabFlag].join(",")).forEach(a => {
497
+ a.addEventListener("click", this.customToolbarHandler);
498
+ });
499
+ // Why do I have to control this manually???
500
+ cq.getContainer(this.containerId).querySelectorAll(".accordion-button").forEach(ac => {
501
+ ac.addEventListener("hidden.bs.collapse", () => {
502
+ ac.classList.add("show");
503
+ });
504
+ ac.addEventListener("hide.bs.collapse", () => {
505
+ ac.classList.add("show");
506
+ });
507
+ });
508
+ cq.getContainer(this.containerId).addEventListener("annotChanged", this.createAnnotListHandler, true);
509
+ //Markup/ XML FileSelection
510
+ cq.getContainer(this.containerId).querySelector("#importXMLBtn").addEventListener("click", function () {
511
+ var impF = this.parentElement.querySelector("#importXML");
512
+ impF.setAttribute("accept", [".musicxml", ".mei"].join(", "));
513
+ impF.click();
514
+ });
515
+ var that = this;
516
+ cq.getContainer(this.containerId).querySelector("#importXML").addEventListener("input", function (e) {
517
+ var fr = new FileReader();
518
+ fr.onload = function () {
519
+ that.importCallback("", fr.result, false, constants_1.constants._TARGETDIVID_).then(mei => {
520
+ var meiXml = meioperations.mergeSectionScoreDefToLayer(mei);
521
+ meiXml = meioperations.mergeArticToParent(meiXml);
522
+ that.importCallback("", meiXml, false, constants_1.constants._TARGETDIVID_);
523
+ that.align(null, null);
524
+ });
525
+ };
526
+ fr.readAsText(this.files[0]);
527
+ }, false);
528
+ /**
529
+ * Import Audio File for alignment
530
+ */
531
+ cq.getContainer(this.containerId).querySelector("#importAudioFileBtn").addEventListener("click", function () {
532
+ var impF = this.parentElement.querySelector("#importAudioFile");
533
+ impF.setAttribute("accept", [".mp3", ".wav"].join(", "));
534
+ impF.click();
535
+ });
536
+ cq.getContainer(this.containerId).querySelector("#importAudioFile").addEventListener("input", function (e) {
537
+ var fr = new FileReader();
538
+ fr.onload = function () {
539
+ var arrayBuffer = new Blob([fr.result]);
540
+ that.align(arrayBuffer, f);
541
+ };
542
+ var f = this.files[0];
543
+ fr.readAsArrayBuffer(f);
544
+ }, false);
545
+ /**
546
+ * Download settings
547
+ */
548
+ cq.getContainer(this.containerId).querySelector("#exportFileBtn").addEventListener("click", function () {
549
+ that.getMEICallback("").then(mei => {
550
+ var d = new Date();
551
+ var fileName = d.getUTCFullYear()
552
+ + ("0" + d.getDate()).slice(-2)
553
+ + ("0" + d.getMonth()).slice(-2)
554
+ + "_"
555
+ + ("0" + d.getHours()).slice(-2)
556
+ + ("0" + d.getMinutes()).slice(-2)
557
+ + ("0" + d.getSeconds()).slice(-2)
558
+ + "_"
559
+ + "vibeScore_" + that.containerId + ".mei";
560
+ that.download(fileName, mei);
561
+ });
562
+ });
563
+ }
564
+ /**
565
+ * Call the alignCallback with parameters. Only when the audioBlob and audioFile are defined, an alignment can take place.
566
+ * This is called when either an audiofile or xml data is loaded. In the case of XML Data an audio file must be loaded prevously
567
+ * @param blob
568
+ * @param file
569
+ * @returns
570
+ */
571
+ align(blob, file) {
572
+ this.audioBlob = blob;
573
+ this.audioFile = file;
574
+ if (!(this.audioBlob && this.audioFile))
575
+ return;
576
+ this.fileSelectGroup.querySelectorAll("#audioSlider, #recordAlignment, #exportAlignment").forEach(el => el.remove());
577
+ var recBtn = dc.makeNewToggle("recordAlignment", buttonStyleDarkOutline + " " + smuflFont, "rec", "recordDiv");
578
+ var audioSlider = dc.makeNewAudioSlider("audioSlider", "", URL.createObjectURL(this.audioFile));
579
+ var exportAlignBtn = dc.makeNewButton("Export Alignment", "exportAlignment", buttonStyleDarkOutline + " " + smuflFont);
580
+ this.fileSelectGroup.prepend(audioSlider);
581
+ this.fileSelectGroup.prepend(recBtn);
582
+ this.fileSelectGroup.prepend(exportAlignBtn);
583
+ this.alignCallback(this.audioBlob);
584
+ }
585
+ download(file, text) {
586
+ //creating an invisible element
587
+ var element = document.createElement('a');
588
+ element.setAttribute('href', 'data:text/plain;charset=utf-8, '
589
+ + encodeURIComponent(text));
590
+ element.setAttribute('download', file);
591
+ document.body.appendChild(element);
592
+ element.click();
593
+ document.body.removeChild(element);
594
+ }
595
+ removeListeners() {
596
+ cq.getContainer(this.containerId).querySelectorAll("#handlerGroup *").forEach(el => {
597
+ el.removeEventListener("click", this.closeHandlerMouse);
598
+ });
599
+ document.removeEventListener("keydown", this.closeHandlerKey);
600
+ cq.getContainer(this.containerId).querySelectorAll(".btn-group-md button").forEach(el => {
601
+ el.removeEventListener("click", this.exclusiveSelectHandler);
602
+ });
603
+ cq.getContainer(this.containerId).querySelector("#toggleSidebar").removeEventListener("click", this.sidebarHandler);
604
+ cq.getContainer(this.containerId).querySelectorAll(["#insertDropdown a", "." + tabFlag].join(",")).forEach(a => {
605
+ a.removeEventListener("click", this.customToolbarHandler);
606
+ });
607
+ cq.getContainer(this.containerId).removeEventListener("annotChanged", this.createAnnotListHandler);
608
+ interactjs_1.default("#annotList").unset();
609
+ }
610
+ closeDropdown(ddButton) {
611
+ if (ddButton.classList.contains("show")) {
612
+ ddButton.classList.remove("show");
613
+ ddButton.removeAttribute("data-popper-placement");
614
+ ddButton.setAttribute("aria-expanded", "false");
615
+ ddButton.nextElementSibling.classList.remove("show");
616
+ ddButton.nextElementSibling.removeAttribute("data-popper-placement");
617
+ }
618
+ }
619
+ resizeListListener(event) {
620
+ event.stopImmediatePropagation();
621
+ var target = event.target;
622
+ var y = (parseFloat(target.getAttribute('data-y')) || 0);
623
+ target.style.height = event.rect.height + 'px';
624
+ y += event.deltaRect.top;
625
+ target.style.transform = 'translate(0px,' + y + 'px)';
626
+ target.setAttribute('data-y', y.toString());
627
+ var sibling = target.previousElementSibling;
628
+ var sbb = sibling.getBoundingClientRect();
629
+ sbb.height = sbb.height + y;
630
+ }
631
+ exclusiveSelect(e) {
632
+ var target = e.target;
633
+ var tagname = "button";
634
+ if (target.tagName.toLowerCase() === tagname) {
635
+ Array.from(target.parentElement.children).forEach(btn => {
636
+ if (btn.tagName.toLowerCase() === tagname && btn !== target) {
637
+ btn.classList.remove(selectedFlag);
638
+ }
639
+ });
640
+ if (!target.classList.contains(selectedFlag)) {
641
+ target.classList.add(selectedFlag);
642
+ }
643
+ else if (["modGroup", "dotGroup", "chordGroupKM", "articGroup", "accidGroup"].some(id => id === target.parentElement.id) && target.classList.contains(selectedFlag)) {
644
+ target.classList.remove(selectedFlag);
645
+ }
646
+ }
647
+ return this;
648
+ }
649
+ clickInsertHandler() {
650
+ //this.customToolbar.appendChild(this.insertSelectGroup)
651
+ this.customToolbar.appendChild(this.noteButtonGroup);
652
+ this.customToolbar.appendChild(this.dotButtonGroup);
653
+ this.customToolbar.appendChild(this.accidButtonGroup);
654
+ this.customToolbar.append(this.articGroup);
655
+ this.customToolbar.appendChild(this.modButtonGroup);
656
+ }
657
+ keyModeHandler() {
658
+ //this.customToolbar.appendChild(this.insertSelectGroup)
659
+ this.customToolbar.appendChild(this.chordGroupKM);
660
+ this.customToolbar.appendChild(this.octaveGroupKM);
661
+ }
662
+ harmHandler() {
663
+ this.removeAllCustomGroups();
664
+ }
665
+ annotHandler() {
666
+ //this.removeAllCustomGroups()
667
+ this.customToolbar.append(this.annotGroupKM);
668
+ }
669
+ articulationHandler() {
670
+ this.customToolbar.append(this.articGroup);
671
+ }
672
+ /**
673
+ * Callback from Core, so that imported mei or musicxml can be loaded in the editor
674
+ * @param importCallback
675
+ */
676
+ setImportCallback(importCallback) {
677
+ this.importCallback = importCallback;
678
+ return this;
679
+ }
680
+ setAlignCallback(alignCallback) {
681
+ this.alignCallback = alignCallback;
682
+ return this;
683
+ }
684
+ setGetMEICallback(getMEICallback) {
685
+ this.getMEICallback = getMEICallback;
686
+ return this;
687
+ }
688
+ /**
689
+ * Set audio File and directly computes alignment
690
+ * @param file
691
+ * @returns
692
+ */
693
+ setAudioFile(file) {
694
+ this.audioFile = file;
695
+ var fr = new FileReader();
696
+ var that = this;
697
+ fr.readAsArrayBuffer(file);
698
+ fr.onload = function () {
699
+ var arrayBuffer = new Blob([fr.result]);
700
+ that.align(arrayBuffer, file);
701
+ };
702
+ return this;
703
+ }
704
+ }
705
+ exports.default = Tabbar;