@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.
- package/dist/elements/helper/PathDataPolyfill.d.ts +11 -10
- package/dist/elements/helper/PathDataPolyfill.js +35 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +12 -5
- package/dist/elements/services/htmlWriterService/AbstractHtmlWriterService.d.ts +10 -0
- package/dist/elements/services/htmlWriterService/AbstractHtmlWriterService.js +62 -0
- package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService.d.ts +5 -5
- package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService.js +4 -4
- package/dist/elements/services/htmlWriterService/HtmlWriterService copy.d.ts +12 -0
- package/dist/elements/services/htmlWriterService/HtmlWriterService copy.js +118 -0
- package/dist/elements/services/htmlWriterService/HtmlWriterService.d.ts +6 -6
- package/dist/elements/services/htmlWriterService/HtmlWriterService.js +6 -33
- package/dist/elements/services/htmlWriterService/IHtmlWriterOptions.d.ts +2 -0
- package/dist/elements/services/htmlWriterService/IHtmlWriterOptions.js +5 -3
- package/dist/elements/services/manifestParsers/WebcomponentManifestParserService.js +3 -1
- package/dist/elements/widgets/codeView/code-view-code-mirror.js +1 -1
- package/dist/elements/widgets/designerView/DomConverter.d.ts +3 -3
- package/dist/elements/widgets/designerView/DomConverter.js +7 -4
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +2 -0
- package/dist/elements/widgets/designerView/designerCanvas.js +20 -8
- package/dist/elements/widgets/designerView/designerView.js +25 -7
- package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.d.ts +14 -0
- package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.js +38 -0
- package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtensionProvider.js +13 -0
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +5 -4
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +41 -15
- package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +2 -2
- package/dist/elements/widgets/designerView/extensions/IframeExtension.d.ts +11 -0
- package/dist/elements/widgets/designerView/extensions/IframeExtension.js +46 -0
- package/dist/elements/widgets/designerView/extensions/IframeExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/IframeExtensionProvider.js +9 -0
- package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.d.ts +1 -1
- package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.js +2 -2
- package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.d.ts +2 -2
- package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.js +3 -3
- package/dist/elements/widgets/designerView/extensions/PathExtension.d.ts +1 -2
- package/dist/elements/widgets/designerView/extensions/PathExtension.js +117 -44
- package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtension copy.d.ts +13 -0
- package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtension copy.js +21 -0
- package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtensionProvider copy.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtensionProvider copy.js +13 -0
- package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +11 -3
- package/dist/elements/widgets/designerView/extensions/ResizeExtensionProvider.js +2 -1
- package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +13 -12
- package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js +0 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/PathContextMenu.d.ts +8 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js +31 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/RectContextMenu.d.ts +8 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js +34 -0
- package/dist/elements/widgets/designerView/tools/DrawElementTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/DrawElementTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/DrawLineTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/DrawLineTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/DrawPathTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js +6 -1
- package/dist/elements/widgets/designerView/tools/DrawRectTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/DrawRectTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/ITool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/PanTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/PanTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/PickColorTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/PickColorTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/PointerTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/TextTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/TextTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/ZoomTool.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/ZoomTool.js +1 -0
- package/dist/elements/widgets/treeView/treeViewExtended.js +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +5 -2
- 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:
|
|
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",
|
|
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',
|
|
123
|
+
this.extendedItem.setAttribute('d', createPathD(this._pathdata));
|
|
115
124
|
break;
|
|
116
125
|
}
|
|
117
126
|
}
|
|
118
|
-
|
|
119
|
-
let
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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();
|
package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtension copy.d.ts
ADDED
|
@@ -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
|
+
}
|
package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtension copy.js
ADDED
|
@@ -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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
|
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:
|
|
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 =
|
|
35
|
-
const dy =
|
|
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 =
|
|
46
|
-
const dy =
|
|
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 /
|
|
52
|
-
const przY = Math.round(newY /
|
|
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;
|
|
@@ -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
|
}
|
|
@@ -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
|
}
|
|
@@ -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
|
|
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
|
}
|
|
@@ -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
|
}
|