@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.
- package/assets/images/layout/ColorPickerTool.svg +21 -0
- package/assets/images/layout/DrawEllipTool.svg +13 -0
- package/assets/images/layout/DrawLineTool.svg +13 -0
- package/assets/images/layout/DrawPathTool.svg +32 -0
- package/assets/images/layout/DrawRectTool.svg +28 -0
- package/assets/images/layout/MagicWandTool.svg +14 -0
- package/assets/images/layout/PointerTool.svg +10 -0
- package/assets/images/layout/SelectRectTool.svg +9 -0
- package/assets/images/layout/TextBoxTool.svg +8 -0
- package/assets/images/layout/TextTool.svg +7 -0
- package/assets/images/layout/ZoomTool.svg +16 -0
- package/dist/Constants.d.ts +1 -1
- package/dist/Constants.js +4 -1
- package/dist/commandHandling/CommandType.d.ts +2 -0
- package/dist/commandHandling/CommandType.js +2 -0
- package/dist/elements/documentContainer.js +2 -2
- package/dist/elements/helper/contextMenu/ContextMenuHelper.js +2 -4
- package/dist/elements/services/DefaultServiceBootstrap.js +3 -0
- package/dist/elements/services/modelCommandService/DefaultModelCommandService.js +50 -0
- package/dist/elements/services/placementService/DefaultPlacementService.js +2 -2
- package/dist/elements/widgets/bindableObjectsBrowser/bindable-objects-browser.d.ts +0 -1
- package/dist/elements/widgets/bindableObjectsBrowser/bindable-objects-browser.js +1 -2
- package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +5 -2
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +14 -6
- package/dist/elements/widgets/designerView/designerCanvas.js +85 -127
- package/dist/elements/widgets/designerView/designerView.d.ts +4 -0
- package/dist/elements/widgets/designerView/designerView.js +59 -34
- package/dist/elements/widgets/designerView/extensions/PathExtension.js +0 -1
- package/dist/elements/widgets/designerView/extensions/PathExtensionProvider.js +2 -1
- package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +0 -1
- package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +0 -1
- package/dist/elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js +4 -2
- package/dist/elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.d.ts +8 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.js +12 -0
- package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +2 -1
- package/dist/elements/widgets/designerView/tools/DrawLineTool.js +2 -1
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js +5 -2
- package/dist/elements/widgets/designerView/tools/DrawRectTool.js +2 -1
- package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +2 -1
- package/dist/elements/widgets/designerView/tools/NamedTools.d.ts +2 -1
- package/dist/elements/widgets/designerView/tools/NamedTools.js +1 -0
- package/dist/elements/widgets/designerView/tools/PanTool.js +2 -1
- package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -2
- package/dist/elements/widgets/designerView/tools/PointerTool.js +58 -122
- package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +2 -1
- package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolRenderer.d.ts +5 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolRenderer.js +19 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolbarPopup.d.ts +8 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolbarPopup.js +37 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolbarPopupToolSelect.d.ts +12 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolbarPopupToolSelect.js +44 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolsButtons.d.ts +32 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarGenerics/designerToolsButtons.js +96 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarPopups/DrawToolPopup.d.ts +8 -0
- package/dist/elements/widgets/designerView/tools/designerToolbarPopups/DrawToolPopup.js +25 -0
- package/dist/elements/widgets/designerView/tools/designerToolsDock.d.ts +23 -0
- package/dist/elements/widgets/designerView/tools/designerToolsDock.js +115 -0
- package/dist/elements/widgets/miniatureView/html-2-canvas-miniature-view.js +1 -0
- package/dist/elements/widgets/paletteView/paletteTreeView.d.ts +0 -1
- package/dist/elements/widgets/paletteView/paletteTreeView.js +1 -2
- package/dist/elements/widgets/paletteView/paletteView.js +1 -0
- package/dist/elements/widgets/propertyGrid/PropertyGrid.js +1 -0
- package/dist/elements/widgets/propertyGrid/PropertyGridPropertyList.js +1 -0
- package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +1 -0
- package/dist/elements/widgets/treeView/treeView.js +1 -0
- package/dist/elements/widgets/treeView/treeViewExtended.js +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- 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.
|
|
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
|
-
|
|
606
|
-
|
|
607
|
-
|
|
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
|
-
|
|
630
|
-
let currentElement =
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
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
|
-
|
|
665
|
-
|
|
666
|
-
|
|
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
|
-
|
|
667
|
+
break;
|
|
669
668
|
}
|
|
670
669
|
return currentElement;
|
|
671
670
|
}
|
|
672
|
-
|
|
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 (
|
|
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 (
|
|
703
|
-
this.
|
|
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
|
-
|
|
715
|
-
|
|
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
|
-
|
|
735
|
-
this.
|
|
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.
|
|
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
|
-
|
|
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"
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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) }))];
|
package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.d.ts
ADDED
|
@@ -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
|
+
}
|
package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.js
ADDED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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");
|