@node-projects/web-component-designer 0.0.82 → 0.0.83

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 (45) hide show
  1. package/dist/elements/services/DefaultServiceBootstrap.js +4 -2
  2. package/dist/elements/widgets/codeView/code-view-code-mirror.js +1 -1
  3. package/dist/elements/widgets/designerView/designerCanvas.js +5 -4
  4. package/dist/elements/widgets/designerView/designerView.js +4 -1
  5. package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +5 -4
  6. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +41 -15
  7. package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +2 -2
  8. package/dist/elements/widgets/designerView/extensions/IframeExtension.d.ts +11 -0
  9. package/dist/elements/widgets/designerView/extensions/IframeExtension.js +46 -0
  10. package/dist/elements/widgets/designerView/extensions/IframeExtensionProvider.d.ts +9 -0
  11. package/dist/elements/widgets/designerView/extensions/IframeExtensionProvider.js +9 -0
  12. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.d.ts +1 -1
  13. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.js +2 -2
  14. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.d.ts +2 -2
  15. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.js +3 -3
  16. package/dist/elements/widgets/designerView/extensions/PathExtension.d.ts +2 -0
  17. package/dist/elements/widgets/designerView/extensions/PathExtension.js +42 -7
  18. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +11 -3
  19. package/dist/elements/widgets/designerView/extensions/ResizeExtensionProvider.js +2 -1
  20. package/dist/elements/widgets/designerView/tools/DrawElementTool.d.ts +1 -0
  21. package/dist/elements/widgets/designerView/tools/DrawElementTool.js +1 -0
  22. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.d.ts +1 -0
  23. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +1 -0
  24. package/dist/elements/widgets/designerView/tools/DrawLineTool.d.ts +1 -0
  25. package/dist/elements/widgets/designerView/tools/DrawLineTool.js +1 -0
  26. package/dist/elements/widgets/designerView/tools/DrawPathTool.d.ts +1 -0
  27. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +1 -0
  28. package/dist/elements/widgets/designerView/tools/DrawRectTool.d.ts +1 -0
  29. package/dist/elements/widgets/designerView/tools/DrawRectTool.js +1 -0
  30. package/dist/elements/widgets/designerView/tools/ITool.d.ts +1 -0
  31. package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.d.ts +1 -0
  32. package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +1 -0
  33. package/dist/elements/widgets/designerView/tools/PanTool.d.ts +1 -0
  34. package/dist/elements/widgets/designerView/tools/PanTool.js +1 -0
  35. package/dist/elements/widgets/designerView/tools/PickColorTool.d.ts +1 -0
  36. package/dist/elements/widgets/designerView/tools/PickColorTool.js +1 -0
  37. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -0
  38. package/dist/elements/widgets/designerView/tools/PointerTool.js +1 -0
  39. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.d.ts +1 -0
  40. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +1 -0
  41. package/dist/elements/widgets/designerView/tools/TextTool.d.ts +1 -0
  42. package/dist/elements/widgets/designerView/tools/TextTool.js +1 -0
  43. package/dist/elements/widgets/designerView/tools/ZoomTool.d.ts +1 -0
  44. package/dist/elements/widgets/designerView/tools/ZoomTool.js +1 -0
  45. package/package.json +3 -3
@@ -54,6 +54,7 @@ import { DrawLineTool } from '../widgets/designerView/tools/DrawLineTool.js';
54
54
  import { HtmlWriterService } from './htmlWriterService/HtmlWriterService.js';
55
55
  import { RectContextMenu } from '../widgets/designerView/extensions/contextMenu/RectContextMenu.js';
56
56
  import { PathContextMenu } from '../widgets/designerView/extensions/contextMenu/PathContextMenu.js';
57
+ import { IframeExtensionProvider } from '../widgets/designerView/extensions/IframeExtensionProvider.js';
57
58
  export function createDefaultServiceContainer() {
58
59
  let serviceContainer = new ServiceContainer();
59
60
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -76,8 +77,9 @@ export function createDefaultServiceContainer() {
76
77
  serviceContainer.register("modelCommandService", new DefaultModelCommandService());
77
78
  serviceContainer.register("demoProviderService", new DemoProviderService());
78
79
  serviceContainer.designerExtensions.set(ExtensionType.Permanent, [
79
- new ResizeExtensionProvider(false),
80
- new InvisibleDivExtensionProvider()
80
+ // new ResizeExtensionProvider(false),
81
+ new InvisibleDivExtensionProvider(),
82
+ new IframeExtensionProvider()
81
83
  ]);
82
84
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
83
85
  new PrimarySelectionDefaultExtensionProvider(),
@@ -20,7 +20,7 @@ export class CodeViewCodeMirror extends BaseCustomWebComponentLazyAppend {
20
20
  constructor() {
21
21
  super();
22
22
  //@ts-ignore
23
- import("/codemirror/lib/codemirror.css", { assert: { type: 'css' } }).then(x => this.shadowRoot.adoptedStyleSheets = [x.default, this.constructor.style]);
23
+ import("./codemirror/lib/codemirror.css", { assert: { type: 'css' } }).then(x => this.shadowRoot.adoptedStyleSheets = [x.default, this.constructor.style]);
24
24
  this.style.display = 'block';
25
25
  this._editor = this._getDomElement('textarea');
26
26
  }
@@ -138,10 +138,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
138
138
  this._canvas = this._getDomElement('node-projects-designer-canvas-canvas');
139
139
  this._canvasContainer = this._getDomElement('node-projects-designer-canvas-canvasContainer');
140
140
  this._outercanvas2 = this._getDomElement('node-projects-designer-canvas-outercanvas2');
141
- this.instanceServiceContainer = new InstanceServiceContainer(this);
142
- this.instanceServiceContainer.register("undoService", new UndoService(this));
143
- this.instanceServiceContainer.register("selectionService", new SelectionService);
144
- this.extensionManager = new ExtensionManager(this);
145
141
  this._onKeyDownBound = this.onKeyDown.bind(this);
146
142
  this._onKeyUpBound = this.onKeyUp.bind(this);
147
143
  this._onDblClickBound = this._onDblClick.bind(this);
@@ -307,8 +303,12 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
307
303
  }
308
304
  initialize(serviceContainer) {
309
305
  this.serviceContainer = serviceContainer;
306
+ this.instanceServiceContainer = new InstanceServiceContainer(this);
307
+ this.instanceServiceContainer.register("undoService", new UndoService(this));
308
+ this.instanceServiceContainer.register("selectionService", new SelectionService);
310
309
  this.rootDesignItem = DesignItem.GetOrCreateDesignItem(this._canvas, this.serviceContainer, this.instanceServiceContainer);
311
310
  this.instanceServiceContainer.register("contentService", new ContentService(this.rootDesignItem));
311
+ this.extensionManager = new ExtensionManager(this);
312
312
  this.overlayLayer = new OverlayLayerView(serviceContainer);
313
313
  this.overlayLayer.style.pointerEvents = 'none';
314
314
  this._canvasContainer.appendChild(this.overlayLayer);
@@ -364,6 +364,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
364
364
  this.snapLines.clearSnaplines();
365
365
  }
366
366
  setDesignItems(designItems) {
367
+ this._fillCalculationrects();
367
368
  this.instanceServiceContainer.undoService.clear();
368
369
  this.overlayLayer.removeAllOverlays();
369
370
  DomHelper.removeAllChildnodes(this.overlayLayer);
@@ -68,6 +68,7 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
68
68
  background-color:rgba(164,206,249,.6);
69
69
  }
70
70
  #outer {
71
+ user-select: none;
71
72
  display: flex;
72
73
  flex-direction: column;
73
74
  width: 100%;
@@ -274,7 +275,9 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
274
275
  }
275
276
  getHTML(designItemsAssignmentList) {
276
277
  //this.instanceServiceContainer.selectionService.setSelectedElements(null);
277
- return DomConverter.ConvertToString([...this._designerCanvas.rootDesignItem.children()], designItemsAssignmentList);
278
+ if (this._designerCanvas.rootDesignItem.childCount > 0)
279
+ return DomConverter.ConvertToString(Array.from(this._designerCanvas.rootDesignItem.children()), designItemsAssignmentList);
280
+ return '';
278
281
  }
279
282
  async parseHTML(html) {
280
283
  const parserService = this.serviceContainer.htmlParserService;
@@ -3,11 +3,12 @@ import { IDesignerCanvas } from "../IDesignerCanvas";
3
3
  import { ExtensionType } from './ExtensionType';
4
4
  import { IExtensionManager } from "./IExtensionManger";
5
5
  export declare class ExtensionManager implements IExtensionManager {
6
- designerView: IDesignerCanvas;
7
- constructor(designerView: IDesignerCanvas);
6
+ designerCanvas: IDesignerCanvas;
7
+ constructor(designerCanvas: IDesignerCanvas);
8
+ private _contentChanged;
8
9
  private _selectedElementsChanged;
9
- applyExtension(designItem: IDesignItem, extensionType: ExtensionType): void;
10
- applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType): void;
10
+ applyExtension(designItem: IDesignItem, extensionType: ExtensionType, recursive?: boolean): void;
11
+ applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, recursive?: boolean): void;
11
12
  removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): void;
12
13
  removeExtensions(designItems: IDesignItem[], extensionType?: ExtensionType): void;
13
14
  refreshExtension(designItem: IDesignItem, extensionType?: ExtensionType): void;
@@ -1,16 +1,32 @@
1
1
  import { DesignItem } from "../../../item/DesignItem";
2
2
  import { ExtensionType } from './ExtensionType';
3
3
  export class ExtensionManager {
4
- designerView;
5
- constructor(designerView) {
6
- this.designerView = designerView;
7
- designerView.instanceServiceContainer.selectionService.onSelectionChanged.on(this._selectedElementsChanged.bind(this));
8
- //TODO: Create Permanent Extensions. We need a Event for new DesignItem Added and Removed from DOM
4
+ designerCanvas;
5
+ constructor(designerCanvas) {
6
+ this.designerCanvas = designerCanvas;
7
+ designerCanvas.instanceServiceContainer.selectionService.onSelectionChanged.on(this._selectedElementsChanged.bind(this));
8
+ designerCanvas.instanceServiceContainer.contentService.onContentChanged.on(this._contentChanged.bind(this));
9
+ }
10
+ _contentChanged(contentChanged) {
11
+ switch (contentChanged.changeType) {
12
+ case 'added':
13
+ this.applyExtensions(contentChanged.designItems, ExtensionType.Permanent, true);
14
+ break;
15
+ case 'moved':
16
+ this.refreshExtensions(contentChanged.designItems, ExtensionType.Permanent);
17
+ break;
18
+ case 'parsed':
19
+ this.applyExtensions(Array.from(this.designerCanvas.rootDesignItem.children()), ExtensionType.Permanent, true);
20
+ break;
21
+ case 'removed':
22
+ this.removeExtensions(contentChanged.designItems, ExtensionType.Permanent);
23
+ break;
24
+ }
9
25
  }
10
26
  _selectedElementsChanged(selectionChangedEvent) {
11
27
  if (selectionChangedEvent.oldSelectedElements && selectionChangedEvent.oldSelectedElements.length) {
12
28
  if (selectionChangedEvent.oldSelectedElements[0].parent) {
13
- const primaryContainer = DesignItem.GetOrCreateDesignItem(selectionChangedEvent.oldSelectedElements[0].parent.element, this.designerView.serviceContainer, this.designerView.instanceServiceContainer);
29
+ const primaryContainer = DesignItem.GetOrCreateDesignItem(selectionChangedEvent.oldSelectedElements[0].parent.element, this.designerCanvas.serviceContainer, this.designerCanvas.instanceServiceContainer);
14
30
  this.removeExtension(primaryContainer, ExtensionType.PrimarySelectionContainer);
15
31
  this.removeExtension(selectionChangedEvent.oldSelectedElements[0], ExtensionType.PrimarySelection);
16
32
  this.removeExtensions(selectionChangedEvent.oldSelectedElements, ExtensionType.Selection);
@@ -19,21 +35,21 @@ export class ExtensionManager {
19
35
  if (selectionChangedEvent.selectedElements && selectionChangedEvent.selectedElements.length) {
20
36
  this.applyExtensions(selectionChangedEvent.selectedElements, ExtensionType.Selection);
21
37
  this.applyExtension(selectionChangedEvent.selectedElements[0], ExtensionType.PrimarySelection);
22
- const primaryContainer = DesignItem.GetOrCreateDesignItem(selectionChangedEvent.selectedElements[0].parent.element, this.designerView.serviceContainer, this.designerView.instanceServiceContainer);
38
+ const primaryContainer = DesignItem.GetOrCreateDesignItem(selectionChangedEvent.selectedElements[0].parent.element, this.designerCanvas.serviceContainer, this.designerCanvas.instanceServiceContainer);
23
39
  this.applyExtension(primaryContainer, ExtensionType.PrimarySelectionContainer);
24
40
  }
25
41
  this.refreshExtensions(selectionChangedEvent.selectedElements);
26
42
  }
27
- applyExtension(designItem, extensionType) {
43
+ applyExtension(designItem, extensionType, recursive = false) {
28
44
  if (designItem) {
29
- const extProv = this.designerView.serviceContainer.designerExtensions.get(extensionType);
45
+ const extProv = this.designerCanvas.serviceContainer.designerExtensions.get(extensionType);
30
46
  if (extProv) {
31
47
  for (let e of extProv) {
32
- if (e.shouldExtend(this, this.designerView, designItem)) {
48
+ if (e.shouldExtend(this, this.designerCanvas, designItem)) {
33
49
  let appE = designItem.appliedDesignerExtensions.get(extensionType);
34
50
  if (!appE)
35
51
  appE = [];
36
- const ext = e.getExtension(this, this.designerView, designItem);
52
+ const ext = e.getExtension(this, this.designerCanvas, designItem);
37
53
  try {
38
54
  ext.extend();
39
55
  }
@@ -45,19 +61,24 @@ export class ExtensionManager {
45
61
  }
46
62
  }
47
63
  }
64
+ if (recursive) {
65
+ for (const d of designItem.children()) {
66
+ this.applyExtension(d, extensionType, recursive);
67
+ }
68
+ }
48
69
  }
49
70
  }
50
- applyExtensions(designItems, extensionType) {
71
+ applyExtensions(designItems, extensionType, recursive = false) {
51
72
  if (designItems) {
52
- const extProv = this.designerView.serviceContainer.designerExtensions.get(extensionType);
73
+ const extProv = this.designerCanvas.serviceContainer.designerExtensions.get(extensionType);
53
74
  if (extProv) {
54
75
  for (let e of extProv) {
55
76
  for (let i of designItems) {
56
- if (e.shouldExtend(this, this.designerView, i)) {
77
+ if (e.shouldExtend(this, this.designerCanvas, i)) {
57
78
  let appE = i.appliedDesignerExtensions.get(extensionType);
58
79
  if (!appE)
59
80
  appE = [];
60
- const ext = e.getExtension(this, this.designerView, i);
81
+ const ext = e.getExtension(this, this.designerCanvas, i);
61
82
  try {
62
83
  ext.extend();
63
84
  }
@@ -70,6 +91,11 @@ export class ExtensionManager {
70
91
  }
71
92
  }
72
93
  }
94
+ if (recursive) {
95
+ for (const d of designItems) {
96
+ this.applyExtensions(Array.from(d.children()), extensionType, recursive);
97
+ }
98
+ }
73
99
  }
74
100
  }
75
101
  removeExtension(designItem, extensionType) {
@@ -1,8 +1,8 @@
1
1
  import { IDesignItem } from "../../../item/IDesignItem";
2
2
  import { ExtensionType } from './ExtensionType';
3
3
  export interface IExtensionManager {
4
- applyExtension(designItem: IDesignItem, extensionType: ExtensionType): any;
5
- applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType): any;
4
+ applyExtension(designItem: IDesignItem, extensionType: ExtensionType, recursive?: boolean): any;
5
+ applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, recursive?: boolean): any;
6
6
  removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): any;
7
7
  removeExtensions(designItems: IDesignItem[], extensionType?: ExtensionType): any;
8
8
  refreshExtension(designItem: IDesignItem, extensionType?: ExtensionType): any;
@@ -0,0 +1,11 @@
1
+ import { IDesignItem } from "../../../item/IDesignItem";
2
+ import { IDesignerCanvas } from "../IDesignerCanvas";
3
+ import { AbstractExtension } from './AbstractExtension';
4
+ import { IExtensionManager } from "./IExtensionManger";
5
+ export declare class IframeExtension extends AbstractExtension {
6
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
7
+ extend(): void;
8
+ _pointerEvent(event: PointerEvent): void;
9
+ refresh(): void;
10
+ dispose(): void;
11
+ }
@@ -0,0 +1,46 @@
1
+ import { AbstractExtension } from './AbstractExtension';
2
+ export class IframeExtension extends AbstractExtension {
3
+ constructor(extensionManager, designerView, extendedItem) {
4
+ super(extensionManager, designerView, extendedItem);
5
+ }
6
+ extend() {
7
+ // forward events to designer, so iframe is selectable via click
8
+ let iframe = this.extendedItem.element;
9
+ iframe.contentWindow.onpointerdown = (e) => this._pointerEvent(e);
10
+ iframe.contentWindow.onpointermove = (e) => this._pointerEvent(e);
11
+ iframe.contentWindow.onpointerup = (e) => this._pointerEvent(e);
12
+ }
13
+ _pointerEvent(event) {
14
+ const rect = this.extendedItem.element.getBoundingClientRect();
15
+ const that = this;
16
+ const handler = {
17
+ get(target, property) {
18
+ switch (property) {
19
+ case 'composedPath':
20
+ return () => [that.extendedItem.element];
21
+ case 'x':
22
+ case 'clientX':
23
+ case 'offsetX':
24
+ case 'pageX':
25
+ return target[property] + rect.x;
26
+ case 'y':
27
+ case 'clientY':
28
+ case 'offsetY':
29
+ case 'pageY':
30
+ return target[property] + rect.y;
31
+ }
32
+ return target[property];
33
+ }
34
+ };
35
+ event.preventDefault();
36
+ event.stopPropagation();
37
+ const proxy = new Proxy(event, handler);
38
+ //@ts-ignore
39
+ this.designerCanvas._pointerEventHandlerBound(proxy);
40
+ }
41
+ refresh() {
42
+ }
43
+ dispose() {
44
+ this._removeAllOverlays();
45
+ }
46
+ }
@@ -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 IframeExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ }
@@ -0,0 +1,9 @@
1
+ import { IframeExtension } from "./IframeExtension.js";
2
+ export class IframeExtensionProvider {
3
+ shouldExtend(extensionManager, designerCanvas, designItem) {
4
+ return designItem.name == 'iframe';
5
+ }
6
+ getExtension(extensionManager, designerCanvas, designItem) {
7
+ return new IframeExtension(extensionManager, designerCanvas, designItem);
8
+ }
9
+ }
@@ -4,7 +4,7 @@ import { AbstractExtension } from './AbstractExtension';
4
4
  import { IExtensionManager } from "./IExtensionManger";
5
5
  export declare class InvisibleDivExtension extends AbstractExtension {
6
6
  private _rect;
7
- constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
7
+ constructor(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, extendedItem: IDesignItem);
8
8
  extend(): void;
9
9
  refresh(): void;
10
10
  dispose(): void;
@@ -1,8 +1,8 @@
1
1
  import { AbstractExtension } from './AbstractExtension';
2
2
  export class InvisibleDivExtension extends AbstractExtension {
3
3
  _rect;
4
- constructor(extensionManager, designerView, extendedItem) {
5
- super(extensionManager, designerView, extendedItem);
4
+ constructor(extensionManager, designerCanvas, extendedItem) {
5
+ super(extensionManager, designerCanvas, extendedItem);
6
6
  }
7
7
  extend() {
8
8
  this.refresh();
@@ -4,7 +4,7 @@ import { IDesignerCanvas } from "../IDesignerCanvas";
4
4
  import { IDesignerExtension } from "./IDesignerExtension";
5
5
  import { IExtensionManager } from "./IExtensionManger";
6
6
  export declare class InvisibleDivExtensionProvider implements IDesignerExtensionProvider {
7
- shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
- getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
7
+ shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
9
  readonly style: CSSStyleSheet;
10
10
  }
@@ -1,15 +1,15 @@
1
1
  import { InvisibleDivExtension } from "./InvisibleDivExtension";
2
2
  import { css } from "@node-projects/base-custom-webcomponent";
3
3
  export class InvisibleDivExtensionProvider {
4
- shouldExtend(extensionManager, designerView, designItem) {
4
+ shouldExtend(extensionManager, designerCanvas, designItem) {
5
5
  if (designItem.name == 'div') {
6
6
  const st = window.getComputedStyle(designItem.element);
7
7
  return st.backgroundColor == 'rgba(0, 0, 0, 0)' && st.borderStyle == 'none';
8
8
  }
9
9
  return false;
10
10
  }
11
- getExtension(extensionManager, designerView, designItem) {
12
- return new InvisibleDivExtension(extensionManager, designerView, designItem);
11
+ getExtension(extensionManager, designerCanvas, designItem) {
12
+ return new InvisibleDivExtension(extensionManager, designerCanvas, designItem);
13
13
  }
14
14
  style = css `
15
15
  .svg-invisible-div { stroke: lightgray; fill: transparent; stroke-width: 1;
@@ -2,6 +2,7 @@ import { IDesignItem } from "../../../item/IDesignItem";
2
2
  import { IDesignerCanvas } from "../IDesignerCanvas";
3
3
  import { AbstractExtension } from "./AbstractExtension";
4
4
  import "../../../helper/PathDataPolyfill";
5
+ import { IPoint } from "../../../../interfaces/IPoint";
5
6
  import { IExtensionManager } from "./IExtensionManger";
6
7
  import { PathData } from "../../../helper/PathDataPolyfill";
7
8
  export declare class PathExtension extends AbstractExtension {
@@ -16,6 +17,7 @@ export declare class PathExtension extends AbstractExtension {
16
17
  pointerEvent(event: PointerEvent, circle: SVGCircleElement, p: PathData, index: number): void;
17
18
  _drawPathCircle(x: number, y: number, p: PathData, index: number): void;
18
19
  _drawPathLine(x1: number, y1: number, x2: number, y2: number): void;
20
+ _checkCircleIndex(p: PathData, circlePos: IPoint): boolean;
19
21
  refresh(): void;
20
22
  dispose(): void;
21
23
  }
@@ -125,6 +125,8 @@ export class PathExtension extends AbstractExtension {
125
125
  }
126
126
  }
127
127
  _drawPathCircle(x, y, p, index) {
128
+ let circle = this._drawCircle(this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y, 5, 'svg-path');
129
+ let circlePos = { x: x, y: y };
128
130
  const items = [];
129
131
  const pidx = this._pathdata.indexOf(p);
130
132
  items.push({
@@ -142,11 +144,19 @@ export class PathExtension extends AbstractExtension {
142
144
  this.extendedItem.setAttribute('d', createPathD(this._pathdata));
143
145
  }
144
146
  });
145
- if (pidx != 0) {
147
+ if (pidx != 0 && this._checkCircleIndex(p, circlePos)) {
146
148
  items.push({
147
149
  title: 'convert to quadratic bézier', action: () => {
148
- const p1x = this._pathdata[pidx - 1].values[0];
149
- const p1y = this._pathdata[pidx - 1].values[1];
150
+ let p1x = this._pathdata[pidx - 1].values[0];
151
+ let p1y = this._pathdata[pidx - 1].values[1];
152
+ if (this._pathdata[pidx - 1].type === 'C') {
153
+ p1x = this._pathdata[pidx - 1].values[4];
154
+ p1y = this._pathdata[pidx - 1].values[5];
155
+ }
156
+ else if (this._pathdata[pidx - 1].type === 'Q') {
157
+ p1x = this._pathdata[pidx - 1].values[2];
158
+ p1y = this._pathdata[pidx - 1].values[3];
159
+ }
150
160
  const p2x = this._pathdata[pidx].values[0];
151
161
  const p2y = this._pathdata[pidx].values[1];
152
162
  const mpx = (p2x + p1x) * 0.5;
@@ -164,11 +174,19 @@ export class PathExtension extends AbstractExtension {
164
174
  }
165
175
  });
166
176
  }
167
- if (pidx != 0) {
177
+ if (pidx != 0 && this._checkCircleIndex(p, circlePos)) {
168
178
  items.push({
169
179
  title: 'convert to cubic bézier', action: () => {
170
- const p1x = this._pathdata[pidx - 1].values[0];
171
- const p1y = this._pathdata[pidx - 1].values[1];
180
+ let p1x = this._pathdata[pidx - 1].values[0];
181
+ let p1y = this._pathdata[pidx - 1].values[1];
182
+ if (this._pathdata[pidx - 1].type === 'C') {
183
+ p1x = this._pathdata[pidx - 1].values[4];
184
+ p1y = this._pathdata[pidx - 1].values[5];
185
+ }
186
+ else if (this._pathdata[pidx - 1].type === 'Q') {
187
+ p1x = this._pathdata[pidx - 1].values[2];
188
+ p1y = this._pathdata[pidx - 1].values[3];
189
+ }
172
190
  const p2x = this._pathdata[pidx].values[0];
173
191
  const p2y = this._pathdata[pidx].values[1];
174
192
  const mpx = (p2x + p1x) * 0.5;
@@ -192,7 +210,6 @@ export class PathExtension extends AbstractExtension {
192
210
  }
193
211
  });
194
212
  }
195
- let circle = this._drawCircle(this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y, 5, 'svg-path');
196
213
  circle.addEventListener(EventNames.PointerDown, event => this.pointerEvent(event, circle, p, index));
197
214
  circle.addEventListener(EventNames.PointerMove, event => this.pointerEvent(event, circle, p, index));
198
215
  circle.addEventListener(EventNames.PointerUp, event => this.pointerEvent(event, circle, p, index));
@@ -204,6 +221,24 @@ export class PathExtension extends AbstractExtension {
204
221
  _drawPathLine(x1, y1, x2, y2) {
205
222
  this._drawLine(this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x1, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y1, this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x2, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y2, 'svg-path-line');
206
223
  }
224
+ _checkCircleIndex(p, circlePos) {
225
+ switch (p.type) {
226
+ case 'M':
227
+ case 'L':
228
+ if (p.values[0] == circlePos.x && p.values[1] == circlePos.y)
229
+ return true;
230
+ break;
231
+ case 'Q':
232
+ if (p.values[2] == circlePos.x && p.values[3] == circlePos.y)
233
+ return true;
234
+ break;
235
+ case 'C':
236
+ if (p.values[4] == circlePos.x && p.values[5] == circlePos.y)
237
+ return true;
238
+ break;
239
+ }
240
+ return false;
241
+ }
207
242
  refresh() {
208
243
  this._removeAllOverlays();
209
244
  this.extend();
@@ -19,6 +19,7 @@ export class ResizeExtension extends AbstractExtension {
19
19
  this.resizeAllSelected = resizeAllSelected;
20
20
  }
21
21
  extend() {
22
+ this.refresh();
22
23
  }
23
24
  refresh() {
24
25
  const rect = this.extendedItem.element.getBoundingClientRect();
@@ -69,9 +70,13 @@ export class ResizeExtension extends AbstractExtension {
69
70
  this._initialPoint = currentPoint;
70
71
  this._initialSizes = [];
71
72
  this._actionModeStarted = actionMode;
72
- for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
73
- let rect = designItem.element.getBoundingClientRect();
74
- this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
73
+ let rect = this.extendedItem.element.getBoundingClientRect();
74
+ this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
75
+ if (this.resizeAllSelected) {
76
+ for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
77
+ rect = designItem.element.getBoundingClientRect();
78
+ this._initialSizes.push({ width: rect.width / this.designerCanvas.scaleFactor, height: rect.height / this.designerCanvas.scaleFactor });
79
+ }
75
80
  }
76
81
  if (this.designerCanvas.alignOnSnap)
77
82
  this.designerCanvas.snapLines.calculateSnaplines(this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
@@ -90,6 +95,7 @@ export class ResizeExtension extends AbstractExtension {
90
95
  this.extendedItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
91
96
  if (this.resizeAllSelected) {
92
97
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
98
+ i++;
93
99
  if (designItem !== this.extendedItem) {
94
100
  designItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
95
101
  designItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
@@ -100,6 +106,7 @@ export class ResizeExtension extends AbstractExtension {
100
106
  case 's-resize':
101
107
  this.extendedItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
102
108
  if (this.resizeAllSelected) {
109
+ i++;
103
110
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
104
111
  if (designItem !== this.extendedItem) {
105
112
  designItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
@@ -110,6 +117,7 @@ export class ResizeExtension extends AbstractExtension {
110
117
  case 'e-resize':
111
118
  this.extendedItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
112
119
  if (this.resizeAllSelected) {
120
+ i++;
113
121
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
114
122
  if (designItem !== this.extendedItem) {
115
123
  designItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
@@ -1,12 +1,13 @@
1
1
  import { ResizeExtension } from "./ResizeExtension";
2
2
  import { css } from "@node-projects/base-custom-webcomponent";
3
+ import { NodeType } from "../../../item/NodeType.js";
3
4
  export class ResizeExtensionProvider {
4
5
  resizeAllSelected;
5
6
  constructor(resizeAllSelected = false) {
6
7
  this.resizeAllSelected = resizeAllSelected;
7
8
  }
8
9
  shouldExtend(extensionManager, designerView, designItem) {
9
- return true;
10
+ return designItem.nodeType == NodeType.Element;
10
11
  }
11
12
  getExtension(extensionManager, designerView, designItem) {
12
13
  return new ResizeExtension(extensionManager, designerView, designItem, this.resizeAllSelected);
@@ -12,6 +12,7 @@ export declare class DrawElementTool implements ITool {
12
12
  activated(serviceContainer: ServiceContainer): void;
13
13
  dispose(): void;
14
14
  pointerEventHandler(designerView: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
15
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
15
16
  private _onPointerDown;
16
17
  private _onPointerMove;
17
18
  private _onPointerUp;
@@ -29,6 +29,7 @@ export class DrawElementTool {
29
29
  break;
30
30
  }
31
31
  }
32
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
32
33
  async _onPointerDown(designerView, event) {
33
34
  event.preventDefault();
34
35
  this._startPosition = { x: event.x, y: event.y };
@@ -12,4 +12,5 @@ export declare class DrawEllipsisTool implements ITool {
12
12
  activated(serviceContainer: ServiceContainer): void;
13
13
  dispose(): void;
14
14
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
15
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
15
16
  }
@@ -88,4 +88,5 @@ export class DrawEllipsisTool {
88
88
  break;
89
89
  }
90
90
  }
91
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
91
92
  }
@@ -10,4 +10,5 @@ export declare class DrawLineTool implements ITool {
10
10
  activated(serviceContainer: ServiceContainer): void;
11
11
  dispose(): void;
12
12
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
13
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
13
14
  }
@@ -73,4 +73,5 @@ export class DrawLineTool {
73
73
  break;
74
74
  }
75
75
  }
76
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
76
77
  }
@@ -16,4 +16,5 @@ export declare class DrawPathTool implements ITool {
16
16
  activated(serviceContainer: ServiceContainer): void;
17
17
  dispose(): void;
18
18
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
19
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
19
20
  }
@@ -120,4 +120,5 @@ export class DrawPathTool {
120
120
  break;
121
121
  }
122
122
  }
123
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
123
124
  }
@@ -15,4 +15,5 @@ export declare class DrawRectTool implements ITool {
15
15
  activated(serviceContainer: ServiceContainer): void;
16
16
  dispose(): void;
17
17
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
18
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
18
19
  }
@@ -103,4 +103,5 @@ export class DrawRectTool {
103
103
  break;
104
104
  }
105
105
  }
106
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
106
107
  }
@@ -5,4 +5,5 @@ export interface ITool extends IDisposable {
5
5
  readonly cursor: string;
6
6
  activated(serviceContainer: ServiceContainer): any;
7
7
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): any;
8
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): any;
8
9
  }
@@ -6,6 +6,7 @@ export declare class MagicWandSelectorTool implements ITool {
6
6
  private _pathD;
7
7
  private _path;
8
8
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
9
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
9
10
  activated(serviceContainer: ServiceContainer): void;
10
11
  dispose(): void;
11
12
  }
@@ -54,6 +54,7 @@ export class MagicWandSelectorTool {
54
54
  break;
55
55
  }
56
56
  }
57
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
57
58
  activated(serviceContainer) {
58
59
  }
59
60
  dispose() {
@@ -4,6 +4,7 @@ import { ITool } from './ITool';
4
4
  export declare class PanTool implements ITool {
5
5
  readonly cursor: string;
6
6
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
7
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
7
8
  activated(serviceContainer: ServiceContainer): void;
8
9
  dispose(): void;
9
10
  }
@@ -16,6 +16,7 @@ export class PanTool {
16
16
  break;
17
17
  }
18
18
  }
19
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
19
20
  activated(serviceContainer) {
20
21
  }
21
22
  dispose() {
@@ -5,5 +5,6 @@ export declare class PickColorTool implements ITool {
5
5
  readonly cursor = "crosshair";
6
6
  activated(serviceContainer: ServiceContainer): Promise<void>;
7
7
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): Promise<void>;
8
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
8
9
  dispose(): void;
9
10
  }
@@ -14,6 +14,7 @@ export class PickColorTool {
14
14
  }
15
15
  async pointerEventHandler(designerCanvas, event, currentElement) {
16
16
  }
17
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
17
18
  dispose() {
18
19
  }
19
20
  }
@@ -20,4 +20,5 @@ export declare class PointerTool implements ITool {
20
20
  private _pointerActionTypeDrawSelection;
21
21
  private _resetPointerEventsForClickThrough;
22
22
  private _pointerActionTypeDragOrSelect;
23
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
23
24
  }
@@ -322,4 +322,5 @@ export class PointerTool {
322
322
  }
323
323
  }
324
324
  }
325
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
325
326
  }
@@ -7,5 +7,6 @@ export declare class RectangleSelectorTool implements ITool {
7
7
  private _initialPoint;
8
8
  activated(serviceContainer: ServiceContainer): void;
9
9
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
10
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
10
11
  dispose(): void;
11
12
  }
@@ -76,6 +76,7 @@ export class RectangleSelectorTool {
76
76
  break;
77
77
  }
78
78
  }
79
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
79
80
  dispose() {
80
81
  }
81
82
  }
@@ -8,4 +8,5 @@ export declare class TextTool implements ITool {
8
8
  readonly cursor = "text";
9
9
  private _text;
10
10
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
11
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
11
12
  }
@@ -30,4 +30,5 @@ export class TextTool {
30
30
  break;
31
31
  }
32
32
  }
33
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
33
34
  }
@@ -5,5 +5,6 @@ export declare class ZoomTool implements ITool {
5
5
  readonly cursor: string;
6
6
  activated(serviceContainer: ServiceContainer): void;
7
7
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
8
+ keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
8
9
  dispose(): void;
9
10
  }
@@ -4,6 +4,7 @@ export class ZoomTool {
4
4
  }
5
5
  pointerEventHandler(designerCanvas, event, currentElement) {
6
6
  }
7
+ keyboardEventHandler(designerCanvas, event, currentElement) { }
7
8
  dispose() {
8
9
  }
9
10
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.0.82",
4
+ "version": "0.0.83",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",
@@ -14,7 +14,7 @@
14
14
  },
15
15
  "dependencies": {
16
16
  "@node-projects/base-custom-webcomponent": "^0.5.0",
17
- "construct-style-sheets-polyfill": "^3.0.5"
17
+ "construct-style-sheets-polyfill": "^3.1.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@node-projects/lean-he-esm": "^3.3.0",
@@ -22,7 +22,7 @@
22
22
  "@types/codemirror": "^5.60.5",
23
23
  "@types/jquery": "^3.5.13",
24
24
  "@types/jquery.fancytree": "0.0.7",
25
- "ace-builds": "^1.4.13",
25
+ "ace-builds": "^1.4.14",
26
26
  "codemirror": "^5.65.1",
27
27
  "custom-elements-manifest": "^1.0.0",
28
28
  "esprima-next": "^5.8.1",