@node-projects/web-component-designer 0.0.92 → 0.0.95

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 (70) hide show
  1. package/assets/images/layout/ColorPickerTool.svg +21 -0
  2. package/assets/images/layout/DrawEllipTool.svg +13 -0
  3. package/assets/images/layout/DrawLineTool.svg +13 -0
  4. package/assets/images/layout/DrawPathTool.svg +32 -0
  5. package/assets/images/layout/DrawRectTool.svg +28 -0
  6. package/assets/images/layout/MagicWandTool.svg +14 -0
  7. package/assets/images/layout/PointerTool.svg +10 -0
  8. package/assets/images/layout/SelectRectTool.svg +9 -0
  9. package/assets/images/layout/TextBoxTool.svg +8 -0
  10. package/assets/images/layout/TextTool.svg +7 -0
  11. package/assets/images/layout/ZoomTool.svg +16 -0
  12. package/dist/Constants.d.ts +1 -1
  13. package/dist/Constants.js +4 -1
  14. package/dist/commandHandling/CommandType.d.ts +2 -0
  15. package/dist/commandHandling/CommandType.js +2 -0
  16. package/dist/elements/documentContainer.js +2 -2
  17. package/dist/elements/helper/contextMenu/ContextMenuHelper.js +2 -4
  18. package/dist/elements/services/DefaultServiceBootstrap.js +3 -0
  19. package/dist/elements/services/modelCommandService/DefaultModelCommandService.js +50 -0
  20. package/dist/elements/services/placementService/DefaultPlacementService.js +2 -2
  21. package/dist/elements/widgets/bindableObjectsBrowser/bindable-objects-browser.d.ts +0 -1
  22. package/dist/elements/widgets/bindableObjectsBrowser/bindable-objects-browser.js +1 -2
  23. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +5 -2
  24. package/dist/elements/widgets/designerView/designerCanvas.d.ts +14 -6
  25. package/dist/elements/widgets/designerView/designerCanvas.js +85 -127
  26. package/dist/elements/widgets/designerView/designerView.d.ts +4 -0
  27. package/dist/elements/widgets/designerView/designerView.js +59 -34
  28. package/dist/elements/widgets/designerView/extensions/PathExtension.js +0 -1
  29. package/dist/elements/widgets/designerView/extensions/PathExtensionProvider.js +2 -1
  30. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +0 -1
  31. package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +0 -1
  32. package/dist/elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js +4 -2
  33. package/dist/elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js +1 -1
  34. package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.d.ts +8 -0
  35. package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.js +12 -0
  36. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +2 -1
  37. package/dist/elements/widgets/designerView/tools/DrawLineTool.js +2 -1
  38. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +5 -2
  39. package/dist/elements/widgets/designerView/tools/DrawRectTool.js +2 -1
  40. package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +2 -1
  41. package/dist/elements/widgets/designerView/tools/NamedTools.d.ts +2 -1
  42. package/dist/elements/widgets/designerView/tools/NamedTools.js +1 -0
  43. package/dist/elements/widgets/designerView/tools/PanTool.js +2 -1
  44. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -2
  45. package/dist/elements/widgets/designerView/tools/PointerTool.js +58 -122
  46. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +2 -1
  47. package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolRenderer.d.ts +5 -0
  48. package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolRenderer.js +19 -0
  49. package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolbarPopup.d.ts +8 -0
  50. package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolbarPopup.js +37 -0
  51. package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolbarPopupToolSelect.d.ts +12 -0
  52. package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolbarPopupToolSelect.js +44 -0
  53. package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolsButtons.d.ts +32 -0
  54. package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolsButtons.js +96 -0
  55. package/dist/elements/widgets/designerView/tools/designerToolbarPopups/DrawToolPopup.d.ts +8 -0
  56. package/dist/elements/widgets/designerView/tools/designerToolbarPopups/DrawToolPopup.js +25 -0
  57. package/dist/elements/widgets/designerView/tools/designerToolsDock.d.ts +23 -0
  58. package/dist/elements/widgets/designerView/tools/designerToolsDock.js +115 -0
  59. package/dist/elements/widgets/miniatureView/html-2-canvas-miniature-view.js +1 -0
  60. package/dist/elements/widgets/paletteView/paletteTreeView.d.ts +0 -1
  61. package/dist/elements/widgets/paletteView/paletteTreeView.js +1 -2
  62. package/dist/elements/widgets/paletteView/paletteView.js +1 -0
  63. package/dist/elements/widgets/propertyGrid/PropertyGrid.js +1 -0
  64. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyList.js +1 -0
  65. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +1 -0
  66. package/dist/elements/widgets/treeView/treeView.js +1 -0
  67. package/dist/elements/widgets/treeView/treeViewExtended.js +5 -0
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.js +2 -0
  70. package/package.json +42 -42
@@ -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');
@@ -344,7 +345,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
344
345
  this.extensionManager = new ExtensionManager(this);
345
346
  this.overlayLayer = new OverlayLayerView(serviceContainer);
346
347
  this.overlayLayer.style.pointerEvents = 'none';
347
- this._canvasContainer.appendChild(this.overlayLayer);
348
+ this.clickOverlay.appendChild(this.overlayLayer);
348
349
  this.snapLines = new Snaplines(this.overlayLayer);
349
350
  this.snapLines.initialize(this.rootDesignItem);
350
351
  if (this.serviceContainer.designerPointerExtensions)
@@ -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;
@@ -401,6 +393,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
401
393
  this._scaleFactor = this._zoomFactor;
402
394
  this._canvasContainer.style.transform = 'scale(' + this._zoomFactor + ') translate(' + (isNaN(this._canvasOffset.x) ? '0' : this._canvasOffset.x) + 'px, ' + (isNaN(this._canvasOffset.y) ? '0' : this._canvasOffset.y) + 'px)';
403
395
  this._canvasContainer.style.transformOrigin = '0 0';
396
+ this.overlayLayer.style.transform = this._canvasContainer.style.transform;
397
+ this.overlayLayer.style.transformOrigin = '0 0';
404
398
  this.snapLines.clearSnaplines();
405
399
  }
406
400
  setDesignItems(designItems) {
@@ -592,6 +586,9 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
592
586
  }
593
587
  event.preventDefault();
594
588
  }
589
+ /**
590
+ * Converts the Event x/y coordinates, to the mouse position on the canvas
591
+ */
595
592
  getNormalizedEventCoordinates(event) {
596
593
  const offsetOfOuterX = (event.clientX - this.outerRect.x) / this.zoomFactor;
597
594
  const offsetOfCanvasX = this.containerBoundingRect.x - this.outerRect.x;
@@ -602,14 +599,9 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
602
599
  y: offsetOfOuterY - offsetOfCanvasY / this.zoomFactor
603
600
  };
604
601
  }
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
- }
602
+ /**
603
+ * Converts the Event x/y coordinates, to the mouse position in the viewport
604
+ */
613
605
  getViewportCoordinates(event) {
614
606
  return {
615
607
  x: (event.clientX - this.outerRect.x),
@@ -625,51 +617,67 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
625
617
  const normEl = this.getNormalizedElementCoordinates(element);
626
618
  return { x: normEvt.x - normEl.x, y: normEvt.y - normEl.y };
627
619
  }
620
+ //todo: remove
621
+ elementFromPoint(x, y) {
622
+ let elements = this.shadowRoot.elementsFromPoint(x, y);
623
+ let element = elements[0];
624
+ if (element === this.clickOverlay)
625
+ element = elements[1];
626
+ if (element === this.clickOverlay)
627
+ element = this._canvas;
628
+ return element;
629
+ }
630
+ elementsFromPoint(x, y) {
631
+ let retVal = [];
632
+ let elements = this.shadowRoot.elementsFromPoint(x, y);
633
+ for (let e of elements) {
634
+ if (e == this.clickOverlay)
635
+ continue;
636
+ if (e == this.overlayLayer)
637
+ continue;
638
+ if (e.getRootNode() !== this.shadowRoot)
639
+ continue;
640
+ retVal.push(e);
641
+ if (e === this._canvas)
642
+ break;
643
+ }
644
+ return retVal;
645
+ }
628
646
  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);
647
+ const elements = this.shadowRoot.elementsFromPoint(point.x, point.y);
648
+ let currentElement = null;
649
+ for (let i = 0; i < elements.length; i++) {
650
+ currentElement = elements[i];
651
+ if (currentElement == this.clickOverlay) {
652
+ currentElement = null;
653
+ continue;
662
654
  }
663
- }
664
- finally {
665
- for (let e of backupPEventsMap.entries()) {
666
- e[0].style.pointerEvents = e[1];
655
+ if (currentElement == this.overlayLayer) {
656
+ currentElement = null;
657
+ continue;
658
+ }
659
+ if (ignoreElementCallback && ignoreElementCallback(currentElement)) {
660
+ currentElement = null;
661
+ continue;
662
+ }
663
+ if (currentElement.getRootNode() !== this.shadowRoot) {
664
+ currentElement = null;
665
+ continue;
667
666
  }
668
- this.clickOverlay.style.pointerEvents = 'auto';
667
+ break;
669
668
  }
670
669
  return currentElement;
671
670
  }
672
- _rect;
671
+ showHoverExtension(element) {
672
+ const currentDesignItem = DesignItem.GetOrCreateDesignItem(element, this.serviceContainer, this.instanceServiceContainer);
673
+ if (this._lastHoverDesignItem != currentDesignItem) {
674
+ if (this._lastHoverDesignItem)
675
+ this.extensionManager.removeExtension(this._lastHoverDesignItem, ExtensionType.MouseOver);
676
+ if (currentDesignItem && currentDesignItem != this.rootDesignItem && DomHelper.getHost(element.parentNode) !== this.overlayLayer)
677
+ this.extensionManager.applyExtension(currentDesignItem, ExtensionType.MouseOver);
678
+ this._lastHoverDesignItem = currentDesignItem;
679
+ }
680
+ }
673
681
  _pointerEventHandler(event, forceElement = null) {
674
682
  this._fillCalculationrects();
675
683
  if (this._pointerextensions) {
@@ -683,56 +691,32 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
683
691
  currentElement = forceElement;
684
692
  else {
685
693
  currentElement = this.serviceContainer.elementAtPointService.getElementAtPoint(this, { x: event.x, y: event.y });
686
- if (currentElement === this._outercanvas2 || currentElement === this.overlayLayer || !currentElement) {
694
+ if (!currentElement) {
687
695
  currentElement = this._canvas;
688
696
  }
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
697
  }
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));
698
+ if (this._activeTool) {
699
+ this._activeTool.pointerEventHandler(this, event, currentElement);
708
700
  return;
709
701
  }
710
702
  this.clickOverlay.style.cursor = this._canvas.style.cursor;
711
- //TODO: remove duplication when tool refactoring starts
712
- //this._fillCalculationrects();
713
703
  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
- }
704
+ this.showHoverExtension(currentDesignItem.element);
705
+ //TODO: needed ??
721
706
  if (currentElement && DomHelper.getHost(currentElement.parentNode) === this.overlayLayer) {
722
707
  if (this.eatEvents)
723
708
  return;
724
709
  currentElement = this.instanceServiceContainer.selectionService.primarySelection?.element ?? this._canvas;
725
710
  }
726
- this._fillCalculationrects();
727
711
  let tool = this.serviceContainer.globalContext.tool ?? this.serviceContainer.designerTools.get(NamedTools.Pointer);
728
712
  this._canvas.style.cursor = tool.cursor;
729
- if (event.type == EventNames.PointerDown) {
730
- this._lastPointerDownHandler = (evt) => tool.pointerEventHandler(this, evt, currentElement);
731
- }
732
713
  tool.pointerEventHandler(this, event, currentElement);
733
714
  }
734
- removeCurrentPointerEventHandler() {
735
- this._lastPointerDownHandler = null;
715
+ captureActiveTool(tool) {
716
+ this._activeTool = tool;
717
+ }
718
+ releaseActiveTool() {
719
+ this._activeTool = null;
736
720
  }
737
721
  _fillCalculationrects() {
738
722
  this.containerBoundingRect = this._canvasContainer.getBoundingClientRect();
@@ -744,40 +728,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
744
728
  removeOverlay(element) {
745
729
  this.overlayLayer.removeOverlay(element);
746
730
  }
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
731
  zoomOntoRectangle(startPoint, endPoint) {
782
732
  let rect = {
783
733
  x: startPoint.x < endPoint.x ? startPoint.x : endPoint.x,
@@ -802,9 +752,17 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
802
752
  };
803
753
  this.canvasOffset = newCanvasOffset;
804
754
  }
755
+ zoomConvertEventToViewPortCoordinates(point) {
756
+ const offsetOfCanvasX = this.containerBoundingRect.x - this.outerRect.x;
757
+ const offsetOfCanvasY = this.containerBoundingRect.y - this.outerRect.y;
758
+ return {
759
+ x: (point.x + offsetOfCanvasX / this.zoomFactor) * this.zoomFactor,
760
+ y: (point.y + offsetOfCanvasY / this.zoomFactor) * this.zoomFactor
761
+ };
762
+ }
805
763
  zoomTowardsPoint(canvasPoint, newZoom) {
806
764
  const scaleChange = newZoom / this.zoomFactor;
807
- const point = this.convertEventToViewPortCoordinates(canvasPoint);
765
+ const point = this.zoomConvertEventToViewPortCoordinates(canvasPoint);
808
766
  const newCanvasOffset = {
809
767
  x: -(point.x * (scaleChange - 1) + scaleChange * -this.canvasOffsetUnzoomed.x),
810
768
  y: -(point.y * (scaleChange - 1) + scaleChange * -this.canvasOffsetUnzoomed.y)
@@ -17,9 +17,13 @@ export declare class DesignerView extends BaseCustomWebComponentConstructorAppen
17
17
  get designerCanvas(): DesignerCanvas;
18
18
  private _zoomInput;
19
19
  private _lowertoolbar;
20
+ private _tooldock;
20
21
  static readonly style: CSSStyleSheet;
21
22
  static readonly template: HTMLTemplateElement;
22
23
  constructor();
24
+ ready(): Promise<void>;
25
+ zoomReset(): void;
26
+ zoomToFit(): void;
23
27
  private _onScrollbar;
24
28
  private _onWheel;
25
29
  get designerWidth(): string;
@@ -25,6 +25,7 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
25
25
  }
26
26
  _zoomInput;
27
27
  _lowertoolbar;
28
+ _tooldock;
28
29
  static style = css `
29
30
  :host {
30
31
  display: block;
@@ -77,8 +78,15 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
77
78
  height: 100%;
78
79
  }
79
80
  #canvas {
80
- width: calc(100% - 16px);
81
+ left: 36px;
82
+ width: calc(100% - 52px);
83
+ height: calc(100% - 32px);
84
+ }
85
+
86
+ #tool-bar{
87
+ width: 36px;
81
88
  height: calc(100% - 32px);
89
+ position: absolute;
82
90
  }
83
91
 
84
92
  .zoom-in {
@@ -120,7 +128,9 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
120
128
  static template = html `
121
129
  <div id="outer">
122
130
  <node-projects-plain-scrollbar id="s-hor" value="0.5" class="bottom-scroll"></node-projects-plain-scrollbar>
123
- <node-projects-plain-scrollbar id="s-vert" value="0.5" orientation="vertical" class="right-scroll"></node-projects-plain-scrollbar>
131
+ <node-projects-plain-scrollbar id="s-vert" value="0.5" orientation="vertical" class="right-scroll">
132
+ </node-projects-plain-scrollbar>
133
+ <node-projects-designer-tools-dock id="tool-bar" class="tool-bar"></node-projects-designer-tools-dock>
124
134
  <div class="bottom-right"></div>
125
135
  <div id="lowertoolbar">
126
136
  <input id="zoomInput" type="text" value="100%">
@@ -138,6 +148,7 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
138
148
  </div>`;
139
149
  constructor() {
140
150
  super();
151
+ this._restoreCachedInititalValues();
141
152
  const outer = this._getDomElement('outer');
142
153
  this._designerCanvas = new DesignerCanvas();
143
154
  this._designerCanvas.id = "canvas";
@@ -179,38 +190,11 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
179
190
  };
180
191
  let zoomReset = this._getDomElement('zoomReset');
181
192
  zoomReset.onclick = () => {
182
- this._designerCanvas.canvasOffset = { x: 0, y: 0 };
183
- this._designerCanvas.zoomFactor = 1;
184
- this._sVert.value = 0.5;
185
- this._sHor.value = 0.5;
186
- this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
193
+ this.zoomReset();
187
194
  };
188
195
  let zoomFit = this._getDomElement('zoomFit');
189
196
  zoomFit.onclick = () => {
190
- let maxX = 0, maxY = 0, minX = 0, minY = 0;
191
- this._designerCanvas.canvasOffset = { x: 0, y: 0 };
192
- this._designerCanvas.zoomFactor = 1;
193
- for (let n of DomHelper.getAllChildNodes(this.designerCanvas.rootDesignItem.element)) {
194
- if (n instanceof Element) {
195
- const rect = n.getBoundingClientRect();
196
- minX = minX < rect.x ? minX : rect.x;
197
- minY = minY < rect.y ? minY : rect.y;
198
- maxX = maxX > rect.x + rect.width + autoZomOffset ? maxX : rect.x + rect.width + autoZomOffset;
199
- maxY = maxY > rect.y + rect.height + autoZomOffset ? maxY : rect.y + rect.height + autoZomOffset;
200
- }
201
- }
202
- const cvRect = this.designerCanvas.getBoundingClientRect();
203
- maxX -= cvRect.x;
204
- maxY -= cvRect.y;
205
- let scaleX = cvRect.width / (maxX / this._designerCanvas.zoomFactor);
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;
212
- this._designerCanvas.zoomFactor = scaleX < scaleY ? scaleX : scaleY;
213
- this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
197
+ this.zoomToFit();
214
198
  };
215
199
  this.addEventListener(EventNames.Wheel, event => this._onWheel(event));
216
200
  let alignSnap = this._getDomElement('alignSnap');
@@ -225,6 +209,43 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
225
209
  this._sVert.addEventListener('scrollbar-input', (e) => this._onScrollbar(e));
226
210
  this._sHor.addEventListener('scrollbar-input', (e) => this._onScrollbar(e));
227
211
  }
212
+ async ready() {
213
+ this._tooldock = await this._getDomElement('tool-bar');
214
+ this._tooldock.initialize(this.serviceContainer, this);
215
+ }
216
+ zoomReset() {
217
+ this._designerCanvas.canvasOffset = { x: 0, y: 0 };
218
+ this._designerCanvas.zoomFactor = 1;
219
+ this._sVert.value = 0.5;
220
+ this._sHor.value = 0.5;
221
+ this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
222
+ }
223
+ zoomToFit() {
224
+ let maxX = 0, maxY = 0, minX = 0, minY = 0;
225
+ this._designerCanvas.canvasOffset = { x: 0, y: 0 };
226
+ this._designerCanvas.zoomFactor = 1;
227
+ for (let n of DomHelper.getAllChildNodes(this.designerCanvas.rootDesignItem.element)) {
228
+ if (n instanceof Element) {
229
+ const rect = n.getBoundingClientRect();
230
+ minX = minX < rect.x ? minX : rect.x;
231
+ minY = minY < rect.y ? minY : rect.y;
232
+ maxX = maxX > rect.x + rect.width + autoZomOffset ? maxX : rect.x + rect.width + autoZomOffset;
233
+ maxY = maxY > rect.y + rect.height + autoZomOffset ? maxY : rect.y + rect.height + autoZomOffset;
234
+ }
235
+ }
236
+ const cvRect = this.designerCanvas.getBoundingClientRect();
237
+ maxX -= cvRect.x;
238
+ maxY -= cvRect.y;
239
+ let scaleX = cvRect.width / (maxX / this._designerCanvas.zoomFactor);
240
+ let scaleY = cvRect.height / (maxY / this._designerCanvas.zoomFactor);
241
+ const dimensions = this.designerCanvas.getDesignSurfaceDimensions();
242
+ if (dimensions.width)
243
+ scaleX = cvRect.width / dimensions.width;
244
+ if (dimensions.height)
245
+ scaleY = cvRect.height / dimensions.height;
246
+ this._designerCanvas.zoomFactor = scaleX < scaleY ? scaleX : scaleY;
247
+ this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
248
+ }
228
249
  _onScrollbar(e) {
229
250
  if (e?.detail == 'incrementLarge')
230
251
  e.target.value += 0.25;
@@ -244,15 +265,19 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
244
265
  event.preventDefault();
245
266
  if (event.ctrlKey) {
246
267
  let zf = this._designerCanvas.zoomFactor;
247
- zf += event.deltaY * -0.001; //deltamode = 0
268
+ const wheel = event.deltaY < 0 ? 1 : (-1);
269
+ zf *= Math.exp(wheel * 0.2);
248
270
  if (zf < 0.02)
249
271
  zf = 0.02;
250
272
  const vp = this.designerCanvas.getNormalizedEventCoordinates(event);
251
273
  this.designerCanvas.zoomTowardsPoint(vp, zf);
252
274
  }
275
+ else if (event.shiftKey) {
276
+ this._sHor.value += event.deltaY / 10000;
277
+ this._onScrollbar(null);
278
+ }
253
279
  else {
254
- this._sHor.value += event.deltaX / 1000;
255
- this._sVert.value += event.deltaY / 1000;
280
+ this._sVert.value += event.deltaY / 10000;
256
281
  this._onScrollbar(null);
257
282
  }
258
283
  }
@@ -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
+ }
@@ -0,0 +1,12 @@
1
+ import { CommandType } from "../../../../../commandHandling/CommandType";
2
+ export class RotateLeftAndRight {
3
+ shouldProvideContextmenu(event, designerView, designItem, initiator) {
4
+ return true;
5
+ }
6
+ provideContextMenuItems(event, designerView, designItem) {
7
+ return [
8
+ { title: 'rotate right', action: () => { designerView.executeCommand({ type: CommandType.rotateClockwise }); }, shortCut: 'Ctrl + R' },
9
+ { title: 'rotate left', action: () => { designerView.executeCommand({ type: CommandType.rotateCounterClockwise }); }, shortCut: 'Ctrl + Shift + R' }
10
+ ];
11
+ }
12
+ }
@@ -23,6 +23,7 @@ export class DrawEllipsisTool {
23
23
  case EventNames.PointerDown:
24
24
  this._startPoint = currentPoint;
25
25
  event.target.setPointerCapture(event.pointerId);
26
+ designerCanvas.captureActiveTool(this);
26
27
  this._path = document.createElementNS("http://www.w3.org/2000/svg", "ellipse");
27
28
  this._path.setAttribute("stroke", designerCanvas.serviceContainer.globalContext.strokeColor);
28
29
  this._path.setAttribute("fill", designerCanvas.serviceContainer.globalContext.fillBrush);
@@ -67,7 +68,7 @@ export class DrawEllipsisTool {
67
68
  break;
68
69
  case EventNames.PointerUp:
69
70
  event.target.releasePointerCapture(event.pointerId);
70
- designerCanvas.removeCurrentPointerEventHandler();
71
+ designerCanvas.releaseActiveTool();
71
72
  const rect = this._path.getBoundingClientRect();
72
73
  designerCanvas.overlayLayer.removeOverlay(this._path);
73
74
  const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
@@ -21,6 +21,7 @@ export class DrawLineTool {
21
21
  case EventNames.PointerDown:
22
22
  this._startPoint = currentPoint;
23
23
  event.target.setPointerCapture(event.pointerId);
24
+ designerCanvas.captureActiveTool(this);
24
25
  this._path = document.createElementNS("http://www.w3.org/2000/svg", "line");
25
26
  // this._pathD = "M" + currentPoint.x + " " + currentPoint.y;
26
27
  // this._path.setAttribute("d", this._pathD);
@@ -50,7 +51,7 @@ export class DrawLineTool {
50
51
  break;
51
52
  case EventNames.PointerUp:
52
53
  event.target.releasePointerCapture(event.pointerId);
53
- designerCanvas.removeCurrentPointerEventHandler();
54
+ designerCanvas.releaseActiveTool();
54
55
  const rect = this._path.getBoundingClientRect();
55
56
  designerCanvas.overlayLayer.removeOverlay(this._path);
56
57
  const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
@@ -28,6 +28,7 @@ export class DrawPathTool {
28
28
  this._eventStarted = true;
29
29
  if (!this._p2pMode) {
30
30
  event.target.setPointerCapture(event.pointerId);
31
+ designerCanvas.captureActiveTool(this);
31
32
  this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
32
33
  this._pathD = "M" + currentPoint.x + " " + currentPoint.y;
33
34
  this._path.setAttribute("d", this._pathD);
@@ -69,8 +70,6 @@ export class DrawPathTool {
69
70
  }
70
71
  break;
71
72
  case EventNames.PointerUp:
72
- event.target.releasePointerCapture(event.pointerId);
73
- designerCanvas.removeCurrentPointerEventHandler();
74
73
  if (this._eventStarted && !this._pointerMoved) {
75
74
  this._p2pMode = true;
76
75
  }
@@ -90,6 +89,8 @@ export class DrawPathTool {
90
89
  }
91
90
  }
92
91
  if (this._samePoint && this._p2pMode || this._dragMode && !this._p2pMode) {
92
+ event.target.releasePointerCapture(event.pointerId);
93
+ designerCanvas.releaseActiveTool();
93
94
  this._eventStarted = false;
94
95
  this._p2pMode = false;
95
96
  this._pointerMoved = false;
@@ -120,6 +121,8 @@ export class DrawPathTool {
120
121
  //TODO: Better Path drawing (like in SVGEDIT & Adding via Undo Framework. And adding to correct container)
121
122
  break;
122
123
  }
124
+ event.preventDefault();
125
+ event.stopPropagation();
123
126
  }
124
127
  keyboardEventHandler(designerCanvas, event, currentElement) { }
125
128
  }
@@ -26,6 +26,7 @@ export class DrawRectTool {
26
26
  case EventNames.PointerDown:
27
27
  this._startPoint = currentPoint;
28
28
  event.target.setPointerCapture(event.pointerId);
29
+ designerCanvas.captureActiveTool(this);
29
30
  this._path = document.createElementNS("http://www.w3.org/2000/svg", "rect");
30
31
  this._path.setAttribute("stroke", designerCanvas.serviceContainer.globalContext.strokeColor);
31
32
  this._path.setAttribute("fill", designerCanvas.serviceContainer.globalContext.fillBrush);
@@ -82,7 +83,7 @@ export class DrawRectTool {
82
83
  break;
83
84
  case EventNames.PointerUp:
84
85
  event.target.releasePointerCapture(event.pointerId);
85
- designerCanvas.removeCurrentPointerEventHandler();
86
+ designerCanvas.releaseActiveTool();
86
87
  const rect = this._path.getBoundingClientRect();
87
88
  designerCanvas.overlayLayer.removeOverlay(this._path);
88
89
  const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");