@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.
Files changed (55) hide show
  1. package/dist/elements/controls/PlainScrollbar.js +122 -116
  2. package/dist/elements/controls/SimpleSplitView.js +1 -1
  3. package/dist/elements/documentContainer.js +2 -0
  4. package/dist/elements/helper/ElementHelper.d.ts +1 -0
  5. package/dist/elements/helper/ElementHelper.js +10 -0
  6. package/dist/elements/item/DesignItem.d.ts +2 -0
  7. package/dist/elements/item/DesignItem.js +7 -0
  8. package/dist/elements/item/IDesignItem.d.ts +1 -0
  9. package/dist/elements/services/DefaultServiceBootstrap.js +0 -4
  10. package/dist/elements/services/ServiceContainer.d.ts +1 -3
  11. package/dist/elements/services/ServiceContainer.js +8 -3
  12. package/dist/elements/services/htmlParserService/NodeHtmlParserService.js +8 -0
  13. package/dist/elements/services/initializationService/DefaultIntializationService.js +12 -12
  14. package/dist/elements/services/instanceService/PrepareElementsForDesignerService.js +23 -23
  15. package/dist/elements/services/undoService/UndoService.js +3 -2
  16. package/dist/elements/services/undoService/transactionItems/InsertAction.js +0 -3
  17. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +8 -0
  18. package/dist/elements/widgets/designerView/designerCanvas.d.ts +13 -1
  19. package/dist/elements/widgets/designerView/designerCanvas.js +129 -39
  20. package/dist/elements/widgets/designerView/designerCanvas.ts.BASE.d.ts +92 -0
  21. package/dist/elements/widgets/designerView/designerCanvas.ts.BASE.js +734 -0
  22. package/dist/elements/widgets/designerView/designerCanvas.ts.LOCAL.d.ts +95 -0
  23. package/dist/elements/widgets/designerView/designerCanvas.ts.LOCAL.js +768 -0
  24. package/dist/elements/widgets/designerView/designerCanvas.ts.REMOTE.d.ts +94 -0
  25. package/dist/elements/widgets/designerView/designerCanvas.ts.REMOTE.js +745 -0
  26. package/dist/elements/widgets/designerView/designerView.js +19 -15
  27. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension copy.d.ts +17 -0
  28. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension copy.js +80 -0
  29. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +4 -2
  30. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.d.ts +9 -0
  31. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.js +11 -0
  32. package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.d.ts +20 -0
  33. package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js +83 -0
  34. package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.d.ts +10 -0
  35. package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.js +15 -0
  36. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.js +2 -2
  37. package/dist/elements/widgets/designerView/extensions/PathExtension.js +2 -5
  38. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +2 -1
  39. package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +1 -0
  40. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +1 -0
  41. package/dist/elements/widgets/designerView/tools/DrawLineTool.js +1 -0
  42. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +1 -0
  43. package/dist/elements/widgets/designerView/tools/DrawRectTool.js +1 -0
  44. package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +10 -9
  45. package/dist/elements/widgets/designerView/tools/PanTool.js +1 -0
  46. package/dist/elements/widgets/designerView/tools/PointerTool.js +4 -2
  47. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +10 -9
  48. package/dist/elements/widgets/designerView/tools/ZoomTool.d.ts +8 -1
  49. package/dist/elements/widgets/designerView/tools/ZoomTool.js +69 -0
  50. package/dist/elements/widgets/paletteView/paletteTreeView.js +5 -0
  51. package/dist/elements/widgets/treeView/treeView.js +1 -0
  52. package/dist/elements/widgets/treeView/treeViewExtended.js +21 -20
  53. package/dist/index.d.ts +4 -4
  54. package/dist/index.js +4 -3
  55. 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._designerCanvas.zoomFactor = zf;
239
- this._zoomInput.value = Math.round(zf * 100) + '%';
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???
@@ -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
+ }
@@ -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
+ }
@@ -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
+ }
@@ -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
- //@ts-ignore
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); //, this.extendedItem.element, event.type === 'pointerdown' ? null : this._initialPoint);
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");
@@ -70,6 +70,7 @@ export class DrawPathTool {
70
70
  break;
71
71
  case EventNames.PointerUp:
72
72
  event.target.releasePointerCapture(event.pointerId);
73
+ designerCanvas.removeCurrentPointerEventHandler();
73
74
  if (this._eventStarted && !this._pointerMoved) {
74
75
  this._p2pMode = true;
75
76
  }
@@ -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 = e.getBoundingClientRect();
32
- point.x = elementRect.left - designerCanvas.containerBoundingRect.left;
33
- point.y = elementRect.top - designerCanvas.containerBoundingRect.top;
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.left - designerCanvas.containerBoundingRect.left + elementRect.width;
36
- point.y = elementRect.top - designerCanvas.containerBoundingRect.top;
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.left - designerCanvas.containerBoundingRect.left;
39
- point.y = elementRect.top - designerCanvas.containerBoundingRect.top + elementRect.height;
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.left - designerCanvas.containerBoundingRect.left + elementRect.width;
42
- point.y = elementRect.top - designerCanvas.containerBoundingRect.top + elementRect.height;
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);
@@ -13,6 +13,7 @@ export class PanTool {
13
13
  break;
14
14
  case EventNames.PointerUp:
15
15
  event.target.releasePointerCapture(event.pointerId);
16
+ designerCanvas.removeCurrentPointerEventHandler();
16
17
  break;
17
18
  }
18
19
  }
@@ -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 = e.getBoundingClientRect();
54
- point.x = elementRect.left - designerCanvas.containerBoundingRect.left;
55
- point.y = elementRect.top - designerCanvas.containerBoundingRect.top;
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.left - designerCanvas.containerBoundingRect.left + elementRect.width;
58
- point.y = elementRect.top - designerCanvas.containerBoundingRect.top;
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.left - designerCanvas.containerBoundingRect.left;
61
- point.y = elementRect.top - designerCanvas.containerBoundingRect.top + elementRect.height;
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.left - designerCanvas.containerBoundingRect.left + elementRect.width;
64
- point.y = elementRect.top - designerCanvas.containerBoundingRect.top + elementRect.height;
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
- readonly cursor: string;
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
  }