@node-projects/web-component-designer 0.0.57 → 0.0.61

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 (67) hide show
  1. package/.github/FUNDING.yml +3 -0
  2. package/dist/commandHandling/CommandType.d.ts +3 -0
  3. package/dist/commandHandling/CommandType.js +3 -0
  4. package/dist/elements/documentContainer.d.ts +5 -0
  5. package/dist/elements/documentContainer.js +50 -11
  6. package/dist/elements/helper/CssAttributeParser.d.ts +1 -1
  7. package/dist/elements/helper/CssAttributeParser.js +6 -3
  8. package/dist/elements/helper/CssCombiner.js +1 -1
  9. package/dist/elements/helper/GridHelper.js +7 -3
  10. package/dist/elements/services/DefaultServiceBootstrap.js +5 -0
  11. package/dist/elements/services/GlobalContext.d.ts +4 -0
  12. package/dist/elements/services/GlobalContext.js +12 -0
  13. package/dist/elements/services/ServiceContainer.d.ts +5 -0
  14. package/dist/elements/services/ServiceContainer.js +4 -0
  15. package/dist/elements/services/demoProviderService/DemoProviderService.d.ts +6 -0
  16. package/dist/elements/services/demoProviderService/DemoProviderService.js +28 -0
  17. package/dist/elements/services/demoProviderService/IDemoProviderService.d.ts +5 -0
  18. package/dist/elements/services/demoProviderService/IDemoProviderService.js +1 -0
  19. package/dist/elements/services/placementService/GridPlacementService.js +25 -5
  20. package/dist/elements/widgets/codeView/ICodeView.d.ts +2 -0
  21. package/dist/elements/widgets/codeView/code-view-ace.d.ts +2 -1
  22. package/dist/elements/widgets/codeView/code-view-ace.js +3 -1
  23. package/dist/elements/widgets/codeView/code-view-code-mirror.d.ts +2 -1
  24. package/dist/elements/widgets/codeView/code-view-code-mirror.js +3 -1
  25. package/dist/elements/widgets/codeView/code-view-monaco.d.ts +2 -1
  26. package/dist/elements/widgets/codeView/code-view-monaco.js +11 -1
  27. package/dist/elements/widgets/demoView/demoView.d.ts +1 -1
  28. package/dist/elements/widgets/demoView/demoView.js +3 -22
  29. package/dist/elements/widgets/designerView/ButtonSeperatorProvider copy.d.ts +7 -0
  30. package/dist/elements/widgets/designerView/ButtonSeperatorProvider copy.js +11 -0
  31. package/dist/elements/widgets/designerView/ButtonSeperatorProvider.d.ts +8 -0
  32. package/dist/elements/widgets/designerView/ButtonSeperatorProvider.js +11 -0
  33. package/dist/elements/widgets/designerView/DesignContext.d.ts +3 -0
  34. package/dist/elements/widgets/designerView/DesignContext.js +1 -0
  35. package/dist/elements/widgets/designerView/DesignerViewUseOverlayScollbars.d.ts +7 -0
  36. package/dist/elements/widgets/designerView/DesignerViewUseOverlayScollbars.js +13 -0
  37. package/dist/elements/widgets/designerView/IDesignContext.d.ts +3 -0
  38. package/dist/elements/widgets/designerView/IDesignViewConfigButtonsProvider.d.ts +5 -0
  39. package/dist/elements/widgets/designerView/IDesignViewConfigButtonsProvider.js +1 -0
  40. package/dist/elements/widgets/designerView/designerCanvas.d.ts +0 -1
  41. package/dist/elements/widgets/designerView/designerCanvas.js +25 -12
  42. package/dist/elements/widgets/designerView/designerView.d.ts +1 -0
  43. package/dist/elements/widgets/designerView/designerView.js +14 -0
  44. package/dist/elements/widgets/designerView/extensions/GridExtensionConfigButtons.d.ts +5 -0
  45. package/dist/elements/widgets/designerView/extensions/GridExtensionConfigButtons.js +12 -0
  46. package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons.d.ts +6 -0
  47. package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons.js +21 -0
  48. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.d.ts +10 -0
  49. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.js +18 -0
  50. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider.d.ts +1 -0
  51. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider.js +2 -1
  52. package/dist/elements/widgets/designerView/extensions/GridExtensionProviderConfigButtons.d.ts +5 -0
  53. package/dist/elements/widgets/designerView/extensions/GridExtensionProviderConfigButtons.js +12 -0
  54. package/dist/elements/widgets/designerView/extensions/GridExtensionProviderOptions.d.ts +10 -0
  55. package/dist/elements/widgets/designerView/extensions/GridExtensionProviderOptions.js +18 -0
  56. package/dist/elements/widgets/designerView/extensions/IDesignViewConfigButtonsProvider.d.ts +0 -0
  57. package/dist/elements/widgets/designerView/extensions/IDesignViewConfigButtonsProvider.js +1 -0
  58. package/dist/elements/widgets/designerView/extensions/IExtensionConfiguration.d.ts +3 -0
  59. package/dist/elements/widgets/designerView/extensions/IExtensionConfiguration.js +1 -0
  60. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +4 -1
  61. package/dist/elements/widgets/designerView/tools/DrawPathTool.d.ts +9 -0
  62. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +95 -29
  63. package/dist/elements/widgets/designerView/tools/PointerTool.js +2 -2
  64. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +3 -0
  65. package/dist/index.d.ts +2 -0
  66. package/dist/index.js +1 -0
  67. package/package.json +4 -4
@@ -18,11 +18,6 @@ export class DemoView extends BaseCustomWebComponentLazyAppend {
18
18
  position: absolute;
19
19
  top: 60px;
20
20
  left: 20px;
21
- }
22
- iframe {
23
- width: 100%;
24
- height: 100%;
25
- border: none;
26
21
  }`;
27
22
  constructor() {
28
23
  super();
@@ -34,24 +29,10 @@ export class DemoView extends BaseCustomWebComponentLazyAppend {
34
29
  this._loading.textContent = '🛀 Hold on, loading...';
35
30
  this.shadowRoot.appendChild(this._loading);
36
31
  }
37
- display(serviceContainer, instanceServiceContainer, code) {
38
- let iframe = document.createElement('iframe');
39
- this._placeholder.innerHTML = '';
40
- this._placeholder.appendChild(iframe);
32
+ async display(serviceContainer, instanceServiceContainer, code) {
41
33
  this._loading.hidden = false;
42
- iframe.onload = () => {
43
- this._loading.hidden = true;
44
- };
45
- let doc = iframe.contentWindow.document;
46
- doc.open();
47
- doc.write('<script type="module">');
48
- for (let i of instanceServiceContainer.designContext.imports) {
49
- doc.write("import '" + i + "';");
50
- }
51
- doc.write("document.body.style.display='';");
52
- doc.write('</script>');
53
- doc.write('<body style="display:none">' + code + '</body>');
54
- doc.close();
34
+ await serviceContainer.demoProviderService.provideDemo(this._placeholder, serviceContainer, instanceServiceContainer, code);
35
+ this._loading.hidden = true;
55
36
  }
56
37
  }
57
38
  customElements.define('node-projects-demo-view', DemoView);
@@ -0,0 +1,7 @@
1
+ import { IDesignerCanvas } from "./IDesignerCanvas.js";
2
+ import { IDesignViewConfigButtonsProvider } from "./IDesignViewConfigButtonsProvider.js";
3
+ export declare class ButtonSeperatorProvider implements IDesignViewConfigButtonsProvider {
4
+ _space: number;
5
+ constructor(space: number);
6
+ provideButtons(designerCanvas: IDesignerCanvas): HTMLElement[];
7
+ }
@@ -0,0 +1,11 @@
1
+ export class ButtonSeperatorProvider {
2
+ _space;
3
+ constructor(space) {
4
+ this._space = space;
5
+ }
6
+ provideButtons(designerCanvas) {
7
+ const div = document.createElement('div');
8
+ div.style.marginLeft = this._space + 'px';
9
+ return [div];
10
+ }
11
+ }
@@ -0,0 +1,8 @@
1
+ import { DesignerView } from "./designerView.js";
2
+ import { IDesignerCanvas } from "./IDesignerCanvas.js";
3
+ import { IDesignViewConfigButtonsProvider } from "./IDesignViewConfigButtonsProvider.js";
4
+ export declare class ButtonSeperatorProvider implements IDesignViewConfigButtonsProvider {
5
+ _space: number;
6
+ constructor(space: number);
7
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
8
+ }
@@ -0,0 +1,11 @@
1
+ export class ButtonSeperatorProvider {
2
+ _space;
3
+ constructor(space) {
4
+ this._space = space;
5
+ }
6
+ provideButtons(designerView, designerCanvas) {
7
+ const div = document.createElement('div');
8
+ div.style.marginLeft = this._space + 'px';
9
+ return [div];
10
+ }
11
+ }
@@ -1,4 +1,7 @@
1
1
  import { IDesignContext } from "./IDesignContext";
2
2
  export declare class DesignContext implements IDesignContext {
3
3
  imports: string[];
4
+ extensionOptions: {
5
+ [key: string]: any;
6
+ };
4
7
  }
@@ -1,3 +1,4 @@
1
1
  export class DesignContext {
2
2
  imports = [];
3
+ extensionOptions = {};
3
4
  }
@@ -0,0 +1,7 @@
1
+ import { IDesignerCanvas } from "./IDesignerCanvas.js";
2
+ import { IDesignViewConfigButtonsProvider } from "./IDesignViewConfigButtonsProvider.js";
3
+ import { DesignerView } from './designerView';
4
+ export declare class DesignerViewUseOverlayScollbars implements IDesignViewConfigButtonsProvider {
5
+ constructor();
6
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
7
+ }
@@ -0,0 +1,13 @@
1
+ //todo, element moving does not work atm, needs to be fixed
2
+ export class DesignerViewUseOverlayScollbars {
3
+ constructor() {
4
+ }
5
+ provideButtons(designerView, designerCanvas) {
6
+ let externalCss = document.createElement('style');
7
+ externalCss.innerHTML = '@import url("./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css");';
8
+ designerCanvas.shadowRoot.appendChild(externalCss);
9
+ //@ts-ignore
10
+ setTimeout(() => OverlayScrollbars([designerCanvas._outercanvas2], {}), 5000);
11
+ return [];
12
+ }
13
+ }
@@ -1,3 +1,6 @@
1
1
  export interface IDesignContext {
2
2
  imports: string[];
3
+ extensionOptions: {
4
+ [key: string]: any;
5
+ };
3
6
  }
@@ -0,0 +1,5 @@
1
+ import { DesignerView } from "./designerView.js";
2
+ import { IDesignerCanvas } from "./IDesignerCanvas.js";
3
+ export interface IDesignViewConfigButtonsProvider {
4
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
5
+ }
@@ -72,7 +72,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
72
72
  getNormalizedEventCoordinates(event: MouseEvent): IPoint;
73
73
  getNormalizedElementCoordinates(element: Element): IRect;
74
74
  getNormalizedOffsetInElement(event: MouseEvent, element: Element): IPoint;
75
- static getHost(node: Node): Element;
76
75
  getElementAtPoint(point: IPoint, ignoreElementCallback?: (element: HTMLElement) => boolean): HTMLElement;
77
76
  _rect: SVGRectElement;
78
77
  private _pointerEventHandler;
@@ -190,6 +190,21 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
190
190
  this.serviceContainer.globalContext.tool = this.serviceContainer.designerTools.get(command.parameter);
191
191
  }
192
192
  break;
193
+ case CommandType.setStrokeColor:
194
+ {
195
+ this.serviceContainer.globalContext.strokeColor = command.parameter;
196
+ }
197
+ break;
198
+ case CommandType.setFillBrush:
199
+ {
200
+ this.serviceContainer.globalContext.fillBrush = command.parameter;
201
+ }
202
+ break;
203
+ case CommandType.setStrokeThickness:
204
+ {
205
+ this.serviceContainer.globalContext.strokeThickness = command.parameter;
206
+ }
207
+ break;
193
208
  case CommandType.delete:
194
209
  this.handleDeleteCommand();
195
210
  break;
@@ -496,14 +511,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
496
511
  const normEl = this.getNormalizedElementCoordinates(element);
497
512
  return { x: normEvt.x - normEl.x, y: normEvt.y - normEl.y };
498
513
  }
499
- //todo remove, is in base custom webcomp domhelper
500
- static getHost(node) {
501
- while (node.parentElement)
502
- node = node.parentElement;
503
- if (node.host)
504
- return node.host;
505
- return node.parentNode.host;
506
- }
507
514
  getElementAtPoint(point, ignoreElementCallback) {
508
515
  let backupPEventsMap = new Map();
509
516
  let currentElement = this.elementFromPoint(point.x, point.y);
@@ -549,6 +556,9 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
549
556
  _rect;
550
557
  _pointerEventHandler(event) {
551
558
  this._fillCalculationrects();
559
+ /*let clickOnScrollbar = event.clientX - this.containerBoundingRect.x > this.containerBoundingRect.width || event.clientY - this.containerBoundingRect.y > this.containerBoundingRect.height
560
+ if (clickOnScrollbar) https://kingsora.github.io/OverlayScrollbars/
561
+ return;*/
552
562
  if (this._pointerextensions) {
553
563
  for (let pe of this._pointerextensions)
554
564
  pe.refresh(event);
@@ -560,18 +570,21 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
560
570
  let currentElement = this.serviceContainer.elementAtPointService.getElementAtPoint(this, { x: event.x, y: event.y });
561
571
  if (currentElement === this._outercanvas2 || currentElement === this.overlayLayer || !currentElement) {
562
572
  currentElement = this._canvas;
563
- }
573
+ } /* else {
574
+ if (!DesignerCanvas.hasOrIsParent(currentElement, this._canvas))
575
+ return;
576
+ }*/
564
577
  //TODO: remove duplication when tool refactoring starts
565
- this._fillCalculationrects();
578
+ //this._fillCalculationrects();
566
579
  const currentDesignItem = DesignItem.GetOrCreateDesignItem(currentElement, this.serviceContainer, this.instanceServiceContainer);
567
580
  if (this._lastHoverDesignItem != currentDesignItem) {
568
581
  if (this._lastHoverDesignItem)
569
582
  this.extensionManager.removeExtension(this._lastHoverDesignItem, ExtensionType.MouseOver);
570
- if (currentDesignItem && currentDesignItem != this.rootDesignItem && DesignerCanvas.getHost(currentElement.parentNode) !== this.overlayLayer)
583
+ if (currentDesignItem && currentDesignItem != this.rootDesignItem && DomHelper.getHost(currentElement.parentNode) !== this.overlayLayer)
571
584
  this.extensionManager.applyExtension(currentDesignItem, ExtensionType.MouseOver);
572
585
  this._lastHoverDesignItem = currentDesignItem;
573
586
  }
574
- if (currentElement && DesignerCanvas.getHost(currentElement.parentNode) === this.overlayLayer) {
587
+ if (currentElement && DomHelper.getHost(currentElement.parentNode) === this.overlayLayer) {
575
588
  if (this.eatEvents)
576
589
  return;
577
590
  currentElement = this.instanceServiceContainer.selectionService.primarySelection?.element ?? this._canvas;
@@ -12,6 +12,7 @@ export declare class DesignerView extends BaseCustomWebComponentConstructorAppen
12
12
  get instanceServiceContainer(): InstanceServiceContainer;
13
13
  set instanceServiceContainer(value: InstanceServiceContainer);
14
14
  private _zoomInput;
15
+ private _lowertoolbar;
15
16
  static readonly style: CSSStyleSheet;
16
17
  static readonly template: HTMLTemplateElement;
17
18
  private _designerCanvas;
@@ -17,6 +17,7 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
17
17
  this._designerCanvas.instanceServiceContainer = value;
18
18
  }
19
19
  _zoomInput;
20
+ _lowertoolbar;
20
21
  static style = css `
21
22
  :host {
22
23
  display: block;
@@ -49,6 +50,12 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
49
50
  display: block;
50
51
  margin-right: 1px;
51
52
  cursor: default;
53
+ display: flex;
54
+ justify-content: center;
55
+ align-items: center;
56
+ }
57
+ .selected {
58
+ background-color: deepskyblue;
52
59
  }
53
60
  .toolbar-control:hover {
54
61
  background-color:rgba(164,206,249,.6);
@@ -138,6 +145,7 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
138
145
  let alignGrid = this._getDomElement('alignGrid');
139
146
  alignGrid.onclick = () => { this._designerCanvas.alignOnGrid = !this._designerCanvas.alignOnGrid; alignGrid.style.backgroundColor = this._designerCanvas.alignOnGrid ? 'deepskyblue' : ''; };
140
147
  alignGrid.style.backgroundColor = this._designerCanvas.alignOnGrid ? 'deepskyblue' : '';
148
+ this._lowertoolbar = this._getDomElement('lowertoolbar');
141
149
  }
142
150
  _onWheel(event) {
143
151
  if (event.ctrlKey) {
@@ -180,6 +188,12 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
180
188
  initialize(serviceContainer) {
181
189
  this.serviceContainer = serviceContainer;
182
190
  this._designerCanvas.initialize(serviceContainer);
191
+ if (serviceContainer.designViewConfigButtons) {
192
+ for (let provider of serviceContainer.designViewConfigButtons) {
193
+ for (let btn of provider.provideButtons(this, this._designerCanvas))
194
+ this._lowertoolbar.appendChild(btn);
195
+ }
196
+ }
183
197
  }
184
198
  getHTML(designItemsAssignmentList) {
185
199
  this.instanceServiceContainer.selectionService.setSelectedElements(null);
@@ -0,0 +1,5 @@
1
+ import { IDesignerCanvas } from "../IDesignerCanvas";
2
+ import { IExtensionManager } from "./IExtensionManger";
3
+ export declare class GridExtensionProviderConfigButtons {
4
+ aaa(extensionManager: IExtensionManager, designerView: IDesignerCanvas): HTMLElement[];
5
+ }
@@ -0,0 +1,12 @@
1
+ import { gridExtensionShowOverlayOptionName } from "./GridExtensionProvider.js";
2
+ export class GridExtensionProviderConfigButtons {
3
+ aaa(extensionManager, designerView) {
4
+ const extensionOptions = designerView.instanceServiceContainer.designContext.extensionOptions;
5
+ const btn = document.createElement('div');
6
+ btn.onclick = () => {
7
+ const val = extensionOptions[gridExtensionShowOverlayOptionName];
8
+ extensionOptions[gridExtensionShowOverlayOptionName] = val == true ? false : true;
9
+ };
10
+ return [btn];
11
+ }
12
+ }
@@ -0,0 +1,6 @@
1
+ import { DesignerView } from "../designerView.js";
2
+ import { IDesignerCanvas } from "../IDesignerCanvas";
3
+ import { IDesignViewConfigButtonsProvider } from "../IDesignViewConfigButtonsProvider.js";
4
+ export declare class GridExtensionDesignViewConfigButtons implements IDesignViewConfigButtonsProvider {
5
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
6
+ }
@@ -0,0 +1,21 @@
1
+ import { gridExtensionShowOverlayOptionName } from "./GridExtensionProvider.js";
2
+ export class GridExtensionDesignViewConfigButtons {
3
+ provideButtons(designerView, designerCanvas) {
4
+ const extensionOptions = designerCanvas.instanceServiceContainer.designContext.extensionOptions;
5
+ const btn = document.createElement('div');
6
+ btn.innerText = 'G';
7
+ btn.title = 'show grid overlay';
8
+ btn.className = 'toolbar-control';
9
+ if (extensionOptions[gridExtensionShowOverlayOptionName] !== false)
10
+ btn.classList.add('selected');
11
+ btn.onclick = () => {
12
+ const val = extensionOptions[gridExtensionShowOverlayOptionName];
13
+ extensionOptions[gridExtensionShowOverlayOptionName] = val === false ? true : false;
14
+ if (extensionOptions[gridExtensionShowOverlayOptionName] !== false)
15
+ btn.classList.add('selected');
16
+ else
17
+ btn.classList.remove('selected');
18
+ };
19
+ return [btn];
20
+ }
21
+ }
@@ -0,0 +1,10 @@
1
+ import { IDesignerExtensionProvider } from "./IDesignerExtensionProvider";
2
+ import { IDesignItem } from "../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../IDesignerCanvas";
4
+ import { IDesignerExtension } from "./IDesignerExtension";
5
+ import { IExtensionManager } from "./IExtensionManger";
6
+ export declare class GridExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ readonly style: CSSStyleSheet;
10
+ }
@@ -0,0 +1,18 @@
1
+ import { GridExtension } from './GridExtension';
2
+ import { css } from "@node-projects/base-custom-webcomponent";
3
+ const gridExtensionShowOverlayOptionName = 'gridExtensionShowOverlay';
4
+ export class GridExtensionProvider {
5
+ shouldExtend(extensionManager, designerView, designItem) {
6
+ if (getComputedStyle(designItem.element).display == 'grid')
7
+ return designerView.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
8
+ return false;
9
+ }
10
+ getExtension(extensionManager, designerView, designItem) {
11
+ return new GridExtension(extensionManager, designerView, designItem);
12
+ }
13
+ style = css `
14
+ .svg-grid { stroke: orange; stroke-dasharray: 5; fill: #ff944722; }
15
+ .svg-grid-area { font-size: 8px; }
16
+ .svg-grid-gap { stroke: orange; stroke-dasharray: 5; fill: #0000ff22; }
17
+ `;
18
+ }
@@ -3,6 +3,7 @@ import { IDesignItem } from "../../../item/IDesignItem";
3
3
  import { IDesignerCanvas } from "../IDesignerCanvas";
4
4
  import { IDesignerExtension } from "./IDesignerExtension";
5
5
  import { IExtensionManager } from "./IExtensionManger";
6
+ export declare const gridExtensionShowOverlayOptionName = "gridExtensionShowOverlay";
6
7
  export declare class GridExtensionProvider implements IDesignerExtensionProvider {
7
8
  shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
9
  getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
@@ -1,9 +1,10 @@
1
1
  import { GridExtension } from './GridExtension';
2
2
  import { css } from "@node-projects/base-custom-webcomponent";
3
+ export const gridExtensionShowOverlayOptionName = 'gridExtensionShowOverlay';
3
4
  export class GridExtensionProvider {
4
5
  shouldExtend(extensionManager, designerView, designItem) {
5
6
  if (getComputedStyle(designItem.element).display == 'grid')
6
- return true;
7
+ return designerView.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
7
8
  return false;
8
9
  }
9
10
  getExtension(extensionManager, designerView, designItem) {
@@ -0,0 +1,5 @@
1
+ import { IDesignerCanvas } from "../IDesignerCanvas";
2
+ import { IExtensionManager } from "./IExtensionManger";
3
+ export declare class GridExtensionProviderConfigButtons {
4
+ aaa(extensionManager: IExtensionManager, designerView: IDesignerCanvas): HTMLElement[];
5
+ }
@@ -0,0 +1,12 @@
1
+ import { gridExtensionShowOverlayOptionName } from "./GridExtensionProvider.js";
2
+ export class GridExtensionProviderConfigButtons {
3
+ aaa(extensionManager, designerView) {
4
+ const extensionOptions = designerView.instanceServiceContainer.designContext.extensionOptions;
5
+ const btn = document.createElement('div');
6
+ btn.onclick = () => {
7
+ const val = extensionOptions[gridExtensionShowOverlayOptionName];
8
+ extensionOptions[gridExtensionShowOverlayOptionName] = val == true ? false : true;
9
+ };
10
+ return [btn];
11
+ }
12
+ }
@@ -0,0 +1,10 @@
1
+ import { IDesignerExtensionProvider } from "./IDesignerExtensionProvider";
2
+ import { IDesignItem } from "../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../IDesignerCanvas";
4
+ import { IDesignerExtension } from "./IDesignerExtension";
5
+ import { IExtensionManager } from "./IExtensionManger";
6
+ export declare class GridExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ readonly style: CSSStyleSheet;
10
+ }
@@ -0,0 +1,18 @@
1
+ import { GridExtension } from './GridExtension';
2
+ import { css } from "@node-projects/base-custom-webcomponent";
3
+ const gridExtensionShowOverlayOptionName = 'gridExtensionShowOverlay';
4
+ export class GridExtensionProvider {
5
+ shouldExtend(extensionManager, designerView, designItem) {
6
+ if (getComputedStyle(designItem.element).display == 'grid')
7
+ return designerView.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
8
+ return false;
9
+ }
10
+ getExtension(extensionManager, designerView, designItem) {
11
+ return new GridExtension(extensionManager, designerView, designItem);
12
+ }
13
+ style = css `
14
+ .svg-grid { stroke: orange; stroke-dasharray: 5; fill: #ff944722; }
15
+ .svg-grid-area { font-size: 8px; }
16
+ .svg-grid-gap { stroke: orange; stroke-dasharray: 5; fill: #0000ff22; }
17
+ `;
18
+ }
@@ -0,0 +1,3 @@
1
+ export interface IExtensionConfiguration {
2
+ designerViewButtons?: HTMLElement[];
3
+ }
@@ -115,7 +115,10 @@ export class ResizeExtension extends AbstractExtension {
115
115
  break;
116
116
  //for other resize modes we need a replacement
117
117
  }
118
- this.extensionManager.refreshExtensions(this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
118
+ const resizedElements = [this.extendedItem, this.extendedItem.parent];
119
+ if (this.resizeAllSelected)
120
+ resizedElements.push(...this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
121
+ this.extensionManager.refreshExtensions(resizedElements);
119
122
  }
120
123
  break;
121
124
  case EventNames.PointerUp:
@@ -1,12 +1,21 @@
1
1
  import { IDesignerCanvas } from '../IDesignerCanvas';
2
2
  import { ITool } from './ITool';
3
3
  import { ServiceContainer } from '../../../services/ServiceContainer.js';
4
+ import { IPoint } from '../../../..';
4
5
  export declare class DrawPathTool implements ITool {
5
6
  readonly cursor = "crosshair";
6
7
  private _pathD;
7
8
  private _path;
9
+ private _samePoint;
10
+ private _p2pMode;
11
+ private _dragMode;
12
+ private _pointerMoved;
13
+ private _eventStarted;
14
+ private _lastPoint;
15
+ private _savedPoint;
8
16
  constructor();
9
17
  activated(serviceContainer: ServiceContainer): void;
10
18
  dispose(): void;
11
19
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
20
+ straightenLine(p1: IPoint, p2: IPoint): IPoint;
12
21
  }
@@ -7,6 +7,13 @@ export class DrawPathTool {
7
7
  cursor = 'crosshair';
8
8
  _pathD;
9
9
  _path;
10
+ _samePoint = false;
11
+ _p2pMode = false;
12
+ _dragMode = false;
13
+ _pointerMoved = false;
14
+ _eventStarted = false;
15
+ _lastPoint = { x: 0, y: 0 };
16
+ _savedPoint = { x: 0, y: 0 };
10
17
  constructor() {
11
18
  }
12
19
  activated(serviceContainer) {
@@ -18,43 +25,102 @@ export class DrawPathTool {
18
25
  const offset = 50;
19
26
  switch (event.type) {
20
27
  case EventNames.PointerDown:
21
- event.target.setPointerCapture(event.pointerId);
22
- this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
23
- this._pathD = "M" + currentPoint.x + " " + currentPoint.y;
24
- this._path.setAttribute("D", this._pathD);
25
- this._path.setAttribute("stroke", designerCanvas.serviceContainer.globalContext.strokeColor);
26
- this._path.setAttribute("fill", designerCanvas.serviceContainer.globalContext.fillBrush);
27
- designerCanvas.overlayLayer.addOverlay(this._path, OverlayLayer.Foregorund);
28
+ this._eventStarted = true;
29
+ if (!this._p2pMode) {
30
+ event.target.setPointerCapture(event.pointerId);
31
+ this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
32
+ this._pathD = "M" + currentPoint.x + " " + currentPoint.y;
33
+ this._path.setAttribute("D", this._pathD);
34
+ this._path.setAttribute("stroke", designerCanvas.serviceContainer.globalContext.strokeColor);
35
+ this._path.setAttribute("fill", designerCanvas.serviceContainer.globalContext.fillBrush);
36
+ this._path.setAttribute("stroke-width", designerCanvas.serviceContainer.globalContext.strokeThickness);
37
+ designerCanvas.overlayLayer.addOverlay(this._path, OverlayLayer.Foregorund);
38
+ }
39
+ if (this._lastPoint.x === currentPoint.x && this._lastPoint.y === currentPoint.y && !this._samePoint) {
40
+ this._samePoint = true;
41
+ }
42
+ this._lastPoint = currentPoint;
28
43
  break;
29
44
  case EventNames.PointerMove:
30
- if (this._path) {
31
- this._pathD += "L" + currentPoint.x + " " + currentPoint.y;
32
- this._path.setAttribute("d", this._pathD);
45
+ if (this._eventStarted) {
46
+ this._pointerMoved = true;
47
+ }
48
+ if (!this._p2pMode) {
49
+ this._dragMode = true;
50
+ if (this._path) {
51
+ this._pathD += "L" + currentPoint.x + " " + currentPoint.y;
52
+ this._path.setAttribute("d", this._pathD);
53
+ }
54
+ }
55
+ else { // shows line preview
56
+ if (this._path) {
57
+ let straightLine = currentPoint;
58
+ if (event.shiftKey)
59
+ straightLine = this.straightenLine(this._savedPoint, currentPoint);
60
+ this._path.setAttribute("d", this._pathD + "L" + straightLine.x + " " + straightLine.y);
61
+ }
33
62
  }
34
63
  break;
35
64
  case EventNames.PointerUp:
36
65
  event.target.releasePointerCapture(event.pointerId);
37
- const rect = this._path.getBoundingClientRect();
38
- designerCanvas.overlayLayer.removeOverlay(this._path);
39
- const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
40
- const mvX = rect.x - designerCanvas.containerBoundingRect.x - offset;
41
- const mvY = rect.y - designerCanvas.containerBoundingRect.y - offset;
42
- const d = movePathData(this._path, mvX, mvY);
43
- this._path.setAttribute("d", d);
44
- svg.appendChild(this._path);
45
- svg.style.left = (mvX) + 'px';
46
- svg.style.top = (mvY) + 'px';
47
- svg.style.position = 'absolute';
48
- svg.style.width = (rect.width + 2 * offset) + 'px';
49
- svg.style.height = (rect.height + 2 * offset) + 'px';
50
- //designerView.rootDesignItem.element.appendChild(svg);
51
- this._path = null;
52
- this._pathD = null;
53
- const di = DesignItem.createDesignItemFromInstance(svg, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
54
- designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
55
- designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
66
+ if (this._eventStarted && !this._pointerMoved) {
67
+ this._p2pMode = true;
68
+ }
69
+ if (this._p2pMode && !this._samePoint) {
70
+ if (this._path) {
71
+ if (event.shiftKey) {
72
+ let straightLine = this.straightenLine(this._savedPoint, currentPoint);
73
+ this._pathD += "L" + straightLine.x + " " + straightLine.y;
74
+ this._path.setAttribute("d", this._pathD);
75
+ }
76
+ else {
77
+ this._pathD += "L" + currentPoint.x + " " + currentPoint.y;
78
+ this._path.setAttribute("d", this._pathD);
79
+ }
80
+ this._savedPoint = currentPoint;
81
+ }
82
+ }
83
+ if (this._samePoint && this._p2pMode || this._dragMode && !this._p2pMode) {
84
+ this._eventStarted = false;
85
+ this._p2pMode = false;
86
+ this._pointerMoved = false;
87
+ this._samePoint = false;
88
+ this._dragMode = false;
89
+ const rect = this._path.getBoundingClientRect();
90
+ designerCanvas.overlayLayer.removeOverlay(this._path);
91
+ const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
92
+ const mvX = rect.x - designerCanvas.containerBoundingRect.x - offset;
93
+ const mvY = rect.y - designerCanvas.containerBoundingRect.y - offset;
94
+ const d = movePathData(this._path, mvX, mvY);
95
+ this._path.setAttribute("d", d);
96
+ svg.appendChild(this._path);
97
+ svg.style.left = (mvX) + 'px';
98
+ svg.style.top = (mvY) + 'px';
99
+ svg.style.position = 'absolute';
100
+ svg.style.width = (rect.width + 2 * offset) + 'px';
101
+ svg.style.height = (rect.height + 2 * offset) + 'px';
102
+ //designerView.rootDesignItem.element.appendChild(svg);
103
+ this._path = null;
104
+ this._pathD = null;
105
+ const di = DesignItem.createDesignItemFromInstance(svg, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
106
+ designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
107
+ designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
108
+ }
56
109
  //TODO: Better Path drawing (like in SVGEDIT & Adding via Undo Framework. And adding to correct container)
57
110
  break;
58
111
  }
59
112
  }
113
+ straightenLine(p1, p2) {
114
+ let newP = { x: 0, y: 0 };
115
+ let alpha = -1 * Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;
116
+ if (alpha < 0)
117
+ alpha += 360;
118
+ if (alpha > 0 && alpha < 45 || alpha > 315 && alpha < 360 || alpha > 135 && alpha < 225) // right or left
119
+ newP = { x: p2.x, y: p1.y };
120
+ else if (alpha > 45 && alpha < 135 || alpha > 225 && alpha < 315) // up or down
121
+ newP = { x: p1.x, y: p2.y };
122
+ else // something else
123
+ newP = { x: p2.x, y: p2.y };
124
+ return newP;
125
+ }
60
126
  }