abcjs 6.0.4 → 6.1.2

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.
@@ -1,6 +1,6 @@
1
1
  var spacing = require('./abc_spacing');
2
2
 
3
- function setupSelection(engraver) {
3
+ function setupSelection(engraver, svgs) {
4
4
  engraver.rangeHighlight = rangeHighlight;
5
5
  if (engraver.dragging) {
6
6
  for (var h = 0; h < engraver.selectables.length; h++) {
@@ -14,14 +14,21 @@ function setupSelection(engraver) {
14
14
  }
15
15
  }
16
16
  }
17
- engraver.renderer.paper.svg.addEventListener('mousedown', mouseDown.bind(engraver));
18
- engraver.renderer.paper.svg.addEventListener('mousemove', mouseMove.bind(engraver));
19
- engraver.renderer.paper.svg.addEventListener('mouseup', mouseUp.bind(engraver));
17
+ for (var i = 0; i < svgs.length; i++) {
18
+ svgs[i].addEventListener('touchstart', mouseDown.bind(engraver));
19
+ svgs[i].addEventListener('touchmove', mouseMove.bind(engraver));
20
+ svgs[i].addEventListener('touchend', mouseUp.bind(engraver));
21
+ svgs[i].addEventListener('mousedown', mouseDown.bind(engraver));
22
+ svgs[i].addEventListener('mousemove', mouseMove.bind(engraver));
23
+ svgs[i].addEventListener('mouseup', mouseUp.bind(engraver));
24
+ }
20
25
  }
21
26
 
22
- function getCoord(ev, svg) {
27
+ function getCoord(ev) {
23
28
  var scaleX = 1;
24
29
  var scaleY = 1;
30
+ var svg = ev.target.closest('svg')
31
+ var yOffset = 0
25
32
 
26
33
  // when renderer.options.responsive === 'resize' the click coords are in relation to the HTML
27
34
  // element, we need to convert to the SVG viewBox coords
@@ -31,6 +38,7 @@ function getCoord(ev, svg) {
31
38
  scaleX = svg.viewBox.baseVal.width / svg.clientWidth
32
39
  if (svg.viewBox.baseVal.height !== 0)
33
40
  scaleY = svg.viewBox.baseVal.height / svg.clientHeight
41
+ yOffset = svg.viewBox.baseVal.y
34
42
  }
35
43
 
36
44
  var svgClicked = ev.target.tagName === "svg";
@@ -48,7 +56,7 @@ function getCoord(ev, svg) {
48
56
  y = y * scaleY;
49
57
  //console.log(x, y)
50
58
 
51
- return [x, y];
59
+ return [x, y+yOffset];
52
60
  }
53
61
 
54
62
  function elementFocused(ev) {
@@ -120,7 +128,7 @@ function keyboardSelection(ev) {
120
128
 
121
129
  function findElementInHistory(selectables, el) {
122
130
  for (var i = 0; i < selectables.length; i++) {
123
- if (el === selectables[i].svgEl)
131
+ if (el.dataset.index === selectables[i].svgEl.dataset.index)
124
132
  return i;
125
133
  }
126
134
  return -1;
@@ -216,7 +224,7 @@ function getMousePosition(self, ev) {
216
224
  //console.log("clicked on", clickedOn, x, y, self.selectables[clickedOn].svgEl.getBBox(), ev.target.getBBox());
217
225
  } else {
218
226
  // See if they clicked close to an element.
219
- box = getCoord(ev, self.renderer.paper.svg);
227
+ box = getCoord(ev);
220
228
  x = box[0];
221
229
  y = box[1];
222
230
  clickedOn = findElementByCoord(self, x, y);
@@ -225,13 +233,30 @@ function getMousePosition(self, ev) {
225
233
  return { x: x, y: y, clickedOn: clickedOn };
226
234
  }
227
235
 
236
+ function attachMissingTouchEventAttributes(touchEv) {
237
+ var rect = touchEv.target.getBoundingClientRect();
238
+ var offsetX = touchEv.touches[0].pageX - rect.left;
239
+ var offsetY = touchEv.touches[0].pageY - rect.top;
240
+
241
+ touchEv.touches[0].offsetX = offsetX;
242
+ touchEv.touches[0].offsetY = offsetY;
243
+
244
+ touchEv.touches[0].layerX = touchEv.touches[0].pageX;
245
+ touchEv.touches[0].layerY = touchEv.touches[0].pageY;
246
+ }
247
+
228
248
  function mouseDown(ev) {
229
249
  // "this" is the EngraverController because of the bind(this) when setting the event listener.
250
+ var _ev = ev;
251
+ if (ev.type === 'touchstart') {
252
+ attachMissingTouchEventAttributes(ev);
253
+ _ev = ev.touches[0];
254
+ }
230
255
 
231
- var positioning = getMousePosition(this, ev);
256
+ var positioning = getMousePosition(this, _ev);
232
257
 
233
258
  // Only start dragging if the user clicked close enough to an element and clicked with the main mouse button.
234
- if (positioning.clickedOn >= 0 && ev.button === 0) {
259
+ if (positioning.clickedOn >= 0 && (ev.type === 'touchstart' || ev.button === 0)) {
235
260
  this.dragTarget = this.selectables[positioning.clickedOn];
236
261
  this.dragIndex = positioning.clickedOn;
237
262
  this.dragMechanism = "mouse";
@@ -244,12 +269,18 @@ function mouseDown(ev) {
244
269
  }
245
270
 
246
271
  function mouseMove(ev) {
272
+ var _ev = ev;
273
+ if (ev.type === 'touchmove') {
274
+ attachMissingTouchEventAttributes(ev);
275
+ _ev = ev.touches[0];
276
+ }
277
+ this.lastTouchMove = ev;
247
278
  // "this" is the EngraverController because of the bind(this) when setting the event listener.
248
279
 
249
280
  if (!this.dragTarget || !this.dragging || !this.dragTarget.isDraggable || this.dragMechanism !== 'mouse')
250
281
  return;
251
282
 
252
- var positioning = getMousePosition(this, ev);
283
+ var positioning = getMousePosition(this, _ev);
253
284
 
254
285
  var yDist = Math.round((positioning.y - this.dragMouseStart.y)/spacing.STEP);
255
286
  if (yDist !== this.dragYStep) {
@@ -260,6 +291,11 @@ function mouseMove(ev) {
260
291
 
261
292
  function mouseUp(ev) {
262
293
  // "this" is the EngraverController because of the bind(this) when setting the event listener.
294
+ var _ev = ev;
295
+ if (ev.type === 'touchend') {
296
+ attachMissingTouchEventAttributes(this.lastTouchMove);
297
+ _ev = this.lastTouchMove.touches[0];
298
+ }
263
299
 
264
300
  if (!this.dragTarget)
265
301
  return;
@@ -270,7 +306,7 @@ function mouseUp(ev) {
270
306
  this.dragTarget.absEl.highlight(undefined, this.selectionColor);
271
307
  }
272
308
 
273
- notifySelect.bind(this)(this.dragTarget, this.dragYStep, this.selectables.length, this.dragIndex, ev);
309
+ notifySelect.bind(this)(this.dragTarget, this.dragYStep, this.selectables.length, this.dragIndex, _ev);
274
310
  if (this.dragTarget.svgEl && this.dragTarget.svgEl.focus) {
275
311
  this.dragTarget.svgEl.focus();
276
312
  this.dragTarget = null;
package/types/index.d.ts CHANGED
@@ -171,6 +171,8 @@ declare module 'abcjs' {
171
171
 
172
172
  export type AbsoluteElement = any; // TODO
173
173
 
174
+ export type AbstractEngraver = any;
175
+
174
176
  export type NoteProperties = any; // TODO
175
177
 
176
178
  export type AudioTrackCommand = 'program' | 'text' | 'note';
@@ -504,6 +506,34 @@ declare module 'abcjs' {
504
506
  wordsfont: Font;
505
507
  }
506
508
 
509
+ export interface EngraverController {
510
+ classes: any;
511
+ dragColor: string;
512
+ dragIndex: number;
513
+ dragMouseStart: { x: number, y: number; };
514
+ dragTarget: null | any;
515
+ dragYStep: number;
516
+ dragging: boolean;
517
+ engraver: AbstractEngraver;
518
+ getFontAndAttr: any;
519
+ getTextSize: any;
520
+ listeners: [ClickListener];
521
+ rangeHighlight: any;
522
+ renderer: any;
523
+ responsive?: boolean;
524
+ scale: number;
525
+ initialClef?: any;
526
+ selectTypes: boolean | Array<DragTypes>;
527
+ selectables: Array<Selectable>;
528
+ selected: Array<any>;
529
+ selectionColor: string;
530
+ space: number;
531
+ staffgroups: [any];
532
+ staffwidthPrint: number;
533
+ staffwidthScreen: number;
534
+ width: number;
535
+ }
536
+
507
537
  export interface MetaText {
508
538
  "abc-copyright"?: string;
509
539
  "abc-creator"?: string;
@@ -712,6 +742,7 @@ declare module 'abcjs' {
712
742
 
713
743
  export interface TuneObject {
714
744
  formatting: Formatting;
745
+ engraver?: EngraverController;
715
746
  lines: Array<TuneLine>;
716
747
  media: Media;
717
748
  metaText: MetaText;
@@ -732,12 +763,23 @@ declare module 'abcjs' {
732
763
  millisecondsPerMeasure: NumberFunction;
733
764
  setTiming: (bpm?: number, measuresOfDelay? : number) => void;
734
765
  setUpAudio: (options: SynthOptions) => AudioTracks;
766
+ makeVoicesArray: () => Array<Selectable[]>
735
767
  lineBreaks?: Array<number>;
736
768
  visualTranspose?: number;
737
769
  }
738
770
 
739
771
  export type TuneObjectArray = [TuneObject]
740
772
 
773
+ export interface Selectable {
774
+ absEl: AbsoluteElement;
775
+ isDraggable: boolean;
776
+ staffPos: {
777
+ height: number;
778
+ top: number;
779
+ zero: number;
780
+ }
781
+ }
782
+
741
783
  export interface AbcElem {
742
784
  el_type: string //TODO enumerate these
743
785
  abselem: any;
@@ -1091,6 +1133,8 @@ declare module 'abcjs' {
1091
1133
 
1092
1134
  export function numberOfTunes(abc: string) : number;
1093
1135
  export function extractMeasures(abc: string) : Array<MeasureList>;
1136
+
1137
+ export function strTranspose(originalAbc: string, visualObj: TuneObject, steps: number): string;
1094
1138
 
1095
1139
  //
1096
1140
  // Glyph
package/version.js CHANGED
@@ -1,3 +1,3 @@
1
- var version = '6.0.4';
1
+ var version = '6.1.2';
2
2
 
3
3
  module.exports = version;