vibe-editor 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +65 -61
- package/src/scripts/js/Core.js +28 -9
- package/src/scripts/js/entry.js +6 -5
- package/src/scripts/js/gui/Annotations.js +27 -12
- package/src/scripts/js/gui/ScoreManipulator.js +6 -4
- package/src/scripts/js/gui/Tabbar.js +13 -4
- package/src/scripts/js/handlers/AnnotationChangeHandler.js +13 -1
- package/src/scripts/js/handlers/InsertModeHandler.js +3 -3
- package/src/scripts/js/handlers/PhantomElementHandler.js +3 -10
- package/src/scripts/js/handlers/WindowHandler.js +7 -7
- package/src/scripts/js/scripts/Core.js +932 -0
- package/src/scripts/js/scripts/MusicProcessor.js +810 -0
- package/src/scripts/js/scripts/VIBE.js +219 -0
- package/src/scripts/js/scripts/datastructures/MeasureMatrix.js +156 -0
- package/src/scripts/js/scripts/gui/Annotations.js +549 -0
- package/src/scripts/js/scripts/gui/Cursor.js +203 -0
- package/src/scripts/js/scripts/gui/PhantomElement.js +132 -0
- package/src/scripts/js/scripts/gui/ScoreManipulator.js +188 -0
- package/src/scripts/js/scripts/gui/Tabbar.js +705 -0
- package/src/scripts/js/{gui/Toolbar copy.js → scripts/gui/Toolbar.js} +15 -11
- package/src/scripts/js/scripts/handlers/AnnotationChangeHandler.js +650 -0
- package/src/scripts/js/scripts/handlers/ClickModeHandler.js +535 -0
- package/src/scripts/js/{gui → scripts/handlers}/CustomAnnotationShapeDrawer.js +34 -17
- package/src/scripts/js/{handlers/ModHandler.js → scripts/handlers/CustomToolbarHandler.js} +54 -66
- package/src/scripts/js/scripts/handlers/GlobalKeyboardHandler.js +372 -0
- package/src/scripts/js/scripts/handlers/Handler.js +2 -0
- package/src/scripts/js/{handlers/InsertModeHandler_deprecated.js → scripts/handlers/InsertModeHandler.js} +117 -164
- package/src/scripts/js/scripts/handlers/KeyModeHandler.js +405 -0
- package/src/scripts/js/scripts/handlers/LabelHandler.js +463 -0
- package/src/scripts/js/scripts/handlers/NoteDragHandler.js +97 -0
- package/src/scripts/js/scripts/handlers/PhantomElementHandler.js +168 -0
- package/src/scripts/js/scripts/handlers/ScoreManipulatorHandler.js +233 -0
- package/src/scripts/js/scripts/handlers/SidebarHandler.js +506 -0
- package/src/scripts/js/scripts/handlers/TooltipHandler.js +132 -0
- package/src/scripts/js/scripts/handlers/WindowHandler.js +278 -0
- package/src/scripts/js/scripts/utils/MEIOperations.js +2121 -0
- package/src/scripts/js/{utils/Mouse2MEI.js → scripts/utils/Mouse2SVG.js} +225 -57
- package/src/scripts/js/scripts/utils/SVGEditor.js +453 -0
- package/src/scripts/js/scripts/utils/Types.js +2 -0
- package/src/scripts/js/{utils/VerovioWrapper copy.js → scripts/utils/VerovioWrapper.js} +35 -21
- package/src/scripts/js/scripts/utils/coordinates.js +54 -0
- package/src/scripts/js/utils/Mouse2SVG.js +11 -4
- package/src/scripts/js/utils/VerovioWrapper.js +4 -4
- package/src/scripts/js/utils/coordinates.js +26 -2
- package/src/scripts/js/.DS_Store +0 -0
- package/src/scripts/js/MusicPlayer.js +0 -572
- package/src/scripts/js/datastructures/ScoreGraph copy.js +0 -432
- package/src/scripts/js/gui/CustomAnnotationDrawer.js +0 -114
- package/src/scripts/js/handlers/AnnotationDragHandler.js +0 -113
- package/src/scripts/js/handlers/AnnotationLineHandler.js +0 -113
- package/src/scripts/js/handlers/ArticulationHandler.js +0 -20
- package/src/scripts/js/handlers/HarmonyHandler.js +0 -282
- package/src/scripts/js/handlers/InsertModeHandler copy.js +0 -423
- package/src/scripts/js/handlers/KeyModeHandler copy.js +0 -407
- package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +0 -411
- package/src/scripts/js/handlers/NoteDragHandler copy.js +0 -148
- package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +0 -150
- package/src/scripts/js/handlers/SelectionHandler.js +0 -262
- package/src/scripts/js/utils/RectWrapper.js +0 -10
- package/src/scripts/js/utils/SVGFiller.js +0 -245
- package/src/scripts/js/utils/VerovioWrapperLocal.js +0 -156
- package/src/scripts/js/utils/firefoxBBoxes.js +0 -143
- package/src/styles/vibe.css +0 -785
- /package/src/scripts/js/{assets → scripts/assets}/mei_template.js +0 -0
- /package/src/scripts/js/{constants.js → scripts/constants.js} +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph.js +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreGraph_deprecated.js +0 -0
- /package/src/scripts/js/{datastructures → scripts/datastructures}/ScoreNode.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/HarmonyLabel.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/Label.js +0 -0
- /package/src/scripts/js/{gui → scripts/gui}/TempoLabel.js +0 -0
- /package/src/scripts/js/{handlers → scripts/handlers}/DeleteHandler.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/DOMCreator.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/MEIConverter.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/ReactWrapper.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/convenienceQueries.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/mappings.js +0 -0
- /package/src/scripts/js/{utils → scripts/utils}/random.js +0 -0
@@ -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("=", "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("-", "KeyGMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
171
|
+
keyListCross.appendChild(dc.makeNewAElement("--", "KeyDMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
172
|
+
keyListCross.appendChild(dc.makeNewAElement("---", "KeyAMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
173
|
+
keyListCross.appendChild(dc.makeNewAElement("----", "KeyEMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
174
|
+
keyListCross.appendChild(dc.makeNewAElement("-----", "KeyBMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
175
|
+
keyListCross.appendChild(dc.makeNewAElement("------", "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("", "KeyFMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
179
|
+
keyListB.appendChild(dc.makeNewAElement("-", "KeyBbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
180
|
+
keyListB.appendChild(dc.makeNewAElement("--", "KeyEbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
181
|
+
keyListB.appendChild(dc.makeNewAElement("---", "KeyAbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
182
|
+
keyListB.appendChild(dc.makeNewAElement("----", "KeyDbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
183
|
+
keyListB.appendChild(dc.makeNewAElement("-----", "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("𝄟", "GClefOctUp", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
192
|
+
clefList.appendChild(dc.makeNewAElement("", "GClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
193
|
+
clefList.appendChild(dc.makeNewAElement("𝄠", "GClefOctDown", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
194
|
+
clefList.appendChild(dc.makeNewAElement("Soprano ", "CClefSoprano", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
195
|
+
clefList.appendChild(dc.makeNewAElement("Mezzo ", "CClefMezzo", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
196
|
+
clefList.appendChild(dc.makeNewAElement("Alto ", "CClefAlto", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
197
|
+
clefList.appendChild(dc.makeNewAElement("Tenor ", "CClefTenor", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
198
|
+
clefList.appendChild(dc.makeNewAElement("Bariton ", "CClefBariton", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
199
|
+
clefList.appendChild(dc.makeNewAElement("𝄣", "FClefOctUp", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
200
|
+
clefList.appendChild(dc.makeNewAElement("", "FClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
|
201
|
+
clefList.appendChild(dc.makeNewAElement("𝄤", "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("𝅜", "breveNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
|
331
|
+
this.noteButtonGroup.append(dc.makeNewButton("𝅝", "fullNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
|
332
|
+
this.noteButtonGroup.append(dc.makeNewButton("𝅗𝅥", "halfNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
|
333
|
+
this.noteButtonGroup.append(dc.makeNewButton("𝅘𝅥", "quarterNote", buttonStyleDarkOutline + " " + smuflFont + " selected", "", true));
|
334
|
+
this.noteButtonGroup.append(dc.makeNewButton("𝅘𝅥𝅮", "eigthNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
|
335
|
+
this.noteButtonGroup.append(dc.makeNewButton("𝅘𝅥𝅯", "sixteenthNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
|
336
|
+
this.noteButtonGroup.append(dc.makeNewButton("𝅘𝅥𝅰", "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("𝄽𝄾", "pauseNote", buttonStyleDarkOutline + " " + smuflFont, "", true))
|
344
|
+
this.modButtonGroup.appendChild(dc.makeNewButton("⁀", "tieNotes", buttonStyleDarkOutline + " " + smuflFont, "", true));
|
345
|
+
this.modButtonGroup.appendChild(dc.makeNewButton("♫", "organizeBeams", buttonStyleDarkOutline + " " + smuflFont, "", true));
|
346
|
+
//accidentals
|
347
|
+
this.accidButtonGroup = cq.getContainer(this.containerId).querySelector("#accidGroup");
|
348
|
+
this.accidButtonGroup.appendChild(dc.makeNewButton("♭", "alterDown", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
|
349
|
+
this.accidButtonGroup.appendChild(dc.makeNewButton("♯", "alterUp", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
|
350
|
+
this.accidButtonGroup.appendChild(dc.makeNewButton("♮", "alterNeutral", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
|
351
|
+
this.accidButtonGroup.appendChild(dc.makeNewButton("𝄫", "alterDDown", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
|
352
|
+
this.accidButtonGroup.appendChild(dc.makeNewButton("𝄪", "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("𝅿", "marcatoBtn", buttonStyleDarkOutline + " " + smuflFont, "", true));
|
444
|
+
this.articGroup.append(dc.makeNewButton("𝅻", "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;
|