@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.
- 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/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 +82 -126
- package/dist/elements/widgets/designerView/designerView.js +8 -3
- 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/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/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 +1 -0
- package/dist/index.js +1 -0
- 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.
|
|
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: ->
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
101
|
+
showHoverExtension(element: Element): void;
|
|
95
102
|
private _pointerEventHandler;
|
|
96
|
-
|
|
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
|
-
|
|
606
|
-
|
|
607
|
-
|
|
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
|
-
|
|
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);
|
|
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
|
-
|
|
665
|
-
|
|
666
|
-
|
|
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
|
-
|
|
665
|
+
break;
|
|
669
666
|
}
|
|
670
667
|
return currentElement;
|
|
671
668
|
}
|
|
672
|
-
|
|
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 (
|
|
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 (
|
|
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));
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
735
|
-
this.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
+
}
|