@node-projects/web-component-designer 0.0.93 → 0.0.94

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 (41) hide show
  1. package/dist/commandHandling/CommandType.d.ts +2 -0
  2. package/dist/commandHandling/CommandType.js +2 -0
  3. package/dist/elements/documentContainer.js +2 -2
  4. package/dist/elements/services/DefaultServiceBootstrap.js +3 -0
  5. package/dist/elements/services/modelCommandService/DefaultModelCommandService.js +50 -0
  6. package/dist/elements/services/placementService/DefaultPlacementService.js +2 -2
  7. package/dist/elements/widgets/bindableObjectsBrowser/bindable-objects-browser.d.ts +0 -1
  8. package/dist/elements/widgets/bindableObjectsBrowser/bindable-objects-browser.js +1 -2
  9. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +5 -2
  10. package/dist/elements/widgets/designerView/designerCanvas.d.ts +14 -6
  11. package/dist/elements/widgets/designerView/designerCanvas.js +82 -126
  12. package/dist/elements/widgets/designerView/designerView.js +8 -3
  13. package/dist/elements/widgets/designerView/extensions/PathExtension.js +0 -1
  14. package/dist/elements/widgets/designerView/extensions/PathExtensionProvider.js +2 -1
  15. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +0 -1
  16. package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +0 -1
  17. package/dist/elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js +4 -2
  18. package/dist/elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js +1 -1
  19. package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.d.ts +8 -0
  20. package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.js +12 -0
  21. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +2 -1
  22. package/dist/elements/widgets/designerView/tools/DrawLineTool.js +2 -1
  23. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +5 -2
  24. package/dist/elements/widgets/designerView/tools/DrawRectTool.js +2 -1
  25. package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +2 -1
  26. package/dist/elements/widgets/designerView/tools/PanTool.js +2 -1
  27. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -2
  28. package/dist/elements/widgets/designerView/tools/PointerTool.js +58 -122
  29. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +2 -1
  30. package/dist/elements/widgets/miniatureView/html-2-canvas-miniature-view.js +1 -0
  31. package/dist/elements/widgets/paletteView/paletteTreeView.d.ts +0 -1
  32. package/dist/elements/widgets/paletteView/paletteTreeView.js +1 -2
  33. package/dist/elements/widgets/paletteView/paletteView.js +1 -0
  34. package/dist/elements/widgets/propertyGrid/PropertyGrid.js +1 -0
  35. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyList.js +1 -0
  36. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +1 -0
  37. package/dist/elements/widgets/treeView/treeView.js +1 -0
  38. package/dist/elements/widgets/treeView/treeViewExtended.js +5 -0
  39. package/dist/index.d.ts +1 -0
  40. package/dist/index.js +1 -0
  41. package/package.json +4 -4
@@ -5,6 +5,8 @@ export declare enum CommandType {
5
5
  'delete' = "delete",
6
6
  'undo' = "undo",
7
7
  'redo' = "redo",
8
+ 'rotateCounterClockwise' = "rotateCounterClockwise",
9
+ 'rotateClockwise' = "rotateClockwise",
8
10
  'selectAll' = "selectAll",
9
11
  'moveToFront' = "moveToFront",
10
12
  'moveForward' = "moveForward",
@@ -6,6 +6,8 @@ export var CommandType;
6
6
  CommandType["delete"] = "delete";
7
7
  CommandType["undo"] = "undo";
8
8
  CommandType["redo"] = "redo";
9
+ CommandType["rotateCounterClockwise"] = "rotateCounterClockwise";
10
+ CommandType["rotateClockwise"] = "rotateClockwise";
9
11
  CommandType["selectAll"] = "selectAll";
10
12
  CommandType["moveToFront"] = "moveToFront";
11
13
  CommandType["moveForward"] = "moveForward";
@@ -128,13 +128,13 @@ export class DocumentContainer extends BaseCustomWebComponentLazyAppend {
128
128
  this.codeView.dispose();
129
129
  }
130
130
  executeCommand(command) {
131
- if (this._tabControl.selectedIndex === 0)
131
+ if (this._tabControl.selectedIndex === 0 || this._tabControl.selectedIndex === 2)
132
132
  this.designerView.executeCommand(command);
133
133
  else if (this._tabControl.selectedIndex === 1)
134
134
  this.codeView.executeCommand(command);
135
135
  }
136
136
  canExecuteCommand(command) {
137
- if (this._tabControl.selectedIndex === 0)
137
+ if (this._tabControl.selectedIndex === 0 || this._tabControl.selectedIndex === 2)
138
138
  return this.designerView.canExecuteCommand(command);
139
139
  else if (this._tabControl.selectedIndex === 1)
140
140
  return this.codeView.canExecuteCommand(command);
@@ -55,6 +55,7 @@ import { RectContextMenu } from '../widgets/designerView/extensions/contextMenu/
55
55
  import { PathContextMenu } from '../widgets/designerView/extensions/contextMenu/PathContextMenu.js';
56
56
  import { SeperatorContextMenu } from '../widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js';
57
57
  import { ZoomToElementContextMenu } from '../widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js';
58
+ import { RotateLeftAndRight } from '../widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.js';
58
59
  export function createDefaultServiceContainer() {
59
60
  let serviceContainer = new ServiceContainer();
60
61
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -127,6 +128,8 @@ export function createDefaultServiceContainer() {
127
128
  serviceContainer.designerContextMenuExtensions = [
128
129
  new CopyPasteContextMenu(),
129
130
  new SeperatorContextMenu(),
131
+ new RotateLeftAndRight(),
132
+ new SeperatorContextMenu(),
130
133
  new ZoomToElementContextMenu(),
131
134
  new SeperatorContextMenu(),
132
135
  new ZMoveContextMenu(),
@@ -69,6 +69,56 @@ export class DefaultModelCommandService {
69
69
  }
70
70
  grp.commit();
71
71
  }
72
+ else if (command.type == CommandType.rotateCounterClockwise) {
73
+ const grp = designerCanvas.instanceServiceContainer.selectionService.primarySelection.openGroup('rotateCounterClockwise');
74
+ var trf = designerCanvas.instanceServiceContainer.selectionService.primarySelection.styles.get('transform');
75
+ let degree = 0;
76
+ let rotation = "";
77
+ if (trf != null) {
78
+ try {
79
+ if (trf.includes('-'))
80
+ degree = parseInt(trf.match(/\d+/)[0]) * -1;
81
+ else
82
+ degree = parseInt(trf.match(/\d+/)[0]);
83
+ rotation = "rotate(" + (degree - 90) + "deg)";
84
+ }
85
+ catch {
86
+ rotation = "rotate(-90deg)";
87
+ }
88
+ }
89
+ else {
90
+ rotation = "rotate(-90deg)";
91
+ }
92
+ for (let s of designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
93
+ s.setStyle('transform', rotation);
94
+ }
95
+ grp.commit();
96
+ }
97
+ else if (command.type == CommandType.rotateClockwise) {
98
+ const grp = designerCanvas.instanceServiceContainer.selectionService.primarySelection.openGroup('rotateClockwise');
99
+ var trf = designerCanvas.instanceServiceContainer.selectionService.primarySelection.styles.get('transform');
100
+ let degree = 0;
101
+ let rotation = "";
102
+ if (trf != null) {
103
+ try {
104
+ if (trf.includes('-'))
105
+ degree = parseInt(trf.match(/\d+/)[0]) * -1;
106
+ else
107
+ degree = parseInt(trf.match(/\d+/)[0]);
108
+ rotation = "rotate(" + (degree + 90) + "deg)";
109
+ }
110
+ catch {
111
+ rotation = "rotate(90deg)";
112
+ }
113
+ }
114
+ else {
115
+ rotation = "rotate(90deg)";
116
+ }
117
+ for (let s of designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
118
+ s.setStyle('transform', rotation);
119
+ }
120
+ grp.commit();
121
+ }
72
122
  else
73
123
  return null;
74
124
  return true;
@@ -19,7 +19,7 @@ export class DefaultPlacementService {
19
19
  return true;
20
20
  }
21
21
  getElementOffset(container, designItem) {
22
- return container.element.getBoundingClientRect();
22
+ return container.instanceServiceContainer.designerCanvas.getNormalizedElementCoordinates(container.element);
23
23
  }
24
24
  calculateTrack(event, placementView, startPoint, offsetInControl, newPoint, item) {
25
25
  let trackX = newPoint.x - startPoint.x;
@@ -79,7 +79,7 @@ export class DefaultPlacementService {
79
79
  //maybe a undo actions returns itself or an id so it could be changed?
80
80
  let track = this.calculateTrack(event, placementView, startPoint, offsetInControl, newPoint, items[0]);
81
81
  let filterdItems = filterChildPlaceItems(items);
82
- //TODO: -> what is if a transform already exists -> backup existing style.?
82
+ //TODO: -> maybe get existing transform via getComputedStyle???
83
83
  for (const designItem of filterdItems) {
84
84
  const newTransform = 'translate(' + track.x + 'px, ' + track.y + 'px)';
85
85
  combineTransforms(placementView.transformHelperElement, designItem.element, designItem.styles.get('transform'), newTransform);
@@ -5,7 +5,6 @@ export declare class BindableObjectsBrowser extends BaseCustomWebComponentLazyAp
5
5
  private _tree;
6
6
  static readonly style: CSSStyleSheet;
7
7
  constructor();
8
- ready(): Promise<void>;
9
8
  initialize(serviceContainer: ServiceContainer): Promise<void>;
10
9
  private lazyLoad;
11
10
  }
@@ -29,6 +29,7 @@ export class BindableObjectsBrowser extends BaseCustomWebComponentLazyAppend {
29
29
  `;
30
30
  constructor() {
31
31
  super();
32
+ this._restoreCachedInititalValues();
32
33
  //@ts-ignore
33
34
  import("jquery.fancytree/dist/skin-win8/ui.fancytree.css", { assert: { type: 'css' } }).then(x => this.shadowRoot.adoptedStyleSheets = [x.default, this.constructor.style]);
34
35
  this._treeDiv = document.createElement('div');
@@ -36,8 +37,6 @@ export class BindableObjectsBrowser extends BaseCustomWebComponentLazyAppend {
36
37
  this._treeDiv.style.overflow = 'auto';
37
38
  this._treeDiv.setAttribute('id', 'tree');
38
39
  this.shadowRoot.appendChild(this._treeDiv);
39
- }
40
- async ready() {
41
40
  $(this._treeDiv).fancytree({
42
41
  icon: false,
43
42
  extensions: ['dnd5'],
@@ -10,6 +10,7 @@ import { OverlayLayerView } from "./overlayLayerView";
10
10
  import { IRect } from "../../../interfaces/IRect.js";
11
11
  import { TypedEvent } from "@node-projects/base-custom-webcomponent";
12
12
  import { ISize } from "../../../interfaces/ISize.js";
13
+ import { ITool } from "./tools/ITool.js";
13
14
  export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
14
15
  readonly serviceContainer: ServiceContainer;
15
16
  readonly instanceServiceContainer: InstanceServiceContainer;
@@ -32,12 +33,14 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
32
33
  getNormalizedEventCoordinates(event: MouseEvent): IPoint;
33
34
  getViewportCoordinates(event: MouseEvent): IPoint;
34
35
  getNormalizedElementCoordinates(element: Element): IRect;
35
- removeCurrentPointerEventHandler(): any;
36
+ captureActiveTool(tool: ITool): any;
37
+ releaseActiveTool(): any;
36
38
  getDesignSurfaceDimensions(): ISize;
37
39
  getNormalizedOffsetInElement(event: MouseEvent, element: Element): IPoint;
38
40
  getElementAtPoint(point: IPoint, ignoreElementCallback?: (element: HTMLElement) => boolean): any;
39
41
  elementFromPoint(x: number, y: number): Element;
40
- getItemsBelowMouse(event: MouseEvent): Element[];
42
+ elementsFromPoint(x: number, y: number): Element[];
43
+ showHoverExtension(element: Element): any;
41
44
  zoomTowardsPoint(point: IPoint, scalechange: number): void;
42
45
  zoomPoint(canvasPoint: IPoint, newZoom: number): void;
43
46
  zoomOntoRectangle(startPoint: IPoint, endPoint: IPoint): void;
@@ -14,12 +14,14 @@ import { OverlayLayer } from "./extensions/OverlayLayer";
14
14
  import { OverlayLayerView } from './overlayLayerView';
15
15
  import { IRect } from "../../../interfaces/IRect.js";
16
16
  import { ISize } from "../../../interfaces/ISize.js";
17
+ import { ITool } from "./tools/ITool.js";
17
18
  export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend implements IDesignerCanvas, IPlacementView, IUiCommandHandler {
18
19
  serviceContainer: ServiceContainer;
19
20
  instanceServiceContainer: InstanceServiceContainer;
20
21
  containerBoundingRect: DOMRect;
21
22
  outerRect: DOMRect;
22
23
  clickOverlay: HTMLDivElement;
24
+ private _activeTool;
23
25
  gridSize: number;
24
26
  alignOnGrid: boolean;
25
27
  alignOnSnap: boolean;
@@ -32,7 +34,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
32
34
  private _scaleFactor;
33
35
  private _canvasOffset;
34
36
  private _currentContextMenu;
35
- private _lastPointerDownHandler;
36
37
  get zoomFactor(): number;
37
38
  set zoomFactor(value: number);
38
39
  get scaleFactor(): number;
@@ -71,7 +72,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
71
72
  handlePasteCommand(): Promise<void>;
72
73
  handleDeleteCommand(): void;
73
74
  initialize(serviceContainer: ServiceContainer): void;
74
- elementFromPoint(x: number, y: number): Element;
75
75
  connectedCallback(): void;
76
76
  private _zoomFactorChanged;
77
77
  _updateTransform(): void;
@@ -85,20 +85,28 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
85
85
  private _onDblClick;
86
86
  private onKeyUp;
87
87
  private onKeyDown;
88
+ /**
89
+ * Converts the Event x/y coordinates, to the mouse position on the canvas
90
+ */
88
91
  getNormalizedEventCoordinates(event: MouseEvent): IPoint;
89
- convertEventToViewPortCoordinates(point: IPoint): IPoint;
92
+ /**
93
+ * Converts the Event x/y coordinates, to the mouse position in the viewport
94
+ */
90
95
  getViewportCoordinates(event: MouseEvent): IPoint;
91
96
  getNormalizedElementCoordinates(element: Element): IRect;
92
97
  getNormalizedOffsetInElement(event: MouseEvent, element: Element): IPoint;
98
+ elementFromPoint(x: number, y: number): Element;
99
+ elementsFromPoint(x: number, y: number): Element[];
93
100
  getElementAtPoint(point: IPoint, ignoreElementCallback?: (element: HTMLElement) => boolean): HTMLElement;
94
- _rect: SVGRectElement;
101
+ showHoverExtension(element: Element): void;
95
102
  private _pointerEventHandler;
96
- removeCurrentPointerEventHandler(): void;
103
+ captureActiveTool(tool: ITool): void;
104
+ releaseActiveTool(): void;
97
105
  private _fillCalculationrects;
98
106
  addOverlay(element: SVGGraphicsElement, overlayLayer?: OverlayLayer): void;
99
107
  removeOverlay(element: SVGGraphicsElement): void;
100
- getItemsBelowMouse(event: MouseEvent): Element[];
101
108
  zoomOntoRectangle(startPoint: IPoint, endPoint: IPoint): void;
102
109
  zoomPoint(canvasPoint: IPoint, newZoom: number): void;
110
+ private zoomConvertEventToViewPortCoordinates;
103
111
  zoomTowardsPoint(canvasPoint: IPoint, newZoom: number): void;
104
112
  }
@@ -27,6 +27,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
27
27
  containerBoundingRect;
28
28
  outerRect;
29
29
  clickOverlay;
30
+ _activeTool;
30
31
  // IPlacementView
31
32
  gridSize = 10;
32
33
  alignOnGrid = false;
@@ -40,7 +41,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
40
41
  _scaleFactor = 1; //if scale css property is used this need to be the scale value
41
42
  _canvasOffset = { x: 0, y: 0 };
42
43
  _currentContextMenu;
43
- _lastPointerDownHandler;
44
44
  get zoomFactor() {
45
45
  return this._zoomFactor;
46
46
  }
@@ -158,6 +158,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
158
158
  _onDblClickBound;
159
159
  constructor() {
160
160
  super();
161
+ this._restoreCachedInititalValues();
161
162
  this._canvas = this._getDomElement('node-projects-designer-canvas-canvas');
162
163
  this._canvasContainer = this._getDomElement('node-projects-designer-canvas-canvasContainer');
163
164
  this._outercanvas2 = this._getDomElement('node-projects-designer-canvas-outercanvas2');
@@ -362,15 +363,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
362
363
  this.addDesignItems(parser.createDesignItems(children, this.serviceContainer, this.instanceServiceContainer));
363
364
  }
364
365
  }
365
- elementFromPoint(x, y) {
366
- this.clickOverlay.style.pointerEvents = 'none';
367
- //@ts-ignore
368
- let element = this.shadowRoot.elementFromPoint(x, y);
369
- if (element === this.clickOverlay)
370
- element = this._canvas;
371
- this.clickOverlay.style.pointerEvents = 'auto';
372
- return element;
373
- }
374
366
  connectedCallback() {
375
367
  if (!this._firstConnect) {
376
368
  this._firstConnect = true;
@@ -592,6 +584,9 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
592
584
  }
593
585
  event.preventDefault();
594
586
  }
587
+ /**
588
+ * Converts the Event x/y coordinates, to the mouse position on the canvas
589
+ */
595
590
  getNormalizedEventCoordinates(event) {
596
591
  const offsetOfOuterX = (event.clientX - this.outerRect.x) / this.zoomFactor;
597
592
  const offsetOfCanvasX = this.containerBoundingRect.x - this.outerRect.x;
@@ -602,14 +597,9 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
602
597
  y: offsetOfOuterY - offsetOfCanvasY / this.zoomFactor
603
598
  };
604
599
  }
605
- convertEventToViewPortCoordinates(point) {
606
- const offsetOfCanvasX = this.containerBoundingRect.x - this.outerRect.x;
607
- const offsetOfCanvasY = this.containerBoundingRect.y - this.outerRect.y;
608
- return {
609
- x: (point.x + offsetOfCanvasX / this.zoomFactor) * this.zoomFactor,
610
- y: (point.y + offsetOfCanvasY / this.zoomFactor) * this.zoomFactor
611
- };
612
- }
600
+ /**
601
+ * Converts the Event x/y coordinates, to the mouse position in the viewport
602
+ */
613
603
  getViewportCoordinates(event) {
614
604
  return {
615
605
  x: (event.clientX - this.outerRect.x),
@@ -625,51 +615,67 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
625
615
  const normEl = this.getNormalizedElementCoordinates(element);
626
616
  return { x: normEvt.x - normEl.x, y: normEvt.y - normEl.y };
627
617
  }
618
+ //todo: remove
619
+ elementFromPoint(x, y) {
620
+ let elements = this.shadowRoot.elementsFromPoint(x, y);
621
+ let element = elements[0];
622
+ if (element === this.clickOverlay)
623
+ element = elements[1];
624
+ if (element === this.clickOverlay)
625
+ element = this._canvas;
626
+ return element;
627
+ }
628
+ elementsFromPoint(x, y) {
629
+ let retVal = [];
630
+ let elements = this.shadowRoot.elementsFromPoint(x, y);
631
+ for (let e of elements) {
632
+ if (e == this.clickOverlay)
633
+ continue;
634
+ if (e == this.overlayLayer)
635
+ continue;
636
+ if (e.getRootNode() !== this.shadowRoot)
637
+ continue;
638
+ retVal.push(e);
639
+ if (e === this._canvas)
640
+ break;
641
+ }
642
+ return retVal;
643
+ }
628
644
  getElementAtPoint(point, ignoreElementCallback) {
629
- let backupPEventsMap = new Map();
630
- let currentElement = this.elementFromPoint(point.x, point.y);
631
- this.clickOverlay.style.pointerEvents = 'none';
632
- let lastElement = null;
633
- try {
634
- while (currentElement != null) {
635
- if (currentElement == lastElement) {
636
- currentElement = null;
637
- break;
638
- }
639
- lastElement = currentElement;
640
- if (currentElement == this._canvas) {
641
- break;
642
- }
643
- if (currentElement === this.overlayLayer) {
644
- currentElement = this.overlayLayer.elementFromPoint(point.x, point.y);
645
- break;
646
- }
647
- if (!ignoreElementCallback || !ignoreElementCallback(currentElement)) {
648
- break;
649
- }
650
- backupPEventsMap.set(currentElement, currentElement.style.pointerEvents);
651
- currentElement.style.pointerEvents = 'none';
652
- if (currentElement.shadowRoot) {
653
- for (let e of currentElement.shadowRoot.querySelectorAll('*')) {
654
- if (!backupPEventsMap.has(e)) {
655
- if (e.style)
656
- backupPEventsMap.set(e, e.style.pointerEvents);
657
- e.style.pointerEvents = 'none';
658
- }
659
- }
660
- }
661
- currentElement = this.elementFromPoint(point.x, point.y);
645
+ const elements = this.shadowRoot.elementsFromPoint(point.x, point.y);
646
+ let currentElement = null;
647
+ for (let i = 0; i < elements.length; i++) {
648
+ currentElement = elements[i];
649
+ if (currentElement == this.clickOverlay) {
650
+ currentElement = null;
651
+ continue;
662
652
  }
663
- }
664
- finally {
665
- for (let e of backupPEventsMap.entries()) {
666
- e[0].style.pointerEvents = e[1];
653
+ if (currentElement == this.overlayLayer) {
654
+ currentElement = null;
655
+ continue;
656
+ }
657
+ if (ignoreElementCallback && ignoreElementCallback(currentElement)) {
658
+ currentElement = null;
659
+ continue;
660
+ }
661
+ if (currentElement.getRootNode() !== this.shadowRoot) {
662
+ currentElement = null;
663
+ continue;
667
664
  }
668
- this.clickOverlay.style.pointerEvents = 'auto';
665
+ break;
669
666
  }
670
667
  return currentElement;
671
668
  }
672
- _rect;
669
+ showHoverExtension(element) {
670
+ const currentDesignItem = DesignItem.GetOrCreateDesignItem(element, this.serviceContainer, this.instanceServiceContainer);
671
+ if (this._lastHoverDesignItem != currentDesignItem) {
672
+ if (this._lastHoverDesignItem)
673
+ this.extensionManager.removeExtension(this._lastHoverDesignItem, ExtensionType.MouseOver);
674
+ if (currentDesignItem && currentDesignItem != this.rootDesignItem && DomHelper.getHost(element.parentNode) !== this.overlayLayer)
675
+ this.extensionManager.applyExtension(currentDesignItem, ExtensionType.MouseOver);
676
+ this._lastHoverDesignItem = currentDesignItem;
677
+ }
678
+ }
673
679
  _pointerEventHandler(event, forceElement = null) {
674
680
  this._fillCalculationrects();
675
681
  if (this._pointerextensions) {
@@ -683,56 +689,32 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
683
689
  currentElement = forceElement;
684
690
  else {
685
691
  currentElement = this.serviceContainer.elementAtPointService.getElementAtPoint(this, { x: event.x, y: event.y });
686
- if (currentElement === this._outercanvas2 || currentElement === this.overlayLayer || !currentElement) {
692
+ if (!currentElement) {
687
693
  currentElement = this._canvas;
688
694
  }
689
- } /* else {
690
- if (!DesignerCanvas.hasOrIsParent(currentElement, this._canvas))
691
- return;
692
- }*/
693
- if (this._lastPointerDownHandler) {
694
- try {
695
- this._lastPointerDownHandler(event);
696
- }
697
- catch { }
698
- if (event.type == EventNames.PointerUp)
699
- this._lastPointerDownHandler = null;
700
- return;
701
695
  }
702
- if (currentElement instanceof SVGGraphicsElement && currentElement?.ownerSVGElement?.parentNode?.host == this.overlayLayer) {
703
- this.clickOverlay.style.cursor = getComputedStyle(currentElement).cursor;
704
- if (event.type == EventNames.PointerDown) {
705
- this._lastPointerDownHandler = (evt) => currentElement.dispatchEvent(new evt.constructor(evt.type, evt));
706
- }
707
- currentElement.dispatchEvent(new event.constructor(event.type, event));
696
+ if (this._activeTool) {
697
+ this._activeTool.pointerEventHandler(this, event, currentElement);
708
698
  return;
709
699
  }
710
700
  this.clickOverlay.style.cursor = this._canvas.style.cursor;
711
- //TODO: remove duplication when tool refactoring starts
712
- //this._fillCalculationrects();
713
701
  const currentDesignItem = DesignItem.GetOrCreateDesignItem(currentElement, this.serviceContainer, this.instanceServiceContainer);
714
- if (this._lastHoverDesignItem != currentDesignItem) {
715
- if (this._lastHoverDesignItem)
716
- this.extensionManager.removeExtension(this._lastHoverDesignItem, ExtensionType.MouseOver);
717
- if (currentDesignItem && currentDesignItem != this.rootDesignItem && DomHelper.getHost(currentElement.parentNode) !== this.overlayLayer)
718
- this.extensionManager.applyExtension(currentDesignItem, ExtensionType.MouseOver);
719
- this._lastHoverDesignItem = currentDesignItem;
720
- }
702
+ this.showHoverExtension(currentDesignItem.element);
703
+ //TODO: needed ??
721
704
  if (currentElement && DomHelper.getHost(currentElement.parentNode) === this.overlayLayer) {
722
705
  if (this.eatEvents)
723
706
  return;
724
707
  currentElement = this.instanceServiceContainer.selectionService.primarySelection?.element ?? this._canvas;
725
708
  }
726
- this._fillCalculationrects();
727
709
  let tool = this.serviceContainer.globalContext.tool ?? this.serviceContainer.designerTools.get(NamedTools.Pointer);
728
710
  this._canvas.style.cursor = tool.cursor;
729
- if (event.type == EventNames.PointerDown) {
730
- this._lastPointerDownHandler = (evt) => tool.pointerEventHandler(this, evt, currentElement);
731
- }
732
711
  tool.pointerEventHandler(this, event, currentElement);
733
712
  }
734
- removeCurrentPointerEventHandler() {
735
- this._lastPointerDownHandler = null;
713
+ captureActiveTool(tool) {
714
+ this._activeTool = tool;
715
+ }
716
+ releaseActiveTool() {
717
+ this._activeTool = null;
736
718
  }
737
719
  _fillCalculationrects() {
738
720
  this.containerBoundingRect = this._canvasContainer.getBoundingClientRect();
@@ -744,40 +726,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
744
726
  removeOverlay(element) {
745
727
  this.overlayLayer.removeOverlay(element);
746
728
  }
747
- getItemsBelowMouse(event) {
748
- const lstEl = [];
749
- //search for containers below mouse cursor.
750
- //to do this, we need to disable pointer events for each in a loop and search wich element is there
751
- let backupPEventsMap = new Map();
752
- this.clickOverlay.style.pointerEvents = 'none';
753
- try {
754
- let el = this.elementFromPoint(event.x, event.y);
755
- backupPEventsMap.set(el, el.style.pointerEvents);
756
- el.style.pointerEvents = 'none';
757
- if (el !== this.rootDesignItem.element) {
758
- while (el != null) {
759
- if (el === this.rootDesignItem.element)
760
- break;
761
- if (el !== this.overlayLayer && el.parentElement !== this.overlayLayer && el.getRootNode() === this.shadowRoot)
762
- lstEl.push(el);
763
- if (!backupPEventsMap.has(el))
764
- backupPEventsMap.set(el, el.style.pointerEvents);
765
- el.style.pointerEvents = 'none';
766
- const oldEl = el;
767
- el = this.elementFromPoint(event.x, event.y);
768
- if (oldEl === el)
769
- break;
770
- }
771
- }
772
- }
773
- finally {
774
- for (let e of backupPEventsMap.entries()) {
775
- e[0].style.pointerEvents = e[1];
776
- }
777
- this.clickOverlay.style.pointerEvents = 'auto';
778
- }
779
- return lstEl;
780
- }
781
729
  zoomOntoRectangle(startPoint, endPoint) {
782
730
  let rect = {
783
731
  x: startPoint.x < endPoint.x ? startPoint.x : endPoint.x,
@@ -802,9 +750,17 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
802
750
  };
803
751
  this.canvasOffset = newCanvasOffset;
804
752
  }
753
+ zoomConvertEventToViewPortCoordinates(point) {
754
+ const offsetOfCanvasX = this.containerBoundingRect.x - this.outerRect.x;
755
+ const offsetOfCanvasY = this.containerBoundingRect.y - this.outerRect.y;
756
+ return {
757
+ x: (point.x + offsetOfCanvasX / this.zoomFactor) * this.zoomFactor,
758
+ y: (point.y + offsetOfCanvasY / this.zoomFactor) * this.zoomFactor
759
+ };
760
+ }
805
761
  zoomTowardsPoint(canvasPoint, newZoom) {
806
762
  const scaleChange = newZoom / this.zoomFactor;
807
- const point = this.convertEventToViewPortCoordinates(canvasPoint);
763
+ const point = this.zoomConvertEventToViewPortCoordinates(canvasPoint);
808
764
  const newCanvasOffset = {
809
765
  x: -(point.x * (scaleChange - 1) + scaleChange * -this.canvasOffsetUnzoomed.x),
810
766
  y: -(point.y * (scaleChange - 1) + scaleChange * -this.canvasOffsetUnzoomed.y)
@@ -138,6 +138,7 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
138
138
  </div>`;
139
139
  constructor() {
140
140
  super();
141
+ this._restoreCachedInititalValues();
141
142
  const outer = this._getDomElement('outer');
142
143
  this._designerCanvas = new DesignerCanvas();
143
144
  this._designerCanvas.id = "canvas";
@@ -250,15 +251,19 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
250
251
  event.preventDefault();
251
252
  if (event.ctrlKey) {
252
253
  let zf = this._designerCanvas.zoomFactor;
253
- zf += event.deltaY * -0.001; //deltamode = 0
254
+ const wheel = event.deltaY < 0 ? 1 : (-1);
255
+ zf *= Math.exp(wheel * 0.2);
254
256
  if (zf < 0.02)
255
257
  zf = 0.02;
256
258
  const vp = this.designerCanvas.getNormalizedEventCoordinates(event);
257
259
  this.designerCanvas.zoomTowardsPoint(vp, zf);
258
260
  }
261
+ else if (event.shiftKey) {
262
+ this._sHor.value += event.deltaY / 10000;
263
+ this._onScrollbar(null);
264
+ }
259
265
  else {
260
- this._sHor.value += event.deltaX / 1000;
261
- this._sVert.value += event.deltaY / 1000;
266
+ this._sVert.value += event.deltaY / 10000;
262
267
  this._onScrollbar(null);
263
268
  }
264
269
  }
@@ -113,7 +113,6 @@ export class PathExtension extends AbstractExtension {
113
113
  break;
114
114
  case EventNames.PointerUp:
115
115
  event.target.releasePointerCapture(event.pointerId);
116
- this.designerCanvas.removeCurrentPointerEventHandler();
117
116
  this._startPos = null;
118
117
  this._circlePos = null;
119
118
  this._lastPos = null;
@@ -7,8 +7,9 @@ export class PathExtensionProvider {
7
7
  designItem.node instanceof SVGEllipseElement ||
8
8
  designItem.node instanceof SVGLineElement ||
9
9
  designItem.node instanceof SVGPolylineElement ||
10
- designItem.node instanceof SVGPolygonElement)
10
+ designItem.node instanceof SVGPolygonElement) {
11
11
  return true;
12
+ }
12
13
  return false;
13
14
  }
14
15
  getExtension(extensionManager, designerView, designItem) {
@@ -138,7 +138,6 @@ export class ResizeExtension extends AbstractExtension {
138
138
  break;
139
139
  case EventNames.PointerUp:
140
140
  event.target.releasePointerCapture(event.pointerId);
141
- this.designerCanvas.removeCurrentPointerEventHandler();
142
141
  let cg = this.extendedItem.openGroup("Resize Elements", this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
143
142
  this.extendedItem.setStyle('width', this.extendedItem.element.style.width);
144
143
  this.extendedItem.setStyle('height', this.extendedItem.element.style.height);
@@ -43,7 +43,6 @@ export class TransformOriginExtension extends AbstractExtension {
43
43
  break;
44
44
  case EventNames.PointerUp:
45
45
  event.target.releasePointerCapture(event.pointerId);
46
- this.designerCanvas.removeCurrentPointerEventHandler();
47
46
  if (this._startPos) {
48
47
  const dx = normalized.x - this._startPos.x;
49
48
  const dy = normalized.y - this._startPos.y;
@@ -2,8 +2,10 @@ import { TransformOriginExtension } from "./TransformOriginExtension";
2
2
  import { css } from "@node-projects/base-custom-webcomponent";
3
3
  export class TransformOriginExtensionProvider {
4
4
  shouldExtend(extensionManager, designerView, designItem) {
5
- if (designItem.node instanceof HTMLElement || (designItem.node instanceof SVGElement && designItem.node.localName === 'svg'))
6
- return true;
5
+ if (designItem.node instanceof HTMLElement || (designItem.node instanceof SVGElement && designItem.node.localName === 'svg')) {
6
+ let r = designItem.element.getBoundingClientRect();
7
+ return r.width > 10 && r.height > 10;
8
+ }
7
9
  return false;
8
10
  }
9
11
  getExtension(extensionManager, designerView, designItem) {
@@ -4,7 +4,7 @@ export class ItemsBelowContextMenu {
4
4
  return initiator == 'designer';
5
5
  }
6
6
  provideContextMenuItems(event, designerCanvas, designItem) {
7
- const lstItems = designerCanvas.getItemsBelowMouse(event);
7
+ const lstItems = designerCanvas.elementsFromPoint(event.x, event.y);
8
8
  if (lstItems.length > 0) {
9
9
  //TODO: create a submenu 'select items below...'
10
10
  return [...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (' + x.id + ')' : ''), action: () => this._select(designerCanvas, x) }))];
@@ -0,0 +1,8 @@
1
+ import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../../IDesignerCanvas";
4
+ import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
5
+ export declare class RotateLeftAndRight implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ }