@node-projects/web-component-designer 0.0.150 → 0.0.152

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 (60) hide show
  1. package/dist/elements/helper/ElementHelper.d.ts +5 -0
  2. package/dist/elements/helper/ElementHelper.js +20 -0
  3. package/dist/elements/helper/GridHelper.js +2 -2
  4. package/dist/elements/helper/LayoutHelper.js +8 -2
  5. package/dist/elements/helper/TransformHelper.d.ts +17 -3
  6. package/dist/elements/helper/TransformHelper.js +204 -13
  7. package/dist/elements/services/DefaultServiceBootstrap.js +10 -2
  8. package/dist/elements/services/placementService/DefaultPlacementService.d.ts +1 -0
  9. package/dist/elements/services/placementService/DefaultPlacementService.js +24 -8
  10. package/dist/elements/services/placementService/FlexBoxPlacementService.d.ts +1 -0
  11. package/dist/elements/services/placementService/FlexBoxPlacementService.js +2 -0
  12. package/dist/elements/services/placementService/GridPlacementService.d.ts +1 -0
  13. package/dist/elements/services/placementService/GridPlacementService.js +2 -0
  14. package/dist/elements/services/placementService/IPlacementService.d.ts +1 -0
  15. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +4 -0
  16. package/dist/elements/widgets/designerView/IPlacementView.d.ts +0 -1
  17. package/dist/elements/widgets/designerView/designerCanvas.d.ts +2 -2
  18. package/dist/elements/widgets/designerView/designerCanvas.js +10 -8
  19. package/dist/elements/widgets/designerView/extensions/AbstractExtensionBase.d.ts +2 -0
  20. package/dist/elements/widgets/designerView/extensions/AbstractExtensionBase.js +8 -0
  21. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +1 -0
  22. package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +2 -1
  23. package/dist/elements/widgets/designerView/extensions/ExtensionType.js +1 -0
  24. package/dist/elements/widgets/designerView/extensions/FlexboxExtension.d.ts +11 -0
  25. package/dist/elements/widgets/designerView/extensions/FlexboxExtension.js +20 -0
  26. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.d.ts +6 -0
  27. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.js +21 -0
  28. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionProvider.d.ts +11 -0
  29. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionProvider.js +17 -0
  30. package/dist/elements/widgets/designerView/extensions/GrayOutDragOverContainerExtension.js +3 -2
  31. package/dist/elements/widgets/designerView/extensions/GridExtension copy.d.ts +10 -0
  32. package/dist/elements/widgets/designerView/extensions/GridExtension copy.js +30 -0
  33. package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons copy.d.ts +6 -0
  34. package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons copy.js +21 -0
  35. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.d.ts +11 -0
  36. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.js +18 -0
  37. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider.js +2 -1
  38. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.js +3 -2
  39. package/dist/elements/widgets/designerView/extensions/MouseOverExtension.js +3 -4
  40. package/dist/elements/widgets/designerView/extensions/PlacementExtension.d.ts +11 -0
  41. package/dist/elements/widgets/designerView/extensions/PlacementExtension.js +22 -0
  42. package/dist/elements/widgets/designerView/extensions/PlacementExtensionProvider.d.ts +10 -0
  43. package/dist/elements/widgets/designerView/extensions/PlacementExtensionProvider.js +13 -0
  44. package/dist/elements/widgets/designerView/extensions/ResizeExtension.d.ts +3 -1
  45. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +201 -41
  46. package/dist/elements/widgets/designerView/extensions/RotateExtension.d.ts +8 -2
  47. package/dist/elements/widgets/designerView/extensions/RotateExtension.js +77 -43
  48. package/dist/elements/widgets/designerView/extensions/RotateExtensionProvider.js +1 -0
  49. package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.d.ts +4 -1
  50. package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.js +14 -9
  51. package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +30 -20
  52. package/dist/elements/widgets/designerView/overlayLayerView.d.ts +1 -0
  53. package/dist/elements/widgets/designerView/overlayLayerView.js +10 -0
  54. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -0
  55. package/dist/elements/widgets/designerView/tools/PointerTool.js +16 -0
  56. package/dist/index.d.ts +3 -0
  57. package/dist/index.js +3 -0
  58. package/dist/interfaces/IPoint3D.d.ts +5 -0
  59. package/dist/interfaces/IPoint3D.js +1 -0
  60. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { EventNames } from "../../../../enums/EventNames";
2
- import { convertCoordinates, getDomMatrix } from "../../../helper/TransformHelper.js";
2
+ import { convertCoordinates, getDomMatrix, getDesignerCanvasNormalizedTransformedCornerDOMPoints, normalizeToAbsolutePosition } from "../../../helper/TransformHelper.js";
3
3
  import { AbstractExtension } from './AbstractExtension';
4
4
  export class ResizeExtension extends AbstractExtension {
5
5
  resizeAllSelected;
@@ -15,6 +15,8 @@ export class ResizeExtension extends AbstractExtension {
15
15
  _circle6;
16
16
  _circle7;
17
17
  _circle8;
18
+ _initialComputedTransformOrigins;
19
+ _initialTransformOrigins;
18
20
  constructor(extensionManager, designerCanvas, extendedItem, resizeAllSelected) {
19
21
  super(extensionManager, designerCanvas, extendedItem);
20
22
  this.resizeAllSelected = resizeAllSelected;
@@ -23,31 +25,17 @@ export class ResizeExtension extends AbstractExtension {
23
25
  this.refresh();
24
26
  }
25
27
  refresh() {
26
- const rect = this.extendedItem.element.getBoundingClientRect();
27
- this._circle1 = this._drawResizerOverlay((rect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (rect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor, 'nw-resize', this._circle1);
28
- this._circle2 = this._drawResizerOverlay((rect.x + (rect.width / 2) - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (rect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor, 'n-resize', this._circle2);
29
- this._circle3 = this._drawResizerOverlay((rect.x + rect.width - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (rect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor, 'ne-resize', this._circle3);
30
- this._circle4 = this._drawResizerOverlay((rect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (rect.y + rect.height - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor, 'sw-resize', this._circle4);
31
- this._circle5 = this._drawResizerOverlay((rect.x + (rect.width / 2) - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (rect.y + rect.height - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor, 's-resize', this._circle5);
32
- this._circle6 = this._drawResizerOverlay((rect.x + rect.width - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (rect.y + rect.height - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor, 'se-resize', this._circle6);
33
- this._circle7 = this._drawResizerOverlay((rect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (rect.y + (rect.height / 2) - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor, 'w-resize', this._circle7);
34
- this._circle8 = this._drawResizerOverlay((rect.x + rect.width - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (rect.y + (rect.height / 2) - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor, 'e-resize', this._circle8);
35
- if (rect.width < 12) {
36
- this._circle2.style.display = 'none';
37
- this._circle5.style.display = 'none';
38
- }
39
- else {
40
- this._circle2.style.display = '';
41
- this._circle5.style.display = '';
42
- }
43
- if (rect.height < 12) {
44
- this._circle7.style.display = 'none';
45
- this._circle8.style.display = 'none';
46
- }
47
- else {
48
- this._circle8.style.display = '';
49
- this._circle8.style.display = '';
50
- }
28
+ //#region Resizer circles
29
+ let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, 0, this.designerCanvas);
30
+ this._circle1 = this._drawResizerOverlay(transformedCornerPoints[0].x, transformedCornerPoints[0].y, 'nw-resize', this._circle1);
31
+ this._circle2 = this._drawResizerOverlay((transformedCornerPoints[0].x + (transformedCornerPoints[1].x - transformedCornerPoints[0].x) / 2), (transformedCornerPoints[0].y + (transformedCornerPoints[1].y - transformedCornerPoints[0].y) / 2), 'n-resize', this._circle2);
32
+ this._circle3 = this._drawResizerOverlay(transformedCornerPoints[1].x, transformedCornerPoints[1].y, 'ne-resize', this._circle3);
33
+ this._circle4 = this._drawResizerOverlay((transformedCornerPoints[0].x + (transformedCornerPoints[2].x - transformedCornerPoints[0].x) / 2), (transformedCornerPoints[0].y + (transformedCornerPoints[2].y - transformedCornerPoints[0].y) / 2), 'w-resize', this._circle4);
34
+ this._circle5 = this._drawResizerOverlay(transformedCornerPoints[2].x, transformedCornerPoints[2].y, 'sw-resize', this._circle5);
35
+ this._circle6 = this._drawResizerOverlay((transformedCornerPoints[2].x + (transformedCornerPoints[3].x - transformedCornerPoints[2].x) / 2), (transformedCornerPoints[2].y + (transformedCornerPoints[3].y - transformedCornerPoints[2].y) / 2), 's-resize', this._circle6);
36
+ this._circle8 = this._drawResizerOverlay((transformedCornerPoints[1].x + (transformedCornerPoints[3].x - transformedCornerPoints[1].x) / 2), (transformedCornerPoints[1].y + (transformedCornerPoints[3].y - transformedCornerPoints[1].y) / 2), 'e-resize', this._circle8);
37
+ this._circle7 = this._drawResizerOverlay(transformedCornerPoints[3].x, transformedCornerPoints[3].y, 'se-resize', this._circle7);
38
+ //#endregion Circles
51
39
  }
52
40
  _drawResizerOverlay(x, y, cursor, oldCircle) {
53
41
  let circle = this._drawCircle(x, y, 3 / this.designerCanvas.zoomFactor, 'svg-primary-resizer', oldCircle);
@@ -60,7 +48,7 @@ export class ResizeExtension extends AbstractExtension {
60
48
  circle.style.cursor = cursor;
61
49
  return circle;
62
50
  }
63
- _pointerActionTypeResize(circle, event, actionMode = 'se-resize') {
51
+ _pointerActionTypeResize(circle, event, actionMode) {
64
52
  event.stopPropagation();
65
53
  const currentPoint = this.designerCanvas.getNormalizedEventCoordinates(event);
66
54
  switch (event.type) {
@@ -72,34 +60,130 @@ export class ResizeExtension extends AbstractExtension {
72
60
  this._initialPoint = currentPoint;
73
61
  this._initialSizes = [];
74
62
  this._actionModeStarted = actionMode;
75
- let rect = this.designerCanvas.getNormalizedElementCoordinatesAndRealSizes(this.extendedItem.element);
76
- this._initialSizes.push({ width: rect.realWidth, height: rect.realHeight });
63
+ this._initialComputedTransformOrigins = [];
64
+ this._initialTransformOrigins = [];
65
+ //#region Calc elements' dimension
66
+ const transformBackup = this.extendedItem.element.style.transform;
67
+ this.extendedItem.element.style.transform = '';
68
+ let rect = this.extendedItem.element.getBoundingClientRect();
69
+ this.extendedItem.element.style.transform = transformBackup;
70
+ //#endregion Calc element's dimension
71
+ this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
72
+ this.extendedItem.element.style.width = this._initialSizes[0].width + 'px';
73
+ const toArr = getComputedStyle(this.extendedItem.element).transformOrigin.split(' ').map(x => parseInt(x.replace('px', '')));
74
+ const transformOrigin = new DOMPoint(toArr[0], toArr[1]);
75
+ this._initialComputedTransformOrigins.push(transformOrigin);
76
+ this._initialTransformOrigins.push(this.extendedItem.element.style.transformOrigin);
77
77
  if (this.resizeAllSelected) {
78
78
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
79
- rect = this.designerCanvas.getNormalizedElementCoordinatesAndRealSizes(designItem.element);
80
- this._initialSizes.push({ width: rect.realWidth, height: rect.realHeight });
79
+ rect = designItem.element.getBoundingClientRect();
80
+ this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
81
81
  }
82
82
  }
83
83
  if (this.designerCanvas.alignOnSnap)
84
84
  this.designerCanvas.snapLines.calculateSnaplines(this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
85
+ let i = 0;
86
+ let top = null;
87
+ let bottom = null;
88
+ let left = null;
89
+ let right = null;
90
+ switch (this._actionModeStarted) {
91
+ case 'e-resize':
92
+ left = getComputedStyle(this.extendedItem.element).left;
93
+ this.extendedItem.element.style.removeProperty('right');
94
+ this.extendedItem.element.style.left = left;
95
+ this.extendedItem.element.style.transformOrigin = this._initialComputedTransformOrigins[i].x + 'px ' + this._initialComputedTransformOrigins[i].y + 'px';
96
+ break;
97
+ case 'se-resize':
98
+ top = getComputedStyle(this.extendedItem.element).top;
99
+ this.extendedItem.element.style.removeProperty('bottom');
100
+ this.extendedItem.element.style.top = top;
101
+ left = getComputedStyle(this.extendedItem.element).left;
102
+ this.extendedItem.element.style.removeProperty('right');
103
+ this.extendedItem.element.style.left = left;
104
+ this.extendedItem.element.style.transformOrigin = this._initialComputedTransformOrigins[i].x + 'px ' + this._initialComputedTransformOrigins[i].y + 'px';
105
+ break;
106
+ case 's-resize':
107
+ top = getComputedStyle(this.extendedItem.element).top;
108
+ this.extendedItem.element.style.removeProperty('bottom');
109
+ this.extendedItem.element.style.top = top;
110
+ this.extendedItem.element.style.transformOrigin = this._initialComputedTransformOrigins[i].x + 'px ' + this._initialComputedTransformOrigins[i].y + 'px';
111
+ break;
112
+ case 'sw-resize':
113
+ top = getComputedStyle(this.extendedItem.element).top;
114
+ this.extendedItem.element.style.removeProperty('bottom');
115
+ this.extendedItem.element.style.top = top;
116
+ right = getComputedStyle(this.extendedItem.element).right;
117
+ this.extendedItem.element.style.removeProperty('left');
118
+ this.extendedItem.element.style.right = right;
119
+ this.extendedItem.element.style.transformOrigin = 'calc(100% - ' + this._initialComputedTransformOrigins[i].x + 'px) ' + this._initialComputedTransformOrigins[i].y + 'px';
120
+ break;
121
+ case 'w-resize':
122
+ right = getComputedStyle(this.extendedItem.element).right;
123
+ this.extendedItem.element.style.removeProperty('left');
124
+ this.extendedItem.element.style.right = right;
125
+ this.extendedItem.element.style.transformOrigin = 'calc(100% - ' + this._initialComputedTransformOrigins[i].x + 'px) ' + this._initialComputedTransformOrigins[i].y + 'px';
126
+ break;
127
+ case 'nw-resize':
128
+ bottom = getComputedStyle(this.extendedItem.element).bottom;
129
+ this.extendedItem.element.style.removeProperty('top');
130
+ this.extendedItem.element.style.bottom = bottom;
131
+ right = getComputedStyle(this.extendedItem.element).right;
132
+ this.extendedItem.element.style.removeProperty('left');
133
+ this.extendedItem.element.style.right = right;
134
+ this.extendedItem.element.style.transformOrigin = 'calc(100% - ' + this._initialComputedTransformOrigins[i].x + 'px) ' + 'calc(100% - ' + this._initialComputedTransformOrigins[i].y + 'px)';
135
+ break;
136
+ case 'n-resize':
137
+ bottom = getComputedStyle(this.extendedItem.element).bottom;
138
+ this.extendedItem.element.style.removeProperty('top');
139
+ this.extendedItem.element.style.bottom = bottom;
140
+ this.extendedItem.element.style.transformOrigin = 'calc(100% - ' + this._initialComputedTransformOrigins[i].x + 'px) ' + 'calc(100% - ' + this._initialComputedTransformOrigins[i].y + 'px)';
141
+ break;
142
+ case 'ne-resize':
143
+ bottom = getComputedStyle(this.extendedItem.element).bottom;
144
+ this.extendedItem.element.style.removeProperty('top');
145
+ this.extendedItem.element.style.bottom = bottom;
146
+ left = getComputedStyle(this.extendedItem.element).left;
147
+ this.extendedItem.element.style.removeProperty('right');
148
+ this.extendedItem.element.style.left = left;
149
+ this.extendedItem.element.style.transformOrigin = this._initialComputedTransformOrigins[i].x + 'px ' + 'calc(100% - ' + this._initialComputedTransformOrigins[i].y + 'px)';
150
+ break;
151
+ }
85
152
  break;
86
153
  case EventNames.PointerMove:
87
154
  if (this._initialPoint) {
88
155
  const containerStyle = getComputedStyle(this.extendedItem.parent.element);
89
156
  const containerService = this.designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this.extendedItem.parent, containerStyle));
90
157
  const diff = containerService.placePoint(event, this.designerCanvas, this.extendedItem.parent, this._initialPoint, { x: 0, y: 0 }, currentPoint, this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
91
- let trackX = diff.x - this._initialPoint.x - this._offsetPoint.x;
92
- let trackY = diff.y - this._initialPoint.y - this._offsetPoint.y;
158
+ let trackX = Math.round(diff.x - this._initialPoint.x - this._offsetPoint.x);
159
+ let trackY = Math.round(diff.y - this._initialPoint.y - this._offsetPoint.y);
93
160
  let matrix = getDomMatrix(this.extendedItem.element);
94
- let transformedTrack = convertCoordinates({ x: trackX, y: trackY }, matrix);
161
+ let transformedTrack = convertCoordinates(new DOMPoint(trackX, trackY, 0, 0), matrix);
95
162
  let i = 0;
163
+ let width = null;
164
+ let height = null;
96
165
  switch (this._actionModeStarted) {
166
+ case 'e-resize':
167
+ width = (this._initialSizes[i].width + transformedTrack.x);
168
+ this.extendedItem.element.style.width = width + 'px';
169
+ if (this.resizeAllSelected) {
170
+ i++;
171
+ for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
172
+ if (designItem !== this.extendedItem) {
173
+ designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
174
+ }
175
+ }
176
+ }
177
+ break;
97
178
  case 'se-resize':
98
- this.extendedItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
99
- this.extendedItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
179
+ width = (this._initialSizes[i].width + transformedTrack.x);
180
+ this.extendedItem.element.style.width = width + 'px';
181
+ height = (this._initialSizes[i].height + transformedTrack.y);
182
+ this.extendedItem.element.style.height = height + 'px';
183
+ console.log(this.extendedItem.element.style.transformOrigin);
100
184
  if (this.resizeAllSelected) {
185
+ i++;
101
186
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
102
- i++;
103
187
  if (designItem !== this.extendedItem) {
104
188
  designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
105
189
  designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
@@ -108,7 +192,8 @@ export class ResizeExtension extends AbstractExtension {
108
192
  }
109
193
  break;
110
194
  case 's-resize':
111
- this.extendedItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
195
+ height = (this._initialSizes[i].height + transformedTrack.y);
196
+ this.extendedItem.element.style.height = height + 'px';
112
197
  if (this.resizeAllSelected) {
113
198
  i++;
114
199
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
@@ -118,18 +203,75 @@ export class ResizeExtension extends AbstractExtension {
118
203
  }
119
204
  }
120
205
  break;
121
- case 'e-resize':
122
- this.extendedItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
206
+ case 'sw-resize':
207
+ width = (this._initialSizes[i].width - transformedTrack.x);
208
+ this.extendedItem.element.style.width = width + 'px';
209
+ height = (this._initialSizes[i].height + transformedTrack.y);
210
+ this.extendedItem.element.style.height = height + 'px';
211
+ if (this.resizeAllSelected) {
212
+ i++;
213
+ for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
214
+ if (designItem !== this.extendedItem) {
215
+ designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
216
+ designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
217
+ }
218
+ }
219
+ }
220
+ break;
221
+ case 'w-resize':
222
+ width = (this._initialSizes[i].width - transformedTrack.x);
223
+ this.extendedItem.element.style.width = width + 'px';
224
+ if (this.resizeAllSelected) {
225
+ i++;
226
+ for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
227
+ if (designItem !== this.extendedItem) {
228
+ designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
229
+ }
230
+ }
231
+ }
232
+ break;
233
+ case 'nw-resize':
234
+ width = (this._initialSizes[i].width - transformedTrack.x);
235
+ this.extendedItem.element.style.width = width + 'px';
236
+ height = (this._initialSizes[i].height - transformedTrack.y);
237
+ this.extendedItem.element.style.height = height + 'px';
238
+ if (this.resizeAllSelected) {
239
+ i++;
240
+ for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
241
+ if (designItem !== this.extendedItem) {
242
+ designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
243
+ designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
244
+ }
245
+ }
246
+ }
247
+ break;
248
+ case 'n-resize':
249
+ height = (this._initialSizes[i].height - transformedTrack.y);
250
+ this.extendedItem.element.style.height = height + 'px';
251
+ if (this.resizeAllSelected) {
252
+ i++;
253
+ for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
254
+ if (designItem !== this.extendedItem) {
255
+ designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
256
+ }
257
+ }
258
+ }
259
+ break;
260
+ case 'ne-resize':
261
+ width = (this._initialSizes[i].width + transformedTrack.x);
262
+ this.extendedItem.element.style.width = width + 'px';
263
+ height = (this._initialSizes[i].height - transformedTrack.y);
264
+ this.extendedItem.element.style.height = height + 'px';
123
265
  if (this.resizeAllSelected) {
124
266
  i++;
125
267
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
126
268
  if (designItem !== this.extendedItem) {
127
269
  designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
270
+ designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
128
271
  }
129
272
  }
130
273
  }
131
274
  break;
132
- //for other resize modes we need a replacement
133
275
  }
134
276
  const resizedElements = [this.extendedItem, this.extendedItem.parent];
135
277
  if (this.resizeAllSelected)
@@ -142,6 +284,24 @@ export class ResizeExtension extends AbstractExtension {
142
284
  let cg = this.extendedItem.openGroup((this.resizeAllSelected && this.designerCanvas.instanceServiceContainer.selectionService.selectedElements.length > 1) ? "Resize Elements" : "Resize &lt;" + this.extendedItem.name + "&gt;");
143
285
  this.extendedItem.setStyle('width', this.extendedItem.element.style.width);
144
286
  this.extendedItem.setStyle('height', this.extendedItem.element.style.height);
287
+ this.extendedItem.setStyle('left', normalizeToAbsolutePosition(this.extendedItem.element, 'left'));
288
+ this.extendedItem.setStyle('top', normalizeToAbsolutePosition(this.extendedItem.element, 'top'));
289
+ let p3Abs = new DOMPoint(this.extendedItem.element.offsetLeft + parseInt(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[0].replace('px', '')), this.extendedItem.element.offsetTop + parseInt(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[1].replace('px', '')));
290
+ this.extendedItem.element.style.transformOrigin = this._initialTransformOrigins[0];
291
+ let p1Abs = new DOMPoint(this.extendedItem.element.offsetLeft + parseInt(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[0].replace('px', '')), this.extendedItem.element.offsetTop + parseInt(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[1].replace('px', '')));
292
+ let p1 = new DOMPoint(p1Abs.x - p3Abs.x, -(p1Abs.y - p3Abs.y));
293
+ let matrix = new DOMMatrix(getComputedStyle(this.extendedItem.element).transform);
294
+ let deltaX = 0;
295
+ let deltaY = 0;
296
+ let p1transformed = p1.matrixTransform(matrix.inverse());
297
+ let p2Abs = new DOMPoint(p3Abs.x + p1transformed.x, p3Abs.y - p1transformed.y);
298
+ let p1p2 = new DOMPoint(p2Abs.x - p1Abs.x, -(p2Abs.y - p1Abs.y));
299
+ let p1p2transformed = p1p2.matrixTransform(matrix);
300
+ let p4Abs = new DOMPoint(p1Abs.x + p1p2transformed.x, p1Abs.y - p1p2transformed.y);
301
+ deltaX = p4Abs.x - p1Abs.x;
302
+ deltaY = p4Abs.y - p1Abs.y;
303
+ this.extendedItem.element.style.transform = matrix.translate(deltaX, deltaY).toString();
304
+ this.extendedItem.setStyle('transform', this.extendedItem.element.style.transform);
145
305
  if (this.resizeAllSelected) {
146
306
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
147
307
  if (designItem !== this.extendedItem) {
@@ -3,10 +3,16 @@ import { IDesignerCanvas } from "../IDesignerCanvas";
3
3
  import { AbstractExtension } from './AbstractExtension';
4
4
  import { IExtensionManager } from "./IExtensionManger";
5
5
  export declare class RotateExtension extends AbstractExtension {
6
+ private _initialPoint;
7
+ private _rotateIcon;
8
+ private _initialElementAngle;
9
+ private _initialOverlayAngle;
10
+ private _textAngle;
11
+ private _actualRotationAngle;
6
12
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
7
13
  extend(): void;
8
- _drawRotateOverlay(itemRect: DOMRect): void;
9
- _pointerActionTypeRotate(event: PointerEvent): void;
10
14
  refresh(): void;
15
+ _drawRotateOverlay(itemRect: DOMRect, oldRotateIcon: any): any;
16
+ _pointerActionTypeRotate(event: PointerEvent): void;
11
17
  dispose(): void;
12
18
  }
@@ -1,70 +1,104 @@
1
1
  import { EventNames } from "../../../../enums/EventNames";
2
+ import { cssMatrixToMatrixArray, extractRotationAngleFromDOMMatrix, getDesignerCanvasNormalizedTransformedCornerDOMPoints, getRotationAngleFromMatrix, getRotationMatrix3d, rotateElementByMatrix3d } from "../../../helper/TransformHelper";
2
3
  import { AbstractExtension } from './AbstractExtension';
3
4
  export class RotateExtension extends AbstractExtension {
5
+ _initialPoint;
6
+ _rotateIcon;
7
+ _initialElementAngle;
8
+ _initialOverlayAngle;
9
+ _textAngle;
10
+ _actualRotationAngle;
4
11
  constructor(extensionManager, designerView, extendedItem) {
5
12
  super(extensionManager, designerView, extendedItem);
6
13
  }
7
14
  extend() {
15
+ this.refresh();
16
+ }
17
+ refresh() {
8
18
  const rect = this.extendedItem.element.getBoundingClientRect();
9
- this._drawRotateOverlay(rect);
19
+ this._actualRotationAngle = getRotationAngleFromMatrix(null, new DOMMatrix(this.extendedItem.element.style.transform));
20
+ this._rotateIcon = this._drawRotateOverlay(rect, this._rotateIcon);
10
21
  }
11
- _drawRotateOverlay(itemRect) {
12
- const g = document.createElementNS("http://www.w3.org/2000/svg", "g");
13
- const line = document.createElementNS("http://www.w3.org/2000/svg", "circle");
14
- line.setAttribute('r', (7.5));
15
- line.setAttribute('class', 'svg-primary-rotate');
16
- line.setAttribute('style', 'cursor: grabbing');
17
- g.appendChild(line);
18
- const g2 = document.createElementNS("http://www.w3.org/2000/svg", "g");
19
- g2.setAttribute('transform', 'translate(-8,0) scale(0.0015,-0.0015)');
20
- const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
21
- path.setAttribute('style', 'fill: white');
22
- path.setAttribute('d', 'M5260,4367.9c-1803.6-157-3329.6-1457-3771.9-3212.8c-34.5-135.9-72.7-331.2-86.2-430.8c-11.5-99.6-24.9-201-30.6-224l-7.7-44H731.8c-528.4,0-631.8-3.8-631.8-26.8c0-42.1,2029.5-2042.9,2104.2-2073.6c36.4-15.3,86.2-21.1,118.7-15.3c40.2,9.6,346.6,300.6,1089.4,1037.7C3981-58.8,4446.3,414.2,4446.3,429.5c0,23-103.4,26.8-620.3,26.8c-342.7,0-626.1,5.7-629.9,15.3c-13.4,21.1,38.3,245.1,93.8,415.5c114.9,348.5,319.7,681.6,582.1,947.8c478.7,484.4,1062.6,731.4,1742.3,735.2c317.8,0,482.5-23,765.9-114.9c402.1-128.3,725.7-331.2,1022.4-641.4c455.7-474.8,687.4-1047.3,687.4-1702.1c-1.9-693.1-254.6-1284.7-754.4-1771c-396.3-384.9-882.7-614.6-1430.3-679.7c-141.7-17.2-195.3-32.6-227.9-63.2l-44-38.3v-811.8v-811.8l49.8-49.8c49.8-47.9,53.6-49.8,243.2-36.4c1606.4,105.3,3048.1,1146.9,3658.9,2646c453.8,1112.4,415.5,2379.9-105.3,3463.6c-360,752.5-953.5,1397.7-1677.3,1828.5c-515,308.3-1139.2,513.1-1746.2,574.4C5872.7,4379.4,5438.1,4383.3,5260,4367.9z');
23
- g2.appendChild(path);
24
- g.appendChild(g2);
25
- g.addEventListener(EventNames.PointerDown, event => this._pointerActionTypeRotate(event));
26
- g.addEventListener(EventNames.PointerMove, event => this._pointerActionTypeRotate(event));
27
- g.addEventListener(EventNames.PointerUp, event => this._pointerActionTypeRotate(event));
28
- g.setAttribute('class', 'svg-primary-rotate');
29
- g.setAttribute('transform', 'translate(' + ((itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor - 13) + ',' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 8.5) + ')');
30
- this.overlayLayerView.addOverlay(g);
31
- this.overlays.push(g);
22
+ _drawRotateOverlay(itemRect, oldRotateIcon) {
23
+ let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, 10, this.designerCanvas);
24
+ let rotateIconPosition = transformedCornerPoints[0];
25
+ if (!oldRotateIcon) {
26
+ const g = document.createElementNS("http://www.w3.org/2000/svg", "g");
27
+ const line = document.createElementNS("http://www.w3.org/2000/svg", "circle");
28
+ line.setAttribute('r', (7.5));
29
+ line.setAttribute('class', 'svg-primary-rotate');
30
+ line.setAttribute('style', 'cursor: grabbing');
31
+ g.appendChild(line);
32
+ const g2 = document.createElementNS("http://www.w3.org/2000/svg", "g");
33
+ g2.setAttribute('transform', 'translate(-8,0) scale(0.0015,-0.0015)');
34
+ const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
35
+ path.setAttribute('style', 'fill: white');
36
+ path.setAttribute('d', 'M5260,4367.9c-1803.6-157-3329.6-1457-3771.9-3212.8c-34.5-135.9-72.7-331.2-86.2-430.8c-11.5-99.6-24.9-201-30.6-224l-7.7-44H731.8c-528.4,0-631.8-3.8-631.8-26.8c0-42.1,2029.5-2042.9,2104.2-2073.6c36.4-15.3,86.2-21.1,118.7-15.3c40.2,9.6,346.6,300.6,1089.4,1037.7C3981-58.8,4446.3,414.2,4446.3,429.5c0,23-103.4,26.8-620.3,26.8c-342.7,0-626.1,5.7-629.9,15.3c-13.4,21.1,38.3,245.1,93.8,415.5c114.9,348.5,319.7,681.6,582.1,947.8c478.7,484.4,1062.6,731.4,1742.3,735.2c317.8,0,482.5-23,765.9-114.9c402.1-128.3,725.7-331.2,1022.4-641.4c455.7-474.8,687.4-1047.3,687.4-1702.1c-1.9-693.1-254.6-1284.7-754.4-1771c-396.3-384.9-882.7-614.6-1430.3-679.7c-141.7-17.2-195.3-32.6-227.9-63.2l-44-38.3v-811.8v-811.8l49.8-49.8c49.8-47.9,53.6-49.8,243.2-36.4c1606.4,105.3,3048.1,1146.9,3658.9,2646c453.8,1112.4,415.5,2379.9-105.3,3463.6c-360,752.5-953.5,1397.7-1677.3,1828.5c-515,308.3-1139.2,513.1-1746.2,574.4C5872.7,4379.4,5438.1,4383.3,5260,4367.9z');
37
+ g2.appendChild(path);
38
+ g.appendChild(g2);
39
+ g.addEventListener(EventNames.PointerDown, event => this._pointerActionTypeRotate(event));
40
+ g.addEventListener(EventNames.PointerMove, event => this._pointerActionTypeRotate(event));
41
+ g.addEventListener(EventNames.PointerUp, event => this._pointerActionTypeRotate(event));
42
+ g.setAttribute('class', 'svg-primary-rotate');
43
+ g.setAttribute('transform', 'translate(' + rotateIconPosition.x + ',' + rotateIconPosition.y + ')');
44
+ this.overlayLayerView.addOverlay(g);
45
+ this.overlays.push(g);
46
+ return g;
47
+ }
48
+ else {
49
+ oldRotateIcon.setAttribute('transform', 'translate(' + rotateIconPosition.x + ',' + rotateIconPosition.y + ')');
50
+ return oldRotateIcon;
51
+ }
32
52
  }
33
53
  _pointerActionTypeRotate(event) {
34
54
  event.stopPropagation();
55
+ const currentPoint = this.designerCanvas.getNormalizedEventCoordinates(event);
35
56
  switch (event.type) {
36
57
  case EventNames.PointerDown:
37
- //his._actionModeStarted = actionMode;
58
+ const el = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
59
+ let transformOriginInPx = {
60
+ x: el.x + parseInt(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[0].replace('px', '')),
61
+ y: el.y + parseInt(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[1].replace('px', ''))
62
+ };
63
+ this._initialPoint = currentPoint;
64
+ this._initialElementAngle = getRotationAngleFromMatrix(cssMatrixToMatrixArray(getComputedStyle(this.extendedItem.element).transform), null);
65
+ this._initialOverlayAngle = Math.atan2(currentPoint.y - transformOriginInPx.y, currentPoint.x - transformOriginInPx.x) * (180 / Math.PI);
66
+ event.target.setPointerCapture(event.pointerId);
38
67
  break;
39
68
  case EventNames.PointerMove:
40
- //let trackX = currentPoint.x - this._initialPoint.x;
41
- //let trackY = currentPoint.y - this._initialPoint.y;
42
- //let i = 0;
43
- /*
44
- var center_x = (offset.left) + (img.width() / 2);
45
- var center_y = (offset.top) + (img.height() / 2);
46
- var mouse_x = evt.pageX;
47
- var mouse_y = evt.pageY;
48
- var radians = Math.atan2(mouse_x - center_x, mouse_y - center_y);
49
- var degree = (radians * (180 / Math.PI) * -1) + 90;
50
- img.css('-moz-transform', 'rotate(' + degree + 'deg)');*/
69
+ if (this._initialPoint) {
70
+ const el = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
71
+ let transformOriginInPx = {
72
+ x: el.x + parseInt(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[0].replace('px', '')),
73
+ y: el.y + parseInt(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[1].replace('px', ''))
74
+ };
75
+ let angle = Math.atan2(currentPoint.y - transformOriginInPx.y, currentPoint.x - transformOriginInPx.x) * (180 / Math.PI);
76
+ angle = angle - this._initialOverlayAngle + this._initialElementAngle;
77
+ angle *= -1;
78
+ const rotationMatrix3d = getRotationMatrix3d('z', angle);
79
+ rotateElementByMatrix3d(this.extendedItem.element, rotationMatrix3d);
80
+ let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, 30, this.designerCanvas);
81
+ let angleTextPosition = transformedCornerPoints[0];
82
+ this._textAngle = this._drawTextWithBackground(this._actualRotationAngle + '°', angleTextPosition.x, angleTextPosition.y, 'white', 'svg-rotate-text', this._textAngle);
83
+ this._textAngle[2].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
84
+ this._textAngle[3].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
85
+ }
51
86
  this.extensionManager.refreshExtensions(this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
52
87
  break;
53
88
  case EventNames.PointerUp:
54
89
  let cg = this.extendedItem.openGroup("Rotate Elements");
55
- /*for (const designItem of this.instanceServiceContainer.selectionService.selectedElements) {
56
- designItem.setStyle('width', (<HTMLElement>designItem.element).style.width);
57
- designItem.setStyle('height', (<HTMLElement>designItem.element).style.height);
58
- }*/
90
+ event.target.releasePointerCapture(event.pointerId);
91
+ this.extendedItem.element.style.transform = 'rotate(' + extractRotationAngleFromDOMMatrix(new DOMMatrix(this.extendedItem.element.style.transform)) + 'deg)';
92
+ this.extendedItem.setStyle('transform', this.extendedItem.element.style.transform);
59
93
  cg.commit();
60
- //this._initialSizes = null;
94
+ this._textAngle.forEach(x => {
95
+ this.designerCanvas.overlayLayer.removeOverlay(x);
96
+ });
97
+ this._textAngle = null;
98
+ this._initialPoint = null;
61
99
  break;
62
100
  }
63
101
  }
64
- refresh() {
65
- this._removeAllOverlays();
66
- this.extend();
67
- }
68
102
  dispose() {
69
103
  this._removeAllOverlays();
70
104
  }
@@ -9,5 +9,6 @@ export class RotateExtensionProvider {
9
9
  }
10
10
  style = css `
11
11
  .svg-primary-rotate { stroke: #3899ec; fill: #3899ec; pointer-events: all }
12
+ .svg-rotate-text { text-anchor: middle; alignment-baseline: central; }
12
13
  `;
13
14
  }
@@ -3,7 +3,10 @@ import { IDesignerCanvas } from "../IDesignerCanvas";
3
3
  import { AbstractExtension } from './AbstractExtension';
4
4
  import { IExtensionManager } from "./IExtensionManger";
5
5
  export declare class SelectionDefaultExtension extends AbstractExtension {
6
- private _rect;
6
+ private _line1;
7
+ private _line2;
8
+ private _line3;
9
+ private _line4;
7
10
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
8
11
  extend(): void;
9
12
  refresh(): void;
@@ -1,6 +1,10 @@
1
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from "../../../helper/TransformHelper";
1
2
  import { AbstractExtension } from './AbstractExtension';
2
3
  export class SelectionDefaultExtension extends AbstractExtension {
3
- _rect;
4
+ _line1;
5
+ _line2;
6
+ _line3;
7
+ _line4;
4
8
  constructor(extensionManager, designerView, extendedItem) {
5
9
  super(extensionManager, designerView, extendedItem);
6
10
  }
@@ -8,14 +12,15 @@ export class SelectionDefaultExtension extends AbstractExtension {
8
12
  this.refresh();
9
13
  }
10
14
  refresh() {
11
- const itemRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
12
- const computedStyle = getComputedStyle(this.extendedItem.element);
13
- const left = Number.parseFloat(computedStyle.marginLeft.replace('px', ''));
14
- const top = Number.parseFloat(computedStyle.marginTop.replace('px', ''));
15
- const right = Number.parseFloat(computedStyle.marginRight.replace('px', ''));
16
- const bottom = Number.parseFloat(computedStyle.marginBottom.replace('px', ''));
17
- this._rect = this._drawRect(itemRect.x - left, itemRect.y - top, left + itemRect.width + right, top + itemRect.height + bottom, 'svg-selection', this._rect);
18
- this._rect.style.strokeWidth = (2 / this.designerCanvas.zoomFactor).toString();
15
+ let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, 0, this.designerCanvas);
16
+ this._line1 = this._drawLine(transformedCornerPoints[0].x, transformedCornerPoints[0].y, transformedCornerPoints[1].x, transformedCornerPoints[1].y, 'svg-selection', this._line1);
17
+ this._line2 = this._drawLine(transformedCornerPoints[0].x, transformedCornerPoints[0].y, transformedCornerPoints[2].x, transformedCornerPoints[2].y, 'svg-selection', this._line2);
18
+ this._line3 = this._drawLine(transformedCornerPoints[1].x, transformedCornerPoints[1].y, transformedCornerPoints[3].x, transformedCornerPoints[3].y, 'svg-selection', this._line3);
19
+ this._line4 = this._drawLine(transformedCornerPoints[2].x, transformedCornerPoints[2].y, transformedCornerPoints[3].x, transformedCornerPoints[3].y, 'svg-selection', this._line4);
20
+ this._line1.style.strokeWidth = (2 / this.designerCanvas.zoomFactor).toString();
21
+ this._line2.style.strokeWidth = (2 / this.designerCanvas.zoomFactor).toString();
22
+ this._line3.style.strokeWidth = (2 / this.designerCanvas.zoomFactor).toString();
23
+ this._line4.style.strokeWidth = (2 / this.designerCanvas.zoomFactor).toString();
19
24
  }
20
25
  dispose() {
21
26
  this._removeAllOverlays();