@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.
- package/.github/FUNDING.yml +3 -0
- package/dist/commandHandling/CommandType.d.ts +3 -0
- package/dist/commandHandling/CommandType.js +3 -0
- package/dist/elements/documentContainer.d.ts +5 -0
- package/dist/elements/documentContainer.js +50 -11
- package/dist/elements/helper/CssAttributeParser.d.ts +1 -1
- package/dist/elements/helper/CssAttributeParser.js +6 -3
- package/dist/elements/helper/CssCombiner.js +1 -1
- package/dist/elements/helper/GridHelper.js +7 -3
- package/dist/elements/services/DefaultServiceBootstrap.js +5 -0
- package/dist/elements/services/GlobalContext.d.ts +4 -0
- package/dist/elements/services/GlobalContext.js +12 -0
- package/dist/elements/services/ServiceContainer.d.ts +5 -0
- package/dist/elements/services/ServiceContainer.js +4 -0
- package/dist/elements/services/demoProviderService/DemoProviderService.d.ts +6 -0
- package/dist/elements/services/demoProviderService/DemoProviderService.js +28 -0
- package/dist/elements/services/demoProviderService/IDemoProviderService.d.ts +5 -0
- package/dist/elements/services/demoProviderService/IDemoProviderService.js +1 -0
- package/dist/elements/services/placementService/GridPlacementService.js +25 -5
- package/dist/elements/widgets/codeView/ICodeView.d.ts +2 -0
- package/dist/elements/widgets/codeView/code-view-ace.d.ts +2 -1
- package/dist/elements/widgets/codeView/code-view-ace.js +3 -1
- package/dist/elements/widgets/codeView/code-view-code-mirror.d.ts +2 -1
- package/dist/elements/widgets/codeView/code-view-code-mirror.js +3 -1
- package/dist/elements/widgets/codeView/code-view-monaco.d.ts +2 -1
- package/dist/elements/widgets/codeView/code-view-monaco.js +11 -1
- package/dist/elements/widgets/demoView/demoView.d.ts +1 -1
- package/dist/elements/widgets/demoView/demoView.js +3 -22
- package/dist/elements/widgets/designerView/ButtonSeperatorProvider copy.d.ts +7 -0
- package/dist/elements/widgets/designerView/ButtonSeperatorProvider copy.js +11 -0
- package/dist/elements/widgets/designerView/ButtonSeperatorProvider.d.ts +8 -0
- package/dist/elements/widgets/designerView/ButtonSeperatorProvider.js +11 -0
- package/dist/elements/widgets/designerView/DesignContext.d.ts +3 -0
- package/dist/elements/widgets/designerView/DesignContext.js +1 -0
- package/dist/elements/widgets/designerView/DesignerViewUseOverlayScollbars.d.ts +7 -0
- package/dist/elements/widgets/designerView/DesignerViewUseOverlayScollbars.js +13 -0
- package/dist/elements/widgets/designerView/IDesignContext.d.ts +3 -0
- package/dist/elements/widgets/designerView/IDesignViewConfigButtonsProvider.d.ts +5 -0
- package/dist/elements/widgets/designerView/IDesignViewConfigButtonsProvider.js +1 -0
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +0 -1
- package/dist/elements/widgets/designerView/designerCanvas.js +25 -12
- package/dist/elements/widgets/designerView/designerView.d.ts +1 -0
- package/dist/elements/widgets/designerView/designerView.js +14 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionConfigButtons.d.ts +5 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionConfigButtons.js +12 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons.d.ts +6 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons.js +21 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.js +18 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionProvider.d.ts +1 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionProvider.js +2 -1
- package/dist/elements/widgets/designerView/extensions/GridExtensionProviderConfigButtons.d.ts +5 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionProviderConfigButtons.js +12 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionProviderOptions.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/GridExtensionProviderOptions.js +18 -0
- package/dist/elements/widgets/designerView/extensions/IDesignViewConfigButtonsProvider.d.ts +0 -0
- package/dist/elements/widgets/designerView/extensions/IDesignViewConfigButtonsProvider.js +1 -0
- package/dist/elements/widgets/designerView/extensions/IExtensionConfiguration.d.ts +3 -0
- package/dist/elements/widgets/designerView/extensions/IExtensionConfiguration.js +1 -0
- package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +4 -1
- package/dist/elements/widgets/designerView/tools/DrawPathTool.d.ts +9 -0
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js +95 -29
- package/dist/elements/widgets/designerView/tools/PointerTool.js +2 -2
- package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +3 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- 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
|
-
|
|
43
|
-
|
|
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,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
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 &&
|
|
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 &&
|
|
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,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
|
+
}
|
package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons.d.ts
ADDED
|
@@ -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
|
|
7
|
+
return designerView.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
|
|
7
8
|
return false;
|
|
8
9
|
}
|
|
9
10
|
getExtension(extensionManager, designerView, designItem) {
|
|
@@ -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
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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.
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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.
|
|
31
|
-
this.
|
|
32
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
}
|