@node-projects/web-component-designer 0.0.86 → 0.0.89
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/controls/PlainScrollbar.js +122 -116
- package/dist/elements/controls/SimpleSplitView.js +1 -1
- package/dist/elements/documentContainer.js +2 -0
- package/dist/elements/helper/ElementHelper.d.ts +1 -0
- package/dist/elements/helper/ElementHelper.js +10 -0
- package/dist/elements/item/DesignItem.d.ts +2 -0
- package/dist/elements/item/DesignItem.js +7 -0
- package/dist/elements/item/IDesignItem.d.ts +1 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +0 -4
- package/dist/elements/services/ServiceContainer.d.ts +1 -3
- package/dist/elements/services/ServiceContainer.js +8 -3
- package/dist/elements/services/htmlParserService/NodeHtmlParserService.js +8 -0
- package/dist/elements/services/initializationService/DefaultIntializationService.js +12 -12
- package/dist/elements/services/instanceService/PrepareElementsForDesignerService.js +23 -23
- package/dist/elements/services/undoService/UndoService.js +3 -2
- package/dist/elements/services/undoService/transactionItems/InsertAction.js +0 -3
- package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +8 -0
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +13 -1
- package/dist/elements/widgets/designerView/designerCanvas.js +129 -39
- package/dist/elements/widgets/designerView/designerCanvas.ts.BASE.d.ts +92 -0
- package/dist/elements/widgets/designerView/designerCanvas.ts.BASE.js +734 -0
- package/dist/elements/widgets/designerView/designerCanvas.ts.LOCAL.d.ts +95 -0
- package/dist/elements/widgets/designerView/designerCanvas.ts.LOCAL.js +768 -0
- package/dist/elements/widgets/designerView/designerCanvas.ts.REMOTE.d.ts +94 -0
- package/dist/elements/widgets/designerView/designerCanvas.ts.REMOTE.js +745 -0
- package/dist/elements/widgets/designerView/designerView.js +19 -15
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension copy.d.ts +17 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension copy.js +80 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +4 -2
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.js +11 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.d.ts +20 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js +83 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.js +15 -0
- package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.js +2 -2
- package/dist/elements/widgets/designerView/extensions/PathExtension.js +2 -5
- package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +2 -1
- package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +1 -0
- package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/DrawLineTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/DrawRectTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +10 -9
- package/dist/elements/widgets/designerView/tools/PanTool.js +1 -0
- package/dist/elements/widgets/designerView/tools/PointerTool.js +4 -2
- package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +10 -9
- package/dist/elements/widgets/designerView/tools/ZoomTool.d.ts +8 -1
- package/dist/elements/widgets/designerView/tools/ZoomTool.js +69 -0
- package/dist/elements/widgets/paletteView/paletteTreeView.js +5 -0
- package/dist/elements/widgets/treeView/treeView.js +1 -0
- package/dist/elements/widgets/treeView/treeViewExtended.js +21 -20
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -3
- package/package.json +5 -4
|
@@ -41,6 +41,8 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
41
41
|
height: 16px;
|
|
42
42
|
background: #787f82;
|
|
43
43
|
display: flex;
|
|
44
|
+
bottom: 0;
|
|
45
|
+
position: absolute;
|
|
44
46
|
}
|
|
45
47
|
input {
|
|
46
48
|
width: 40px;
|
|
@@ -75,8 +77,8 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
75
77
|
height: 100%;
|
|
76
78
|
}
|
|
77
79
|
#canvas {
|
|
78
|
-
width: 100
|
|
79
|
-
height: 100
|
|
80
|
+
width: calc(100% - 16px);
|
|
81
|
+
height: calc(100% - 32px);
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
.zoom-in {
|
|
@@ -141,15 +143,21 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
141
143
|
this._designerCanvas.id = "canvas";
|
|
142
144
|
this._designerCanvas.appendChild(document.createElement("slot"));
|
|
143
145
|
outer.insertAdjacentElement('afterbegin', this._designerCanvas);
|
|
146
|
+
this._designerCanvas.onZoomFactorChanged.on(() => {
|
|
147
|
+
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
148
|
+
const pos = this.designerCanvas.canvasOffset;
|
|
149
|
+
const w = this.designerCanvas.designerOffsetWidth > this.designerCanvas.offsetWidth ? this.designerCanvas.designerOffsetWidth : this.designerCanvas.offsetWidth;
|
|
150
|
+
const h = this.designerCanvas.designerOffsetHeight > this.designerCanvas.offsetHeight ? this.designerCanvas.designerOffsetHeight : this.designerCanvas.offsetHeight;
|
|
151
|
+
this._sHor.value = (pos.x / (-2 * w)) + 0.5;
|
|
152
|
+
this._sVert.value = (pos.y / (-2 * h)) + 0.5;
|
|
153
|
+
});
|
|
144
154
|
this._zoomInput = this._getDomElement('zoomInput');
|
|
145
155
|
this._zoomInput.onkeydown = (e) => {
|
|
146
156
|
if (e.key == 'Enter')
|
|
147
157
|
this._designerCanvas.zoomFactor = parseFloat(this._zoomInput.value) / 100;
|
|
148
|
-
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
149
158
|
};
|
|
150
159
|
this._zoomInput.onblur = () => {
|
|
151
160
|
this._designerCanvas.zoomFactor = parseFloat(this._zoomInput.value) / 100;
|
|
152
|
-
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
153
161
|
};
|
|
154
162
|
this._zoomInput.onclick = this._zoomInput.select;
|
|
155
163
|
let zoomIncrease = this._getDomElement('zoomIncrease');
|
|
@@ -158,7 +166,6 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
158
166
|
this._designerCanvas.zoomFactor += 0.1;
|
|
159
167
|
else
|
|
160
168
|
this._designerCanvas.zoomFactor += 0.01;
|
|
161
|
-
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
162
169
|
};
|
|
163
170
|
let zoomDecrease = this._getDomElement('zoomDecrease');
|
|
164
171
|
zoomDecrease.onclick = () => {
|
|
@@ -197,6 +204,11 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
197
204
|
maxY -= cvRect.y;
|
|
198
205
|
let scaleX = cvRect.width / (maxX / this._designerCanvas.zoomFactor);
|
|
199
206
|
let scaleY = cvRect.height / (maxY / this._designerCanvas.zoomFactor);
|
|
207
|
+
const dimensions = this.designerCanvas.getDesignSurfaceDimensions();
|
|
208
|
+
if (dimensions.width)
|
|
209
|
+
scaleX = cvRect.width / dimensions.width;
|
|
210
|
+
if (dimensions.height)
|
|
211
|
+
scaleY = cvRect.height / dimensions.height;
|
|
200
212
|
this._designerCanvas.zoomFactor = scaleX < scaleY ? scaleX : scaleY;
|
|
201
213
|
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
202
214
|
};
|
|
@@ -235,16 +247,8 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
235
247
|
zf += event.deltaY * -0.001; //deltamode = 0
|
|
236
248
|
if (zf < 0.02)
|
|
237
249
|
zf = 0.02;
|
|
238
|
-
this.
|
|
239
|
-
this.
|
|
240
|
-
const rect = this.getBoundingClientRect();
|
|
241
|
-
//const xc = this.designerCanvas.canvasOffset.x;
|
|
242
|
-
//const yc = this.designerCanvas.canvasOffset.y;
|
|
243
|
-
const xp = event.x - rect.x;
|
|
244
|
-
const yp = event.y - rect.y;
|
|
245
|
-
const x = xp / zf * (1 - zf);
|
|
246
|
-
const y = yp / zf * (1 - zf);
|
|
247
|
-
this.designerCanvas.canvasOffset = { x, y };
|
|
250
|
+
const vp = this.designerCanvas.getNormalizedEventCoordinates(event);
|
|
251
|
+
this.designerCanvas.zoomTowardsPoint(vp, zf);
|
|
248
252
|
}
|
|
249
253
|
else {
|
|
250
254
|
this._sHor.value += event.deltaX / 1000;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
2
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
3
|
+
import { AbstractExtension } from "../AbstractExtension.js";
|
|
4
|
+
import { IExtensionManager } from "../IExtensionManger";
|
|
5
|
+
export declare class EditTextExtension extends AbstractExtension {
|
|
6
|
+
private _contentEditedBound;
|
|
7
|
+
private _blurBound;
|
|
8
|
+
private static template;
|
|
9
|
+
private _blurTimeout;
|
|
10
|
+
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
11
|
+
extend(): void;
|
|
12
|
+
refresh(): void;
|
|
13
|
+
dispose(): void;
|
|
14
|
+
_contentEdited(): void;
|
|
15
|
+
_blur(): void;
|
|
16
|
+
_formatSelection(type: string): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { html } from "@node-projects/base-custom-webcomponent";
|
|
2
|
+
import { AbstractExtension } from "../AbstractExtension.js";
|
|
3
|
+
import { ExtensionType } from "../ExtensionType.js";
|
|
4
|
+
import { OverlayLayer } from "../OverlayLayer.js";
|
|
5
|
+
export class EditTextExtension extends AbstractExtension {
|
|
6
|
+
_contentEditedBound;
|
|
7
|
+
_blurBound;
|
|
8
|
+
static template = html `
|
|
9
|
+
<div style="height: 24px; display: flex;">
|
|
10
|
+
<button data-command="bold" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
|
|
11
|
+
<button data-command="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
|
|
12
|
+
<button data-command="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
|
|
13
|
+
<button data-command="strikeThrough" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
|
|
14
|
+
</div>
|
|
15
|
+
`;
|
|
16
|
+
_blurTimeout;
|
|
17
|
+
constructor(extensionManager, designerView, extendedItem) {
|
|
18
|
+
super(extensionManager, designerView, extendedItem);
|
|
19
|
+
this._contentEditedBound = this._contentEdited.bind(this);
|
|
20
|
+
this._blurBound = this._blur.bind(this);
|
|
21
|
+
}
|
|
22
|
+
extend() {
|
|
23
|
+
//todo -> check what to do with extensions, do not loose edit on mouse click,...
|
|
24
|
+
//maybe use a html edit framework
|
|
25
|
+
this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
|
|
26
|
+
//this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelection);
|
|
27
|
+
//this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Selection);
|
|
28
|
+
this.extendedItem.element.setAttribute('contenteditable', '');
|
|
29
|
+
this.extendedItem.element.addEventListener('input', this._contentEditedBound);
|
|
30
|
+
this.extendedItem.element.addEventListener('blur', this._blurBound);
|
|
31
|
+
this.extendedItem.element.focus();
|
|
32
|
+
this.designerCanvas.eatEvents = this.extendedItem.element;
|
|
33
|
+
let itemRect = this.extendedItem.element.getBoundingClientRect();
|
|
34
|
+
const elements = EditTextExtension.template.content.cloneNode(true);
|
|
35
|
+
elements.querySelectorAll('button').forEach(x => x.onclick = () => this._formatSelection(x.dataset['command']));
|
|
36
|
+
let foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
37
|
+
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
|
|
38
|
+
foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
|
|
39
|
+
foreignObject.setAttribute('width', '96');
|
|
40
|
+
foreignObject.setAttribute('height', '24');
|
|
41
|
+
foreignObject.appendChild(elements);
|
|
42
|
+
this.overlayLayerView.addOverlay(foreignObject, OverlayLayer.Foregorund);
|
|
43
|
+
this.overlays.push(foreignObject);
|
|
44
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
45
|
+
}
|
|
46
|
+
refresh() {
|
|
47
|
+
this.dispose();
|
|
48
|
+
}
|
|
49
|
+
dispose() {
|
|
50
|
+
this._removeAllOverlays();
|
|
51
|
+
this.extendedItem.element.removeAttribute('contenteditable');
|
|
52
|
+
this.extendedItem.element.removeEventListener('input', this._contentEditedBound);
|
|
53
|
+
this.extendedItem.element.removeEventListener('blur', this._blurBound);
|
|
54
|
+
this.designerCanvas.eatEvents = null;
|
|
55
|
+
this.extendedItem.updateChildrenFromNodesChildren();
|
|
56
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
|
|
57
|
+
}
|
|
58
|
+
_contentEdited() {
|
|
59
|
+
//todo -> save???
|
|
60
|
+
//this.extendedItem.content = this.extendedItem.element.innerHTML;
|
|
61
|
+
//console.log(this.extendedItem.element.innerHTML)
|
|
62
|
+
}
|
|
63
|
+
_blur() {
|
|
64
|
+
if (!this._blurTimeout) {
|
|
65
|
+
this._blurTimeout = setTimeout(() => {
|
|
66
|
+
//todo, don't remove doubleclick extension (another type could be used), remove extension itself
|
|
67
|
+
//maybe also configureable when when to remove the extension
|
|
68
|
+
this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
|
|
69
|
+
}, 150);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
_formatSelection(type) {
|
|
73
|
+
if (this._blurTimeout)
|
|
74
|
+
clearTimeout(this._blurTimeout);
|
|
75
|
+
this._blurTimeout = null;
|
|
76
|
+
//const selection = <Selection>(<any>this.designerView.shadowRoot).getSelection()
|
|
77
|
+
document.execCommand(type, false, null);
|
|
78
|
+
this.extendedItem.element.focus();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -34,13 +34,14 @@ export class EditTextExtension extends AbstractExtension {
|
|
|
34
34
|
const elements = EditTextExtension.template.content.cloneNode(true);
|
|
35
35
|
elements.querySelectorAll('button').forEach(x => x.onclick = () => this._formatSelection(x.dataset['command']));
|
|
36
36
|
let foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
37
|
-
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x));
|
|
38
|
-
foreignObject.setAttribute('y', '' + (itemRect.y - this.designerCanvas.containerBoundingRect.y - 30));
|
|
37
|
+
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
|
|
38
|
+
foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
|
|
39
39
|
foreignObject.setAttribute('width', '96');
|
|
40
40
|
foreignObject.setAttribute('height', '24');
|
|
41
41
|
foreignObject.appendChild(elements);
|
|
42
42
|
this.overlayLayerView.addOverlay(foreignObject, OverlayLayer.Foregorund);
|
|
43
43
|
this.overlays.push(foreignObject);
|
|
44
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
44
45
|
}
|
|
45
46
|
refresh() {
|
|
46
47
|
this.dispose();
|
|
@@ -52,6 +53,7 @@ export class EditTextExtension extends AbstractExtension {
|
|
|
52
53
|
this.extendedItem.element.removeEventListener('blur', this._blurBound);
|
|
53
54
|
this.designerCanvas.eatEvents = null;
|
|
54
55
|
this.extendedItem.updateChildrenFromNodesChildren();
|
|
56
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
|
|
55
57
|
}
|
|
56
58
|
_contentEdited() {
|
|
57
59
|
//todo -> save???
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
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 EditTextExtensionProvider implements IDesignerExtensionProvider {
|
|
7
|
+
shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
|
|
8
|
+
getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
|
|
9
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EditTextExtension } from "./EditTextExtension.js";
|
|
2
|
+
export class EditTextExtensionProvider {
|
|
3
|
+
shouldExtend(extensionManager, designerView, designItem) {
|
|
4
|
+
if (designItem.name === 'button' || designItem.name === 'input')
|
|
5
|
+
return false;
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
getExtension(extensionManager, designerView, designItem) {
|
|
9
|
+
return new EditTextExtension(extensionManager, designerView, designItem);
|
|
10
|
+
}
|
|
11
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
2
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
3
|
+
import { AbstractExtension } from "../AbstractExtension.js";
|
|
4
|
+
import { IExtensionManager } from "../IExtensionManger";
|
|
5
|
+
export declare class EditTextWithStyloExtension extends AbstractExtension {
|
|
6
|
+
private _contentEditedBound;
|
|
7
|
+
private _blurBound;
|
|
8
|
+
private static template;
|
|
9
|
+
private _resizeObserver;
|
|
10
|
+
private _rect1;
|
|
11
|
+
private _rect2;
|
|
12
|
+
private _rect3;
|
|
13
|
+
private _rect4;
|
|
14
|
+
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
15
|
+
extend(): void;
|
|
16
|
+
private _drawClickOverlayRects;
|
|
17
|
+
refresh(): void;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
_clickOutside(e: any): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { html } from "@node-projects/base-custom-webcomponent";
|
|
2
|
+
import { AbstractExtension } from "../AbstractExtension.js";
|
|
3
|
+
import { ExtensionType } from "../ExtensionType.js";
|
|
4
|
+
import { OverlayLayer } from "../OverlayLayer.js";
|
|
5
|
+
export class EditTextWithStyloExtension extends AbstractExtension {
|
|
6
|
+
_contentEditedBound;
|
|
7
|
+
_blurBound;
|
|
8
|
+
static template = html `
|
|
9
|
+
<stylo-editor></stylo-editor>
|
|
10
|
+
`;
|
|
11
|
+
_resizeObserver;
|
|
12
|
+
_rect1;
|
|
13
|
+
_rect2;
|
|
14
|
+
_rect3;
|
|
15
|
+
_rect4;
|
|
16
|
+
constructor(extensionManager, designerView, extendedItem) {
|
|
17
|
+
super(extensionManager, designerView, extendedItem);
|
|
18
|
+
import('@papyrs/stylo/dist/esm/loader.js').then(d => d.defineCustomElements());
|
|
19
|
+
}
|
|
20
|
+
extend() {
|
|
21
|
+
this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
|
|
22
|
+
this.extendedItem.element.setAttribute('contenteditable', 'true');
|
|
23
|
+
this.extendedItem.element.addEventListener('input', this._contentEditedBound);
|
|
24
|
+
this.extendedItem.element.addEventListener('blur', this._blurBound);
|
|
25
|
+
this.extendedItem.element.focus();
|
|
26
|
+
this.designerCanvas.eatEvents = this.extendedItem.element;
|
|
27
|
+
const elements = EditTextWithStyloExtension.template.content.cloneNode(true);
|
|
28
|
+
let foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
29
|
+
foreignObject.setAttribute('x', '0');
|
|
30
|
+
foreignObject.setAttribute('y', '0');
|
|
31
|
+
foreignObject.setAttribute('width', '100%');
|
|
32
|
+
foreignObject.setAttribute('height', '100%');
|
|
33
|
+
foreignObject.appendChild(elements);
|
|
34
|
+
this.overlayLayerView.addOverlay(foreignObject, OverlayLayer.Foregorund);
|
|
35
|
+
this.overlays.push(foreignObject);
|
|
36
|
+
this._drawClickOverlayRects();
|
|
37
|
+
this._rect1.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
38
|
+
this._rect1.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
39
|
+
this._rect2.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
40
|
+
this._rect2.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
41
|
+
this._rect3.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
42
|
+
this._rect3.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
43
|
+
this._rect4.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
44
|
+
this._rect4.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
45
|
+
requestAnimationFrame(() => {
|
|
46
|
+
const stylo = foreignObject.querySelector('stylo-editor');
|
|
47
|
+
//@ts-ignore
|
|
48
|
+
stylo.containerRef = this.extendedItem.element;
|
|
49
|
+
//@ts-ignore
|
|
50
|
+
stylo.config = {
|
|
51
|
+
dontInjectHeadCss: true
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
55
|
+
this._resizeObserver = new ResizeObserver(() => this._drawClickOverlayRects());
|
|
56
|
+
this._resizeObserver.observe(this.extendedItem.element);
|
|
57
|
+
}
|
|
58
|
+
_drawClickOverlayRects() {
|
|
59
|
+
const normalized = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
|
|
60
|
+
this._rect1 = this._drawRect(0, 0, this.designerCanvas.containerBoundingRect.width, normalized.y, 'svg-transparent', this._rect1, OverlayLayer.Normal);
|
|
61
|
+
this._rect2 = this._drawRect(0, 0, normalized.x, this.designerCanvas.containerBoundingRect.height, 'svg-transparent', this._rect2, OverlayLayer.Normal);
|
|
62
|
+
this._rect3 = this._drawRect(normalized.x + normalized.width, 0, this.designerCanvas.containerBoundingRect.width, this.designerCanvas.containerBoundingRect.height, 'svg-transparent', this._rect3, OverlayLayer.Normal);
|
|
63
|
+
this._rect4 = this._drawRect(0, normalized.y + normalized.height, this.designerCanvas.containerBoundingRect.width, this.designerCanvas.containerBoundingRect.height, 'svg-transparent', this._rect4, OverlayLayer.Normal);
|
|
64
|
+
}
|
|
65
|
+
refresh() {
|
|
66
|
+
this.dispose();
|
|
67
|
+
}
|
|
68
|
+
dispose() {
|
|
69
|
+
this._resizeObserver.disconnect();
|
|
70
|
+
this._removeAllOverlays();
|
|
71
|
+
this.extendedItem.element.removeAttribute('contenteditable');
|
|
72
|
+
this.designerCanvas.eatEvents = null;
|
|
73
|
+
this.extendedItem.updateChildrenFromNodesChildren();
|
|
74
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
|
|
75
|
+
}
|
|
76
|
+
_clickOutside(e) {
|
|
77
|
+
this.extendedItem.innerHTML = this.extendedItem.element.innerHTML;
|
|
78
|
+
//TODO: the extension should remove itself, not the doubleclick extensions
|
|
79
|
+
// cause the extension could be applied in another way
|
|
80
|
+
//maybe also the removal is maybe not desired (for example if it's permanet extension)
|
|
81
|
+
this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -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 EditTextWithStyloExtensionProvider 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
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EditTextWithStyloExtension } from "./EditTextWithStyloExtension.js";
|
|
2
|
+
import { css } from "@node-projects/base-custom-webcomponent";
|
|
3
|
+
export class EditTextWithStyloExtensionProvider {
|
|
4
|
+
shouldExtend(extensionManager, designerView, designItem) {
|
|
5
|
+
if (designItem.name === 'button' || designItem.name === 'input')
|
|
6
|
+
return false;
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
getExtension(extensionManager, designerView, designItem) {
|
|
10
|
+
return new EditTextWithStyloExtension(extensionManager, designerView, designItem);
|
|
11
|
+
}
|
|
12
|
+
style = css `
|
|
13
|
+
.svg-transparent { stroke: none; fill: transparent; pointer-events: all; }
|
|
14
|
+
`;
|
|
15
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { NamedTools } from "../tools/NamedTools.js";
|
|
1
2
|
import { AbstractExtension } from './AbstractExtension';
|
|
2
3
|
export class ElementDragTitleExtension extends AbstractExtension {
|
|
3
4
|
_rect;
|
|
@@ -29,8 +30,7 @@ export class ElementDragTitleExtension extends AbstractExtension {
|
|
|
29
30
|
_pointerEvent(event) {
|
|
30
31
|
event.preventDefault();
|
|
31
32
|
event.stopPropagation();
|
|
32
|
-
|
|
33
|
-
this.designerCanvas._pointerEventHandlerBound(event, this.extendedItem.element);
|
|
33
|
+
this.designerCanvas.serviceContainer.designerTools.get(NamedTools.Pointer).pointerEventHandler(this.designerCanvas, event, this.extendedItem.element);
|
|
34
34
|
}
|
|
35
35
|
dispose() {
|
|
36
36
|
this._removeAllOverlays();
|
|
@@ -4,8 +4,6 @@ import { EventNames } from "../../../../enums/EventNames";
|
|
|
4
4
|
import { createPathD } from "../../../helper/PathDataPolyfill";
|
|
5
5
|
import { ContextMenuHelper } from "../../../helper/contextMenu/ContextMenuHelper";
|
|
6
6
|
export class PathExtension extends AbstractExtension {
|
|
7
|
-
//private _itemRect: DOMRect;
|
|
8
|
-
//private _svgRect: DOMRect;
|
|
9
7
|
_lastPos;
|
|
10
8
|
_parentRect;
|
|
11
9
|
_startPos;
|
|
@@ -16,8 +14,6 @@ export class PathExtension extends AbstractExtension {
|
|
|
16
14
|
super(extensionManager, designerView, extendedItem);
|
|
17
15
|
}
|
|
18
16
|
extend() {
|
|
19
|
-
//this._itemRect = this.extendedItem.element.getBoundingClientRect();
|
|
20
|
-
//this._svgRect = (<SVGGeometryElement>this.extendedItem.element).ownerSVGElement.getBoundingClientRect();
|
|
21
17
|
this._parentRect = this.extendedItem.element.parentElement.getBoundingClientRect();
|
|
22
18
|
this._pathdata = this.extendedItem.node.getPathData({ normalize: false });
|
|
23
19
|
for (let p of this._pathdata) {
|
|
@@ -117,6 +113,7 @@ export class PathExtension extends AbstractExtension {
|
|
|
117
113
|
break;
|
|
118
114
|
case EventNames.PointerUp:
|
|
119
115
|
event.target.releasePointerCapture(event.pointerId);
|
|
116
|
+
this.designerCanvas.removeCurrentPointerEventHandler();
|
|
120
117
|
this._startPos = null;
|
|
121
118
|
this._circlePos = null;
|
|
122
119
|
this._lastPos = null;
|
|
@@ -125,7 +122,7 @@ export class PathExtension extends AbstractExtension {
|
|
|
125
122
|
}
|
|
126
123
|
}
|
|
127
124
|
_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');
|
|
125
|
+
let circle = this._drawCircle((this._parentRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor + x, (this._parentRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor + y, 5, 'svg-path');
|
|
129
126
|
let circlePos = { x: x, y: y };
|
|
130
127
|
const items = [];
|
|
131
128
|
const pidx = this._pathdata.indexOf(p);
|
|
@@ -60,7 +60,7 @@ export class ResizeExtension extends AbstractExtension {
|
|
|
60
60
|
}
|
|
61
61
|
_pointerActionTypeResize(circle, event, actionMode = 'se-resize') {
|
|
62
62
|
event.stopPropagation();
|
|
63
|
-
const currentPoint = this.designerCanvas.getNormalizedEventCoordinates(event);
|
|
63
|
+
const currentPoint = this.designerCanvas.getNormalizedEventCoordinates(event);
|
|
64
64
|
switch (event.type) {
|
|
65
65
|
case EventNames.PointerDown:
|
|
66
66
|
const cx = parseFloat(circle.getAttribute('cx'));
|
|
@@ -135,6 +135,7 @@ export class ResizeExtension extends AbstractExtension {
|
|
|
135
135
|
break;
|
|
136
136
|
case EventNames.PointerUp:
|
|
137
137
|
event.target.releasePointerCapture(event.pointerId);
|
|
138
|
+
this.designerCanvas.removeCurrentPointerEventHandler();
|
|
138
139
|
let cg = this.extendedItem.openGroup("Resize Elements", this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
|
|
139
140
|
this.extendedItem.setStyle('width', this.extendedItem.element.style.width);
|
|
140
141
|
this.extendedItem.setStyle('height', this.extendedItem.element.style.height);
|
|
@@ -43,6 +43,7 @@ export class TransformOriginExtension extends AbstractExtension {
|
|
|
43
43
|
break;
|
|
44
44
|
case EventNames.PointerUp:
|
|
45
45
|
event.target.releasePointerCapture(event.pointerId);
|
|
46
|
+
this.designerCanvas.removeCurrentPointerEventHandler();
|
|
46
47
|
if (this._startPos) {
|
|
47
48
|
const dx = normalized.x - this._startPos.x;
|
|
48
49
|
const dy = normalized.y - this._startPos.y;
|
|
@@ -67,6 +67,7 @@ export class DrawEllipsisTool {
|
|
|
67
67
|
break;
|
|
68
68
|
case EventNames.PointerUp:
|
|
69
69
|
event.target.releasePointerCapture(event.pointerId);
|
|
70
|
+
designerCanvas.removeCurrentPointerEventHandler();
|
|
70
71
|
const rect = this._path.getBoundingClientRect();
|
|
71
72
|
designerCanvas.overlayLayer.removeOverlay(this._path);
|
|
72
73
|
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
@@ -50,6 +50,7 @@ export class DrawLineTool {
|
|
|
50
50
|
break;
|
|
51
51
|
case EventNames.PointerUp:
|
|
52
52
|
event.target.releasePointerCapture(event.pointerId);
|
|
53
|
+
designerCanvas.removeCurrentPointerEventHandler();
|
|
53
54
|
const rect = this._path.getBoundingClientRect();
|
|
54
55
|
designerCanvas.overlayLayer.removeOverlay(this._path);
|
|
55
56
|
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
@@ -82,6 +82,7 @@ export class DrawRectTool {
|
|
|
82
82
|
break;
|
|
83
83
|
case EventNames.PointerUp:
|
|
84
84
|
event.target.releasePointerCapture(event.pointerId);
|
|
85
|
+
designerCanvas.removeCurrentPointerEventHandler();
|
|
85
86
|
const rect = this._path.getBoundingClientRect();
|
|
86
87
|
designerCanvas.overlayLayer.removeOverlay(this._path);
|
|
87
88
|
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
@@ -24,22 +24,23 @@ export class MagicWandSelectorTool {
|
|
|
24
24
|
break;
|
|
25
25
|
case EventNames.PointerUp:
|
|
26
26
|
event.target.releasePointerCapture(event.pointerId);
|
|
27
|
+
designerCanvas.removeCurrentPointerEventHandler();
|
|
27
28
|
const elements = designerCanvas.rootDesignItem.element.querySelectorAll('*');
|
|
28
29
|
const inSelectionElements = [];
|
|
29
30
|
let point = designerCanvas.overlayLayer.createPoint();
|
|
30
31
|
for (let e of elements) {
|
|
31
|
-
let elementRect =
|
|
32
|
-
point.x = elementRect.
|
|
33
|
-
point.y = elementRect.
|
|
32
|
+
let elementRect = designerCanvas.getNormalizedElementCoordinates(e);
|
|
33
|
+
point.x = elementRect.x;
|
|
34
|
+
point.y = elementRect.y;
|
|
34
35
|
const p1 = this._path.isPointInFill(point) || this._path.isPointInStroke(point);
|
|
35
|
-
point.x = elementRect.
|
|
36
|
-
point.y = elementRect.
|
|
36
|
+
point.x = elementRect.x + elementRect.width;
|
|
37
|
+
point.y = elementRect.y;
|
|
37
38
|
const p2 = this._path.isPointInFill(point) || this._path.isPointInStroke(point);
|
|
38
|
-
point.x = elementRect.
|
|
39
|
-
point.y = elementRect.
|
|
39
|
+
point.x = elementRect.x;
|
|
40
|
+
point.y = elementRect.y + elementRect.height;
|
|
40
41
|
const p3 = this._path.isPointInFill(point) || this._path.isPointInStroke(point);
|
|
41
|
-
point.x = elementRect.
|
|
42
|
-
point.y = elementRect.
|
|
42
|
+
point.x = elementRect.x + elementRect.width;
|
|
43
|
+
point.y = elementRect.y + elementRect.height;
|
|
43
44
|
const p4 = this._path.isPointInFill(point) || this._path.isPointInStroke(point);
|
|
44
45
|
if (p1 && p2 && p3 && p4) {
|
|
45
46
|
const desItem = DesignItem.GetOrCreateDesignItem(e, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
|
|
@@ -37,6 +37,7 @@ export class PointerTool {
|
|
|
37
37
|
break;
|
|
38
38
|
case EventNames.PointerUp:
|
|
39
39
|
event.target.releasePointerCapture(event.pointerId);
|
|
40
|
+
designerCanvas.removeCurrentPointerEventHandler();
|
|
40
41
|
break;
|
|
41
42
|
}
|
|
42
43
|
if (!event.altKey)
|
|
@@ -189,7 +190,7 @@ export class PointerTool {
|
|
|
189
190
|
break;
|
|
190
191
|
}
|
|
191
192
|
}
|
|
192
|
-
else if (newContainerElement == this._actionStartedDesignItem.element) {
|
|
193
|
+
else if (newContainerElement == this._actionStartedDesignItem.element || newContainerElement == currentDesignItem.element) {
|
|
193
194
|
backupPEventsMap.set(newContainerElement, newContainerElement.style.pointerEvents);
|
|
194
195
|
newContainerElement.style.pointerEvents = 'none';
|
|
195
196
|
const old = newContainerElement;
|
|
@@ -197,6 +198,7 @@ export class PointerTool {
|
|
|
197
198
|
if (old === newContainerElement) {
|
|
198
199
|
newContainerElementDesignItem = null;
|
|
199
200
|
newContainerService = null;
|
|
201
|
+
newContainerElement = null;
|
|
200
202
|
break;
|
|
201
203
|
}
|
|
202
204
|
}
|
|
@@ -297,7 +299,7 @@ export class PointerTool {
|
|
|
297
299
|
}
|
|
298
300
|
case EventNames.PointerUp:
|
|
299
301
|
{
|
|
300
|
-
if (this._actionType == PointerActionType.DragOrSelect) {
|
|
302
|
+
if (!this._movedSinceStartedAction || this._actionType == PointerActionType.DragOrSelect) {
|
|
301
303
|
if (this._previousEventName == EventNames.PointerDown && !event.shiftKey && !event.ctrlKey)
|
|
302
304
|
designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([currentDesignItem]);
|
|
303
305
|
return;
|
|
@@ -46,22 +46,23 @@ export class RectangleSelectorTool {
|
|
|
46
46
|
break;
|
|
47
47
|
case EventNames.PointerUp:
|
|
48
48
|
event.target.releasePointerCapture(event.pointerId);
|
|
49
|
+
designerCanvas.removeCurrentPointerEventHandler();
|
|
49
50
|
const elements = designerCanvas.rootDesignItem.element.querySelectorAll('*');
|
|
50
51
|
const inSelectionElements = [];
|
|
51
52
|
let point = designerCanvas.overlayLayer.createPoint();
|
|
52
53
|
for (let e of elements) {
|
|
53
|
-
let elementRect =
|
|
54
|
-
point.x = elementRect.
|
|
55
|
-
point.y = elementRect.
|
|
54
|
+
let elementRect = designerCanvas.getNormalizedElementCoordinates(e);
|
|
55
|
+
point.x = elementRect.x;
|
|
56
|
+
point.y = elementRect.y;
|
|
56
57
|
const p1 = this._rect.isPointInFill(point);
|
|
57
|
-
point.x = elementRect.
|
|
58
|
-
point.y = elementRect.
|
|
58
|
+
point.x = elementRect.x + elementRect.width;
|
|
59
|
+
point.y = elementRect.y;
|
|
59
60
|
const p2 = p1 && this._rect.isPointInFill(point);
|
|
60
|
-
point.x = elementRect.
|
|
61
|
-
point.y = elementRect.
|
|
61
|
+
point.x = elementRect.x;
|
|
62
|
+
point.y = elementRect.y + elementRect.height;
|
|
62
63
|
const p3 = p2 && this._rect.isPointInFill(point);
|
|
63
|
-
point.x = elementRect.
|
|
64
|
-
point.y = elementRect.
|
|
64
|
+
point.x = elementRect.x + elementRect.width;
|
|
65
|
+
point.y = elementRect.y + elementRect.height;
|
|
65
66
|
const p4 = p3 && this._rect.isPointInFill(point);
|
|
66
67
|
if (p4) {
|
|
67
68
|
const desItem = DesignItem.GetOrCreateDesignItem(e, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
|
|
@@ -2,9 +2,16 @@ import { ServiceContainer } from '../../../services/ServiceContainer.js';
|
|
|
2
2
|
import { IDesignerCanvas } from '../IDesignerCanvas';
|
|
3
3
|
import { ITool } from './ITool';
|
|
4
4
|
export declare class ZoomTool implements ITool {
|
|
5
|
-
|
|
5
|
+
cursor: string;
|
|
6
|
+
private _rect;
|
|
7
|
+
private _startPoint;
|
|
8
|
+
private _endPoint;
|
|
9
|
+
private _pointerMovementTolerance;
|
|
10
|
+
private _zoomStepSize;
|
|
6
11
|
activated(serviceContainer: ServiceContainer): void;
|
|
7
12
|
pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
|
|
13
|
+
private _zoomOnto;
|
|
14
|
+
private _isPositionEqual;
|
|
8
15
|
keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
|
|
9
16
|
dispose(): void;
|
|
10
17
|
}
|