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