@node-projects/web-component-designer 0.0.80 → 0.0.84

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 (78) hide show
  1. package/dist/elements/helper/PathDataPolyfill.d.ts +11 -10
  2. package/dist/elements/helper/PathDataPolyfill.js +35 -0
  3. package/dist/elements/services/DefaultServiceBootstrap.js +12 -5
  4. package/dist/elements/services/htmlWriterService/AbstractHtmlWriterService.d.ts +10 -0
  5. package/dist/elements/services/htmlWriterService/AbstractHtmlWriterService.js +62 -0
  6. package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService.d.ts +5 -5
  7. package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService.js +4 -4
  8. package/dist/elements/services/htmlWriterService/HtmlWriterService copy.d.ts +12 -0
  9. package/dist/elements/services/htmlWriterService/HtmlWriterService copy.js +118 -0
  10. package/dist/elements/services/htmlWriterService/HtmlWriterService.d.ts +6 -6
  11. package/dist/elements/services/htmlWriterService/HtmlWriterService.js +6 -33
  12. package/dist/elements/services/htmlWriterService/IHtmlWriterOptions.d.ts +2 -0
  13. package/dist/elements/services/htmlWriterService/IHtmlWriterOptions.js +5 -3
  14. package/dist/elements/services/manifestParsers/WebcomponentManifestParserService.js +3 -1
  15. package/dist/elements/widgets/codeView/code-view-code-mirror.js +1 -1
  16. package/dist/elements/widgets/designerView/DomConverter.d.ts +3 -3
  17. package/dist/elements/widgets/designerView/DomConverter.js +7 -4
  18. package/dist/elements/widgets/designerView/designerCanvas.d.ts +2 -0
  19. package/dist/elements/widgets/designerView/designerCanvas.js +20 -8
  20. package/dist/elements/widgets/designerView/designerView.js +25 -7
  21. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.d.ts +14 -0
  22. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.js +38 -0
  23. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtensionProvider.d.ts +10 -0
  24. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtensionProvider.js +13 -0
  25. package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +5 -4
  26. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +41 -15
  27. package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +2 -2
  28. package/dist/elements/widgets/designerView/extensions/IframeExtension.d.ts +11 -0
  29. package/dist/elements/widgets/designerView/extensions/IframeExtension.js +46 -0
  30. package/dist/elements/widgets/designerView/extensions/IframeExtensionProvider.d.ts +9 -0
  31. package/dist/elements/widgets/designerView/extensions/IframeExtensionProvider.js +9 -0
  32. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.d.ts +1 -1
  33. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.js +2 -2
  34. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.d.ts +2 -2
  35. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.js +3 -3
  36. package/dist/elements/widgets/designerView/extensions/PathExtension.d.ts +1 -2
  37. package/dist/elements/widgets/designerView/extensions/PathExtension.js +117 -44
  38. package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtension copy.d.ts +13 -0
  39. package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtension copy.js +21 -0
  40. package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtensionProvider copy.d.ts +10 -0
  41. package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtensionProvider copy.js +13 -0
  42. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +11 -3
  43. package/dist/elements/widgets/designerView/extensions/ResizeExtensionProvider.js +2 -1
  44. package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +13 -12
  45. package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js +0 -1
  46. package/dist/elements/widgets/designerView/extensions/contextMenu/PathContextMenu.d.ts +8 -0
  47. package/dist/elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js +31 -0
  48. package/dist/elements/widgets/designerView/extensions/contextMenu/RectContextMenu.d.ts +8 -0
  49. package/dist/elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js +34 -0
  50. package/dist/elements/widgets/designerView/tools/DrawElementTool.d.ts +1 -0
  51. package/dist/elements/widgets/designerView/tools/DrawElementTool.js +1 -0
  52. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.d.ts +1 -0
  53. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +1 -0
  54. package/dist/elements/widgets/designerView/tools/DrawLineTool.d.ts +1 -0
  55. package/dist/elements/widgets/designerView/tools/DrawLineTool.js +1 -0
  56. package/dist/elements/widgets/designerView/tools/DrawPathTool.d.ts +1 -0
  57. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +6 -1
  58. package/dist/elements/widgets/designerView/tools/DrawRectTool.d.ts +1 -0
  59. package/dist/elements/widgets/designerView/tools/DrawRectTool.js +1 -0
  60. package/dist/elements/widgets/designerView/tools/ITool.d.ts +1 -0
  61. package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.d.ts +1 -0
  62. package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +1 -0
  63. package/dist/elements/widgets/designerView/tools/PanTool.d.ts +1 -0
  64. package/dist/elements/widgets/designerView/tools/PanTool.js +1 -0
  65. package/dist/elements/widgets/designerView/tools/PickColorTool.d.ts +1 -0
  66. package/dist/elements/widgets/designerView/tools/PickColorTool.js +1 -0
  67. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -0
  68. package/dist/elements/widgets/designerView/tools/PointerTool.js +1 -0
  69. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.d.ts +1 -0
  70. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +1 -0
  71. package/dist/elements/widgets/designerView/tools/TextTool.d.ts +1 -0
  72. package/dist/elements/widgets/designerView/tools/TextTool.js +1 -0
  73. package/dist/elements/widgets/designerView/tools/ZoomTool.d.ts +1 -0
  74. package/dist/elements/widgets/designerView/tools/ZoomTool.js +1 -0
  75. package/dist/elements/widgets/treeView/treeViewExtended.js +1 -0
  76. package/dist/index.d.ts +5 -2
  77. package/dist/index.js +5 -2
  78. package/package.json +9 -9
@@ -1,6 +1,8 @@
1
1
  import { AbstractExtension } from "./AbstractExtension";
2
2
  import "../../../helper/PathDataPolyfill";
3
3
  import { EventNames } from "../../../../enums/EventNames";
4
+ import { createPathD } from "../../../helper/PathDataPolyfill";
5
+ import { ContextMenuHelper } from "../../../helper/contextMenu/ContextMenuHelper";
4
6
  export class PathExtension extends AbstractExtension {
5
7
  //private _itemRect: DOMRect;
6
8
  //private _svgRect: DOMRect;
@@ -17,7 +19,7 @@ export class PathExtension extends AbstractExtension {
17
19
  //this._itemRect = this.extendedItem.element.getBoundingClientRect();
18
20
  //this._svgRect = (<SVGGeometryElement>this.extendedItem.element).ownerSVGElement.getBoundingClientRect();
19
21
  this._parentRect = this.extendedItem.element.parentElement.getBoundingClientRect();
20
- this._pathdata = this.extendedItem.node.getPathData({ normalize: true });
22
+ this._pathdata = this.extendedItem.node.getPathData({ normalize: false });
21
23
  for (let p of this._pathdata) {
22
24
  switch (p.type) {
23
25
  case 'M':
@@ -26,6 +28,7 @@ export class PathExtension extends AbstractExtension {
26
28
  break;
27
29
  case 'L':
28
30
  this._drawPathCircle(p.values[0], p.values[1], p, 0);
31
+ this._lastPos = { x: p.values[0], y: p.values[1] };
29
32
  break;
30
33
  case 'H':
31
34
  break;
@@ -52,17 +55,23 @@ export class PathExtension extends AbstractExtension {
52
55
  case 'S':
53
56
  this._drawPathCircle(p.values[0], p.values[1], p, 0);
54
57
  this._drawPathCircle(p.values[2], p.values[3], p, 2);
58
+ this._lastPos = { x: p.values[2], y: p.values[3] };
55
59
  break;
56
60
  case 'Q':
61
+ this._drawPathLine(this._lastPos.x, this._lastPos.y, p.values[0], p.values[1]);
62
+ this._drawPathLine(p.values[0], p.values[1], p.values[2], p.values[3]);
57
63
  this._drawPathCircle(p.values[0], p.values[1], p, 0);
58
64
  this._drawPathCircle(p.values[2], p.values[3], p, 2);
65
+ this._lastPos = { x: p.values[2], y: p.values[3] };
59
66
  break;
60
67
  case 'T':
61
68
  this._drawPathCircle(p.values[0], p.values[1], p, 0);
69
+ this._lastPos = { x: p.values[0], y: p.values[1] };
62
70
  break;
63
71
  case 'A':
64
72
  this._drawPathCircle(p.values[0], p.values[1], p, 0);
65
73
  this._drawPathCircle(p.values[5], p.values[6], p, 5);
74
+ this._lastPos = { x: p.values[0], y: p.values[1] };
66
75
  break;
67
76
  }
68
77
  }
@@ -103,7 +112,7 @@ export class PathExtension extends AbstractExtension {
103
112
  circle.setAttribute("cx", (this._circlePos.x + dx).toString());
104
113
  circle.setAttribute("cy", (this._circlePos.y + dy).toString());
105
114
  }
106
- this.extendedItem.element.setAttribute("d", this._drawPath(this._pathdata, index));
115
+ this.extendedItem.element.setAttribute("d", createPathD(this._pathdata));
107
116
  }
108
117
  break;
109
118
  case EventNames.PointerUp:
@@ -111,60 +120,124 @@ export class PathExtension extends AbstractExtension {
111
120
  this._startPos = null;
112
121
  this._circlePos = null;
113
122
  this._lastPos = null;
114
- this.extendedItem.setAttribute('d', this._drawPath(this._pathdata, index));
123
+ this.extendedItem.setAttribute('d', createPathD(this._pathdata));
115
124
  break;
116
125
  }
117
126
  }
118
- _drawPath(path, index) {
119
- let pathD = "";
120
- for (let p of path) {
121
- switch (p.type) {
122
- case 'M':
123
- pathD += p.type + p.values[0] + " " + p.values[1];
124
- break;
125
- case 'L':
126
- pathD += p.type + p.values[0] + " " + p.values[1];
127
- break;
128
- case 'H':
129
- break;
130
- case 'V':
131
- break;
132
- case 'Z':
133
- break;
134
- case 'C':
135
- case 'c':
136
- pathD += p.type + p.values[0] + " " + p.values[1] + " " + p.values[2] + " " + p.values[3] + " " + p.values[4] + " " + p.values[5];
137
- break;
138
- case 'S':
139
- break;
140
- case 'Q':
141
- break;
142
- case 'T':
143
- break;
144
- case 'A':
145
- break;
127
+ _drawPathCircle(x, y, p, index) {
128
+ let circle = this._drawCircle(this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y, 5, 'svg-path');
129
+ let circlePos = { x: x, y: y };
130
+ const items = [];
131
+ const pidx = this._pathdata.indexOf(p);
132
+ items.push({
133
+ title: 'delete point', action: () => {
134
+ this._pathdata.splice(pidx, 1);
135
+ if (pidx == 0)
136
+ this._pathdata[0].type = 'M';
137
+ this.extendedItem.setAttribute('d', createPathD(this._pathdata));
138
+ }
139
+ });
140
+ items.push({
141
+ title: 'insert point after', action: () => {
142
+ const l = { type: 'L', values: [p.values[0], p.values[1]] };
143
+ this._pathdata.splice(pidx + 1, 0, l);
144
+ this.extendedItem.setAttribute('d', createPathD(this._pathdata));
146
145
  }
146
+ });
147
+ if (pidx != 0 && this._checkCircleIndex(p, circlePos)) {
148
+ items.push({
149
+ title: 'convert to quadratic bézier', action: () => {
150
+ let p1x = this._pathdata[pidx - 1].values[0];
151
+ let p1y = this._pathdata[pidx - 1].values[1];
152
+ if (this._pathdata[pidx - 1].type === 'C') {
153
+ p1x = this._pathdata[pidx - 1].values[4];
154
+ p1y = this._pathdata[pidx - 1].values[5];
155
+ }
156
+ else if (this._pathdata[pidx - 1].type === 'Q') {
157
+ p1x = this._pathdata[pidx - 1].values[2];
158
+ p1y = this._pathdata[pidx - 1].values[3];
159
+ }
160
+ const p2x = this._pathdata[pidx].values[0];
161
+ const p2y = this._pathdata[pidx].values[1];
162
+ const mpx = (p2x + p1x) * 0.5;
163
+ const mpy = (p2y + p1y) * 0.5;
164
+ const theta = Math.atan2(p2y - p1y, p2x - p1x) - Math.PI / 2;
165
+ const offset = 50;
166
+ const c1x = mpx + offset * Math.cos(theta);
167
+ const c1y = mpy + offset * Math.sin(theta);
168
+ this._pathdata[pidx].type = 'Q';
169
+ this._pathdata[pidx].values[0] = c1x;
170
+ this._pathdata[pidx].values[1] = c1y;
171
+ this._pathdata[pidx].values[2] = p2x;
172
+ this._pathdata[pidx].values[3] = p2y;
173
+ this.extendedItem.setAttribute('d', createPathD(this._pathdata));
174
+ }
175
+ });
176
+ }
177
+ if (pidx != 0 && this._checkCircleIndex(p, circlePos)) {
178
+ items.push({
179
+ title: 'convert to cubic bézier', action: () => {
180
+ let p1x = this._pathdata[pidx - 1].values[0];
181
+ let p1y = this._pathdata[pidx - 1].values[1];
182
+ if (this._pathdata[pidx - 1].type === 'C') {
183
+ p1x = this._pathdata[pidx - 1].values[4];
184
+ p1y = this._pathdata[pidx - 1].values[5];
185
+ }
186
+ else if (this._pathdata[pidx - 1].type === 'Q') {
187
+ p1x = this._pathdata[pidx - 1].values[2];
188
+ p1y = this._pathdata[pidx - 1].values[3];
189
+ }
190
+ const p2x = this._pathdata[pidx].values[0];
191
+ const p2y = this._pathdata[pidx].values[1];
192
+ const mpx = (p2x + p1x) * 0.5;
193
+ const mpy = (p2y + p1y) * 0.5;
194
+ const theta = Math.atan2(p2y - p1y, p2x - p1x) - Math.PI / 2;
195
+ const offset = 50;
196
+ let c1x = mpx + offset * Math.cos(theta);
197
+ let c1y = mpy + offset * Math.sin(theta);
198
+ c1x = p.values[0] + 2 * (p1x - p.values[0]) / 3;
199
+ c1y = p.values[1] + 2 * (p1y - p.values[1]) / 3;
200
+ const c2x = x + 2 * (p1x - x) / 3;
201
+ const c2y = y + 2 * (p1y - y) / 3;
202
+ this._pathdata[pidx].type = 'C';
203
+ this._pathdata[pidx].values[0] = c1x;
204
+ this._pathdata[pidx].values[1] = c1y;
205
+ this._pathdata[pidx].values[2] = c2x;
206
+ this._pathdata[pidx].values[3] = c2y;
207
+ this._pathdata[pidx].values[4] = p2x;
208
+ this._pathdata[pidx].values[5] = p2y;
209
+ this.extendedItem.setAttribute('d', createPathD(this._pathdata));
210
+ }
211
+ });
147
212
  }
148
- return pathD;
149
- console.log(pathD);
150
- }
151
- _drawPathCircle(x, y, p, index) {
152
- let circle = this._drawCircle(this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y, 3, 'svg-path');
153
213
  circle.addEventListener(EventNames.PointerDown, event => this.pointerEvent(event, circle, p, index));
154
214
  circle.addEventListener(EventNames.PointerMove, event => this.pointerEvent(event, circle, p, index));
155
215
  circle.addEventListener(EventNames.PointerUp, event => this.pointerEvent(event, circle, p, index));
216
+ circle.addEventListener(EventNames.ContextMenu, event => {
217
+ event.preventDefault();
218
+ ContextMenuHelper.showContextMenu(null, event, null, items);
219
+ });
156
220
  }
157
221
  _drawPathLine(x1, y1, x2, y2) {
158
222
  this._drawLine(this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x1, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y1, this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x2, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y2, 'svg-path-line');
159
223
  }
160
- _drawHelpLine(pStart, pEnd) {
161
- let line;
162
- line.setAttribute("stroke", "yellow");
163
- line.setAttribute("stroke-width", "2");
164
- line.setAttribute("x1", pStart.x.toString());
165
- line.setAttribute("y1", pStart.y.toString());
166
- line.setAttribute("x2", pEnd.x.toString());
167
- line.setAttribute("y2", pEnd.y.toString());
224
+ _checkCircleIndex(p, circlePos) {
225
+ switch (p.type) {
226
+ case 'M':
227
+ case 'L':
228
+ if (p.values[0] == circlePos.x && p.values[1] == circlePos.y)
229
+ return true;
230
+ break;
231
+ case 'Q':
232
+ if (p.values[2] == circlePos.x && p.values[3] == circlePos.y)
233
+ return true;
234
+ break;
235
+ case 'C':
236
+ if (p.values[4] == circlePos.x && p.values[5] == circlePos.y)
237
+ return true;
238
+ break;
239
+ }
240
+ return false;
168
241
  }
169
242
  refresh() {
170
243
  this._removeAllOverlays();
@@ -0,0 +1,13 @@
1
+ import { IDesignItem } from "../../../item/IDesignItem";
2
+ import { IDesignerCanvas } from "../IDesignerCanvas";
3
+ import { AbstractExtension } from './AbstractExtension';
4
+ import { IExtensionManager } from "./IExtensionManger";
5
+ export declare class PrimarySelectionDefaultExtension extends AbstractExtension {
6
+ private _rect;
7
+ private _text;
8
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
9
+ extend(): void;
10
+ _drawMoveOverlay(itemRect: DOMRect): void;
11
+ refresh(): void;
12
+ dispose(): void;
13
+ }
@@ -0,0 +1,21 @@
1
+ import { AbstractExtension } from './AbstractExtension';
2
+ export class PrimarySelectionDefaultExtension extends AbstractExtension {
3
+ _rect;
4
+ _text;
5
+ constructor(extensionManager, designerView, extendedItem) {
6
+ super(extensionManager, designerView, extendedItem);
7
+ }
8
+ extend() {
9
+ this.refresh();
10
+ }
11
+ _drawMoveOverlay(itemRect) {
12
+ }
13
+ refresh() {
14
+ const boundRect = this.extendedItem.element.getBoundingClientRect();
15
+ this._rect = this._drawRect((boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (boundRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 16, 60, 15, 'svg-primary-selection-move', this._rect);
16
+ this._text = this._drawText(this.extendedItem.name.substring(0, 10) + '…', (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (boundRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 5, 'svg-text-primary', this._text);
17
+ }
18
+ dispose() {
19
+ this._removeAllOverlays();
20
+ }
21
+ }
@@ -0,0 +1,10 @@
1
+ import { IDesignerExtensionProvider } from "./IDesignerExtensionProvider";
2
+ import { IDesignItem } from "../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../IDesignerCanvas";
4
+ import { IDesignerExtension } from "./IDesignerExtension";
5
+ import { IExtensionManager } from "./IExtensionManger";
6
+ export declare class PrimarySelectionDefaultExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ readonly style: CSSStyleSheet;
10
+ }
@@ -0,0 +1,13 @@
1
+ import { PrimarySelectionDefaultExtension } from "./PrimarySelectionDefaultExtension";
2
+ import { css } from "@node-projects/base-custom-webcomponent";
3
+ export class PrimarySelectionDefaultExtensionProvider {
4
+ shouldExtend(extensionManager, designerView, designItem) {
5
+ return true;
6
+ }
7
+ getExtension(extensionManager, designerView, designItem) {
8
+ return new PrimarySelectionDefaultExtension(extensionManager, designerView, designItem);
9
+ }
10
+ style = css `
11
+ .svg-text-primary { stroke: none; fill: white; stroke-width: 1; font-size: 10px; font-family: monospace; }
12
+ `;
13
+ }
@@ -19,6 +19,7 @@ export class ResizeExtension extends AbstractExtension {
19
19
  this.resizeAllSelected = resizeAllSelected;
20
20
  }
21
21
  extend() {
22
+ this.refresh();
22
23
  }
23
24
  refresh() {
24
25
  const rect = this.extendedItem.element.getBoundingClientRect();
@@ -69,9 +70,13 @@ export class ResizeExtension extends AbstractExtension {
69
70
  this._initialPoint = currentPoint;
70
71
  this._initialSizes = [];
71
72
  this._actionModeStarted = actionMode;
72
- for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
73
- let rect = designItem.element.getBoundingClientRect();
74
- this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
73
+ let rect = this.extendedItem.element.getBoundingClientRect();
74
+ this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
75
+ if (this.resizeAllSelected) {
76
+ for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
77
+ rect = designItem.element.getBoundingClientRect();
78
+ this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
79
+ }
75
80
  }
76
81
  if (this.designerCanvas.alignOnSnap)
77
82
  this.designerCanvas.snapLines.calculateSnaplines(this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
@@ -90,6 +95,7 @@ export class ResizeExtension extends AbstractExtension {
90
95
  this.extendedItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
91
96
  if (this.resizeAllSelected) {
92
97
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
98
+ i++;
93
99
  if (designItem !== this.extendedItem) {
94
100
  designItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
95
101
  designItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
@@ -100,6 +106,7 @@ export class ResizeExtension extends AbstractExtension {
100
106
  case 's-resize':
101
107
  this.extendedItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
102
108
  if (this.resizeAllSelected) {
109
+ i++;
103
110
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
104
111
  if (designItem !== this.extendedItem) {
105
112
  designItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
@@ -110,6 +117,7 @@ export class ResizeExtension extends AbstractExtension {
110
117
  case 'e-resize':
111
118
  this.extendedItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
112
119
  if (this.resizeAllSelected) {
120
+ i++;
113
121
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
114
122
  if (designItem !== this.extendedItem) {
115
123
  designItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
@@ -1,12 +1,13 @@
1
1
  import { ResizeExtension } from "./ResizeExtension";
2
2
  import { css } from "@node-projects/base-custom-webcomponent";
3
+ import { NodeType } from "../../../item/NodeType.js";
3
4
  export class ResizeExtensionProvider {
4
5
  resizeAllSelected;
5
6
  constructor(resizeAllSelected = false) {
6
7
  this.resizeAllSelected = resizeAllSelected;
7
8
  }
8
9
  shouldExtend(extensionManager, designerView, designItem) {
9
- return true;
10
+ return designItem.nodeType == NodeType.Element;
10
11
  }
11
12
  getExtension(extensionManager, designerView, designItem) {
12
13
  return new ResizeExtension(extensionManager, designerView, designItem, this.resizeAllSelected);
@@ -22,35 +22,36 @@ export class TransformOriginExtension extends AbstractExtension {
22
22
  pointerEvent(event) {
23
23
  event.stopPropagation();
24
24
  const rect = this.extendedItem.element.getBoundingClientRect();
25
+ const rectNr = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element); //.getBoundingClientRect();
25
26
  const computed = getComputedStyle(this.extendedItem.element);
26
27
  const to = computed.transformOrigin.split(' ');
28
+ const normalized = this.designerCanvas.getNormalizedEventCoordinates(event);
27
29
  switch (event.type) {
28
30
  case EventNames.PointerDown:
29
31
  event.target.setPointerCapture(event.pointerId);
30
- this._startPos = { x: event.x, y: event.y };
32
+ this._startPos = { x: normalized.x, y: normalized.y };
31
33
  break;
32
34
  case EventNames.PointerMove:
33
35
  if (this._startPos && event.buttons > 0) {
34
- const dx = event.x - this._startPos.x;
35
- const dy = event.y - this._startPos.y;
36
- this._circle.setAttribute('cx', (rect.x - this.designerCanvas.containerBoundingRect.x + Number.parseFloat(to[0].replace('px', '')) + dx));
37
- this._circle.setAttribute('cy', (rect.y - this.designerCanvas.containerBoundingRect.y + Number.parseFloat(to[1].replace('px', '')) + dy));
38
- this._circle2.setAttribute('cx', (rect.x - this.designerCanvas.containerBoundingRect.x + Number.parseFloat(to[0].replace('px', '')) + dx));
39
- this._circle2.setAttribute('cy', (rect.y - this.designerCanvas.containerBoundingRect.y + Number.parseFloat(to[1].replace('px', '')) + dy));
36
+ const dx = normalized.x - this._startPos.x;
37
+ const dy = normalized.y - this._startPos.y;
38
+ this._circle.setAttribute('cx', ((rect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor + Number.parseFloat(to[0].replace('px', '')) + dx));
39
+ this._circle.setAttribute('cy', ((rect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor + Number.parseFloat(to[1].replace('px', '')) + dy));
40
+ this._circle2.setAttribute('cx', ((rect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor + Number.parseFloat(to[0].replace('px', '')) + dx));
41
+ this._circle2.setAttribute('cy', ((rect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor + Number.parseFloat(to[1].replace('px', '')) + dy));
40
42
  }
41
43
  break;
42
44
  case EventNames.PointerUp:
43
45
  event.target.releasePointerCapture(event.pointerId);
44
46
  if (this._startPos) {
45
- const dx = event.x - this._startPos.x;
46
- const dy = event.y - this._startPos.y;
47
+ const dx = normalized.x - this._startPos.x;
48
+ const dy = normalized.y - this._startPos.y;
47
49
  const x = Number.parseFloat(to[0].replace('px', ''));
48
50
  const y = Number.parseFloat(to[1].replace('px', ''));
49
51
  const newX = (dx + x);
50
52
  const newY = (dy + y);
51
- const przX = Math.round(newX / rect.width * 10000) / 100; //round to 2 decimal places
52
- const przY = Math.round(newY / rect.height * 10000) / 100;
53
- //this.extendedItem.setStyle('transform-origin',newX + 'px ' + newY + 'px');
53
+ const przX = Math.round(newX / rectNr.width * 10000) / 100;
54
+ const przY = Math.round(newY / rectNr.height * 10000) / 100;
54
55
  this.extendedItem.setStyle('transform-origin', przX + '% ' + przY + '%');
55
56
  this.refresh();
56
57
  this._startPos = null;
@@ -8,7 +8,6 @@ export class CopyPasteContextMenu {
8
8
  { title: 'copy', action: () => { designerView.executeCommand({ type: CommandType.copy }); } },
9
9
  { title: 'cut', action: () => { designerView.executeCommand({ type: CommandType.cut }); } },
10
10
  { title: 'paste', action: () => { designerView.executeCommand({ type: CommandType.paste }); } },
11
- { title: '-' },
12
11
  { title: 'delete', action: () => { designerView.executeCommand({ type: CommandType.delete }); } },
13
12
  { title: '-' }
14
13
  ];
@@ -0,0 +1,8 @@
1
+ import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../../IDesignerCanvas";
4
+ import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
5
+ export declare class PathContextMenu implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ }
@@ -0,0 +1,31 @@
1
+ import { createPathD } from "../../../../helper/PathDataPolyfill";
2
+ export class PathContextMenu {
3
+ shouldProvideContextmenu(event, designerView, designItem, initiator) {
4
+ if (designItem.element instanceof SVGPathElement)
5
+ return true;
6
+ return false;
7
+ }
8
+ provideContextMenuItems(event, designerCanvas, designItem) {
9
+ const pathdata = designItem.node.getPathData({ normalize: true });
10
+ const items = [];
11
+ const lastType = pathdata[pathdata.length - 1].type;
12
+ items.push({ title: '-' });
13
+ if (lastType == 'z' || lastType == 'Z') {
14
+ items.push({
15
+ title: 'open path ', action: () => {
16
+ pathdata.splice(pathdata.length - 1, 1);
17
+ designItem.setAttribute('d', createPathD(pathdata));
18
+ }
19
+ });
20
+ }
21
+ else {
22
+ items.push({
23
+ title: 'close path ', action: () => {
24
+ pathdata.push({ type: 'Z' });
25
+ designItem.setAttribute('d', createPathD(pathdata));
26
+ }
27
+ });
28
+ }
29
+ return items;
30
+ }
31
+ }
@@ -0,0 +1,8 @@
1
+ import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../../IDesignerCanvas";
4
+ import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
5
+ export declare class RectContextMenu implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ }
@@ -0,0 +1,34 @@
1
+ import { DeleteAction } from "../../../../..";
2
+ import { DesignItem } from "../../../../item/DesignItem";
3
+ import { InsertAction } from "../../../../services/undoService/transactionItems/InsertAction";
4
+ export class RectContextMenu {
5
+ shouldProvideContextmenu(event, designerView, designItem, initiator) {
6
+ if (designItem.element instanceof SVGRectElement)
7
+ return true;
8
+ return false;
9
+ }
10
+ provideContextMenuItems(event, designerCanvas, designItem) {
11
+ return [
12
+ { title: '-' },
13
+ {
14
+ title: 'convert to path', action: () => {
15
+ let rect = designItem.element;
16
+ let pathD = "";
17
+ pathD += "M" + rect.x.baseVal.value + " " + rect.y.baseVal.value +
18
+ "L" + (rect.x.baseVal.value + rect.width.baseVal.value) + " " + rect.y.baseVal.value +
19
+ "L" + (rect.x.baseVal.value + rect.width.baseVal.value) + " " + (rect.y.baseVal.value + rect.height.baseVal.value) +
20
+ "L" + rect.x.baseVal.value + " " + (rect.y.baseVal.value + rect.height.baseVal.value) +
21
+ "Z";
22
+ const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
23
+ path.setAttribute("d", pathD);
24
+ path.setAttribute("stroke", rect.getAttribute("stroke"));
25
+ path.setAttribute("fill", rect.getAttribute("fill"));
26
+ path.setAttribute("stroke-width", rect.getAttribute("stroke-width"));
27
+ const di = DesignItem.createDesignItemFromInstance(path, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
28
+ designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designItem.parent, designItem.childCount, di));
29
+ designerCanvas.instanceServiceContainer.undoService.execute(new DeleteAction([designItem]));
30
+ }
31
+ }
32
+ ];
33
+ }
34
+ }
@@ -12,6 +12,7 @@ export declare class DrawElementTool implements ITool {
12
12
  activated(serviceContainer: ServiceContainer): void;
13
13
  dispose(): void;
14
14
  pointerEventHandler(designerView: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
15
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
15
16
  private _onPointerDown;
16
17
  private _onPointerMove;
17
18
  private _onPointerUp;
@@ -29,6 +29,7 @@ export class DrawElementTool {
29
29
  break;
30
30
  }
31
31
  }
32
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
32
33
  async _onPointerDown(designerView, event) {
33
34
  event.preventDefault();
34
35
  this._startPosition = { x: event.x, y: event.y };
@@ -12,4 +12,5 @@ export declare class DrawEllipsisTool implements ITool {
12
12
  activated(serviceContainer: ServiceContainer): void;
13
13
  dispose(): void;
14
14
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
15
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
15
16
  }
@@ -88,4 +88,5 @@ export class DrawEllipsisTool {
88
88
  break;
89
89
  }
90
90
  }
91
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
91
92
  }
@@ -10,4 +10,5 @@ export declare class DrawLineTool implements ITool {
10
10
  activated(serviceContainer: ServiceContainer): void;
11
11
  dispose(): void;
12
12
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
13
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
13
14
  }
@@ -73,4 +73,5 @@ export class DrawLineTool {
73
73
  break;
74
74
  }
75
75
  }
76
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
76
77
  }
@@ -16,4 +16,5 @@ export declare class DrawPathTool implements ITool {
16
16
  activated(serviceContainer: ServiceContainer): void;
17
17
  dispose(): void;
18
18
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
19
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
19
20
  }
@@ -13,7 +13,7 @@ export class DrawPathTool {
13
13
  _pointerMoved = false;
14
14
  _eventStarted = false;
15
15
  _lastPoint;
16
- _startPoint = { x: 0, y: 0 };
16
+ _startPoint;
17
17
  constructor() {
18
18
  }
19
19
  activated(serviceContainer) {
@@ -43,6 +43,9 @@ export class DrawPathTool {
43
43
  if (this._lastPoint == null) {
44
44
  this._lastPoint = currentPoint;
45
45
  }
46
+ if (this._startPoint == null) {
47
+ this._startPoint = currentPoint;
48
+ }
46
49
  break;
47
50
  case EventNames.PointerMove:
48
51
  if (this._eventStarted) {
@@ -108,6 +111,7 @@ export class DrawPathTool {
108
111
  //designerView.rootDesignItem.element.appendChild(svg);
109
112
  this._path = null;
110
113
  this._pathD = null;
114
+ this._lastPoint = null;
111
115
  const di = DesignItem.createDesignItemFromInstance(svg, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
112
116
  designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
113
117
  designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
@@ -116,4 +120,5 @@ export class DrawPathTool {
116
120
  break;
117
121
  }
118
122
  }
123
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
119
124
  }
@@ -15,4 +15,5 @@ export declare class DrawRectTool implements ITool {
15
15
  activated(serviceContainer: ServiceContainer): void;
16
16
  dispose(): void;
17
17
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
18
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
18
19
  }
@@ -103,4 +103,5 @@ export class DrawRectTool {
103
103
  break;
104
104
  }
105
105
  }
106
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
106
107
  }
@@ -5,4 +5,5 @@ export interface ITool extends IDisposable {
5
5
  readonly cursor: string;
6
6
  activated(serviceContainer: ServiceContainer): any;
7
7
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): any;
8
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): any;
8
9
  }
@@ -6,6 +6,7 @@ export declare class MagicWandSelectorTool implements ITool {
6
6
  private _pathD;
7
7
  private _path;
8
8
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
9
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
9
10
  activated(serviceContainer: ServiceContainer): void;
10
11
  dispose(): void;
11
12
  }
@@ -54,6 +54,7 @@ export class MagicWandSelectorTool {
54
54
  break;
55
55
  }
56
56
  }
57
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
57
58
  activated(serviceContainer) {
58
59
  }
59
60
  dispose() {