@leafer-in/editor 1.5.1 → 1.5.3

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/dist/editor.cjs CHANGED
@@ -90,9 +90,24 @@ function targetAttr(fn) {
90
90
  set(value) {
91
91
  const old = this[privateKey];
92
92
  if (old !== value) {
93
- const type = key === 'target' ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER;
94
- if (this.hasEvent(type))
95
- this.emitEvent(new EditorEvent(type, { editor: this, value: value, oldValue: old }));
93
+ if (this.config) {
94
+ const isSelect = key === 'target';
95
+ if (isSelect) {
96
+ if (value instanceof Array && value.length > 1 && value[0].locked)
97
+ value.splice(0, 1);
98
+ const { beforeSelect } = this.config;
99
+ if (beforeSelect) {
100
+ const check = beforeSelect({ target: value });
101
+ if (typeof check === 'object')
102
+ value = check;
103
+ else if (check === false)
104
+ return;
105
+ }
106
+ }
107
+ const type = isSelect ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER;
108
+ if (this.hasEvent(type))
109
+ this.emitEvent(new EditorEvent(type, { editor: this, value: value, oldValue: old }));
110
+ }
96
111
  this[privateKey] = value, fn(this, old);
97
112
  }
98
113
  }
@@ -393,7 +408,8 @@ class EditSelect extends draw.Group {
393
408
  return target.leafer !== this.editor.leafer;
394
409
  }
395
410
  allowDrag(e) {
396
- if (this.running && (this.editor.mergeConfig.boxSelect) && !e.target.draggable) {
411
+ const { boxSelect, multipleSelect } = this.editor.mergeConfig;
412
+ if (this.running && (multipleSelect && boxSelect) && !e.target.draggable) {
397
413
  return (!this.editor.editing && this.allow(e.target)) || (e.shiftKey && !findOne(e.path));
398
414
  }
399
415
  else {
@@ -411,7 +427,8 @@ class EditSelect extends draw.Group {
411
427
  return this.isMultipleSelect(e) ? this.findDeepOne(e) : findOne(e.path);
412
428
  }
413
429
  isMultipleSelect(e) {
414
- return e.shiftKey || this.editor.mergeConfig.continuousSelect;
430
+ const { multipleSelect, continuousSelect } = this.editor.mergeConfig;
431
+ return multipleSelect && (e.shiftKey || continuousSelect);
415
432
  }
416
433
  __listenEvents() {
417
434
  const { editor } = this;
@@ -586,21 +603,25 @@ const EditDataHelper = {
586
603
  let last;
587
604
  switch (direction) {
588
605
  case top:
606
+ case topLeft:
589
607
  last = { x: 0.5, y: 0 };
590
608
  align = 'bottom';
591
609
  skewX = 1;
592
610
  break;
593
611
  case bottom:
612
+ case bottomRight:
594
613
  last = { x: 0.5, y: 1 };
595
614
  align = 'top';
596
615
  skewX = 1;
597
616
  break;
598
617
  case left$1:
618
+ case bottomLeft:
599
619
  last = { x: 0, y: 0.5 };
600
620
  align = 'right';
601
621
  skewY = 1;
602
622
  break;
603
623
  case right$1:
624
+ case topRight:
604
625
  last = { x: 1, y: 0.5 };
605
626
  align = 'left';
606
627
  skewY = 1;
@@ -689,7 +710,7 @@ function updateCursor(editor, e) {
689
710
  let showResize = pointType.includes('resize');
690
711
  if (showResize && rotateable && (e.metaKey || e.ctrlKey || !resizeable))
691
712
  showResize = false;
692
- const showSkew = skewable && !showResize && point.name === 'resize-line';
713
+ const showSkew = skewable && !showResize && (point.name === 'resize-line' || pointType === 'skew');
693
714
  const cursor = showSkew ? skewCursor : (showResize ? resizeCursor : rotateCursor);
694
715
  rotation += (EditDataHelper.getFlipDirection(point.direction, flippedX, flippedY) + 1) * 45;
695
716
  rotation = Math.round(draw.MathHelper.formatRotation(rotation, true) / 2) * 2;
@@ -911,6 +932,8 @@ class EditBox extends draw.Group {
911
932
  editor.onRotate(e);
912
933
  if (pointType.includes('resize'))
913
934
  editor.onScale(e);
935
+ if (pointType === 'skew')
936
+ editor.onSkew(e);
914
937
  updateCursor(editor, e);
915
938
  }
916
939
  onArrow(e) {
@@ -1092,6 +1115,7 @@ const config = {
1092
1115
  hover: true,
1093
1116
  select: 'press',
1094
1117
  openInner: 'double',
1118
+ multipleSelect: true,
1095
1119
  boxSelect: true,
1096
1120
  moveable: true,
1097
1121
  resizeable: true,
@@ -1118,11 +1142,7 @@ function simulate(editor) {
1118
1142
  function onTarget(editor, oldValue) {
1119
1143
  const { target } = editor;
1120
1144
  if (target) {
1121
- const { list } = editor.leafList = target instanceof draw.LeafList ? target : new draw.LeafList(target instanceof Array ? target : target);
1122
- if (!list.every(checkEditable)) {
1123
- editor.target = list.filter(checkEditable);
1124
- return;
1125
- }
1145
+ editor.leafList = target instanceof draw.LeafList ? target : new draw.LeafList(target);
1126
1146
  if (editor.multiple)
1127
1147
  simulate(editor);
1128
1148
  }
@@ -1149,9 +1169,6 @@ function onTarget(editor, oldValue) {
1149
1169
  function onHover(editor, oldValue) {
1150
1170
  editor.emitEvent(new EditorEvent(EditorEvent.HOVER, { editor, value: editor.hoverTarget, oldValue }));
1151
1171
  }
1152
- function checkEditable(item) {
1153
- return item.editable && !item.locked;
1154
- }
1155
1172
 
1156
1173
  const order = (a, b) => a.parent.children.indexOf(a) - b.parent.children.indexOf(b);
1157
1174
  const reverseOrder = (a, b) => b.parent.children.indexOf(b) - a.parent.children.indexOf(a);
@@ -1183,13 +1200,16 @@ const EditorHelper = {
1183
1200
  const ungroupList = [];
1184
1201
  app.lockLayout();
1185
1202
  list.forEach(leaf => {
1186
- if (leaf.isBranch && !leaf.isBranchLeaf) {
1203
+ if (leaf.isBranch) {
1187
1204
  const { parent, children } = leaf;
1188
1205
  while (children.length) {
1189
1206
  ungroupList.push(children[0]);
1190
1207
  children[0].dropTo(parent, parent.children.indexOf(leaf));
1191
1208
  }
1192
- leaf.remove();
1209
+ if (leaf.isBranchLeaf)
1210
+ ungroupList.push(leaf);
1211
+ else
1212
+ leaf.remove();
1193
1213
  }
1194
1214
  else {
1195
1215
  ungroupList.push(leaf);
@@ -1494,13 +1514,22 @@ class Editor extends draw.Group {
1494
1514
  this.skewOf(origin, skewX, skewY);
1495
1515
  }
1496
1516
  move(x, y = 0) {
1497
- const { element } = this;
1498
1517
  if (!this.checkTransform('moveable'))
1499
1518
  return;
1500
- const world = element.getWorldPointByLocal(typeof x === 'object' ? Object.assign({}, x) : { x, y }, null, true);
1519
+ if (typeof x === 'object')
1520
+ y = x.y, x = x.x;
1521
+ const { element: target } = this, { beforeMove } = this.mergeConfig;
1522
+ if (beforeMove) {
1523
+ const check = beforeMove({ target, x, y });
1524
+ if (typeof check === 'object')
1525
+ x = check.x, y = check.y;
1526
+ else if (check === false)
1527
+ return;
1528
+ }
1529
+ const world = target.getWorldPointByLocal({ x, y }, null, true);
1501
1530
  if (this.multiple)
1502
- element.safeChange(() => element.move(x, y));
1503
- const data = { target: element, editor: this, moveX: world.x, moveY: world.y };
1531
+ target.safeChange(() => target.move(x, y));
1532
+ const data = { target, editor: this, moveX: world.x, moveY: world.y };
1504
1533
  this.emitEvent(new EditorMoveEvent(EditorMoveEvent.BEFORE_MOVE, data));
1505
1534
  const event = new EditorMoveEvent(EditorMoveEvent.MOVE, data);
1506
1535
  this.editTool.onMove(event);
@@ -1509,8 +1538,14 @@ class Editor extends draw.Group {
1509
1538
  scaleWithDrag(data) {
1510
1539
  if (!this.checkTransform('resizeable'))
1511
1540
  return;
1512
- const { element } = this;
1513
- data = Object.assign(Object.assign({}, data), { target: element, editor: this, worldOrigin: element.getWorldPoint(data.origin) });
1541
+ const { element: target } = this, { beforeScale } = this.mergeConfig;
1542
+ if (beforeScale) {
1543
+ const { origin, scaleX, scaleY, drag } = data;
1544
+ const check = beforeScale({ target, drag, origin, scaleX, scaleY });
1545
+ if (check === false)
1546
+ return;
1547
+ }
1548
+ data = Object.assign(Object.assign({}, data), { target, editor: this, worldOrigin: target.getWorldPoint(data.origin) });
1514
1549
  this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data));
1515
1550
  const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data);
1516
1551
  this.editTool.onScaleWithDrag(event);
@@ -1519,10 +1554,17 @@ class Editor extends draw.Group {
1519
1554
  scaleOf(origin, scaleX, scaleY = scaleX, _resize) {
1520
1555
  if (!this.checkTransform('resizeable'))
1521
1556
  return;
1522
- const { element } = this;
1557
+ const { element: target } = this, { beforeScale } = this.mergeConfig;
1558
+ if (beforeScale) {
1559
+ const check = beforeScale({ target, origin, scaleX, scaleY });
1560
+ if (typeof check === 'object')
1561
+ scaleX = check.scaleX, scaleY = check.scaleY;
1562
+ else if (check === false)
1563
+ return;
1564
+ }
1523
1565
  const worldOrigin = this.getWorldOrigin(origin);
1524
- const transform = this.multiple && this.getChangedTransform(() => element.safeChange(() => element.scaleOf(origin, scaleX, scaleY)));
1525
- const data = { target: element, editor: this, worldOrigin, scaleX, scaleY, transform };
1566
+ const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.scaleOf(origin, scaleX, scaleY)));
1567
+ const data = { target, editor: this, worldOrigin, scaleX, scaleY, transform };
1526
1568
  this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data));
1527
1569
  const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data);
1528
1570
  this.editTool.onScale(event);
@@ -1543,10 +1585,17 @@ class Editor extends draw.Group {
1543
1585
  rotateOf(origin, rotation) {
1544
1586
  if (!this.checkTransform('rotateable'))
1545
1587
  return;
1546
- const { element } = this;
1588
+ const { element: target } = this, { beforeRotate } = this.mergeConfig;
1589
+ if (beforeRotate) {
1590
+ const check = beforeRotate({ target, origin, rotation });
1591
+ if (typeof check === 'number')
1592
+ rotation = check;
1593
+ else if (check === false)
1594
+ return;
1595
+ }
1547
1596
  const worldOrigin = this.getWorldOrigin(origin);
1548
- const transform = this.multiple && this.getChangedTransform(() => element.safeChange(() => element.rotateOf(origin, rotation)));
1549
- const data = { target: element, editor: this, worldOrigin, rotation, transform };
1597
+ const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.rotateOf(origin, rotation)));
1598
+ const data = { target, editor: this, worldOrigin, rotation, transform };
1550
1599
  this.emitEvent(new EditorRotateEvent(EditorRotateEvent.BEFORE_ROTATE, data));
1551
1600
  const event = new EditorRotateEvent(EditorRotateEvent.ROTATE, data);
1552
1601
  this.editTool.onRotate(event);
@@ -1555,10 +1604,17 @@ class Editor extends draw.Group {
1555
1604
  skewOf(origin, skewX, skewY = 0, _resize) {
1556
1605
  if (!this.checkTransform('skewable'))
1557
1606
  return;
1558
- const { element } = this;
1607
+ const { element: target } = this, { beforeSkew } = this.mergeConfig;
1608
+ if (beforeSkew) {
1609
+ const check = beforeSkew({ target, origin, skewX, skewY });
1610
+ if (typeof check === 'object')
1611
+ skewX = check.skewX, skewY = check.skewY;
1612
+ else if (check === false)
1613
+ return;
1614
+ }
1559
1615
  const worldOrigin = this.getWorldOrigin(origin);
1560
- const transform = this.multiple && this.getChangedTransform(() => element.safeChange(() => element.skewOf(origin, skewX, skewY)));
1561
- const data = { target: element, editor: this, worldOrigin, skewX, skewY, transform };
1616
+ const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.skewOf(origin, skewX, skewY)));
1617
+ const data = { target, editor: this, worldOrigin, skewX, skewY, transform };
1562
1618
  this.emitEvent(new EditorSkewEvent(EditorSkewEvent.BEFORE_SKEW, data));
1563
1619
  const event = new EditorSkewEvent(EditorSkewEvent.SKEW, data);
1564
1620
  this.editTool.onSkew(event);