vibe-editor 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/package.json +56 -0
  4. package/src/fonts/bravura/FONTLOG.txt +243 -0
  5. package/src/fonts/bravura/OFL-FAQ.txt +369 -0
  6. package/src/fonts/bravura/OFL.txt +94 -0
  7. package/src/fonts/bravura/bravura-text.md +153 -0
  8. package/src/fonts/bravura/bravura_metadata.json +34718 -0
  9. package/src/fonts/bravura/eot/Bravura.eot +0 -0
  10. package/src/fonts/bravura/eot/BravuraText.eot +0 -0
  11. package/src/fonts/bravura/otf/Bravura.otf +0 -0
  12. package/src/fonts/bravura/otf/BravuraText.otf +0 -0
  13. package/src/fonts/bravura/svg/Bravura.svg +3517 -0
  14. package/src/fonts/bravura/svg/BravuraText.svg +18879 -0
  15. package/src/fonts/bravura/woff/Bravura.woff +0 -0
  16. package/src/fonts/bravura/woff/BravuraText.woff +0 -0
  17. package/src/fonts/colaborate/ColabBol-webfont.eot +0 -0
  18. package/src/fonts/colaborate/ColabBol-webfont.svg +976 -0
  19. package/src/fonts/colaborate/ColabBol-webfont.ttf +0 -0
  20. package/src/fonts/colaborate/ColabBol-webfont.woff +0 -0
  21. package/src/fonts/colaborate/ColabLig-webfont.eot +0 -0
  22. package/src/fonts/colaborate/ColabLig-webfont.svg +976 -0
  23. package/src/fonts/colaborate/ColabLig-webfont.ttf +0 -0
  24. package/src/fonts/colaborate/ColabLig-webfont.woff +0 -0
  25. package/src/fonts/colaborate/ColabMed-webfont.eot +0 -0
  26. package/src/fonts/colaborate/ColabMed-webfont.svg +976 -0
  27. package/src/fonts/colaborate/ColabMed-webfont.ttf +0 -0
  28. package/src/fonts/colaborate/ColabMed-webfont.woff +0 -0
  29. package/src/fonts/colaborate/ColabReg-webfont.eot +0 -0
  30. package/src/fonts/colaborate/ColabReg-webfont.svg +976 -0
  31. package/src/fonts/colaborate/ColabReg-webfont.ttf +0 -0
  32. package/src/fonts/colaborate/ColabReg-webfont.woff +0 -0
  33. package/src/fonts/colaborate/ColabThi-webfont.eot +0 -0
  34. package/src/fonts/colaborate/ColabThi-webfont.svg +970 -0
  35. package/src/fonts/colaborate/ColabThi-webfont.ttf +0 -0
  36. package/src/fonts/colaborate/ColabThi-webfont.woff +0 -0
  37. package/src/images/GUI/.DS_Store +0 -0
  38. package/src/images/GUI/backward-fast-solid.svg +1 -0
  39. package/src/images/GUI/bars-solid.svg +1 -0
  40. package/src/images/GUI/caret-left-solid.svg +1 -0
  41. package/src/images/GUI/caret-right-solid.svg +1 -0
  42. package/src/images/GUI/edit-solid.svg +1 -0
  43. package/src/images/GUI/pause-solid.svg +1 -0
  44. package/src/images/GUI/play-solid.svg +1 -0
  45. package/src/images/GUI/triplet.svg +21 -0
  46. package/src/images/GUI/zoomin.svg +1 -0
  47. package/src/images/GUI/zoomout.svg +1 -0
  48. package/src/images/bravura_notes/.DS_Store +0 -0
  49. package/src/images/bravura_notes/16th.svg +1 -0
  50. package/src/images/bravura_notes/32th.svg +1 -0
  51. package/src/images/bravura_notes/alterDDown.svg +1 -0
  52. package/src/images/bravura_notes/alterDUp.svg +1 -0
  53. package/src/images/bravura_notes/alterDown.svg +1 -0
  54. package/src/images/bravura_notes/alterNeutral.svg +1 -0
  55. package/src/images/bravura_notes/alterUp.svg +1 -0
  56. package/src/images/bravura_notes/beams.svg +1 -0
  57. package/src/images/bravura_notes/eigth.svg +1 -0
  58. package/src/images/bravura_notes/full.svg +1 -0
  59. package/src/images/bravura_notes/half.svg +1 -0
  60. package/src/images/bravura_notes/oneDot.svg +1 -0
  61. package/src/images/bravura_notes/pauseNote.svg +1 -0
  62. package/src/images/bravura_notes/quarter.svg +1 -0
  63. package/src/images/bravura_notes/tie.svg +1 -0
  64. package/src/images/bravura_notes/twoDot.svg +1 -0
  65. package/src/scripts/js/.DS_Store +0 -0
  66. package/src/scripts/js/Core.js +887 -0
  67. package/src/scripts/js/MusicPlayer.js +572 -0
  68. package/src/scripts/js/MusicProcessor.js +652 -0
  69. package/src/scripts/js/VerovioScoreEditor.js +183 -0
  70. package/src/scripts/js/assets/mei_template.js +161 -0
  71. package/src/scripts/js/constants.js +20 -0
  72. package/src/scripts/js/datastructures/MeasureMatrix.js +235 -0
  73. package/src/scripts/js/datastructures/ScoreGraph.js +432 -0
  74. package/src/scripts/js/datastructures/ScoreNode.js +78 -0
  75. package/src/scripts/js/entry.js +4 -0
  76. package/src/scripts/js/gui/Annotations.js +456 -0
  77. package/src/scripts/js/gui/Cursor.js +203 -0
  78. package/src/scripts/js/gui/CustomAnnotationDrawer.js +114 -0
  79. package/src/scripts/js/gui/CustomAnnotationShapeDrawer.js +114 -0
  80. package/src/scripts/js/gui/HarmonyLabel.js +104 -0
  81. package/src/scripts/js/gui/Label.js +2 -0
  82. package/src/scripts/js/gui/PhantomElement.js +132 -0
  83. package/src/scripts/js/gui/ScoreManipulator.js +156 -0
  84. package/src/scripts/js/gui/Tabbar.js +675 -0
  85. package/src/scripts/js/gui/TempoLabel.js +60 -0
  86. package/src/scripts/js/gui/Toolbar copy.js +614 -0
  87. package/src/scripts/js/gui/Toolbar.js +618 -0
  88. package/src/scripts/js/handlers/AnnotationChangeHandler.js +567 -0
  89. package/src/scripts/js/handlers/AnnotationDragHandler.js +113 -0
  90. package/src/scripts/js/handlers/AnnotationLineHandler.js +113 -0
  91. package/src/scripts/js/handlers/ArticulationHandler.js +20 -0
  92. package/src/scripts/js/handlers/ClickModeHandler.js +265 -0
  93. package/src/scripts/js/handlers/CustomAnnotationShapeDrawer.js +131 -0
  94. package/src/scripts/js/handlers/CustomToolbarHandler.js +297 -0
  95. package/src/scripts/js/handlers/DeleteHandler.js +102 -0
  96. package/src/scripts/js/handlers/GlobalKeyboardHandler.js +367 -0
  97. package/src/scripts/js/handlers/Handler.js +2 -0
  98. package/src/scripts/js/handlers/HarmonyHandler.js +282 -0
  99. package/src/scripts/js/handlers/InsertModeHandler copy.js +423 -0
  100. package/src/scripts/js/handlers/InsertModeHandler.js +380 -0
  101. package/src/scripts/js/handlers/InsertModeHandler_deprecated.js +424 -0
  102. package/src/scripts/js/handlers/KeyModeHandler copy.js +407 -0
  103. package/src/scripts/js/handlers/KeyModeHandler.js +456 -0
  104. package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +411 -0
  105. package/src/scripts/js/handlers/LabelHandler.js +461 -0
  106. package/src/scripts/js/handlers/ModHandler.js +311 -0
  107. package/src/scripts/js/handlers/NoteDragHandler copy.js +148 -0
  108. package/src/scripts/js/handlers/NoteDragHandler.js +97 -0
  109. package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +150 -0
  110. package/src/scripts/js/handlers/PhantomElementHandler.js +168 -0
  111. package/src/scripts/js/handlers/ScoreManipulatorHandler.js +135 -0
  112. package/src/scripts/js/handlers/SelectionHandler.js +218 -0
  113. package/src/scripts/js/handlers/SideBarHandler.js +499 -0
  114. package/src/scripts/js/handlers/TooltipHandler.js +132 -0
  115. package/src/scripts/js/handlers/WindowHandler.js +257 -0
  116. package/src/scripts/js/utils/DOMCreator.js +174 -0
  117. package/src/scripts/js/utils/MEIConverter.js +64 -0
  118. package/src/scripts/js/utils/MEIOperations.js +2112 -0
  119. package/src/scripts/js/utils/Mouse2MEI.js +735 -0
  120. package/src/scripts/js/utils/Mouse2SVG.js +737 -0
  121. package/src/scripts/js/utils/SVGEditor.js +352 -0
  122. package/src/scripts/js/utils/SVGFiller.js +245 -0
  123. package/src/scripts/js/utils/Types.js +2 -0
  124. package/src/scripts/js/utils/VerovioWrapper copy.js +156 -0
  125. package/src/scripts/js/utils/VerovioWrapper.js +165 -0
  126. package/src/scripts/js/utils/VerovioWrapperLocal.js +156 -0
  127. package/src/scripts/js/utils/convenienceQueries.js +37 -0
  128. package/src/scripts/js/utils/coordinates.js +54 -0
  129. package/src/scripts/js/utils/firefoxBBoxes.js +143 -0
  130. package/src/scripts/js/utils/mappings.js +332 -0
  131. package/src/scripts/js/utils/random.js +45 -0
  132. package/src/styles/VerovioScoreEditor.css +694 -0
@@ -0,0 +1,614 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const dc = require("../utils/DOMCreator");
3
+ const bootstrap_1 = require("bootstrap");
4
+ //import Toggle from "bootstrap5-toggle"
5
+ const interactjs_1 = require("interactjs");
6
+ const constants_1 = require("../constants");
7
+ const cq = require("../utils/convenienceQueries");
8
+ const buttonStyleDarkOutline = "btn btn-outline-dark btn-sm";
9
+ const buttonStyleDark = "btn btn-dark btn-md";
10
+ const smuflFont = "smufl";
11
+ const alterBtn = "alterBtn";
12
+ const selectedFlag = "selected";
13
+ class Toolbar {
14
+ //private task: Evaluation
15
+ constructor(options = null, containerId) {
16
+ this.createAnnotListFunction = (function (e) {
17
+ var t = e.target;
18
+ if (t.closest(".vse-container").id !== this.containerId)
19
+ return;
20
+ this.createAnnotList(e);
21
+ }).bind(this);
22
+ this.closeHandlerMouse = (function closeHandlerMouse(e) {
23
+ e.preventDefault();
24
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
25
+ //this.closeDropdown(dd)
26
+ });
27
+ }).bind(this);
28
+ // Macht momentan nix
29
+ this.closeHandlerKey = (function closeHandlerMouse(e) {
30
+ if (!cq.hasActiveElement(this.containerId))
31
+ return;
32
+ if (e.key === "Escape") {
33
+ //e.preventDefault()
34
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
35
+ //this.closeDropdown(dd)
36
+ });
37
+ }
38
+ }).bind(this);
39
+ /**
40
+ * MAke Buttons in Toolbar selectable exclusively
41
+ */
42
+ this.exclusiveSelectHandler = (function exclusiveSelectHandler(e) {
43
+ this.exclusiveSelect(e);
44
+ }).bind(this);
45
+ this.sidebarHandler = (function sidebarHandler(e) {
46
+ //toggle
47
+ var sidebarWidthRatio = "30%";
48
+ var btnToolbar = cq.getContainer(this.containerId).querySelector("#btnToolbar");
49
+ if (this.sidebar.classList.contains("closedSidebar")) {
50
+ //document.getElementById("sidebarContainer").style.width = sidebarWidthRatio
51
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".closedSidebar")).forEach(el => {
52
+ el.classList.remove("closedSidebar");
53
+ el.classList.add("openSidebar");
54
+ });
55
+ //btnToolbar.style.marginLeft = sidebarWidthRatio
56
+ }
57
+ else {
58
+ //document.getElementById("sidebarContainer").style.width = "0"
59
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".openSidebar")).forEach(el => {
60
+ el.classList.add("closedSidebar");
61
+ el.classList.remove("openSidebar");
62
+ });
63
+ //btnToolbar.style.marginLeft = "0"
64
+ }
65
+ }).bind(this);
66
+ /**
67
+ * Creates second toolbar depending on selected option
68
+ */
69
+ this.customToolbarHandler = (function customToolbarHandler(e) {
70
+ var target = e.target;
71
+ var tID = target.id;
72
+ this.removeAllCustomGroups();
73
+ switch (tID) {
74
+ case "clickInsert":
75
+ this.clickInsertHandler();
76
+ break;
77
+ case "keyMode":
78
+ this.keyModeHandler();
79
+ break;
80
+ case "activateAnnot":
81
+ this.annotHandler();
82
+ break;
83
+ case "activateHarm":
84
+ this.harmHandler();
85
+ break;
86
+ }
87
+ if (target.textContent === cq.getContainer(this.containerId).querySelector("#insertMode").textContent) {
88
+ this.removeAllCustomGroups();
89
+ }
90
+ }).bind(this);
91
+ this.containerId = containerId;
92
+ if (options !== null) {
93
+ this.options = options;
94
+ }
95
+ }
96
+ createToolbars() {
97
+ this.sideBarGroup = cq.getContainer(this.containerId).querySelector("#sideBarGroup");
98
+ var toggleBtn = dc.makeNewButton("", "toggleSidebar", buttonStyleDarkOutline + " closedSidebar");
99
+ this.sideBarGroup.append(toggleBtn);
100
+ this.createSideBar();
101
+ this.createMainToolbar();
102
+ this.createCustomToolbar();
103
+ this.addElementsToBootstrap();
104
+ this.setListeners();
105
+ }
106
+ createSideBar() {
107
+ this.createModList();
108
+ cq.getContainer(this.containerId).querySelectorAll("#sidebarList a, #timeDiv, #tempoDiv").forEach(sa => {
109
+ sa.setAttribute("draggable", "true");
110
+ });
111
+ this.createAnnotList();
112
+ this.optionalButtons();
113
+ }
114
+ createModList() {
115
+ this.sidebar = cq.getContainer(this.containerId).querySelector("#sidebarContainer");
116
+ var accordeon = dc.makeNewDiv("sidebarList", "accordion");
117
+ this.sidebar.appendChild(accordeon);
118
+ //Keysignatures
119
+ accordeon.appendChild(this.createKeySigAccItem());
120
+ //Music Key
121
+ accordeon.appendChild(this.createClefAccItem());
122
+ //Time Signature
123
+ accordeon.appendChild(this.createTimeSigAccItem());
124
+ //Tempo
125
+ //accordeon.appendChild(this.createTempoAccItem())
126
+ }
127
+ createKeySigAccItem() {
128
+ var keySelectItem = dc.makeNewAccordionItem("sidebarList", "selectKey", "selectKeyHeader", "selectKeyBtn", "Key", buttonStyleDark, "selectKeyDiv");
129
+ var keyListCMajRow = dc.makeNewDiv("keyListCDIV", "row");
130
+ var keyListCMaj = dc.makeNewDiv("keyListC", "list-group flex-fill col");
131
+ keySelectItem.querySelector("#selectKeyDiv").appendChild(keyListCMajRow);
132
+ keyListCMajRow.appendChild(keyListCMaj);
133
+ keyListCMaj.appendChild(dc.makeNewAElement("======", "KeyCMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
134
+ var keyListSignedRow = dc.makeNewDiv("keyListCrossDIV", "col row g-0");
135
+ var keyListCross = dc.makeNewDiv("keyListCross", "list-group flex-fill col");
136
+ keySelectItem.querySelector("#selectKeyDiv").appendChild(keyListSignedRow);
137
+ keyListSignedRow.appendChild(keyListCross);
138
+ keyListCross.appendChild(dc.makeNewAElement("======", "KeyGMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
139
+ keyListCross.appendChild(dc.makeNewAElement("======", "KeyDMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
140
+ keyListCross.appendChild(dc.makeNewAElement("======", "KeyAMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
141
+ keyListCross.appendChild(dc.makeNewAElement("======", "KeyEMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
142
+ keyListCross.appendChild(dc.makeNewAElement("======", "KeyBMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
143
+ keyListCross.appendChild(dc.makeNewAElement("======", "KeyF#Maj", "list-group-item list-group-item-action " + smuflFont, "#", true));
144
+ var keyListB = dc.makeNewDiv("keyListB", "list-group flex-fill col");
145
+ keyListSignedRow.appendChild(keyListB);
146
+ keyListB.appendChild(dc.makeNewAElement("======", "KeyFMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
147
+ keyListB.appendChild(dc.makeNewAElement("======", "KeyBbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
148
+ keyListB.appendChild(dc.makeNewAElement("======", "KeyEbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
149
+ keyListB.appendChild(dc.makeNewAElement("======", "KeyAbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
150
+ keyListB.appendChild(dc.makeNewAElement("======", "KeyDbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
151
+ keyListB.appendChild(dc.makeNewAElement("======", "KeyGbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
152
+ return keySelectItem;
153
+ }
154
+ createClefAccItem() {
155
+ //Music Key
156
+ var clefSelectItem = dc.makeNewAccordionItem("sidebarList", "selectClef", "selectClefHeader", "selectClefBtn", "Clef", buttonStyleDark, "selectClefDiv");
157
+ var clefList = dc.makeNewDiv("clefList", "list-group flex-fill");
158
+ clefSelectItem.querySelector("#selectClefDiv").appendChild(clefList);
159
+ clefList.appendChild(dc.makeNewAElement("&#xE050", "GClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
160
+ clefList.appendChild(dc.makeNewAElement("&#xE05C", "CClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
161
+ clefList.appendChild(dc.makeNewAElement("&#xE062", "FClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
162
+ return clefSelectItem;
163
+ }
164
+ createTimeSigAccItem() {
165
+ //Time Signature
166
+ var timeSelectItem = dc.makeNewAccordionItem("sidebarList", "selectTime", "selectTimeHeader", "selectTimeBtn", "Time", buttonStyleDark, "selectTimeDiv");
167
+ var timeDiv = dc.makeNewDiv("timeDiv", "row align-items-start");
168
+ var countDiv = dc.makeNewDiv("countDiv", "col");
169
+ var tcdatalistname = "timeCountDatalist";
170
+ var timeCount = dc.makeNewInput("timeCount", "text", "", null, tcdatalistname);
171
+ //create list for time code select
172
+ var tcOptionValues = new Array();
173
+ for (var i = 0; i < 16; i++) {
174
+ tcOptionValues.push((i + 1).toString());
175
+ }
176
+ var tcDatalist = dc.makeNewSelect("timeCount", tcOptionValues);
177
+ //countDiv.appendChild(timeCount)
178
+ countDiv.appendChild(tcDatalist);
179
+ var slashDiv = dc.makeNewDiv("slash", "col");
180
+ slashDiv.textContent = "/";
181
+ var unitDiv = dc.makeNewDiv("unitDiv", "col");
182
+ var tudatalistname = "timeUnitDatalist";
183
+ var timeUnit = dc.makeNewInput("timeUnit", "text", "", null, tudatalistname);
184
+ //create list for time units select
185
+ var tuOptionValues = new Array();
186
+ for (var i = 0; i <= 16; i++) {
187
+ if (Number.isInteger(Math.log2(i))) {
188
+ tuOptionValues.push(i.toString());
189
+ }
190
+ }
191
+ var tuDataList = dc.makeNewSelect("timeUnit", tuOptionValues);
192
+ unitDiv.appendChild(tuDataList);
193
+ timeSelectItem.querySelector("#selectTimeDiv").appendChild(timeDiv);
194
+ timeDiv.appendChild(countDiv);
195
+ timeDiv.appendChild(slashDiv);
196
+ timeDiv.appendChild(unitDiv);
197
+ return timeSelectItem;
198
+ }
199
+ createTempoAccItem() {
200
+ var tempoItem = dc.makeNewAccordionItem("sidebarList", "selectTempo", "selectTempoHeader", "selectTempoBtn", "Tempo", buttonStyleDark, "selectTempoDiv");
201
+ var tempoDiv = dc.makeNewDiv("tempoDiv", "row align-items-start");
202
+ var tempoRefDurDiv = dc.makeNewDiv("tempoRefDurDif", "col");
203
+ var tcdatalistname = "timeCountDatalist";
204
+ var timeCount = dc.makeNewInput("timeCount", "text", "", null, tcdatalistname);
205
+ //create list for time code select
206
+ var tcOptionValues = new Array();
207
+ for (var i = 0; i <= 16; i++) {
208
+ if (Number.isInteger(Math.log2(i))) {
209
+ tcOptionValues.push(i.toString());
210
+ tcOptionValues.push(i.toString() + ".");
211
+ }
212
+ }
213
+ var tcDatalist = dc.makeNewSelect("timeCount", tcOptionValues);
214
+ tempoRefDurDiv.appendChild(tcDatalist);
215
+ var equal = dc.makeNewDiv("equal", "col");
216
+ equal.textContent = "=";
217
+ var unitDiv = dc.makeNewDiv("unitDiv", "col");
218
+ var timeUnit = dc.makeNewInput("timeUnit", "text", "", null);
219
+ unitDiv.appendChild(timeUnit);
220
+ tempoItem.querySelector("#selectTempoDiv").appendChild(tempoDiv);
221
+ tempoDiv.appendChild(tempoRefDurDiv);
222
+ tempoDiv.appendChild(equal);
223
+ tempoDiv.appendChild(unitDiv);
224
+ return tempoItem;
225
+ }
226
+ optionalButtons() {
227
+ if (typeof this.sidebar === "undefined") {
228
+ return;
229
+ }
230
+ // if(typeof this.options.taskType !== "undefined"){
231
+ // var submitButton = dc.makeNewButton("Submit", "submitScore", buttonStyle)
232
+ // this.sidebar.appendChild(submitButton)
233
+ // switch(this.options.taskType){
234
+ // case "simpleSubmit":
235
+ // this.task = new SimpleSubmit()
236
+ // break;
237
+ // }
238
+ // }
239
+ }
240
+ createAnnotList() {
241
+ var _a, _b;
242
+ (_a = cq.getContainer(this.containerId).querySelector("#annotList")) === null || _a === void 0 ? void 0 : _a.remove();
243
+ var annotList = document.createElement("div");
244
+ annotList.setAttribute("id", "annotList");
245
+ annotList.classList.add("list-group");
246
+ var that = this;
247
+ (_b = cq.getContainer(this.containerId).querySelectorAll("#annotationCanvas > g")) === null || _b === void 0 ? void 0 : _b.forEach(c => {
248
+ var text = c.querySelector(".annotDiv").textContent || c.querySelector(".annotDiv").getAttribute("data-text");
249
+ var a = dc.makeNewAElement(text, "", "list-group-item list-group-item-action list-group-item-primary", "#");
250
+ a.setAttribute("refId", c.id);
251
+ a.setAttribute("contenteditable", "true");
252
+ a.addEventListener("click", function () {
253
+ var _a;
254
+ Array.from(cq.getContainer(that.containerId).querySelectorAll(".selected")).forEach(s => s.classList.remove(selectedFlag));
255
+ cq.getContainer(that.containerId).querySelector("#" + c.id).focus();
256
+ (_a = cq.getContainer(that.containerId).querySelector("#" + c.id).querySelector(".annotLinkedText, .annotStaticText")) === null || _a === void 0 ? void 0 : _a.classList.add(selectedFlag);
257
+ });
258
+ a.addEventListener("blur", function (e) {
259
+ var t = e.target;
260
+ cq.getContainer(that.containerId).querySelector("#" + t.getAttribute("refid")).querySelector(".annotDiv").textContent = t.textContent;
261
+ });
262
+ a.addEventListener("keydown", function (e) {
263
+ var t = e.target;
264
+ if (e.code === "Enter") {
265
+ t.blur();
266
+ }
267
+ else if (e.code === "Space") {
268
+ e.preventDefault();
269
+ document.execCommand("insertText", false, ' ');
270
+ }
271
+ });
272
+ annotList.appendChild(a);
273
+ });
274
+ this.sidebar.appendChild(annotList);
275
+ }
276
+ createButtonsMainToolbar() {
277
+ var that = this;
278
+ // Buttons können in eigenes package ausgelagert werden (Editor)
279
+ var handlerDropdown = dc.makeNewDiv("insertDropdown", "dropdown-menu");
280
+ handlerDropdown.append(dc.makeNewAElement("Mouse Input", "clickInsert", "dropdown-item", "#"));
281
+ handlerDropdown.append(dc.makeNewAElement("Keyboard Input", "keyMode", "dropdown-item", "#"));
282
+ //handlerDropdown.append(dc.makeNewAElement("Select Mode", "activateSelect", "dropdown-item", "#"))
283
+ handlerDropdown.append(dc.makeNewAElement("Annotations", "activateAnnot", "dropdown-item", "#"));
284
+ //handlerDropdown.append(dc.makeNewAElement("Harmony Mode", "activateHarm", "dropdown-item", "#"))
285
+ this.handlerGroup = cq.getContainer(this.containerId).querySelector("#handlerGroup");
286
+ this.handlerGroup.append(dc.makeNewButton("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", "insertMode", buttonStyleDarkOutline + " empty", "dropdown"));
287
+ this.handlerGroup.append(handlerDropdown);
288
+ this.noteButtonGroup = cq.getContainer(this.containerId).querySelector("#noteGroup");
289
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15D", "fullNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
290
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15E", "halfNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
291
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15F", "quarterNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
292
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D160", "eigthNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
293
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D161", "sixteenthNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
294
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D162", "thirtysecondNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
295
+ this.dotButtonGroup = cq.getContainer(this.containerId).querySelector("#dotGroup");
296
+ this.dotButtonGroup.append(dc.makeNewButton(".", "oneDot", buttonStyleDarkOutline + " " + smuflFont, "", true));
297
+ this.dotButtonGroup.append(dc.makeNewButton(". .", "twoDot", buttonStyleDarkOutline + " " + smuflFont, "", true));
298
+ this.modButtonGroup = cq.getContainer(this.containerId).querySelector("#modGroup");
299
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#x1D13D;&#x1D13E;", "pauseNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
300
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#8256", "tieNotes", buttonStyleDarkOutline + " " + smuflFont, "", true));
301
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#9835;", "organizeBeams", buttonStyleDarkOutline + " " + smuflFont, "", true));
302
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#x266D;", "alterDown", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
303
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#x266F;", "alterUp", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
304
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#x266E;", "alterNeutral", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
305
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#x1D12B", "alterDDown", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
306
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#x1D12A", "alterDUp", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
307
+ this.modButtonGroup.addEventListener("click", this.exclusiveSelectHandler);
308
+ this.soundGroup = cq.getContainer(this.containerId).querySelector("#soundGroup");
309
+ this.soundGroup.appendChild(dc.makeNewButton("", "playBtn", buttonStyleDarkOutline));
310
+ //this.soundGroup.appendChild(dc.makeNewButton("", "pauseBtn", buttonStyleDarkOutline))
311
+ this.soundGroup.appendChild(dc.makeNewButton("", "rewindBtn", buttonStyleDarkOutline));
312
+ this.fileSelectGroup = cq.getContainer(this.containerId).querySelector("#fileSelectGroup");
313
+ this.fileSelectGroup.append(dc.makeNewInput("importFile", "file", ""));
314
+ this.fileSelectGroup.append(dc.makeNewButton("Import File", "importFileBtn", buttonStyleDarkOutline));
315
+ this.fileSelectGroup.append(dc.makeNewButton("Export MEI", "exportFileBtn", buttonStyleDarkOutline));
316
+ var showBBToggle = dc.makeNewToggle("showBB", buttonStyleDark, "BBoxes", "showBBDiv");
317
+ this.setToggleLogic(showBBToggle, function () { cq.getContainer(that.containerId).classList.add("debug"); }, function () { cq.getContainer(that.containerId).classList.remove("debug"); });
318
+ this.fileSelectGroup.append(showBBToggle);
319
+ }
320
+ /**
321
+ *
322
+ * @param el element to set logic for
323
+ * @param callBackChecked additional code to execute when toggle is checked
324
+ * @param callBackUnchecked additional code to execute when toggle is unchecked
325
+ * @param switchPair pair of words to change between when toggled
326
+ */
327
+ setToggleLogic(el, callbackChecked = null, callbackUnchecked = null, switchPair = new Array()) {
328
+ if (switchPair.length > 2 || switchPair.length === 1) {
329
+ throw new Error("switchPair Array must have exaclty 2 strings");
330
+ }
331
+ el.addEventListener("click", function (e) {
332
+ e.preventDefault();
333
+ var target = e.target;
334
+ if (target.tagName.toLowerCase() !== "label")
335
+ return;
336
+ var label = e.target;
337
+ var input = label.previousElementSibling;
338
+ if (input.checked === true) {
339
+ if (switchPair.length > 0)
340
+ label.textContent = switchPair[0];
341
+ input.checked = false;
342
+ callbackUnchecked();
343
+ }
344
+ else {
345
+ if (switchPair.length > 0)
346
+ label.textContent = switchPair[1];
347
+ input.checked = true;
348
+ callbackChecked();
349
+ }
350
+ });
351
+ }
352
+ createInsertSelect() {
353
+ //InsertSelect DropdownMenu
354
+ this.insertSelectGroup = dc.makeNewDiv("insertGroup", "customGroup btn-group-sm me-2 h-100", { role: "group" });
355
+ var toggle = dc.makeNewToggle("insertToggle", buttonStyleDarkOutline, "Replace", "insertToggleDiv");
356
+ toggle.addEventListener("click", function (e) {
357
+ e.preventDefault();
358
+ var target = e.target;
359
+ if (target.tagName.toLowerCase() !== "label")
360
+ return;
361
+ var label = e.target;
362
+ var input = label.previousElementSibling;
363
+ if (label.textContent === "Replace") {
364
+ label.textContent = "Insert";
365
+ input.checked = false;
366
+ }
367
+ else {
368
+ label.textContent = "Replace";
369
+ input.checked = true;
370
+ }
371
+ });
372
+ this.insertSelectGroup.append(toggle);
373
+ }
374
+ createButtonsKeyMode() {
375
+ //ChordGroup
376
+ this.chordGroupKM = dc.makeNewDiv("chordGroupKM", "customGroup btn-group-sm me-2 h-100", { role: "group" });
377
+ this.chordGroupKM.append(dc.makeNewButton("CHORD", "chordButton", buttonStyleDarkOutline));
378
+ this.chordGroupKM.addEventListener("click", this.exclusiveSelectHandler);
379
+ //OctaveGroup
380
+ this.octaveGroupKM = dc.makeNewDiv("octaveGroupKM", "btn-group-sm me-2 h-100", { role: "group" });
381
+ let oct = dc.makeNewButton("", "subkontraOct", buttonStyleDarkOutline);
382
+ oct.innerHTML = "C" + "0".sub();
383
+ this.octaveGroupKM.appendChild(oct);
384
+ oct = dc.makeNewButton("", "kontraOct", buttonStyleDarkOutline);
385
+ oct.innerHTML = "C" + "1".sub();
386
+ this.octaveGroupKM.appendChild(oct);
387
+ oct = dc.makeNewButton("", "greatOct", buttonStyleDarkOutline);
388
+ oct.innerHTML = "C" + "2".sub();
389
+ this.octaveGroupKM.appendChild(oct);
390
+ oct = dc.makeNewButton("", "smallOct", buttonStyleDarkOutline);
391
+ oct.innerHTML = "C" + "3".sub();
392
+ this.octaveGroupKM.appendChild(oct);
393
+ oct = dc.makeNewButton("", "LineOct1", buttonStyleDarkOutline);
394
+ oct.innerHTML = "C" + "4".sub();
395
+ this.octaveGroupKM.appendChild(oct);
396
+ oct = dc.makeNewButton("", "LineOct2", buttonStyleDarkOutline);
397
+ oct.innerHTML = "C" + "5".sub();
398
+ this.octaveGroupKM.appendChild(oct);
399
+ oct = dc.makeNewButton("", "LineOct3", buttonStyleDarkOutline);
400
+ oct.innerHTML = "C" + "6".sub();
401
+ this.octaveGroupKM.appendChild(oct);
402
+ oct = dc.makeNewButton("", "LineOct4", buttonStyleDarkOutline);
403
+ oct.innerHTML = "C" + "7".sub();
404
+ this.octaveGroupKM.appendChild(oct);
405
+ oct = dc.makeNewButton("", "LineOct5", buttonStyleDarkOutline);
406
+ oct.innerHTML = "C" + "8".sub();
407
+ this.octaveGroupKM.appendChild(oct);
408
+ Array.from(this.octaveGroupKM.children).forEach(btn => {
409
+ btn.addEventListener("click", this.exclusiveSelectHandler);
410
+ });
411
+ }
412
+ createButtonsAnnotationMode() {
413
+ this.annotGroupKM = dc.makeNewDiv("annotGroupKM", "customGroup btn-group-sm me-2 h-100", { role: "group" });
414
+ this.annotGroupKM.append(dc.makeNewButton("TEXT", "staticTextButton", buttonStyleDarkOutline));
415
+ this.annotGroupKM.append(dc.makeNewButton("LINKED ANNOTATION", "linkedAnnotButton", buttonStyleDarkOutline + " selected"));
416
+ this.annotGroupKM.append(dc.makeNewButton("HARMONY", "harmonyAnnotButton", buttonStyleDarkOutline));
417
+ this.annotGroupKM.addEventListener("click", this.exclusiveSelectHandler);
418
+ }
419
+ createMainToolbar() {
420
+ this.createButtonsMainToolbar();
421
+ var btnToolbar = cq.getContainer(this.containerId).querySelector("#btnToolbar");
422
+ btnToolbar.appendChild(this.sideBarGroup);
423
+ btnToolbar.parentElement.insertBefore(this.sidebar, btnToolbar.parentElement.firstChild); // important for ~ selector
424
+ btnToolbar.appendChild(this.handlerGroup);
425
+ btnToolbar.appendChild(this.noteButtonGroup);
426
+ btnToolbar.appendChild(this.dotButtonGroup);
427
+ btnToolbar.appendChild(this.modButtonGroup);
428
+ btnToolbar.appendChild(this.soundGroup);
429
+ btnToolbar.appendChild(this.fileSelectGroup);
430
+ }
431
+ createCustomToolbar() {
432
+ this.createButtonsKeyMode();
433
+ this.createInsertSelect();
434
+ this.createButtonsAnnotationMode();
435
+ this.customToolbar = cq.getContainer(this.containerId).querySelector("#customToolbar");
436
+ }
437
+ removeAllCustomGroups() {
438
+ Array.from(this.customToolbar.children).forEach(c => {
439
+ c.remove();
440
+ });
441
+ }
442
+ addElementsToBootstrap() {
443
+ //attach bootstrap functionality to Elements
444
+ // Array.from(document.querySelectorAll(".btn")).forEach(b => {
445
+ // new Button(b)
446
+ // })
447
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
448
+ new bootstrap_1.Dropdown(dd);
449
+ });
450
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".collapsed")).forEach(c => {
451
+ new bootstrap_1.Collapse(c);
452
+ });
453
+ // Array.from(cq.getContainer(this.containerId).querySelectorAll("*[type=\"checkbox\"][data-toggle=\"toggle\"]")).forEach(t => {
454
+ // new Toggle(t)
455
+ // })
456
+ }
457
+ setListeners() {
458
+ cq.getContainer(this.containerId).querySelectorAll("#handlerGroup *").forEach(el => {
459
+ el.addEventListener("click", this.closeHandlerMouse);
460
+ });
461
+ // achtung: nie preventDefault in einem Document anwenden
462
+ document.addEventListener("keydown", this.closeHandlerKey);
463
+ //document.getElementsByClassName("vse-container")[0]?.addEventListener("click", this.closeHandlerMouse)
464
+ cq.getContainer(this.containerId).querySelectorAll("#dotGroup button, #noteGroup button, #modGroup button").forEach(el => {
465
+ el.addEventListener("click", this.exclusiveSelectHandler);
466
+ });
467
+ cq.getContainer(this.containerId).querySelector("#toggleSidebar").addEventListener("click", this.sidebarHandler);
468
+ cq.getContainer(this.containerId).querySelectorAll("#insertDropdown a").forEach(a => {
469
+ a.addEventListener("click", this.customToolbarHandler);
470
+ });
471
+ // document.querySelectorAll("#sidebarContainer * a").forEach(el => {
472
+ // el.addEventListener("click", this.sidebarHandler)
473
+ // })
474
+ // Why do I have to control this manually???
475
+ cq.getContainer(this.containerId).querySelectorAll(".accordion-button").forEach(ac => {
476
+ ac.addEventListener("hidden.bs.collapse", () => {
477
+ ac.classList.add("show");
478
+ });
479
+ ac.addEventListener("hide.bs.collapse", () => {
480
+ ac.classList.add("show");
481
+ });
482
+ });
483
+ cq.getContainer(this.containerId).addEventListener("annotChanged", this.createAnnotListFunction, true);
484
+ // interact("#" + this.containerId + " #annotList")
485
+ // .resizable({
486
+ // // resize from all edges and corners
487
+ // edges: { left: false, right: false, bottom: false, top: true },
488
+ // listeners: { move: this.resizeListListener.bind(this) },
489
+ // })
490
+ //FileSelection
491
+ cq.getContainer(this.containerId).querySelector("#importFileBtn").addEventListener("click", function () {
492
+ var impF = this.parentElement.querySelector("#importFile");
493
+ impF.setAttribute("accept", [".musicxml", ".mei"].join(", "));
494
+ impF.click();
495
+ });
496
+ var that = this;
497
+ cq.getContainer(this.containerId).querySelector("#importFile").addEventListener("change", function (e) {
498
+ var fr = new FileReader();
499
+ fr.onload = function () {
500
+ that.importCallback("", fr.result, false, constants_1.constants._TARGETDIVID_);
501
+ };
502
+ fr.readAsText(this.files[0]);
503
+ }, false);
504
+ cq.getContainer(this.containerId).querySelector("#exportFileBtn").addEventListener("click", function () {
505
+ that.getMEICallback("").then(mei => {
506
+ var d = new Date();
507
+ var fileName = d.getUTCFullYear()
508
+ + ("0" + d.getDate()).slice(-2)
509
+ + ("0" + d.getMonth()).slice(-2)
510
+ + "_"
511
+ + ("0" + d.getHours()).slice(-2)
512
+ + ("0" + d.getMinutes()).slice(-2)
513
+ + ("0" + d.getSeconds()).slice(-2)
514
+ + "_"
515
+ + "vseScore_" + that.containerId + ".mei";
516
+ that.download(fileName, mei);
517
+ });
518
+ });
519
+ }
520
+ download(file, text) {
521
+ //creating an invisible element
522
+ var element = document.createElement('a');
523
+ element.setAttribute('href', 'data:text/plain;charset=utf-8, '
524
+ + encodeURIComponent(text));
525
+ element.setAttribute('download', file);
526
+ document.body.appendChild(element);
527
+ element.click();
528
+ document.body.removeChild(element);
529
+ }
530
+ removeListeners() {
531
+ cq.getContainer(this.containerId).querySelectorAll("#handlerGroup *").forEach(el => {
532
+ el.removeEventListener("click", this.closeHandlerMouse);
533
+ });
534
+ document.removeEventListener("keydown", this.closeHandlerKey);
535
+ //document.getElementsByClassName("vse-container")[0].removeEventListener("click", this.closeHandlerMouse)
536
+ cq.getContainer(this.containerId).querySelectorAll(".btn-group-sm button").forEach(el => {
537
+ el.removeEventListener("click", this.exclusiveSelectHandler);
538
+ });
539
+ cq.getContainer(this.containerId).querySelector("#toggleSidebar").removeEventListener("click", this.sidebarHandler);
540
+ cq.getContainer(this.containerId).querySelectorAll("#insertDropdown a").forEach(a => {
541
+ a.removeEventListener("click", this.customToolbarHandler);
542
+ });
543
+ // document.querySelectorAll("#sidebarContainer * a").forEach(el => {
544
+ // el.removeEventListener("click", this.sidebarHandler)
545
+ // })
546
+ cq.getContainer(this.containerId).removeEventListener("annotChanged", this.createAnnotListFunction);
547
+ interactjs_1.default("#annotList").unset();
548
+ }
549
+ closeDropdown(ddButton) {
550
+ if (ddButton.classList.contains("show")) {
551
+ ddButton.classList.remove("show");
552
+ ddButton.removeAttribute("data-popper-placement");
553
+ ddButton.setAttribute("aria-expanded", "false");
554
+ ddButton.nextElementSibling.classList.remove("show");
555
+ ddButton.nextElementSibling.removeAttribute("data-popper-placement");
556
+ }
557
+ }
558
+ resizeListListener(event) {
559
+ event.stopImmediatePropagation();
560
+ var target = event.target;
561
+ var y = (parseFloat(target.getAttribute('data-y')) || 0);
562
+ target.style.height = event.rect.height + 'px';
563
+ y += event.deltaRect.top;
564
+ target.style.transform = 'translate(0px,' + y + 'px)';
565
+ target.setAttribute('data-y', y.toString());
566
+ var sibling = target.previousElementSibling;
567
+ var sbb = sibling.getBoundingClientRect();
568
+ sbb.height = sbb.height + y;
569
+ }
570
+ exclusiveSelect(e) {
571
+ var select;
572
+ var target = e.target;
573
+ var tagname = "button";
574
+ if (target.tagName.toLowerCase() === tagname) {
575
+ Array.from(target.parentElement.children).forEach(btn => {
576
+ if (btn.tagName.toLowerCase() === tagname && btn !== target) {
577
+ btn.classList.remove(selectedFlag);
578
+ }
579
+ });
580
+ if (!target.classList.contains(selectedFlag)) {
581
+ target.classList.add(selectedFlag);
582
+ }
583
+ else if (["modGroup", "dotGroup", "chordGroupKM"].some(id => id === target.parentElement.id) && target.classList.contains(selectedFlag)) {
584
+ target.classList.remove(selectedFlag);
585
+ }
586
+ }
587
+ }
588
+ clickInsertHandler() {
589
+ this.customToolbar.appendChild(this.insertSelectGroup);
590
+ }
591
+ keyModeHandler() {
592
+ this.customToolbar.appendChild(this.insertSelectGroup);
593
+ this.customToolbar.appendChild(this.chordGroupKM);
594
+ this.customToolbar.appendChild(this.octaveGroupKM);
595
+ }
596
+ harmHandler() {
597
+ this.removeAllCustomGroups();
598
+ }
599
+ annotHandler() {
600
+ //this.removeAllCustomGroups()
601
+ this.customToolbar.append(this.annotGroupKM);
602
+ }
603
+ /**
604
+ * Callback from Core, so that imported mei or musicxml can be loaded in the editor
605
+ * @param importCallback
606
+ */
607
+ setImportCallback(importCallback) {
608
+ this.importCallback = importCallback;
609
+ }
610
+ setGetMEICallback(getMEICallback) {
611
+ this.getMEICallback = getMEICallback;
612
+ }
613
+ }
614
+ exports.default = Toolbar;