@node-projects/web-component-designer 0.0.153 → 0.0.155

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 (36) hide show
  1. package/dist/elements/controls/MetricsEditor.d.ts +1 -1
  2. package/dist/elements/controls/MetricsEditor.js +29 -30
  3. package/dist/elements/helper/ElementHelper.js +18 -3
  4. package/dist/elements/helper/TransformHelper.d.ts +6 -1
  5. package/dist/elements/helper/TransformHelper.js +29 -23
  6. package/dist/elements/helper/contextMenu/ContextMenu.js +9 -1
  7. package/dist/elements/services/manifestParsers/WebcomponentManifestParserService.d.ts +2 -2
  8. package/dist/elements/services/manifestParsers/WebcomponentManifestParserService.js +3 -2
  9. package/dist/elements/services/modelCommandService/DefaultModelCommandService.js +2 -0
  10. package/dist/elements/services/placementService/FlexBoxPlacementService.js +8 -0
  11. package/dist/elements/services/propertiesService/IPropertiesService.d.ts +6 -1
  12. package/dist/elements/services/propertiesService/IPropertiesService.js +6 -1
  13. package/dist/elements/services/propertiesService/services/AbstractPolymerLikePropertiesService.d.ts +2 -1
  14. package/dist/elements/services/propertiesService/services/AbstractPolymerLikePropertiesService.js +3 -2
  15. package/dist/elements/services/propertiesService/services/AbstractPropertiesService.d.ts +2 -2
  16. package/dist/elements/services/propertiesService/services/AbstractPropertiesService.js +3 -0
  17. package/dist/elements/services/propertiesService/services/AttributesPropertiesService.d.ts +2 -2
  18. package/dist/elements/services/propertiesService/services/AttributesPropertiesService.js +3 -2
  19. package/dist/elements/services/propertiesService/services/CommonPropertiesService.d.ts +2 -1
  20. package/dist/elements/services/propertiesService/services/CommonPropertiesService.js +3 -2
  21. package/dist/elements/services/propertiesService/services/CssPropertiesService.d.ts +2 -1
  22. package/dist/elements/services/propertiesService/services/CssPropertiesService.js +3 -2
  23. package/dist/elements/services/propertiesService/services/ListPropertiesService.d.ts +2 -1
  24. package/dist/elements/services/propertiesService/services/ListPropertiesService.js +3 -2
  25. package/dist/elements/services/propertiesService/services/NativeElementsPropertiesService.d.ts +2 -1
  26. package/dist/elements/services/propertiesService/services/NativeElementsPropertiesService.js +3 -2
  27. package/dist/elements/services/propertiesService/services/WebcomponentManifestPropertiesService.d.ts +2 -2
  28. package/dist/elements/services/propertiesService/services/WebcomponentManifestPropertiesService.js +3 -2
  29. package/dist/elements/widgets/designerView/designerCanvas.js +2 -0
  30. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +33 -28
  31. package/dist/elements/widgets/designerView/extensions/RotateExtension.js +4 -2
  32. package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +3 -8
  33. package/dist/elements/widgets/propertyGrid/PropertyGrid.js +5 -0
  34. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyList.d.ts +1 -0
  35. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyList.js +5 -1
  36. package/package.json +1 -1
@@ -8,7 +8,7 @@ export declare class MetricsEditor extends BaseCustomWebComponentConstructorAppe
8
8
  static readonly template: HTMLTemplateElement;
9
9
  property: string;
10
10
  unsetValue: string;
11
- _updateValue(): void;
12
11
  ready(): void;
13
12
  onDoubleClick(event: PointerEvent): void;
13
+ onKeyDown(event: KeyboardEvent): void;
14
14
  }
@@ -30,7 +30,7 @@ export class MetricsEditor extends BaseCustomWebComponentConstructorAppend {
30
30
  }
31
31
 
32
32
  div.ct {
33
- width:280px;height:180px;
33
+ width:280px;height:120px;
34
34
  }
35
35
 
36
36
  div span {
@@ -83,44 +83,43 @@ span {
83
83
  }`;
84
84
  static template = html `
85
85
  <div class="ct"><span title="position">position</span>
86
- <div class="top">-</div><br><div class="left">-</div><div class="ct"><span title="margin">margin</span>
87
- <div id="testdiv" [contentEditable]="contentEditable" @dblclick="onDoubleClick" class="top">-</div><br><div class="left">-</div><div class="ct"><span title="border">border</span>
88
- <div class="top">-</div><br><div class="left">-</div><div class="ct"><span title="padding">padding</span>
89
- <div class="top">-</div><br><div class="left">-</div><div class="ct" style="font-size:6px"><div class="left">-</div>
90
- x
91
- <div class="right">-</div>
92
- </div><div class="right">-</div><br><div class="bottom">-</div></div><div class="right">-</div><br><div class="bottom">-</div></div><div class="right">-</div><br><div class="bottom">-</div></div><div class="right">-</div><br><div class="bottom">-</div></div>
86
+ <div data-style="position" @keydown="onKeyDown" @dblclick="onDoubleClick" class="top">-</div><br><div data-style="position" @keydown="onKeyDown" @dblclick="onDoubleClick" class="left">-</div><div class="ct"><span title="margin">margin</span>
87
+ <div data-style="margin" @keydown="onKeyDown" @dblclick="onDoubleClick" class="top">-</div><br><div @keydown="onKeyDown" @dblclick="onDoubleClick" class="left">-</div><div class="ct"><span title="border">border</span>
88
+ <div data-style="border" @keydown="onKeyDown" @dblclick="onDoubleClick" class="top">-</div><br><div @keydown="onKeyDown" @dblclick="onDoubleClick" class="left">-</div><div class="ct"><span title="padding">padding</span>
89
+ <div data-style="padding" @keydown="onKeyDown" @dblclick="onDoubleClick" class="top">-</div><br><div @keydown="onKeyDown" @dblclick="onDoubleClick" class="left">-</div><div class="ct" style="font-size:6px"><div data-style="element" @keydown="onKeyDown" @dblclick="onDoubleClick" class="left">-</div>
90
+ &nbsp;x&nbsp;
91
+ <div data-style="element" @keydown="onKeyDown" @dblclick="onDoubleClick" class="right">-</div>
92
+ </div><div data-style="padding" @keydown="onKeyDown" @dblclick="onDoubleClick" class="right">-</div><br><div data-style="padding" @keydown="onKeyDown" @dblclick="onDoubleClick" class="bottom">-</div></div><div data-style="border" @keydown="onKeyDown" @dblclick="onDoubleClick" class="right">-</div><br><div data-style="border" @keydown="onKeyDown" @dblclick="onDoubleClick" class="bottom">-</div></div><div data-style="margin" @keydown="onKeyDown" @dblclick="onDoubleClick" class="right">-</div><br><div data-style="margin" @keydown="onKeyDown" @dblclick="onDoubleClick" class="bottom">-</div></div><div data-style="position" @keydown="onKeyDown" @dblclick="onDoubleClick" class="right">-</div><br><div data-style="position" @keydown="onKeyDown" @dblclick="onDoubleClick" class="bottom">-</div></div>
93
93
  `;
94
94
  property;
95
95
  unsetValue;
96
- //private _root: HTMLDivElement;
97
- //private _contentEditable: HTMLDivElement;
98
- _updateValue() {
99
- }
100
96
  ready() {
101
- //this._root = this._getDomElement<HTMLDivElement>("testdiv");
102
97
  this._parseAttributesToProperties();
103
- this._updateValue();
104
98
  this._assignEvents();
105
99
  }
106
100
  onDoubleClick(event) {
107
- let element = this._getDomElement("testdiv");
108
- // contentEditable setzten
101
+ const element = event.target;
109
102
  element.setAttribute("contentEditable", "");
110
- // - rausnehmen
111
- element.innerHTML = "-";
112
- // Input auswerten
113
- //Input in div schreiben
114
- // contentEditable false setzen mit EnterTaste
115
- element.onkeydown = (e) => {
116
- if (e.key == "Enter") {
117
- let _input = element.innerHTML;
118
- //let value = document.createElement("input");
119
- element.style.marginTop = _input;
120
- element.removeAttribute("contentEditable");
121
- element.innerHTML = "-";
122
- }
123
- };
103
+ const range = document.createRange();
104
+ const sel = window.getSelection();
105
+ range.setStart(element.firstChild, 0);
106
+ range.setEndAfter(element.lastChild);
107
+ sel.removeAllRanges();
108
+ sel.addRange(range);
109
+ }
110
+ onKeyDown(event) {
111
+ const element = event.target;
112
+ if (event.key == "Enter") {
113
+ element.removeAttribute("contentEditable");
114
+ const value = element.innerHTML;
115
+ const valueChangedEvent = new CustomEvent('value-changed', {
116
+ detail: {
117
+ style: element.dataset['style'],
118
+ value: value
119
+ }
120
+ });
121
+ this.dispatchEvent(valueChangedEvent);
122
+ }
124
123
  }
125
124
  }
126
125
  customElements.define('node-projects-metrics-editor', MetricsEditor);
@@ -47,9 +47,24 @@ export function getElementsWindowOffsetWithoutSelfAndParentTransformations(eleme
47
47
  var offsetLeft = 0;
48
48
  var offsetTop = 0;
49
49
  while (element) {
50
- offsetLeft += element.offsetLeft;
51
- offsetTop += element.offsetTop;
52
- element = element.offsetParent;
50
+ if (element instanceof SVGSVGElement) {
51
+ const bcEl = element.getBoundingClientRect();
52
+ const bcPar = element.parentElement.getBoundingClientRect();
53
+ offsetLeft += bcEl.left - bcPar.left;
54
+ offsetTop += bcEl.top - bcPar.top;
55
+ element = element.parentElement;
56
+ }
57
+ else if (element instanceof SVGGraphicsElement) {
58
+ let bbox = element.getBBox();
59
+ offsetLeft += bbox.x;
60
+ offsetTop += bbox.y;
61
+ element = element.parentElement;
62
+ }
63
+ else {
64
+ offsetLeft += element.offsetLeft;
65
+ offsetTop += element.offsetTop;
66
+ element = element.offsetParent;
67
+ }
53
68
  }
54
69
  return { offsetLeft: offsetLeft, offsetTop: offsetTop };
55
70
  }
@@ -2,7 +2,7 @@ import { IPoint } from "../../interfaces/IPoint.js";
2
2
  import { IDesignerCanvas } from "../widgets/designerView/IDesignerCanvas.js";
3
3
  export declare function combineTransforms(element: HTMLElement, actualTransforms: string, requestedTransformation: string): void;
4
4
  export declare function getDomMatrix(element: HTMLElement): DOMMatrix;
5
- export declare function convertCoordinates(point: DOMPoint, matrix: DOMMatrix): DOMPoint;
5
+ export declare function transformPointByInverseMatrix(point: DOMPoint, matrix: DOMMatrix): DOMPoint;
6
6
  export declare function getRotationMatrix3d(axisOfRotation: 'x' | 'y' | 'z' | 'X' | 'Y' | 'Z', angle: number): any[];
7
7
  export declare function rotateElementByMatrix3d(element: HTMLElement, matrix: number[]): void;
8
8
  export declare function matrixArrayToCssMatrix(matrixArray: number[]): string;
@@ -12,6 +12,11 @@ export declare function addVectors(vectorA: [number, number], vectorB: [number,
12
12
  export declare function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransformation(element: HTMLElement, designerCanvas: IDesignerCanvas): DOMPoint;
13
13
  export declare function getResultingTransformationBetweenElementAndAllAncestors(element: HTMLElement, ancestor: HTMLElement, excludeAncestor?: boolean): DOMMatrix;
14
14
  export declare function getByParentsTransformedPointRelatedToCanvas(element: HTMLElement, point: DOMPoint, designerCanvas: IDesignerCanvas): IPoint;
15
+ export declare function getDesignerCanvasNormalizedTransformedPoint(element: HTMLElement, point: IPoint, designerCanvas: IDesignerCanvas): IPoint;
16
+ export declare function getElementSize(element: HTMLElement): {
17
+ width: number;
18
+ height: number;
19
+ };
15
20
  export declare function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element: HTMLElement, untransformedCornerPointsOffset: IPoint | null, designerCanvas: IDesignerCanvas): [DOMPoint, DOMPoint, DOMPoint, DOMPoint];
16
21
  export declare function extractTranslationFromDOMMatrix(matrix: DOMMatrix): DOMPoint;
17
22
  export declare function extractRotationAngleFromDOMMatrix(matrix: DOMMatrix): number;
@@ -18,8 +18,12 @@ export function combineTransforms(element, actualTransforms, requestedTransforma
18
18
  export function getDomMatrix(element) {
19
19
  return new DOMMatrix(window.getComputedStyle(element).transform);
20
20
  }
21
- export function convertCoordinates(point, matrix) {
22
- return point.matrixTransform(matrix.inverse());
21
+ export function transformPointByInverseMatrix(point, matrix) {
22
+ const inverse = matrix.inverse();
23
+ //fix chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=1395645
24
+ inverse.m33 = 1;
25
+ inverse.m44 = 1;
26
+ return point.matrixTransform(inverse);
23
27
  }
24
28
  export function getRotationMatrix3d(axisOfRotation, angle) {
25
29
  const angleInRadians = angle / 180 * Math.PI;
@@ -83,7 +87,7 @@ export function addVectors(vectorA, vectorB) {
83
87
  return [vectorA[0] + vectorB[0], vectorA[1] + vectorB[1]];
84
88
  }
85
89
  export function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransformation(element, designerCanvas) {
86
- const top0 = new DOMPointReadOnly(-parseInt(getComputedStyle(element).transformOrigin.split(' ')[0]), -parseInt(getComputedStyle(element).transformOrigin.split(' ')[1]), 0, 0);
90
+ const top0 = new DOMPointReadOnly(-parseFloat(getComputedStyle(element).transformOrigin.split(' ')[0]), -parseFloat(getComputedStyle(element).transformOrigin.split(' ')[1]), 0, 0);
87
91
  const p0Offsets = getElementsWindowOffsetWithoutSelfAndParentTransformations(element);
88
92
  const transformOriginAbsolutRelatedToWindowWithoutAnyTransformation = new DOMPoint(p0Offsets.offsetLeft - top0.x, p0Offsets.offsetTop - top0.y);
89
93
  const designerCanvasNormalizedTransformedOrigin = new DOMPoint(transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.x - designerCanvas.containerBoundingRect.x, transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.y - designerCanvas.containerBoundingRect.y);
@@ -113,7 +117,7 @@ export function getByParentsTransformedPointRelatedToCanvas(element, point, desi
113
117
  let byParentTransformedPointRelatedToCanvas = { x: 0, y: 0 };
114
118
  while (actualElement != canvas) {
115
119
  const parentElement = getParentElementIncludingSlots(actualElement);
116
- const parentElementTransformOrigin = new DOMPoint(getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement).offsetLeft - designerCanvas.outerRect.x + parseInt(getComputedStyle(parentElement).transformOrigin.split(' ')[0]), getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement).offsetTop - designerCanvas.outerRect.y + parseInt(getComputedStyle(parentElement).transformOrigin.split(' ')[1]));
120
+ const parentElementTransformOrigin = new DOMPoint(getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement).offsetLeft - designerCanvas.outerRect.x + parseFloat(getComputedStyle(parentElement).transformOrigin.split(' ')[0]), getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement).offsetTop - designerCanvas.outerRect.y + parseFloat(getComputedStyle(parentElement).transformOrigin.split(' ')[1]));
117
121
  parentElementTransformOrigin.x -= extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform)).x;
118
122
  parentElementTransformOrigin.y -= extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform)).y;
119
123
  const parentElementTransformOriginToPointVector = new DOMPointReadOnly(-parentElementTransformOrigin.x + (element == actualElement ? point.x : byParentTransformedPointRelatedToCanvas.x), -parentElementTransformOrigin.y + (element == actualElement ? point.y : byParentTransformedPointRelatedToCanvas.y));
@@ -123,6 +127,23 @@ export function getByParentsTransformedPointRelatedToCanvas(element, point, desi
123
127
  }
124
128
  return byParentTransformedPointRelatedToCanvas;
125
129
  }
130
+ export function getDesignerCanvasNormalizedTransformedPoint(element, point, designerCanvas) {
131
+ return getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, { x: -point.x, y: -point.y }, designerCanvas)[0];
132
+ }
133
+ export function getElementSize(element) {
134
+ let width = element.offsetWidth;
135
+ let height = element.offsetHeight;
136
+ if (element instanceof SVGElement && element.width) {
137
+ width = element.width.baseVal.value;
138
+ height = element.height.baseVal.value;
139
+ }
140
+ else if (element instanceof SVGGraphicsElement) {
141
+ let bbox = element.getBBox();
142
+ width = bbox.width;
143
+ height = bbox.height;
144
+ }
145
+ return { width, height };
146
+ }
126
147
  export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, untransformedCornerPointsOffset, designerCanvas) {
127
148
  const topleft = 0;
128
149
  const topright = 1;
@@ -134,22 +155,7 @@ export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, u
134
155
  x: p0Offsets.offsetLeft - designerCanvas.containerBoundingRect.left,
135
156
  y: p0Offsets.offsetTop - designerCanvas.containerBoundingRect.top
136
157
  });
137
- let width = parseInt(getComputedStyle(element).width.replace('px', ''));
138
- let height = parseInt(getComputedStyle(element).height.replace('px', ''));
139
- if (getComputedStyle(element).boxSizing == 'content-box') {
140
- width += parseInt(getComputedStyle(element).paddingLeft.replace('px', ''))
141
- + parseInt(getComputedStyle(element).marginLeft.replace('px', ''))
142
- + parseInt(getComputedStyle(element).borderLeft.replace('px', ''))
143
- + parseInt(getComputedStyle(element).paddingRight.replace('px', ''))
144
- + parseInt(getComputedStyle(element).marginRight.replace('px', ''))
145
- + parseInt(getComputedStyle(element).borderRight.replace('px', ''));
146
- height += parseInt(getComputedStyle(element).paddingTop.replace('px', ''))
147
- + parseInt(getComputedStyle(element).marginTop.replace('px', ''))
148
- + parseInt(getComputedStyle(element).borderTop.replace('px', ''))
149
- + parseInt(getComputedStyle(element).paddingBottom.replace('px', ''))
150
- + parseInt(getComputedStyle(element).marginBottom.replace('px', ''))
151
- + parseInt(getComputedStyle(element).borderBottom.replace('px', ''));
152
- }
158
+ let { width, height } = getElementSize(element);
153
159
  const elementWithoutTransformCornerDOMPoints = [];
154
160
  elementWithoutTransformCornerDOMPoints[topleft] = DOMPoint.fromPoint({
155
161
  x: p0OffsetsRelatedToCanvas.x - intUntransformedCornerPointsOffset.x,
@@ -168,12 +174,12 @@ export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, u
168
174
  y: p0OffsetsRelatedToCanvas.y + height + intUntransformedCornerPointsOffset.y
169
175
  });
170
176
  const transformOriginWithoutTransformRelatedToCanvas = DOMPointReadOnly.fromPoint({
171
- x: p0OffsetsRelatedToCanvas.x + parseInt(getComputedStyle(element).transformOrigin.split(' ')[0]),
172
- y: p0OffsetsRelatedToCanvas.y + parseInt(getComputedStyle(element).transformOrigin.split(' ')[1]),
177
+ x: p0OffsetsRelatedToCanvas.x + parseFloat(getComputedStyle(element).transformOrigin.split(' ')[0]),
178
+ y: p0OffsetsRelatedToCanvas.y + parseFloat(getComputedStyle(element).transformOrigin.split(' ')[1]),
173
179
  z: 0,
174
180
  w: 0
175
181
  });
176
- const designerCanvasNormalizedTransformOrigin = getByParentsTransformedPointRelatedToCanvas(element, new DOMPoint(getElementsWindowOffsetWithoutSelfAndParentTransformations(element).offsetLeft - designerCanvas.outerRect.left + parseInt(getComputedStyle(element).transformOrigin.split(' ')[0]), getElementsWindowOffsetWithoutSelfAndParentTransformations(element).offsetTop - designerCanvas.outerRect.top + parseInt(getComputedStyle(element).transformOrigin.split(' ')[1])), designerCanvas);
182
+ const designerCanvasNormalizedTransformOrigin = getByParentsTransformedPointRelatedToCanvas(element, new DOMPoint(getElementsWindowOffsetWithoutSelfAndParentTransformations(element).offsetLeft - designerCanvas.outerRect.left + parseFloat(getComputedStyle(element).transformOrigin.split(' ')[0]), getElementsWindowOffsetWithoutSelfAndParentTransformations(element).offsetTop - designerCanvas.outerRect.top + parseFloat(getComputedStyle(element).transformOrigin.split(' ')[1])), designerCanvas);
177
183
  let top0 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[topleft].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[topleft].y));
178
184
  let top1 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[topright].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[topright].y));
179
185
  let top2 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[bottomleft].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[bottomleft].y));
@@ -178,7 +178,15 @@ export class ContextMenu {
178
178
  this.close();
179
179
  });
180
180
  if (item.children != null) {
181
- li.appendChild(this.renderLevel(item.children));
181
+ let childmenu = this.renderLevel(item.children);
182
+ li.appendChild(childmenu);
183
+ li.addEventListener('mouseenter', () => {
184
+ const childRect = childmenu.getBoundingClientRect();
185
+ if (childRect.top + childRect.height > window.innerHeight) {
186
+ childmenu.style.top = 'unset';
187
+ childmenu.style.bottom = '0';
188
+ }
189
+ });
182
190
  }
183
191
  }
184
192
  lastWasDivider = false;
@@ -1,12 +1,12 @@
1
1
  import { BindingTarget } from "../../item/BindingTarget";
2
2
  import { IElementDefinition } from "../elementsService/IElementDefinition";
3
3
  import { IElementsService } from "../elementsService/IElementsService";
4
- import { IPropertiesService } from "../propertiesService/IPropertiesService";
4
+ import { IPropertiesService, RefreshMode } from "../propertiesService/IPropertiesService";
5
5
  import { IProperty } from "../propertiesService/IProperty";
6
6
  import { IDesignItem } from "../../item/IDesignItem";
7
7
  import { AbstractPropertiesService } from "../propertiesService/services/AbstractPropertiesService";
8
8
  export declare class WebcomponentManifestParserService extends AbstractPropertiesService implements IElementsService, IPropertiesService {
9
- listNeedsRefresh(designItem: IDesignItem): boolean;
9
+ getRefreshMode(designItem: IDesignItem): RefreshMode;
10
10
  private _name;
11
11
  get name(): string;
12
12
  private _packageData;
@@ -1,9 +1,10 @@
1
1
  import { BindingTarget } from "../../item/BindingTarget";
2
+ import { RefreshMode } from "../propertiesService/IPropertiesService";
2
3
  import { PropertyType } from "../propertiesService/PropertyType";
3
4
  import { AbstractPropertiesService } from "../propertiesService/services/AbstractPropertiesService";
4
5
  export class WebcomponentManifestParserService extends AbstractPropertiesService {
5
- listNeedsRefresh(designItem) {
6
- return false;
6
+ getRefreshMode(designItem) {
7
+ return RefreshMode.none;
7
8
  }
8
9
  _name;
9
10
  get name() { return this._name; }
@@ -21,6 +21,7 @@ export class DefaultModelCommandService {
21
21
  }
22
22
  async executeCommand(designerCanvas, command) {
23
23
  let sel = designerCanvas.instanceServiceContainer.selectionService.primarySelection;
24
+ const selection = [...designerCanvas.instanceServiceContainer.selectionService.selectedElements];
24
25
  if (command.type == CommandType.moveBackward) {
25
26
  let idx = sel.parent.indexOf(sel) - 1;
26
27
  if (idx >= 0)
@@ -121,6 +122,7 @@ export class DefaultModelCommandService {
121
122
  }
122
123
  else
123
124
  return null;
125
+ designerCanvas.instanceServiceContainer.selectionService.setSelectedElements(selection);
124
126
  return true;
125
127
  }
126
128
  }
@@ -57,18 +57,22 @@ export class FlexBoxPlacementService {
57
57
  if (elBefore && elBefore[0] != items[0]) {
58
58
  if (posBefore + 1 === posDrag)
59
59
  return;
60
+ const sel = [...container.instanceServiceContainer.selectionService.selectedElements];
60
61
  let cg = items[0].openGroup('move in flexbox');
61
62
  items[0].remove();
62
63
  elBefore[0].insertAdjacentElement(items[0], 'afterend');
63
64
  cg.commit();
65
+ container.instanceServiceContainer.selectionService.setSelectedElements(sel);
64
66
  }
65
67
  else if (elBefore == null) {
66
68
  if (posDrag == 0)
67
69
  return;
70
+ const sel = [...container.instanceServiceContainer.selectionService.selectedElements];
68
71
  let cg = items[0].openGroup('move in flexbox');
69
72
  items[0].remove();
70
73
  container.insertChild(items[0], 0);
71
74
  cg.commit();
75
+ container.instanceServiceContainer.selectionService.setSelectedElements(sel);
72
76
  }
73
77
  }
74
78
  else if (style.flexDirection == 'column') {
@@ -84,18 +88,22 @@ export class FlexBoxPlacementService {
84
88
  if (elBefore && elBefore[0] != items[0]) {
85
89
  if (posBefore + 1 === posDrag)
86
90
  return;
91
+ const sel = [...container.instanceServiceContainer.selectionService.selectedElements];
87
92
  let cg = items[0].openGroup('move in flexbox');
88
93
  items[0].remove();
89
94
  elBefore[0].insertAdjacentElement(items[0], 'afterend');
90
95
  cg.commit();
96
+ container.instanceServiceContainer.selectionService.setSelectedElements(sel);
91
97
  }
92
98
  else if (elBefore == null) {
93
99
  if (posDrag == 0)
94
100
  return;
101
+ const sel = [...container.instanceServiceContainer.selectionService.selectedElements];
95
102
  let cg = items[0].openGroup('move in flexbox');
96
103
  items[0].remove();
97
104
  container.insertChild(items[0], 0);
98
105
  cg.commit();
106
+ container.instanceServiceContainer.selectionService.setSelectedElements(sel);
99
107
  }
100
108
  }
101
109
  placementView.extensionManager.refreshAllExtensions([container]);
@@ -4,8 +4,13 @@ import { IDesignItem } from '../../item/IDesignItem';
4
4
  import { ValueType } from './ValueType';
5
5
  import { BindingTarget } from '../../item/BindingTarget';
6
6
  import { IBinding } from '../../item/IBinding';
7
+ export declare enum RefreshMode {
8
+ none = 0,
9
+ full = 1,
10
+ fullOnValueChange = 2
11
+ }
7
12
  export interface IPropertiesService extends IService {
8
- listNeedsRefresh(designItem: IDesignItem): boolean;
13
+ getRefreshMode(designItem: IDesignItem): RefreshMode;
9
14
  isHandledElement(designItem: IDesignItem): boolean;
10
15
  getProperties(designItem: IDesignItem): IProperty[];
11
16
  getProperty(designItem: IDesignItem, name: string): IProperty;
@@ -1 +1,6 @@
1
- export {};
1
+ export var RefreshMode;
2
+ (function (RefreshMode) {
3
+ RefreshMode[RefreshMode["none"] = 0] = "none";
4
+ RefreshMode[RefreshMode["full"] = 1] = "full";
5
+ RefreshMode[RefreshMode["fullOnValueChange"] = 2] = "fullOnValueChange";
6
+ })(RefreshMode || (RefreshMode = {}));
@@ -1,8 +1,9 @@
1
1
  import { IProperty } from '../IProperty';
2
2
  import { IDesignItem } from '../../../item/IDesignItem';
3
3
  import { AbstractPropertiesService } from "./AbstractPropertiesService";
4
+ import { RefreshMode } from '../IPropertiesService';
4
5
  export declare abstract class AbstractPolymerLikePropertiesService extends AbstractPropertiesService {
5
- listNeedsRefresh(designItem: IDesignItem): boolean;
6
+ getRefreshMode(designItem: IDesignItem): RefreshMode;
6
7
  getProperties(designItem: IDesignItem): IProperty[];
7
8
  protected parseProperties(list: any): IProperty[];
8
9
  }
@@ -1,9 +1,10 @@
1
1
  import { PropertiesHelper } from './PropertiesHelper';
2
2
  import { AbstractPropertiesService } from "./AbstractPropertiesService";
3
3
  import { PropertyType } from '../PropertyType';
4
+ import { RefreshMode } from '../IPropertiesService';
4
5
  export class AbstractPolymerLikePropertiesService extends AbstractPropertiesService {
5
- listNeedsRefresh(designItem) {
6
- return true;
6
+ getRefreshMode(designItem) {
7
+ return RefreshMode.full;
7
8
  }
8
9
  getProperties(designItem) {
9
10
  if (!this.isHandledElement(designItem))
@@ -1,11 +1,11 @@
1
- import { IPropertiesService } from "../IPropertiesService";
1
+ import { IPropertiesService, RefreshMode } from "../IPropertiesService";
2
2
  import { IProperty } from '../IProperty';
3
3
  import { IDesignItem } from '../../../item/IDesignItem';
4
4
  import { ValueType } from "../ValueType";
5
5
  import { BindingTarget } from "../../../item/BindingTarget";
6
6
  import { IBinding } from "../../../item/IBinding";
7
7
  export declare abstract class AbstractPropertiesService implements IPropertiesService {
8
- abstract listNeedsRefresh(designItem: IDesignItem): boolean;
8
+ abstract getRefreshMode(designItem: IDesignItem): RefreshMode;
9
9
  abstract isHandledElement(designItem: IDesignItem): boolean;
10
10
  protected _notifyChangedProperty(designItem: IDesignItem, property: IProperty, value: any): void;
11
11
  getProperty(designItem: IDesignItem, name: string): IProperty;
@@ -15,6 +15,9 @@ export class AbstractPropertiesService {
15
15
  if (property.propertyType == PropertyType.cssValue) {
16
16
  d.styles.set(property.name, value);
17
17
  d.element.style[property.name] = value;
18
+ //unkown css property names do not trigger the mutation observer of property grid,
19
+ //fixed by assinging stle again to the attribute
20
+ d.element.setAttribute('style', d.element.getAttribute('style'));
18
21
  }
19
22
  else {
20
23
  let attributeName = property.attributeName;
@@ -1,4 +1,4 @@
1
- import { IPropertiesService } from "../IPropertiesService";
1
+ import { IPropertiesService, RefreshMode } from "../IPropertiesService";
2
2
  import { IProperty } from '../IProperty';
3
3
  import { IDesignItem } from '../../../item/IDesignItem';
4
4
  import { ValueType } from "../ValueType";
@@ -6,7 +6,7 @@ import { IBinding } from "../../../item/IBinding.js";
6
6
  import { BindingTarget } from "../../../item/BindingTarget";
7
7
  export declare class AttributesPropertiesService implements IPropertiesService {
8
8
  name: string;
9
- listNeedsRefresh(designItem: IDesignItem): boolean;
9
+ getRefreshMode(designItem: IDesignItem): RefreshMode;
10
10
  isHandledElement(designItem: IDesignItem): boolean;
11
11
  getProperty(designItem: IDesignItem, name: string): IProperty;
12
12
  getProperties(designItem: IDesignItem): IProperty[];
@@ -1,10 +1,11 @@
1
+ import { RefreshMode } from "../IPropertiesService";
1
2
  import { ValueType } from "../ValueType";
2
3
  import { BindingTarget } from "../../../item/BindingTarget";
3
4
  import { PropertyType } from "../PropertyType";
4
5
  export class AttributesPropertiesService {
5
6
  name = "attributes";
6
- listNeedsRefresh(designItem) {
7
- return true;
7
+ getRefreshMode(designItem) {
8
+ return RefreshMode.fullOnValueChange;
8
9
  }
9
10
  isHandledElement(designItem) {
10
11
  return true;
@@ -1,8 +1,9 @@
1
1
  import { IProperty } from '../IProperty';
2
2
  import { IDesignItem } from '../../../item/IDesignItem';
3
3
  import { AbstractPropertiesService } from "./AbstractPropertiesService";
4
+ import { RefreshMode } from '../IPropertiesService';
4
5
  export declare class CommonPropertiesService extends AbstractPropertiesService {
5
- listNeedsRefresh(designItem: IDesignItem): boolean;
6
+ getRefreshMode(designItem: IDesignItem): RefreshMode;
6
7
  private commonProperties;
7
8
  name: string;
8
9
  isHandledElement(designItem: IDesignItem): boolean;
@@ -1,8 +1,9 @@
1
1
  import { PropertyType } from "../PropertyType";
2
2
  import { AbstractPropertiesService } from "./AbstractPropertiesService";
3
+ import { RefreshMode } from '../IPropertiesService';
3
4
  export class CommonPropertiesService extends AbstractPropertiesService {
4
- listNeedsRefresh(designItem) {
5
- return false;
5
+ getRefreshMode(designItem) {
6
+ return RefreshMode.none;
6
7
  }
7
8
  //@ts-ignore
8
9
  commonProperties = [
@@ -2,8 +2,9 @@ import { IProperty } from '../IProperty';
2
2
  import { IDesignItem } from '../../../item/IDesignItem';
3
3
  import { BindingTarget } from '../../../item/BindingTarget.js';
4
4
  import { CommonPropertiesService } from './CommonPropertiesService';
5
+ import { RefreshMode } from '../IPropertiesService';
5
6
  export declare class CssPropertiesService extends CommonPropertiesService {
6
- listNeedsRefresh(designItem: IDesignItem): boolean;
7
+ getRefreshMode(designItem: IDesignItem): RefreshMode.none | RefreshMode.fullOnValueChange;
7
8
  layout: IProperty[];
8
9
  grid: IProperty[];
9
10
  flex: IProperty[];
@@ -1,9 +1,10 @@
1
1
  import { BindingTarget } from '../../../item/BindingTarget.js';
2
2
  import { PropertyType } from '../PropertyType';
3
3
  import { CommonPropertiesService } from './CommonPropertiesService';
4
+ import { RefreshMode } from '../IPropertiesService';
4
5
  export class CssPropertiesService extends CommonPropertiesService {
5
- listNeedsRefresh(designItem) {
6
- return this.name == 'styles' ? true : false;
6
+ getRefreshMode(designItem) {
7
+ return this.name == 'styles' ? RefreshMode.fullOnValueChange : RefreshMode.none;
7
8
  }
8
9
  layout = [
9
10
  {
@@ -2,8 +2,9 @@ import { IProperty } from '../IProperty';
2
2
  import { IDesignItem } from '../../../item/IDesignItem';
3
3
  import { IJsonPropertyDefinitions } from './IJsonPropertyDefinitions';
4
4
  import { AbstractPropertiesService } from './AbstractPropertiesService';
5
+ import { RefreshMode } from '../IPropertiesService';
5
6
  export declare class ListPropertiesService extends AbstractPropertiesService {
6
- listNeedsRefresh(designItem: IDesignItem): boolean;
7
+ getRefreshMode(designItem: IDesignItem): RefreshMode;
7
8
  name: string;
8
9
  private _propertys;
9
10
  constructor(propertyDefinitions: IJsonPropertyDefinitions);
@@ -1,8 +1,9 @@
1
1
  import { AbstractPropertiesService } from './AbstractPropertiesService';
2
2
  import { PropertyType } from '../PropertyType';
3
+ import { RefreshMode } from '../IPropertiesService';
3
4
  export class ListPropertiesService extends AbstractPropertiesService {
4
- listNeedsRefresh(designItem) {
5
- return true;
5
+ getRefreshMode(designItem) {
6
+ return RefreshMode.full;
6
7
  }
7
8
  name = "list";
8
9
  _propertys = new Map();
@@ -1,6 +1,7 @@
1
1
  import { IProperty } from '../IProperty';
2
2
  import { IDesignItem } from '../../../item/IDesignItem';
3
3
  import { CommonPropertiesService } from "./CommonPropertiesService";
4
+ import { RefreshMode } from '../IPropertiesService';
4
5
  export declare class NativeElementsPropertiesService extends CommonPropertiesService {
5
6
  private inputProperties;
6
7
  private textareaProperties;
@@ -12,7 +13,7 @@ export declare class NativeElementsPropertiesService extends CommonPropertiesSer
12
13
  private iframeProperties;
13
14
  private formElementProperties;
14
15
  name: string;
15
- listNeedsRefresh(designItem: IDesignItem): boolean;
16
+ getRefreshMode(designItem: IDesignItem): RefreshMode;
16
17
  isHandledElement(designItem: IDesignItem): boolean;
17
18
  getProperty(designItem: IDesignItem, name: string): IProperty;
18
19
  getProperties(designItem: IDesignItem): IProperty[];
@@ -1,5 +1,6 @@
1
1
  import { CommonPropertiesService } from "./CommonPropertiesService";
2
2
  import { PropertyType } from '../PropertyType';
3
+ import { RefreshMode } from '../IPropertiesService';
3
4
  export class NativeElementsPropertiesService extends CommonPropertiesService {
4
5
  inputProperties = [
5
6
  {
@@ -156,8 +157,8 @@ export class NativeElementsPropertiesService extends CommonPropertiesService {
156
157
  }
157
158
  ];
158
159
  name = "native";
159
- listNeedsRefresh(designItem) {
160
- return true;
160
+ getRefreshMode(designItem) {
161
+ return RefreshMode.full;
161
162
  }
162
163
  isHandledElement(designItem) {
163
164
  switch (designItem.element.localName) {
@@ -1,10 +1,10 @@
1
1
  import { BindingTarget } from "../../../item/BindingTarget.js";
2
2
  import { IDesignItem } from "../../../item/IDesignItem.js";
3
- import { IPropertiesService } from "../IPropertiesService.js";
3
+ import { IPropertiesService, RefreshMode } from "../IPropertiesService.js";
4
4
  import { IProperty } from "../IProperty.js";
5
5
  import { AbstractPropertiesService } from "./AbstractPropertiesService.js";
6
6
  export declare class WebcomponentManifestPropertiesService extends AbstractPropertiesService implements IPropertiesService {
7
- listNeedsRefresh(designItem: IDesignItem): boolean;
7
+ getRefreshMode(designItem: IDesignItem): RefreshMode;
8
8
  private _name;
9
9
  get name(): string;
10
10
  private _propertiesList;
@@ -1,9 +1,10 @@
1
1
  import { BindingTarget } from "../../../item/BindingTarget.js";
2
+ import { RefreshMode } from "../IPropertiesService.js";
2
3
  import { PropertyType } from "../PropertyType.js";
3
4
  import { AbstractPropertiesService } from "./AbstractPropertiesService.js";
4
5
  export class WebcomponentManifestPropertiesService extends AbstractPropertiesService {
5
- listNeedsRefresh(designItem) {
6
- return true;
6
+ getRefreshMode(designItem) {
7
+ return RefreshMode.full;
7
8
  }
8
9
  _name;
9
10
  get name() { return this._name; }
@@ -663,6 +663,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
663
663
  di.setStyle('position', 'absolute');
664
664
  di.setStyle('left', (position.x - pos.x) + 'px');
665
665
  di.setStyle('top', (position.y - pos.y) + 'px');
666
+ const containerService = this.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainer, getComputedStyle(newContainer.element)));
667
+ containerService.enterContainer(newContainer, [di]);
666
668
  this.instanceServiceContainer.undoService.execute(new InsertAction(newContainer, newContainer.childCount, di));
667
669
  grp.commit();
668
670
  requestAnimationFrame(() => this.instanceServiceContainer.selectionService.setSelectedElements([di]));
@@ -1,5 +1,5 @@
1
1
  import { EventNames } from "../../../../enums/EventNames";
2
- import { convertCoordinates, getDomMatrix, getDesignerCanvasNormalizedTransformedCornerDOMPoints, normalizeToAbsolutePosition } from "../../../helper/TransformHelper.js";
2
+ import { transformPointByInverseMatrix, getDomMatrix, getDesignerCanvasNormalizedTransformedCornerDOMPoints, normalizeToAbsolutePosition } from "../../../helper/TransformHelper.js";
3
3
  import { AbstractExtension } from './AbstractExtension';
4
4
  export class ResizeExtension extends AbstractExtension {
5
5
  resizeAllSelected;
@@ -158,116 +158,121 @@ export class ResizeExtension extends AbstractExtension {
158
158
  let trackX = Math.round(diff.x - this._initialPoint.x - this._offsetPoint.x);
159
159
  let trackY = Math.round(diff.y - this._initialPoint.y - this._offsetPoint.y);
160
160
  let matrix = getDomMatrix(this.extendedItem.element);
161
- let transformedTrack = convertCoordinates(new DOMPoint(trackX, trackY, 0, 0), matrix);
161
+ let transformedTrack = transformPointByInverseMatrix(new DOMPoint(trackX, trackY, 0, 0), matrix);
162
+ let deltaX = transformedTrack.x;
163
+ let deltaY = transformedTrack.y;
164
+ if (event.shiftKey) {
165
+ deltaX = deltaX < deltaY ? deltaX : deltaY;
166
+ deltaY = deltaX;
167
+ }
162
168
  let i = 0;
163
169
  let width = null;
164
170
  let height = null;
165
171
  switch (this._actionModeStarted) {
166
172
  case 'e-resize':
167
- width = (this._initialSizes[i].width + transformedTrack.x);
173
+ width = (this._initialSizes[i].width + deltaX);
168
174
  this.extendedItem.element.style.width = width + 'px';
169
175
  if (this.resizeAllSelected) {
170
176
  i++;
171
177
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
172
178
  if (designItem !== this.extendedItem) {
173
- designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
179
+ designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
174
180
  }
175
181
  }
176
182
  }
177
183
  break;
178
184
  case 'se-resize':
179
- width = (this._initialSizes[i].width + transformedTrack.x);
185
+ width = (this._initialSizes[i].width + deltaX);
180
186
  this.extendedItem.element.style.width = width + 'px';
181
- height = (this._initialSizes[i].height + transformedTrack.y);
187
+ height = (this._initialSizes[i].height + deltaY);
182
188
  this.extendedItem.element.style.height = height + 'px';
183
- console.log(this.extendedItem.element.style.transformOrigin);
184
189
  if (this.resizeAllSelected) {
185
190
  i++;
186
191
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
187
192
  if (designItem !== this.extendedItem) {
188
- designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
189
- designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
193
+ designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
194
+ designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
190
195
  }
191
196
  }
192
197
  }
193
198
  break;
194
199
  case 's-resize':
195
- height = (this._initialSizes[i].height + transformedTrack.y);
200
+ height = (this._initialSizes[i].height + deltaY);
196
201
  this.extendedItem.element.style.height = height + 'px';
197
202
  if (this.resizeAllSelected) {
198
203
  i++;
199
204
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
200
205
  if (designItem !== this.extendedItem) {
201
- designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
206
+ designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
202
207
  }
203
208
  }
204
209
  }
205
210
  break;
206
211
  case 'sw-resize':
207
- width = (this._initialSizes[i].width - transformedTrack.x);
212
+ width = (this._initialSizes[i].width - deltaX);
208
213
  this.extendedItem.element.style.width = width + 'px';
209
- height = (this._initialSizes[i].height + transformedTrack.y);
214
+ height = (this._initialSizes[i].height + deltaY);
210
215
  this.extendedItem.element.style.height = height + 'px';
211
216
  if (this.resizeAllSelected) {
212
217
  i++;
213
218
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
214
219
  if (designItem !== this.extendedItem) {
215
- designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
216
- designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
220
+ designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
221
+ designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
217
222
  }
218
223
  }
219
224
  }
220
225
  break;
221
226
  case 'w-resize':
222
- width = (this._initialSizes[i].width - transformedTrack.x);
227
+ width = (this._initialSizes[i].width - deltaX);
223
228
  this.extendedItem.element.style.width = width + 'px';
224
229
  if (this.resizeAllSelected) {
225
230
  i++;
226
231
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
227
232
  if (designItem !== this.extendedItem) {
228
- designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
233
+ designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
229
234
  }
230
235
  }
231
236
  }
232
237
  break;
233
238
  case 'nw-resize':
234
- width = (this._initialSizes[i].width - transformedTrack.x);
239
+ width = (this._initialSizes[i].width - deltaX);
235
240
  this.extendedItem.element.style.width = width + 'px';
236
- height = (this._initialSizes[i].height - transformedTrack.y);
241
+ height = (this._initialSizes[i].height - deltaY);
237
242
  this.extendedItem.element.style.height = height + 'px';
238
243
  if (this.resizeAllSelected) {
239
244
  i++;
240
245
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
241
246
  if (designItem !== this.extendedItem) {
242
- designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
243
- designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
247
+ designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
248
+ designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
244
249
  }
245
250
  }
246
251
  }
247
252
  break;
248
253
  case 'n-resize':
249
- height = (this._initialSizes[i].height - transformedTrack.y);
254
+ height = (this._initialSizes[i].height - deltaY);
250
255
  this.extendedItem.element.style.height = height + 'px';
251
256
  if (this.resizeAllSelected) {
252
257
  i++;
253
258
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
254
259
  if (designItem !== this.extendedItem) {
255
- designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
260
+ designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
256
261
  }
257
262
  }
258
263
  }
259
264
  break;
260
265
  case 'ne-resize':
261
- width = (this._initialSizes[i].width + transformedTrack.x);
266
+ width = (this._initialSizes[i].width + deltaX);
262
267
  this.extendedItem.element.style.width = width + 'px';
263
- height = (this._initialSizes[i].height - transformedTrack.y);
268
+ height = (this._initialSizes[i].height - deltaY);
264
269
  this.extendedItem.element.style.height = height + 'px';
265
270
  if (this.resizeAllSelected) {
266
271
  i++;
267
272
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
268
273
  if (designItem !== this.extendedItem) {
269
- designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
270
- designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
274
+ designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
275
+ designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
271
276
  }
272
277
  }
273
278
  }
@@ -293,7 +298,7 @@ export class ResizeExtension extends AbstractExtension {
293
298
  let matrix = new DOMMatrix(getComputedStyle(this.extendedItem.element).transform);
294
299
  let deltaX = 0;
295
300
  let deltaY = 0;
296
- let p1transformed = p1.matrixTransform(matrix.inverse());
301
+ let p1transformed = transformPointByInverseMatrix(p1, matrix);
297
302
  let p2Abs = new DOMPoint(p3Abs.x + p1transformed.x, p3Abs.y - p1transformed.y);
298
303
  let p1p2 = new DOMPoint(p2Abs.x - p1Abs.x, -(p2Abs.y - p1Abs.y));
299
304
  let p1p2transformed = p1p2.matrixTransform(matrix);
@@ -75,10 +75,12 @@ export class RotateExtension extends AbstractExtension {
75
75
  let angle = Math.atan2(currentPoint.y - transformOriginInPx.y, currentPoint.x - transformOriginInPx.x) * (180 / Math.PI);
76
76
  angle = angle - this._initialOverlayAngle + this._initialElementAngle;
77
77
  angle *= -1;
78
+ if (!event.ctrlKey)
79
+ angle = Math.ceil(angle / 15) * 15;
78
80
  const rotationMatrix3d = getRotationMatrix3d('z', angle);
79
81
  rotateElementByMatrix3d(this.extendedItem.element, rotationMatrix3d);
80
- let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: 30, y: 30 }, this.designerCanvas);
81
- let angleTextPosition = transformedCornerPoints[0];
82
+ const transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: 30, y: 30 }, this.designerCanvas);
83
+ const angleTextPosition = transformedCornerPoints[0];
82
84
  this._textAngle = this._drawTextWithBackground(this._actualRotationAngle + '°', angleTextPosition.x, angleTextPosition.y, 'white', 'svg-rotate-text', this._textAngle);
83
85
  this._textAngle[2].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
84
86
  this._textAngle[3].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
@@ -1,5 +1,6 @@
1
1
  import { EventNames } from "../../../../enums/EventNames";
2
2
  import { convertCssUnit, getCssUnit } from "../../../helper/CssUnitConverter";
3
+ import { getDesignerCanvasNormalizedTransformedPoint } from "../../../helper/TransformHelper";
3
4
  import { AbstractExtension } from './AbstractExtension';
4
5
  export class TransformOriginExtension extends AbstractExtension {
5
6
  _startPos;
@@ -10,21 +11,15 @@ export class TransformOriginExtension extends AbstractExtension {
10
11
  super(extensionManager, designerView, extendedItem);
11
12
  }
12
13
  extend() {
13
- const rect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
14
14
  const computed = getComputedStyle(this.extendedItem.element);
15
- const x = 0;
16
- const y = 1;
17
15
  const to = computed.transformOrigin.split(' '); // This value remains the same regardless of scalefactor
18
- const toInPercentage = [];
19
- toInPercentage[0] = parseInt(to[0]) / parseInt(getComputedStyle(this.extendedItem.element).width); // This value remains the same regardless of scalefactor
20
- toInPercentage[1] = parseInt(to[1]) / parseInt(getComputedStyle(this.extendedItem.element).height); // This value remains the same regardless of scalefactor
21
- const toDOMPoint = new DOMPoint(rect.x + toInPercentage[x] * rect.width, rect.y + toInPercentage[y] * rect.height);
16
+ const toDOMPoint = getDesignerCanvasNormalizedTransformedPoint(this.extendedItem.element, { x: parseFloat(to[0]), y: parseFloat(to[1]) }, this.designerCanvas);
22
17
  this._circle = this._drawCircle(toDOMPoint.x, toDOMPoint.y, 5 / this.designerCanvas.zoomFactor, 'svg-transform-origin');
23
18
  this._circle.style.strokeWidth = (1 / this.designerCanvas.zoomFactor).toString();
24
19
  this._circle.style.cursor = 'pointer';
25
20
  this._circle2 = this._drawCircle(toDOMPoint.x, toDOMPoint.y, 1 / this.designerCanvas.zoomFactor, 'svg-transform-origin');
26
21
  this._circle2.style.strokeWidth = (1 / this.designerCanvas.zoomFactor).toString();
27
- this._circle2.style.pointerEvents = 'pointer-events: none';
22
+ this._circle2.style.pointerEvents = 'none';
28
23
  this._circle.addEventListener(EventNames.PointerDown, event => this.pointerEvent(event));
29
24
  this._circle.addEventListener(EventNames.PointerMove, event => this.pointerEvent(event));
30
25
  this._circle.addEventListener(EventNames.PointerUp, event => this.pointerEvent(event)); //TODO: -> assign to window
@@ -1,6 +1,7 @@
1
1
  import { PropertyGridPropertyList } from './PropertyGridPropertyList';
2
2
  import { DesignerTabControl } from '../../controls/DesignerTabControl';
3
3
  import { BaseCustomWebComponentLazyAppend, css } from '@node-projects/base-custom-webcomponent';
4
+ import { RefreshMode } from '../../services/propertiesService/IPropertiesService';
4
5
  export class PropertyGrid extends BaseCustomWebComponentLazyAppend {
5
6
  _serviceContainer;
6
7
  _designerTabControl;
@@ -35,6 +36,10 @@ export class PropertyGrid extends BaseCustomWebComponentLazyAppend {
35
36
  });
36
37
  this._itemsObserver = new MutationObserver((m) => {
37
38
  for (const a of this._propertyGridPropertyLists) {
39
+ if (a.propertiesService.getRefreshMode(this._selectedItems[0]) == RefreshMode.fullOnValueChange) {
40
+ a.createElements(this._selectedItems[0]);
41
+ a.designItemsChanged(this._selectedItems);
42
+ }
38
43
  a.refreshForDesignItems(this._selectedItems);
39
44
  }
40
45
  });
@@ -9,6 +9,7 @@ export declare class PropertyGridPropertyList extends BaseCustomWebComponentLazy
9
9
  private _serviceContainer;
10
10
  private _propertiesService;
11
11
  private _designItems;
12
+ get propertiesService(): IPropertiesService;
12
13
  static get style(): CSSStyleSheet;
13
14
  constructor(serviceContainer: ServiceContainer);
14
15
  setPropertiesService(propertiesService: IPropertiesService): void;
@@ -1,4 +1,5 @@
1
1
  import { BaseCustomWebComponentLazyAppend, css, DomHelper } from '@node-projects/base-custom-webcomponent';
2
+ import { RefreshMode } from '../../services/propertiesService/IPropertiesService';
2
3
  import { ValueType } from '../../services/propertiesService/ValueType';
3
4
  import { ContextMenu } from '../../helper/contextMenu/ContextMenu';
4
5
  import { PropertyType } from '../../services/propertiesService/PropertyType';
@@ -8,6 +9,9 @@ export class PropertyGridPropertyList extends BaseCustomWebComponentLazyAppend {
8
9
  _serviceContainer;
9
10
  _propertiesService;
10
11
  _designItems;
12
+ get propertiesService() {
13
+ return this._propertiesService;
14
+ }
11
15
  static get style() {
12
16
  return css `
13
17
  :host{
@@ -93,7 +97,7 @@ export class PropertyGridPropertyList extends BaseCustomWebComponentLazyAppend {
93
97
  }
94
98
  }
95
99
  createElements(designItem) {
96
- if (this._propertiesService && (this._propertiesService.listNeedsRefresh(designItem)) || this._propertyMap.size == 0) {
100
+ if (this._propertiesService && (this._propertiesService.getRefreshMode(designItem) != RefreshMode.none) || this._propertyMap.size == 0) {
97
101
  DomHelper.removeAllChildnodes(this._div);
98
102
  this._propertyMap.clear();
99
103
  if (this._propertiesService) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.0.153",
4
+ "version": "0.0.155",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",