@node-projects/web-component-designer 0.0.62 → 0.0.66
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/.vscode/settings.json +1 -1
- package/ACKNOWLEDGMENTS +7 -0
- package/dist/elements/controls/DesignerTabControl.js +4 -2
- package/dist/elements/controls/PlainScrollbar.d.ts +15 -0
- package/dist/elements/controls/PlainScrollbar.js +482 -0
- package/dist/elements/controls/SimpleSplitView.d.ts +11 -0
- package/dist/elements/controls/SimpleSplitView.js +67 -0
- package/dist/elements/documentContainer.d.ts +4 -1
- package/dist/elements/documentContainer.js +45 -19
- package/dist/elements/helper/PathDataPolyfill.d.ts +5 -1
- package/dist/elements/helper/PathDataPolyfill.js +49 -1
- package/dist/elements/helper/contextMenu/ContextMenuHelper.js +1 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +10 -0
- package/dist/elements/services/htmlParserService/NodeHtmlParserService.js +2 -0
- package/dist/elements/services/placementService/DefaultPlacementService.js +1 -1
- package/dist/elements/services/placementService/ISnaplinesProviderService.d.ts +5 -4
- package/dist/elements/services/placementService/SnaplinesProviderService.d.ts +5 -4
- package/dist/elements/services/placementService/SnaplinesProviderService.js +15 -13
- package/dist/elements/services/undoService/UndoService.js +3 -0
- package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +4 -0
- package/dist/elements/widgets/designerView/IPlacementView.d.ts +2 -0
- package/dist/elements/widgets/designerView/Snaplines.d.ts +2 -1
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +8 -1
- package/dist/elements/widgets/designerView/designerCanvas.js +49 -26
- package/dist/elements/widgets/designerView/designerView.d.ts +5 -1
- package/dist/elements/widgets/designerView/designerView.js +81 -18
- package/dist/elements/widgets/designerView/extensions/AltToEnterContainerExtension.js +3 -3
- package/dist/elements/widgets/designerView/extensions/MouseOverExtension.js +1 -1
- package/dist/elements/widgets/designerView/extensions/PositionExtension.js +4 -4
- package/dist/elements/widgets/designerView/extensions/PrimarySelectionDefaultExtension.js +2 -2
- package/dist/elements/widgets/designerView/extensions/ResizeExtension.d.ts +2 -1
- package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +19 -15
- package/dist/elements/widgets/designerView/extensions/RotateExtension.js +1 -1
- package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.js +2 -2
- package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +2 -2
- package/dist/elements/widgets/designerView/overlayLayerView.d.ts +1 -0
- package/dist/elements/widgets/designerView/overlayLayerView.js +6 -0
- package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.d.ts +15 -0
- package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +90 -0
- package/dist/elements/widgets/designerView/tools/DrawLineTool.d.ts +13 -0
- package/dist/elements/widgets/designerView/tools/DrawLineTool.js +75 -0
- package/dist/elements/widgets/designerView/tools/DrawPathTool.d.ts +0 -2
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js +5 -18
- package/dist/elements/widgets/designerView/tools/DrawRectTool.d.ts +18 -0
- package/dist/elements/widgets/designerView/tools/DrawRectTool.js +105 -0
- package/dist/elements/widgets/designerView/tools/NamedTools.d.ts +3 -0
- package/dist/elements/widgets/designerView/tools/NamedTools.js +3 -0
- package/dist/elements/widgets/designerView/tools/PanTool.js +14 -0
- package/dist/elements/widgets/designerView/tools/PointerTool.js +7 -0
- package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +2 -2
- package/dist/elements/widgets/paletteView/paletteTreeView.js +0 -5
- package/dist/elements/widgets/propertyGrid/PropertyGrid.js +1 -0
- package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +1 -0
- package/dist/elements/widgets/treeView/treeView.js +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/package.json +1 -1
- package/dist/elements/widgets/designerView/ButtonSeperatorProvider copy.d.ts +0 -7
- package/dist/elements/widgets/designerView/ButtonSeperatorProvider copy.js +0 -11
- package/dist/elements/widgets/designerView/extensions/GridExtensionConfigButtons.d.ts +0 -5
- package/dist/elements/widgets/designerView/extensions/GridExtensionConfigButtons.js +0 -12
- package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.d.ts +0 -10
- package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.js +0 -18
- package/dist/elements/widgets/designerView/extensions/GridExtensionProviderConfigButtons.d.ts +0 -5
- package/dist/elements/widgets/designerView/extensions/GridExtensionProviderConfigButtons.js +0 -12
- package/dist/elements/widgets/designerView/extensions/GridExtensionProviderOptions.d.ts +0 -10
- package/dist/elements/widgets/designerView/extensions/GridExtensionProviderOptions.js +0 -18
- package/dist/elements/widgets/designerView/extensions/IDesignViewConfigButtonsProvider.d.ts +0 -0
- package/dist/elements/widgets/designerView/extensions/IDesignViewConfigButtonsProvider.js +0 -1
- package/dist/elements/widgets/designerView/extensions/IExtensionConfiguration.d.ts +0 -3
- package/dist/elements/widgets/designerView/extensions/IExtensionConfiguration.js +0 -1
|
@@ -3,7 +3,10 @@ import { DesignerCanvas } from "./designerCanvas.js";
|
|
|
3
3
|
import { DomConverter } from './DomConverter.js';
|
|
4
4
|
import { DefaultHtmlParserService } from '../../services/htmlParserService/DefaultHtmlParserService.js';
|
|
5
5
|
import { EventNames } from '../../../enums/EventNames.js';
|
|
6
|
+
const autoZomOffset = 10;
|
|
6
7
|
export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
8
|
+
_sVert;
|
|
9
|
+
_sHor;
|
|
7
10
|
get serviceContainer() {
|
|
8
11
|
return this._designerCanvas.serviceContainer;
|
|
9
12
|
}
|
|
@@ -16,6 +19,10 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
16
19
|
set instanceServiceContainer(value) {
|
|
17
20
|
this._designerCanvas.instanceServiceContainer = value;
|
|
18
21
|
}
|
|
22
|
+
_designerCanvas;
|
|
23
|
+
get designerCanvas() {
|
|
24
|
+
return this._designerCanvas;
|
|
25
|
+
}
|
|
19
26
|
_zoomInput;
|
|
20
27
|
_lowertoolbar;
|
|
21
28
|
static style = css `
|
|
@@ -82,24 +89,50 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
82
89
|
}
|
|
83
90
|
.snap-guide {
|
|
84
91
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYVJREFUeNqkU7tKA1EQnbs3CnlVqbQNARMjFilS+AnZQhIbW0ER/AA/wlYbhXR2wUKx0iKNYGMKDViEdEIgieBujGvCPpyz7sK6iWLIwJk798zsuXsfIxzHoXksAqcoij+vMbYq7MoszGxaEB3wtODlH3i5E5uojck210RCgq7SJie4MC0TsdO1cim/lMmkwHdarZWni+t16/1jz/FElJBAGc5imLzyakXNG0IuVo+OnwHE4JCzgisG7BJu/I3CQjyRuq1dvWi6vg8gBofcOHgGAZO+AFv88/VNDofDEcd3IBCD43ycfhEowY28Sazfnzh1cKMggWsUQvi4waiqKuVyud16/d7JZrOHxWJxKudMuQV3C81mk3RdX0wmk9Tr9UxN06jb7dJgMPjBwQRUAu/AtWg0SpZl7TDSUso2/1UVNWHOMIwJARzWBhcQwMXu1oJb9Ufbtsk0zYktPLrvgD8E/mWeYoNxxlj2xoZ3qI2/YrePQs10PksjTRPozCog5m3nLwEGABrLzseuHT6IAAAAAElFTkSuQmCC);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.bottom-scroll {
|
|
95
|
+
width: calc(100% - 16px);
|
|
96
|
+
position: absolute;
|
|
97
|
+
bottom: 16px;
|
|
98
|
+
height: 16px;
|
|
99
|
+
box-sizing: border-box;
|
|
100
|
+
}
|
|
101
|
+
.right-scroll {
|
|
102
|
+
height: calc(100% - 32px);
|
|
103
|
+
position: absolute;
|
|
104
|
+
right: 0;
|
|
105
|
+
top: 0;
|
|
106
|
+
width: 16px;
|
|
107
|
+
box-sizing: border-box;
|
|
108
|
+
}
|
|
109
|
+
.bottom-right {
|
|
110
|
+
width: 16px;
|
|
111
|
+
height: 16px;
|
|
112
|
+
bottom: 16px;
|
|
113
|
+
right: 0;
|
|
114
|
+
position: absolute;
|
|
115
|
+
background: #f0f0f0;
|
|
85
116
|
}`;
|
|
86
117
|
static template = html `
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
118
|
+
<div id="outer">
|
|
119
|
+
<node-projects-plain-scrollbar id="s-hor" value="0.5" class="bottom-scroll"></node-projects-plain-scrollbar>
|
|
120
|
+
<node-projects-plain-scrollbar id="s-vert" value="0.5" orientation="vertical" class="right-scroll"></node-projects-plain-scrollbar>
|
|
121
|
+
<div class="bottom-right"></div>
|
|
122
|
+
<div id="lowertoolbar">
|
|
123
|
+
<input id="zoomInput" type="text" value="100%">
|
|
124
|
+
<div title="decrease zoom" id="zoomIncrease" class="toolbar-control zoom-in"></div>
|
|
125
|
+
<div title="increase zoom" id="zoomDecrease" class="toolbar-control zoom-out"></div>
|
|
126
|
+
<div title="reset zoom" id="zoomReset" class="toolbar-control"
|
|
127
|
+
style="width: 16px; height: 16px; font-size: 14px; display: flex; align-items: center; justify-content: center;">1
|
|
128
|
+
</div>
|
|
129
|
+
<div title="zoom to fit" id="zoomFit" class="toolbar-control"
|
|
130
|
+
style="width: 16px; height: 16px; font-size: 8px; display: flex; align-items: center; justify-content: center;">
|
|
131
|
+
100%</div>
|
|
132
|
+
<div title="snap to grid" id="alignGrid" class="toolbar-control snap-grid"></div>
|
|
133
|
+
<div title="snap to elements" id="alignSnap" class="toolbar-control snap-guide"></div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>`;
|
|
103
136
|
constructor() {
|
|
104
137
|
super();
|
|
105
138
|
const outer = this._getDomElement('outer');
|
|
@@ -130,12 +163,32 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
130
163
|
};
|
|
131
164
|
let zoomReset = this._getDomElement('zoomReset');
|
|
132
165
|
zoomReset.onclick = () => {
|
|
166
|
+
this._designerCanvas.canvasOffset = { x: 0, y: 0 };
|
|
133
167
|
this._designerCanvas.zoomFactor = 1;
|
|
168
|
+
this._sVert.value = 0.5;
|
|
169
|
+
this._sHor.value = 0.5;
|
|
134
170
|
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
135
171
|
};
|
|
136
172
|
let zoomFit = this._getDomElement('zoomFit');
|
|
137
173
|
zoomFit.onclick = () => {
|
|
138
|
-
|
|
174
|
+
let maxX = 0, maxY = 0, minX = 0, minY = 0;
|
|
175
|
+
this._designerCanvas.canvasOffset = { x: 0, y: 0 };
|
|
176
|
+
this._designerCanvas.zoomFactor = 1;
|
|
177
|
+
for (let n of DomHelper.getAllChildNodes(this.designerCanvas.rootDesignItem.element)) {
|
|
178
|
+
if (n instanceof Element) {
|
|
179
|
+
const rect = n.getBoundingClientRect();
|
|
180
|
+
minX = minX < rect.x ? minX : rect.x;
|
|
181
|
+
minY = minY < rect.y ? minY : rect.y;
|
|
182
|
+
maxX = maxX > rect.x + rect.width + autoZomOffset ? maxX : rect.x + rect.width + autoZomOffset;
|
|
183
|
+
maxY = maxY > rect.y + rect.height + autoZomOffset ? maxY : rect.y + rect.height + autoZomOffset;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const cvRect = this.designerCanvas.getBoundingClientRect();
|
|
187
|
+
maxX -= cvRect.x;
|
|
188
|
+
maxY -= cvRect.y;
|
|
189
|
+
let scaleX = cvRect.width / (maxX / this._designerCanvas.zoomFactor);
|
|
190
|
+
let scaleY = cvRect.height / (maxY / this._designerCanvas.zoomFactor);
|
|
191
|
+
this._designerCanvas.zoomFactor = scaleX < scaleY ? scaleX : scaleY;
|
|
139
192
|
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
140
193
|
};
|
|
141
194
|
this.addEventListener(EventNames.Wheel, event => this._onWheel(event));
|
|
@@ -146,6 +199,15 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
146
199
|
alignGrid.onclick = () => { this._designerCanvas.alignOnGrid = !this._designerCanvas.alignOnGrid; alignGrid.style.backgroundColor = this._designerCanvas.alignOnGrid ? 'deepskyblue' : ''; };
|
|
147
200
|
alignGrid.style.backgroundColor = this._designerCanvas.alignOnGrid ? 'deepskyblue' : '';
|
|
148
201
|
this._lowertoolbar = this._getDomElement('lowertoolbar');
|
|
202
|
+
this._sVert = this._getDomElement('s-vert');
|
|
203
|
+
this._sHor = this._getDomElement('s-hor');
|
|
204
|
+
this._sVert.addEventListener('scrollbar-input', () => this._onScrollbar());
|
|
205
|
+
this._sHor.addEventListener('scrollbar-input', () => this._onScrollbar());
|
|
206
|
+
}
|
|
207
|
+
_onScrollbar() {
|
|
208
|
+
const x = this.designerCanvas.offsetWidth * (this._sHor.value - 0.5) * -1;
|
|
209
|
+
const y = this.designerCanvas.offsetHeight * (this._sVert.value - 0.5) * -1;
|
|
210
|
+
this.designerCanvas.canvasOffset = { x, y };
|
|
149
211
|
}
|
|
150
212
|
_onWheel(event) {
|
|
151
213
|
if (event.ctrlKey) {
|
|
@@ -196,13 +258,14 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
196
258
|
}
|
|
197
259
|
}
|
|
198
260
|
getHTML(designItemsAssignmentList) {
|
|
199
|
-
this.instanceServiceContainer.selectionService.setSelectedElements(null);
|
|
261
|
+
//this.instanceServiceContainer.selectionService.setSelectedElements(null);
|
|
200
262
|
return DomConverter.ConvertToString([...this._designerCanvas.rootDesignItem.children()], designItemsAssignmentList);
|
|
201
263
|
}
|
|
202
264
|
async parseHTML(html) {
|
|
203
265
|
const parserService = this.serviceContainer.htmlParserService;
|
|
204
266
|
if (!html) {
|
|
205
267
|
this.instanceServiceContainer.undoService.clear();
|
|
268
|
+
this._designerCanvas.overlayLayer.removeAllOverlays();
|
|
206
269
|
DomHelper.removeAllChildnodes(this._designerCanvas.overlayLayer);
|
|
207
270
|
this._designerCanvas.rootDesignItem.clearChildren();
|
|
208
271
|
}
|
|
@@ -10,9 +10,9 @@ export class AltToEnterContainerExtension extends AbstractExtension {
|
|
|
10
10
|
this.refresh();
|
|
11
11
|
}
|
|
12
12
|
refresh() {
|
|
13
|
-
let itemRect = this.extendedItem.element
|
|
14
|
-
this._text = this._drawText("Press ALT to enter container", itemRect.x
|
|
15
|
-
this._rect = this._drawRect(itemRect.x
|
|
13
|
+
let itemRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
|
|
14
|
+
this._text = this._drawText("Press ALT to enter container", itemRect.x + 5, itemRect.y + 12, 'svg-text-enter-container', this._text, OverlayLayer.Foregorund);
|
|
15
|
+
this._rect = this._drawRect(itemRect.x, itemRect.y, itemRect.width, itemRect.height, 'svg-rect-enter-container', this._rect, OverlayLayer.Foregorund);
|
|
16
16
|
}
|
|
17
17
|
dispose() {
|
|
18
18
|
this._removeAllOverlays();
|
|
@@ -12,7 +12,7 @@ export class MouseOverExtension extends AbstractExtension {
|
|
|
12
12
|
let itemRect = this.extendedItem.element.getBoundingClientRect();
|
|
13
13
|
const xOffset = itemRect.x - this.designerCanvas.containerBoundingRect.x;
|
|
14
14
|
const yOffset = itemRect.y - this.designerCanvas.containerBoundingRect.y;
|
|
15
|
-
this._rect = this._drawRect(xOffset - offset, yOffset - offset, itemRect.width + offset + offset, itemRect.height + offset + offset, 'svg-hover', this._rect);
|
|
15
|
+
this._rect = this._drawRect((xOffset - offset) / this.designerCanvas.scaleFactor, (yOffset - offset) / this.designerCanvas.scaleFactor, (itemRect.width + offset + offset) / this.designerCanvas.scaleFactor, (itemRect.height + offset + offset) / this.designerCanvas.scaleFactor, 'svg-hover', this._rect);
|
|
16
16
|
}
|
|
17
17
|
dispose() {
|
|
18
18
|
this._removeAllOverlays();
|
|
@@ -34,10 +34,10 @@ export class PositionExtension extends AbstractExtension {
|
|
|
34
34
|
tx = Number.parseFloat(transforms[4]);
|
|
35
35
|
ty = Number.parseFloat(transforms[5].replace(')', ''));
|
|
36
36
|
}
|
|
37
|
-
this._line1 = this._drawLine(xOffset - left - tx, yOffset + itemRect.height / 2, xOffset, yOffset + itemRect.height / 2, 'svg-position', this._line1);
|
|
38
|
-
this._line2 = this._drawLine(xOffset + itemRect.width / 2, yOffset - top - ty, xOffset + itemRect.width / 2, yOffset, 'svg-position', this._line2);
|
|
39
|
-
this._line3 = this._drawLine(xOffset + itemRect.width, yOffset + itemRect.height / 2, xOffset + itemRect.width + right + -1 * tx, yOffset + itemRect.height / 2, 'svg-position', this._line3);
|
|
40
|
-
this._line4 = this._drawLine(xOffset + itemRect.width / 2, yOffset + itemRect.height, xOffset + itemRect.width / 2, yOffset + itemRect.height + bottom + -1 * ty, 'svg-position', this._line4);
|
|
37
|
+
this._line1 = this._drawLine((xOffset / this.designerCanvas.scaleFactor - left - tx), (yOffset + itemRect.height / 2) / this.designerCanvas.scaleFactor, xOffset / this.designerCanvas.scaleFactor, (yOffset + itemRect.height / 2) / this.designerCanvas.scaleFactor, 'svg-position', this._line1);
|
|
38
|
+
this._line2 = this._drawLine((xOffset + itemRect.width / 2) / this.designerCanvas.scaleFactor, (yOffset / this.designerCanvas.scaleFactor) - top - ty, (xOffset + itemRect.width / 2) / this.designerCanvas.scaleFactor, yOffset / this.designerCanvas.scaleFactor, 'svg-position', this._line2);
|
|
39
|
+
this._line3 = this._drawLine((xOffset + itemRect.width) / this.designerCanvas.scaleFactor, (yOffset + itemRect.height / 2) / this.designerCanvas.scaleFactor, (xOffset + itemRect.width + right + -1 * tx) / this.designerCanvas.scaleFactor, (yOffset + itemRect.height / 2) / this.designerCanvas.scaleFactor, 'svg-position', this._line3);
|
|
40
|
+
this._line4 = this._drawLine((xOffset + itemRect.width / 2) / this.designerCanvas.scaleFactor, (yOffset + itemRect.height) / this.designerCanvas.scaleFactor, (xOffset + itemRect.width / 2) / this.designerCanvas.scaleFactor, (yOffset + itemRect.height + bottom + -1 * ty) / this.designerCanvas.scaleFactor, 'svg-position', this._line4);
|
|
41
41
|
}
|
|
42
42
|
dispose() {
|
|
43
43
|
this._removeAllOverlays();
|
|
@@ -12,8 +12,8 @@ export class PrimarySelectionDefaultExtension extends AbstractExtension {
|
|
|
12
12
|
}
|
|
13
13
|
refresh() {
|
|
14
14
|
const boundRect = this.extendedItem.element.getBoundingClientRect();
|
|
15
|
-
this._rect = this._drawRect(boundRect.x - this.designerCanvas.containerBoundingRect.x, boundRect.y - this.designerCanvas.containerBoundingRect.y - 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, boundRect.y - this.designerCanvas.containerBoundingRect.y - 5, 'svg-text-primary', this._text);
|
|
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
17
|
}
|
|
18
18
|
dispose() {
|
|
19
19
|
this._removeAllOverlays();
|
|
@@ -7,6 +7,7 @@ export declare class ResizeExtension extends AbstractExtension {
|
|
|
7
7
|
private _initialSizes;
|
|
8
8
|
private _actionModeStarted;
|
|
9
9
|
private _initialPoint;
|
|
10
|
+
private _offsetPoint;
|
|
10
11
|
private _circle1;
|
|
11
12
|
private _circle2;
|
|
12
13
|
private _circle3;
|
|
@@ -19,6 +20,6 @@ export declare class ResizeExtension extends AbstractExtension {
|
|
|
19
20
|
extend(): void;
|
|
20
21
|
refresh(): void;
|
|
21
22
|
_drawResizerOverlay(x: number, y: number, cursor: string, oldCircle?: SVGCircleElement): SVGCircleElement;
|
|
22
|
-
_pointerActionTypeResize(event: PointerEvent, actionMode?: string): void;
|
|
23
|
+
_pointerActionTypeResize(circle: SVGCircleElement, event: PointerEvent, actionMode?: string): void;
|
|
23
24
|
dispose(): void;
|
|
24
25
|
}
|
|
@@ -5,6 +5,7 @@ export class ResizeExtension extends AbstractExtension {
|
|
|
5
5
|
_initialSizes;
|
|
6
6
|
_actionModeStarted;
|
|
7
7
|
_initialPoint;
|
|
8
|
+
_offsetPoint;
|
|
8
9
|
_circle1;
|
|
9
10
|
_circle2;
|
|
10
11
|
_circle3;
|
|
@@ -21,14 +22,14 @@ export class ResizeExtension extends AbstractExtension {
|
|
|
21
22
|
}
|
|
22
23
|
refresh() {
|
|
23
24
|
const rect = this.extendedItem.element.getBoundingClientRect();
|
|
24
|
-
this._circle1 = this._drawResizerOverlay(rect.x - this.designerCanvas.containerBoundingRect.x, rect.y - this.designerCanvas.containerBoundingRect.y, 'nw-resize', this._circle1);
|
|
25
|
-
this._circle2 = this._drawResizerOverlay(rect.x + (rect.width / 2) - this.designerCanvas.containerBoundingRect.x, rect.y - this.designerCanvas.containerBoundingRect.y, 'n-resize', this._circle2);
|
|
26
|
-
this._circle3 = this._drawResizerOverlay(rect.x + rect.width - this.designerCanvas.containerBoundingRect.x, rect.y - this.designerCanvas.containerBoundingRect.y, 'ne-resize', this._circle3);
|
|
27
|
-
this._circle4 = this._drawResizerOverlay(rect.x - this.designerCanvas.containerBoundingRect.x, rect.y + rect.height - this.designerCanvas.containerBoundingRect.y, 'sw-resize', this._circle4);
|
|
28
|
-
this._circle5 = this._drawResizerOverlay(rect.x + (rect.width / 2) - this.designerCanvas.containerBoundingRect.x, rect.y + rect.height - this.designerCanvas.containerBoundingRect.y, 's-resize', this._circle5);
|
|
29
|
-
this._circle6 = this._drawResizerOverlay(rect.x + rect.width - this.designerCanvas.containerBoundingRect.x, rect.y + rect.height - this.designerCanvas.containerBoundingRect.y, 'se-resize', this._circle6);
|
|
30
|
-
this._circle7 = this._drawResizerOverlay(rect.x - this.designerCanvas.containerBoundingRect.x, rect.y + (rect.height / 2) - this.designerCanvas.containerBoundingRect.y, 'w-resize', this._circle7);
|
|
31
|
-
this._circle8 = this._drawResizerOverlay(rect.x + rect.width - this.designerCanvas.containerBoundingRect.x, rect.y + (rect.height / 2) - this.designerCanvas.containerBoundingRect.y, 'e-resize', this._circle8);
|
|
25
|
+
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);
|
|
26
|
+
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);
|
|
27
|
+
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);
|
|
28
|
+
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);
|
|
29
|
+
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);
|
|
30
|
+
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);
|
|
31
|
+
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);
|
|
32
|
+
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);
|
|
32
33
|
if (rect.width < 12) {
|
|
33
34
|
this._circle2.style.display = 'none';
|
|
34
35
|
this._circle5.style.display = 'none';
|
|
@@ -49,25 +50,28 @@ export class ResizeExtension extends AbstractExtension {
|
|
|
49
50
|
_drawResizerOverlay(x, y, cursor, oldCircle) {
|
|
50
51
|
let circle = this._drawCircle(x, y, 3, 'svg-primary-resizer', oldCircle);
|
|
51
52
|
if (!oldCircle) {
|
|
52
|
-
circle.addEventListener(EventNames.PointerDown, event => this._pointerActionTypeResize(event, cursor));
|
|
53
|
-
circle.addEventListener(EventNames.PointerMove, event => this._pointerActionTypeResize(event, cursor));
|
|
54
|
-
circle.addEventListener(EventNames.PointerUp, event => this._pointerActionTypeResize(event, cursor));
|
|
53
|
+
circle.addEventListener(EventNames.PointerDown, event => this._pointerActionTypeResize(circle, event, cursor));
|
|
54
|
+
circle.addEventListener(EventNames.PointerMove, event => this._pointerActionTypeResize(circle, event, cursor));
|
|
55
|
+
circle.addEventListener(EventNames.PointerUp, event => this._pointerActionTypeResize(circle, event, cursor));
|
|
55
56
|
}
|
|
56
57
|
circle.setAttribute('style', 'cursor: ' + cursor);
|
|
57
58
|
return circle;
|
|
58
59
|
}
|
|
59
|
-
_pointerActionTypeResize(event, actionMode = 'se-resize') {
|
|
60
|
+
_pointerActionTypeResize(circle, event, actionMode = 'se-resize') {
|
|
60
61
|
event.stopPropagation();
|
|
61
62
|
const currentPoint = this.designerCanvas.getNormalizedEventCoordinates(event); //, this.extendedItem.element, event.type === 'pointerdown' ? null : this._initialPoint);
|
|
62
63
|
switch (event.type) {
|
|
63
64
|
case EventNames.PointerDown:
|
|
65
|
+
const cx = parseFloat(circle.getAttribute('cx'));
|
|
66
|
+
const cy = parseFloat(circle.getAttribute('cy'));
|
|
67
|
+
this._offsetPoint = { x: cx - currentPoint.x, y: cy - currentPoint.y };
|
|
64
68
|
event.target.setPointerCapture(event.pointerId);
|
|
65
69
|
this._initialPoint = currentPoint;
|
|
66
70
|
this._initialSizes = [];
|
|
67
71
|
this._actionModeStarted = actionMode;
|
|
68
72
|
for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
|
|
69
73
|
let rect = designItem.element.getBoundingClientRect();
|
|
70
|
-
this._initialSizes.push({ width: rect.width, height: rect.height });
|
|
74
|
+
this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
|
|
71
75
|
}
|
|
72
76
|
if (this.designerCanvas.alignOnSnap)
|
|
73
77
|
this.designerCanvas.snapLines.calculateSnaplines(this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
|
|
@@ -77,8 +81,8 @@ export class ResizeExtension extends AbstractExtension {
|
|
|
77
81
|
const containerStyle = getComputedStyle(this.extendedItem.parent.element);
|
|
78
82
|
const containerService = this.designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this.extendedItem.parent, containerStyle));
|
|
79
83
|
const diff = containerService.placePoint(event, this.designerCanvas, this.extendedItem.parent, this._initialPoint, { x: 0, y: 0 }, currentPoint, this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
|
|
80
|
-
let trackX = diff.x - this._initialPoint.x;
|
|
81
|
-
let trackY = diff.y - this._initialPoint.y;
|
|
84
|
+
let trackX = diff.x - this._initialPoint.x - this._offsetPoint.x;
|
|
85
|
+
let trackY = diff.y - this._initialPoint.y - this._offsetPoint.y;
|
|
82
86
|
let i = 0;
|
|
83
87
|
switch (this._actionModeStarted) {
|
|
84
88
|
case 'se-resize':
|
|
@@ -26,7 +26,7 @@ export class RotateExtension extends AbstractExtension {
|
|
|
26
26
|
g.addEventListener(EventNames.PointerMove, event => this._pointerActionTypeRotate(event));
|
|
27
27
|
g.addEventListener(EventNames.PointerUp, event => this._pointerActionTypeRotate(event));
|
|
28
28
|
g.setAttribute('class', 'svg-primary-rotate');
|
|
29
|
-
g.setAttribute('transform', 'translate(' + (itemRect.x - this.designerCanvas.containerBoundingRect.x - 13) + ',' + (itemRect.y - this.designerCanvas.containerBoundingRect.y - 8.5) + ')');
|
|
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
30
|
this.overlayLayerView.addOverlay(g);
|
|
31
31
|
this.overlays.push(g);
|
|
32
32
|
}
|
|
@@ -8,13 +8,13 @@ export class SelectionDefaultExtension extends AbstractExtension {
|
|
|
8
8
|
this.refresh();
|
|
9
9
|
}
|
|
10
10
|
refresh() {
|
|
11
|
-
const itemRect = this.extendedItem.element
|
|
11
|
+
const itemRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
|
|
12
12
|
const computedStyle = getComputedStyle(this.extendedItem.element);
|
|
13
13
|
const left = Number.parseFloat(computedStyle.marginLeft.replace('px', ''));
|
|
14
14
|
const top = Number.parseFloat(computedStyle.marginTop.replace('px', ''));
|
|
15
15
|
const right = Number.parseFloat(computedStyle.marginRight.replace('px', ''));
|
|
16
16
|
const bottom = Number.parseFloat(computedStyle.marginBottom.replace('px', ''));
|
|
17
|
-
this._rect = this._drawRect(itemRect.x -
|
|
17
|
+
this._rect = this._drawRect(itemRect.x - left, itemRect.y - top, left + itemRect.width + right, top + itemRect.height + bottom, 'svg-selection', this._rect);
|
|
18
18
|
}
|
|
19
19
|
dispose() {
|
|
20
20
|
this._removeAllOverlays();
|
|
@@ -11,9 +11,9 @@ export class TransformOriginExtension extends AbstractExtension {
|
|
|
11
11
|
const rect = this.extendedItem.element.getBoundingClientRect();
|
|
12
12
|
const computed = getComputedStyle(this.extendedItem.element);
|
|
13
13
|
const to = computed.transformOrigin.split(' ');
|
|
14
|
-
this._circle = this._drawCircle(rect.x - this.designerCanvas.containerBoundingRect.x + Number.parseFloat(to[0].replace('px', '')), rect.y - this.designerCanvas.containerBoundingRect.y + Number.parseFloat(to[1].replace('px', '')), 5, 'svg-transform-origin');
|
|
14
|
+
this._circle = this._drawCircle((rect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor + Number.parseFloat(to[0].replace('px', '')), (rect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor + Number.parseFloat(to[1].replace('px', '')), 5, 'svg-transform-origin');
|
|
15
15
|
this._circle.setAttribute('style', 'cursor: pointer');
|
|
16
|
-
this._circle2 = this._drawCircle(rect.x - this.designerCanvas.containerBoundingRect.x + Number.parseFloat(to[0].replace('px', '')), rect.y - this.designerCanvas.containerBoundingRect.y + Number.parseFloat(to[1].replace('px', '')), 1, 'svg-transform-origin');
|
|
16
|
+
this._circle2 = this._drawCircle((rect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor + Number.parseFloat(to[0].replace('px', '')), (rect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor + Number.parseFloat(to[1].replace('px', '')), 1, 'svg-transform-origin');
|
|
17
17
|
this._circle2.setAttribute('style', 'pointer-events: none');
|
|
18
18
|
this._circle.addEventListener(EventNames.PointerDown, event => this.pointerEvent(event));
|
|
19
19
|
this._circle.addEventListener(EventNames.PointerMove, event => this.pointerEvent(event));
|
|
@@ -15,6 +15,7 @@ export declare class OverlayLayerView extends BaseCustomWebComponentConstructorA
|
|
|
15
15
|
addOverlay(element: SVGGraphicsElement, overlayLayer?: OverlayLayer): void;
|
|
16
16
|
removeOverlay(element: SVGGraphicsElement): void;
|
|
17
17
|
removeAllNodesWithClass(className: string): void;
|
|
18
|
+
removeAllOverlays(): void;
|
|
18
19
|
createPoint(): DOMPointInit;
|
|
19
20
|
elementFromPoint(x: number, y: number): Element;
|
|
20
21
|
drawLine(x1: number, y1: number, x2: number, y2: number, className?: string, line?: SVGLineElement, overlayLayer?: OverlayLayer): SVGLineElement;
|
|
@@ -80,6 +80,12 @@ export class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
80
80
|
e.parentNode.removeChild(e);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
+
removeAllOverlays() {
|
|
84
|
+
const nodes = this._svg.querySelectorAll('svg > g > *');
|
|
85
|
+
for (const e of nodes) {
|
|
86
|
+
e.parentNode.removeChild(e);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
83
89
|
createPoint() {
|
|
84
90
|
//@ts-ignore
|
|
85
91
|
return this._svg.createSVGPoint();
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IDesignerCanvas } from '../IDesignerCanvas';
|
|
2
|
+
import { ITool } from './ITool';
|
|
3
|
+
import { ServiceContainer } from '../../../services/ServiceContainer.js';
|
|
4
|
+
export declare class DrawEllipsisTool implements ITool {
|
|
5
|
+
readonly cursor = "crosshair";
|
|
6
|
+
private _path;
|
|
7
|
+
private _startPoint;
|
|
8
|
+
private _radius;
|
|
9
|
+
private _cx;
|
|
10
|
+
private _cy;
|
|
11
|
+
constructor();
|
|
12
|
+
activated(serviceContainer: ServiceContainer): void;
|
|
13
|
+
dispose(): void;
|
|
14
|
+
pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { EventNames } from '../../../../enums/EventNames';
|
|
2
|
+
import { OverlayLayer } from '../extensions/OverlayLayer.js';
|
|
3
|
+
import { calculateNormLegth } from '../../../helper/PathDataPolyfill';
|
|
4
|
+
import { DesignItem } from '../../../item/DesignItem';
|
|
5
|
+
import { InsertAction } from '../../../services/undoService/transactionItems/InsertAction';
|
|
6
|
+
export class DrawEllipsisTool {
|
|
7
|
+
cursor = 'crosshair';
|
|
8
|
+
_path;
|
|
9
|
+
_startPoint;
|
|
10
|
+
_radius;
|
|
11
|
+
_cx;
|
|
12
|
+
_cy;
|
|
13
|
+
constructor() {
|
|
14
|
+
}
|
|
15
|
+
activated(serviceContainer) {
|
|
16
|
+
}
|
|
17
|
+
dispose() {
|
|
18
|
+
}
|
|
19
|
+
pointerEventHandler(designerCanvas, event, currentElement) {
|
|
20
|
+
const currentPoint = designerCanvas.getNormalizedEventCoordinates(event);
|
|
21
|
+
const offset = 50;
|
|
22
|
+
switch (event.type) {
|
|
23
|
+
case EventNames.PointerDown:
|
|
24
|
+
this._startPoint = currentPoint;
|
|
25
|
+
event.target.setPointerCapture(event.pointerId);
|
|
26
|
+
this._path = document.createElementNS("http://www.w3.org/2000/svg", "ellipse");
|
|
27
|
+
this._path.setAttribute("stroke", designerCanvas.serviceContainer.globalContext.strokeColor);
|
|
28
|
+
this._path.setAttribute("fill", designerCanvas.serviceContainer.globalContext.fillBrush);
|
|
29
|
+
this._path.setAttribute("stroke-width", designerCanvas.serviceContainer.globalContext.strokeThickness);
|
|
30
|
+
this._path.setAttribute("cx", currentPoint.x.toString());
|
|
31
|
+
this._path.setAttribute("cy", currentPoint.y.toString());
|
|
32
|
+
this._path.setAttribute("rx", "0");
|
|
33
|
+
this._path.setAttribute("ry", "0");
|
|
34
|
+
designerCanvas.overlayLayer.addOverlay(this._path, OverlayLayer.Foregorund);
|
|
35
|
+
break;
|
|
36
|
+
case EventNames.PointerMove:
|
|
37
|
+
if (this._path) {
|
|
38
|
+
this._radius = { x: Math.abs(currentPoint.x - this._startPoint.x), y: Math.abs(currentPoint.y - this._startPoint.y) };
|
|
39
|
+
if (event.ctrlKey) {
|
|
40
|
+
this._path.setAttribute("cx", this._startPoint.x.toString());
|
|
41
|
+
this._path.setAttribute("cy", this._startPoint.y.toString());
|
|
42
|
+
this._cx = this._startPoint.x;
|
|
43
|
+
this._cy = this._startPoint.y;
|
|
44
|
+
if (event.shiftKey) {
|
|
45
|
+
const radius = calculateNormLegth(this._startPoint, currentPoint);
|
|
46
|
+
this._path.setAttribute("rx", radius.toString());
|
|
47
|
+
this._path.setAttribute("ry", radius.toString());
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this._path.setAttribute("rx", this._radius.x.toString());
|
|
51
|
+
this._path.setAttribute("ry", this._radius.y.toString());
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
if (event.shiftKey) {
|
|
56
|
+
const radius = calculateNormLegth(this._startPoint, currentPoint);
|
|
57
|
+
this._radius = { x: radius, y: radius };
|
|
58
|
+
}
|
|
59
|
+
this._cx = currentPoint.x < this._startPoint.x ? this._startPoint.x - this._radius.x / 2 : this._startPoint.x + this._radius.x / 2;
|
|
60
|
+
this._cy = currentPoint.y < this._startPoint.y ? this._startPoint.y - this._radius.y / 2 : this._startPoint.y + this._radius.y / 2;
|
|
61
|
+
this._path.setAttribute("cx", this._cx.toString());
|
|
62
|
+
this._path.setAttribute("cy", this._cy.toString());
|
|
63
|
+
this._path.setAttribute("rx", (this._radius.x / 2).toString());
|
|
64
|
+
this._path.setAttribute("ry", (this._radius.y / 2).toString());
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
case EventNames.PointerUp:
|
|
69
|
+
event.target.releasePointerCapture(event.pointerId);
|
|
70
|
+
const rect = this._path.getBoundingClientRect();
|
|
71
|
+
designerCanvas.overlayLayer.removeOverlay(this._path);
|
|
72
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
73
|
+
const mvX = rect.x - designerCanvas.containerBoundingRect.x - offset;
|
|
74
|
+
const mvY = rect.y - designerCanvas.containerBoundingRect.y - offset;
|
|
75
|
+
svg.appendChild(this._path);
|
|
76
|
+
this._path.setAttribute("cx", (this._cx - mvX).toString());
|
|
77
|
+
this._path.setAttribute("cy", (this._cy - mvY).toString());
|
|
78
|
+
svg.style.left = (mvX) + 'px';
|
|
79
|
+
svg.style.top = (mvY) + 'px';
|
|
80
|
+
svg.style.position = 'absolute';
|
|
81
|
+
svg.style.width = (rect.width + 2 * offset) + 'px';
|
|
82
|
+
svg.style.height = (rect.height + 2 * offset) + 'px';
|
|
83
|
+
this._path = null;
|
|
84
|
+
const di = DesignItem.createDesignItemFromInstance(svg, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
|
|
85
|
+
designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
|
|
86
|
+
designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IDesignerCanvas } from '../IDesignerCanvas';
|
|
2
|
+
import { ITool } from './ITool';
|
|
3
|
+
import { ServiceContainer } from '../../../services/ServiceContainer.js';
|
|
4
|
+
export declare class DrawLineTool implements ITool {
|
|
5
|
+
readonly cursor = "crosshair";
|
|
6
|
+
private _path;
|
|
7
|
+
private _startPoint;
|
|
8
|
+
private _endPoint;
|
|
9
|
+
constructor();
|
|
10
|
+
activated(serviceContainer: ServiceContainer): void;
|
|
11
|
+
dispose(): void;
|
|
12
|
+
pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { EventNames } from '../../../../enums/EventNames';
|
|
2
|
+
import { OverlayLayer } from '../extensions/OverlayLayer.js';
|
|
3
|
+
import { straightenLine } from '../../../helper/PathDataPolyfill';
|
|
4
|
+
import { DesignItem } from '../../../item/DesignItem';
|
|
5
|
+
import { InsertAction } from '../../../services/undoService/transactionItems/InsertAction';
|
|
6
|
+
export class DrawLineTool {
|
|
7
|
+
cursor = 'crosshair';
|
|
8
|
+
_path;
|
|
9
|
+
_startPoint;
|
|
10
|
+
_endPoint;
|
|
11
|
+
constructor() {
|
|
12
|
+
}
|
|
13
|
+
activated(serviceContainer) {
|
|
14
|
+
}
|
|
15
|
+
dispose() {
|
|
16
|
+
}
|
|
17
|
+
pointerEventHandler(designerCanvas, event, currentElement) {
|
|
18
|
+
const currentPoint = designerCanvas.getNormalizedEventCoordinates(event);
|
|
19
|
+
const offset = 50;
|
|
20
|
+
switch (event.type) {
|
|
21
|
+
case EventNames.PointerDown:
|
|
22
|
+
this._startPoint = currentPoint;
|
|
23
|
+
event.target.setPointerCapture(event.pointerId);
|
|
24
|
+
this._path = document.createElementNS("http://www.w3.org/2000/svg", "line");
|
|
25
|
+
// this._pathD = "M" + currentPoint.x + " " + currentPoint.y;
|
|
26
|
+
// this._path.setAttribute("d", this._pathD);
|
|
27
|
+
this._path.setAttribute("stroke", designerCanvas.serviceContainer.globalContext.strokeColor);
|
|
28
|
+
this._path.setAttribute("stroke-width", designerCanvas.serviceContainer.globalContext.strokeThickness);
|
|
29
|
+
this._path.setAttribute("x1", currentPoint.x.toString());
|
|
30
|
+
this._path.setAttribute("y1", currentPoint.y.toString());
|
|
31
|
+
this._path.setAttribute("x2", currentPoint.x.toString());
|
|
32
|
+
this._path.setAttribute("y2", currentPoint.y.toString());
|
|
33
|
+
designerCanvas.overlayLayer.addOverlay(this._path, OverlayLayer.Foregorund);
|
|
34
|
+
break;
|
|
35
|
+
case EventNames.PointerMove:
|
|
36
|
+
if (this._path) {
|
|
37
|
+
if (event.shiftKey) {
|
|
38
|
+
let straightLine = straightenLine(this._startPoint, currentPoint);
|
|
39
|
+
this._path.setAttribute("x2", straightLine.x.toString());
|
|
40
|
+
this._path.setAttribute("y2", straightLine.y.toString());
|
|
41
|
+
this._endPoint = straightLine;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
//this._path.setAttribute("d", this._pathD + "L" + currentPoint.x + " " + currentPoint.y);
|
|
45
|
+
this._path.setAttribute("x2", currentPoint.x.toString());
|
|
46
|
+
this._path.setAttribute("y2", currentPoint.y.toString());
|
|
47
|
+
this._endPoint = currentPoint;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case EventNames.PointerUp:
|
|
52
|
+
event.target.releasePointerCapture(event.pointerId);
|
|
53
|
+
const rect = this._path.getBoundingClientRect();
|
|
54
|
+
designerCanvas.overlayLayer.removeOverlay(this._path);
|
|
55
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
56
|
+
const mvX = rect.x - designerCanvas.containerBoundingRect.x - offset;
|
|
57
|
+
const mvY = rect.y - designerCanvas.containerBoundingRect.y - offset;
|
|
58
|
+
this._path.setAttribute("x1", (this._startPoint.x - mvX).toString());
|
|
59
|
+
this._path.setAttribute("y1", (this._startPoint.y - mvY).toString());
|
|
60
|
+
this._path.setAttribute("x2", (this._endPoint.x - mvX).toString());
|
|
61
|
+
this._path.setAttribute("y2", (this._endPoint.y - mvY).toString());
|
|
62
|
+
svg.appendChild(this._path);
|
|
63
|
+
svg.style.left = (mvX) + 'px';
|
|
64
|
+
svg.style.top = (mvY) + 'px';
|
|
65
|
+
svg.style.position = 'absolute';
|
|
66
|
+
svg.style.width = (rect.width + 2 * offset) + 'px';
|
|
67
|
+
svg.style.height = (rect.height + 2 * offset) + 'px';
|
|
68
|
+
this._path = null;
|
|
69
|
+
const di = DesignItem.createDesignItemFromInstance(svg, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
|
|
70
|
+
designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
|
|
71
|
+
designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { IDesignerCanvas } from '../IDesignerCanvas';
|
|
2
2
|
import { ITool } from './ITool';
|
|
3
3
|
import { ServiceContainer } from '../../../services/ServiceContainer.js';
|
|
4
|
-
import { IPoint } from '../../../..';
|
|
5
4
|
export declare class DrawPathTool implements ITool {
|
|
6
5
|
readonly cursor = "crosshair";
|
|
7
6
|
private _pathD;
|
|
@@ -17,5 +16,4 @@ export declare class DrawPathTool implements ITool {
|
|
|
17
16
|
activated(serviceContainer: ServiceContainer): void;
|
|
18
17
|
dispose(): void;
|
|
19
18
|
pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
|
|
20
|
-
straightenLine(p1: IPoint, p2: IPoint): IPoint;
|
|
21
19
|
}
|