@node-projects/web-component-designer 0.1.104 → 0.1.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/helper/Helper.d.ts +1 -0
- package/dist/elements/helper/Helper.js +13 -0
- package/dist/elements/item/DesignItem.d.ts +0 -5
- package/dist/elements/item/DesignItem.js +2 -3
- package/dist/elements/item/IDesignItem.d.ts +0 -5
- package/dist/elements/services/DefaultServiceBootstrap.js +18 -18
- package/dist/elements/services/dragDropService/DragDropService.js +1 -1
- package/dist/elements/services/selectionService/ISelectionChangedEvent copy.d.ts +6 -0
- package/dist/elements/services/selectionService/ISelectionChangedEvent copy.js +1 -0
- package/dist/elements/services/selectionService/ISelectionChangedEvent.d.ts +1 -0
- package/dist/elements/services/selectionService/ISelectionRefreshEvent.d.ts +5 -0
- package/dist/elements/services/selectionService/ISelectionRefreshEvent.js +1 -0
- package/dist/elements/services/selectionService/ISelectionService.d.ts +3 -1
- package/dist/elements/services/selectionService/SelectionService.d.ts +4 -2
- package/dist/elements/services/selectionService/SelectionService.js +10 -4
- package/dist/elements/widgets/designerView/extensions/AbstractExtension.d.ts +7 -0
- package/dist/elements/widgets/designerView/extensions/AbstractExtension.js +21 -0
- package/dist/elements/widgets/designerView/extensions/AbstractToolbarExtension.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/AbstractToolbarExtension.js +30 -0
- package/dist/elements/widgets/designerView/extensions/ConditionExtensionProvider.d.ts +13 -0
- package/dist/elements/widgets/designerView/extensions/ConditionExtensionProvider.js +18 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.d.ts +1 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +7 -16
- package/dist/elements/widgets/designerView/extensions/EditTextExtension.d.ts +18 -0
- package/dist/elements/widgets/designerView/extensions/EditTextExtension.js +107 -0
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +10 -3
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +100 -60
- package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +5 -1
- package/dist/elements/widgets/designerView/extensions/ExtensionType.js +4 -0
- package/dist/elements/widgets/designerView/extensions/GridToolbarExtension.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/GridToolbarExtension.js +58 -0
- package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +3 -3
- package/dist/elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js +6 -2
- package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.js +35 -0
- package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js +12 -0
- package/dist/elements/widgets/designerView/extensions/block/FlexToolbarExtension.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/block/FlexToolbarExtension.js +34 -0
- package/dist/elements/widgets/designerView/extensions/block/FlexToolbarExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/block/FlexToolbarExtensionProvider.js +12 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/ChildContextMenu.d.ts +11 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/ChildContextMenu.js +14 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js +3 -3
- package/dist/elements/widgets/designerView/extensions/contextMenu/JumpToElementContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/SelectAllChildrenContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.js +35 -0
- package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.js +12 -0
- package/dist/elements/widgets/designerView/extensions/flex/GridToolbarExtension.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/flex/GridToolbarExtension.js +66 -0
- package/dist/elements/widgets/designerView/extensions/flex/GridToolbarExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/flex/GridToolbarExtensionProvider.js +17 -0
- package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.d.ts +1 -0
- package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.js +12 -8
- package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtension.d.ts +27 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtension.js +259 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtensionProvider.js +16 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtension.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtension.js +66 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.js +17 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension copy.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension copy.js +66 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.js +67 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider copy.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider copy.js +17 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider.js +12 -0
- package/dist/elements/widgets/designerView/extensions/grid/ResizeExtension.d.ts +28 -0
- package/dist/elements/widgets/designerView/extensions/grid/ResizeExtension.js +355 -0
- package/dist/elements/widgets/designerView/extensions/grid/ResizeExtensionProvider.d.ts +12 -0
- package/dist/elements/widgets/designerView/extensions/grid/ResizeExtensionProvider.js +20 -0
- package/dist/elements/widgets/designerView/extensions/logic/ConditionExtensionProvider.d.ts +13 -0
- package/dist/elements/widgets/designerView/extensions/logic/ConditionExtensionProvider.js +18 -0
- package/dist/elements/widgets/designerView/extensions/svg/EllipsisExtension.js +8 -6
- package/dist/elements/widgets/designerView/extensions/svg/RectExtension.d.ts +2 -2
- package/dist/elements/widgets/designerView/extensions/svg/RectExtension.js +18 -15
- package/dist/elements/widgets/designerView/extensions/svg/RectExtensionProvider copy.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/svg/RectExtensionProvider copy.js +14 -0
- package/dist/elements/widgets/designerView/extensions/svg/SvgBaseExtension.d.ts +30 -0
- package/dist/elements/widgets/designerView/extensions/svg/SvgBaseExtension.js +181 -0
- package/dist/elements/widgets/designerView/extensions/svg/SvgElementExtension.d.ts +26 -0
- package/dist/elements/widgets/designerView/extensions/svg/SvgElementExtension.js +144 -0
- package/dist/elements/widgets/designerView/extensions/svg/SvgElementExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/svg/SvgElementExtensionProvider.js +16 -0
- package/dist/elements/widgets/designerView/overlayLayerView.js +4 -1
- package/dist/elements/widgets/designerView/tools/DrawElementTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/PointerTool.js +9 -9
- package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +0 -1
- package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +14 -0
- package/package.json +1 -1
|
@@ -7,3 +7,4 @@ export declare function pointInRect(point: IPoint, rect: IRect): boolean;
|
|
|
7
7
|
export declare function removeTrailing(text: string, char: string): string;
|
|
8
8
|
export declare function removeLeading(text: string, char: string): string;
|
|
9
9
|
export declare function requestAnimationFramePromise(): Promise<unknown>;
|
|
10
|
+
export declare function arraysEqual<T>(a: T[], b: T[]): boolean;
|
|
@@ -37,3 +37,16 @@ export function removeLeading(text, char) {
|
|
|
37
37
|
export function requestAnimationFramePromise() {
|
|
38
38
|
return new Promise(resolve => requestAnimationFrame(resolve));
|
|
39
39
|
}
|
|
40
|
+
export function arraysEqual(a, b) {
|
|
41
|
+
if (a === b)
|
|
42
|
+
return true;
|
|
43
|
+
if (a == null || b == null)
|
|
44
|
+
return false;
|
|
45
|
+
if (a.length !== b.length)
|
|
46
|
+
return false;
|
|
47
|
+
for (var i = 0; i < a.length; ++i) {
|
|
48
|
+
if (a[i] !== b[i])
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
@@ -4,10 +4,7 @@ import { IDesignItem } from './IDesignItem.js';
|
|
|
4
4
|
import { InstanceServiceContainer } from '../services/InstanceServiceContainer.js';
|
|
5
5
|
import { ChangeGroup } from '../services/undoService/ChangeGroup.js';
|
|
6
6
|
import { NodeType } from './NodeType.js';
|
|
7
|
-
import { ExtensionType } from '../widgets/designerView/extensions/ExtensionType.js';
|
|
8
|
-
import { IDesignerExtension } from '../widgets/designerView/extensions/IDesignerExtension.js';
|
|
9
7
|
import { ISize } from '../../interfaces/ISize.js';
|
|
10
|
-
import { IDesignerExtensionProvider } from '../widgets/designerView/extensions/IDesignerExtensionProvider.js';
|
|
11
8
|
import { IStyleRule } from '../services/stylesheetService/IStylesheetService.js';
|
|
12
9
|
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
13
10
|
import { IPlacementService } from '../services/placementService/IPlacementService.js';
|
|
@@ -18,8 +15,6 @@ export declare class DesignItem implements IDesignItem {
|
|
|
18
15
|
view: Node;
|
|
19
16
|
serviceContainer: ServiceContainer;
|
|
20
17
|
instanceServiceContainer: InstanceServiceContainer;
|
|
21
|
-
appliedDesignerExtensions: Map<ExtensionType, IDesignerExtension[]>;
|
|
22
|
-
shouldAppliedDesignerExtensions: Map<ExtensionType, IDesignerExtensionProvider[]>;
|
|
23
18
|
nodeReplaced: TypedEvent<void>;
|
|
24
19
|
clone(): Promise<IDesignItem>;
|
|
25
20
|
allMatching(selectors: string): Generator<IDesignItem, void, undefined>;
|
|
@@ -20,8 +20,6 @@ export class DesignItem {
|
|
|
20
20
|
view;
|
|
21
21
|
serviceContainer;
|
|
22
22
|
instanceServiceContainer;
|
|
23
|
-
appliedDesignerExtensions = new Map();
|
|
24
|
-
shouldAppliedDesignerExtensions = new Map();
|
|
25
23
|
nodeReplaced = new TypedEvent;
|
|
26
24
|
async clone() {
|
|
27
25
|
try {
|
|
@@ -266,11 +264,12 @@ export class DesignItem {
|
|
|
266
264
|
set innerHTML(value) {
|
|
267
265
|
if (this.nodeType != NodeType.TextNode) {
|
|
268
266
|
const grp = this.openGroup('set innerHTML');
|
|
267
|
+
this.clearChildren();
|
|
269
268
|
const range = document.createRange();
|
|
270
269
|
range.selectNode(document.body);
|
|
271
270
|
const fragment = range.createContextualFragment(value);
|
|
272
271
|
for (const n of fragment.childNodes) {
|
|
273
|
-
let di = DesignItem.
|
|
272
|
+
let di = DesignItem.createDesignItemFromInstance(n, this.serviceContainer, this.instanceServiceContainer);
|
|
274
273
|
this.insertChild(di);
|
|
275
274
|
}
|
|
276
275
|
grp.commit();
|
|
@@ -2,10 +2,7 @@ import { ServiceContainer } from '../services/ServiceContainer.js';
|
|
|
2
2
|
import { InstanceServiceContainer } from '../services/InstanceServiceContainer.js';
|
|
3
3
|
import { ChangeGroup } from '../services/undoService/ChangeGroup.js';
|
|
4
4
|
import { NodeType } from './NodeType.js';
|
|
5
|
-
import { ExtensionType } from '../widgets/designerView/extensions/ExtensionType.js';
|
|
6
|
-
import { IDesignerExtension } from '../widgets/designerView/extensions/IDesignerExtension.js';
|
|
7
5
|
import { ISize } from "../../interfaces/ISize.js";
|
|
8
|
-
import { IDesignerExtensionProvider } from '../widgets/designerView/extensions/IDesignerExtensionProvider.js';
|
|
9
6
|
import { IStyleRule } from '../services/stylesheetService/IStylesheetService.js';
|
|
10
7
|
import { IPlacementService } from '../services/placementService/IPlacementService.js';
|
|
11
8
|
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
@@ -51,8 +48,6 @@ export interface IDesignItem {
|
|
|
51
48
|
readonly element: Element;
|
|
52
49
|
serviceContainer: ServiceContainer;
|
|
53
50
|
instanceServiceContainer: InstanceServiceContainer;
|
|
54
|
-
appliedDesignerExtensions: Map<ExtensionType, IDesignerExtension[]>;
|
|
55
|
-
shouldAppliedDesignerExtensions: Map<ExtensionType, IDesignerExtensionProvider[]>;
|
|
56
51
|
getOrCreateDesignItem(node: Node): any;
|
|
57
52
|
openGroup(title: string): ChangeGroup;
|
|
58
53
|
styles(): Iterable<[name: string, value: string]>;
|
|
@@ -14,7 +14,6 @@ import { ElementDragTitleExtensionProvider } from '../widgets/designerView/exten
|
|
|
14
14
|
import { TransformOriginExtensionProvider } from '../widgets/designerView/extensions/TransformOriginExtensionProvider.js';
|
|
15
15
|
import { CanvasExtensionProvider } from '../widgets/designerView/extensions/CanvasExtensionProvider.js';
|
|
16
16
|
import { PositionExtensionProvider } from '../widgets/designerView/extensions/PositionExtensionProvider.js';
|
|
17
|
-
import { PathExtensionProvider } from '../widgets/designerView/extensions/svg/PathExtensionProvider.js';
|
|
18
17
|
import { HighlightElementExtensionProvider } from '../widgets/designerView/extensions/HighlightElementExtensionProvider.js';
|
|
19
18
|
import { NamedTools } from '../widgets/designerView/tools/NamedTools.js';
|
|
20
19
|
import { PointerTool } from '../widgets/designerView/tools/PointerTool.js';
|
|
@@ -62,9 +61,6 @@ import { DrawToolButtonProvider } from '../widgets/designerView/tools/toolBar/bu
|
|
|
62
61
|
import { TextToolButtonProvider } from '../widgets/designerView/tools/toolBar/buttons/TextToolButtonProvider.js';
|
|
63
62
|
import { SelectorToolButtonProvider } from '../widgets/designerView/tools/toolBar/buttons/SelectorToolButtonProvider.js';
|
|
64
63
|
import { GrayOutDragOverContainerExtensionProvider } from '../widgets/designerView/extensions/GrayOutDragOverContainerExtensionProvider.js';
|
|
65
|
-
import { LineExtensionProvider } from '../widgets/designerView/extensions/svg/LineExtensionProvider.js';
|
|
66
|
-
import { RectExtentionProvider } from '../widgets/designerView/extensions/svg/RectExtensionProvider.js';
|
|
67
|
-
import { EllipsisExtensionProvider } from '../widgets/designerView/extensions/svg/EllipsisExtensionProvider.js';
|
|
68
64
|
import { PropertyGroupsService } from './propertiesService/PropertyGroupsService.js';
|
|
69
65
|
import { PlacementExtensionProvider } from '../widgets/designerView/extensions/PlacementExtensionProvider.js';
|
|
70
66
|
import { FlexboxExtensionProvider } from '../widgets/designerView/extensions/FlexboxExtensionProvider.js';
|
|
@@ -87,6 +83,12 @@ import { SimpleDemoProviderService } from './demoProviderService/SimpleDemoProvi
|
|
|
87
83
|
import { DrawElementTool } from '../widgets/designerView/tools/DrawElementTool.js';
|
|
88
84
|
import { RoundPixelsDesignViewConfigButton } from '../widgets/designerView/extensions/buttons/RoundPixelsDesignViewConfigButton.js';
|
|
89
85
|
import { MathMLElementsPropertiesService } from './propertiesService/services/MathMLElementsPropertiesService.js';
|
|
86
|
+
import { SvgElementExtensionProvider } from '../widgets/designerView/extensions/svg/SvgElementExtensionProvider.js';
|
|
87
|
+
import { ConditionExtensionProvider } from '../widgets/designerView/extensions/logic/ConditionExtensionProvider.js';
|
|
88
|
+
import { GridToolbarExtensionProvider } from '../widgets/designerView/extensions/grid/GridToolbarExtensionProvider.js';
|
|
89
|
+
import { FlexToolbarExtensionProvider } from '../widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.js';
|
|
90
|
+
import { BlockToolbarExtensionProvider } from '../widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js';
|
|
91
|
+
import { ChildContextMenu } from '../widgets/designerView/extensions/contextMenu/ChildContextMenu.js';
|
|
90
92
|
export function createDefaultServiceContainer() {
|
|
91
93
|
let serviceContainer = new ServiceContainer();
|
|
92
94
|
let defaultPlacementService = new DefaultPlacementService();
|
|
@@ -118,22 +120,22 @@ export function createDefaultServiceContainer() {
|
|
|
118
120
|
serviceContainer.register("contentService", (designerCanvas) => new ContentService(designerCanvas.rootDesignItem));
|
|
119
121
|
serviceContainer.register("designItemDocumentPositionService", (designerCanvas) => new DesignItemDocumentPositionService(designerCanvas));
|
|
120
122
|
serviceContainer.designerExtensions.set(ExtensionType.Permanent, [
|
|
121
|
-
// new ResizeExtensionProvider(false),
|
|
122
123
|
new InvisibleElementExtensionProvider(),
|
|
123
|
-
// new ElementDragTitleExtensionProvider(),
|
|
124
124
|
]);
|
|
125
125
|
serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
|
|
126
|
-
new ElementDragTitleExtensionProvider(),
|
|
126
|
+
new ConditionExtensionProvider(new ElementDragTitleExtensionProvider(), item => !(item.node instanceof SVGElement) || item.node instanceof SVGSVGElement),
|
|
127
127
|
new TransformOriginExtensionProvider(true),
|
|
128
128
|
new CanvasExtensionProvider(),
|
|
129
129
|
new PositionExtensionProvider(),
|
|
130
|
-
new
|
|
131
|
-
new LineExtensionProvider(),
|
|
132
|
-
new PathExtensionProvider(),
|
|
133
|
-
new RectExtentionProvider(),
|
|
130
|
+
new SvgElementExtensionProvider(),
|
|
134
131
|
new ResizeExtensionProvider(true),
|
|
135
132
|
new RotateExtensionProvider(),
|
|
136
|
-
new MultipleSelectionRectExtensionProvider(),
|
|
133
|
+
new ConditionExtensionProvider(new MultipleSelectionRectExtensionProvider(), item => !(item.node instanceof SVGElement) || item.node instanceof SVGSVGElement),
|
|
134
|
+
]);
|
|
135
|
+
serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionRefreshed, [
|
|
136
|
+
new GridToolbarExtensionProvider(),
|
|
137
|
+
new FlexToolbarExtensionProvider(),
|
|
138
|
+
new BlockToolbarExtensionProvider(),
|
|
137
139
|
]);
|
|
138
140
|
serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionAndCanBeEntered, [
|
|
139
141
|
new DisplayGridExtensionProvider(),
|
|
@@ -141,7 +143,7 @@ export function createDefaultServiceContainer() {
|
|
|
141
143
|
new FlexboxExtensionProvider(),
|
|
142
144
|
]);
|
|
143
145
|
serviceContainer.designerExtensions.set(ExtensionType.Selection, [
|
|
144
|
-
new SelectionDefaultExtensionProvider()
|
|
146
|
+
new ConditionExtensionProvider(new SelectionDefaultExtensionProvider(), item => !(item.node instanceof SVGElement) || item.node instanceof SVGSVGElement),
|
|
145
147
|
]);
|
|
146
148
|
serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionContainerAndCanBeEntered, [
|
|
147
149
|
new DisplayGridExtensionProvider(),
|
|
@@ -186,14 +188,12 @@ export function createDefaultServiceContainer() {
|
|
|
186
188
|
serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new InvisibleElementExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new StylesheetServiceDesignViewConfigButtons(), new ButtonSeperatorProvider(30), new RoundPixelsDesignViewConfigButton());
|
|
187
189
|
serviceContainer.designViewToolbarButtons.push(new PointerToolButtonProvider(), new SeperatorToolProvider(22), new SelectorToolButtonProvider(), new SeperatorToolProvider(22), new ZoomToolButtonProvider(), new SeperatorToolProvider(22), new DrawToolButtonProvider(), new SeperatorToolProvider(22), new TextToolButtonProvider(), new SeperatorToolProvider(22), new TransformToolButtonProvider());
|
|
188
190
|
serviceContainer.designerContextMenuExtensions = [
|
|
189
|
-
new CopyPasteContextMenu(),
|
|
191
|
+
new ChildContextMenu('edit', new CopyPasteContextMenu()),
|
|
190
192
|
new SeperatorContextMenu(),
|
|
191
|
-
new RotateLeftAndRight(),
|
|
193
|
+
new ChildContextMenu('modify', new RotateLeftAndRight(), new SeperatorContextMenu(), new ZMoveContextMenu()),
|
|
192
194
|
new SeperatorContextMenu(),
|
|
193
|
-
new JumpToElementContextMenu(),
|
|
194
|
-
new ZoomToElementContextMenu(),
|
|
195
|
+
new ChildContextMenu('view', new JumpToElementContextMenu(), new ZoomToElementContextMenu()),
|
|
195
196
|
new SeperatorContextMenu(),
|
|
196
|
-
new ZMoveContextMenu(),
|
|
197
197
|
new MultipleItemsSelectedContextMenu(),
|
|
198
198
|
new PathContextMenu(),
|
|
199
199
|
new RectContextMenu(),
|
|
@@ -48,7 +48,7 @@ export class DragDropService {
|
|
|
48
48
|
containerService.place(event, designerCanvas, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, pos, [di]);
|
|
49
49
|
containerService.finishPlace(event, designerCanvas, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, pos, [di]);
|
|
50
50
|
requestAnimationFrame(() => {
|
|
51
|
-
designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di]);
|
|
51
|
+
designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di], event);
|
|
52
52
|
grp.commit();
|
|
53
53
|
});
|
|
54
54
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
2
2
|
import { IDesignItem } from '../../item/IDesignItem.js';
|
|
3
3
|
import { ISelectionChangedEvent } from './ISelectionChangedEvent.js';
|
|
4
|
+
import { ISelectionRefreshEvent } from './ISelectionRefreshEvent.js';
|
|
4
5
|
export interface ISelectionService {
|
|
5
6
|
primarySelection: IDesignItem;
|
|
6
7
|
selectedElements: IDesignItem[];
|
|
7
|
-
setSelectedElements(designItems: IDesignItem[]): void;
|
|
8
|
+
setSelectedElements(designItems: IDesignItem[], even?: Event): void;
|
|
8
9
|
setSelectionByTextRange(positionStart: number, positionEnd: number): any;
|
|
9
10
|
clearSelectedElements(): void;
|
|
10
11
|
isSelected(designItem: IDesignItem): boolean;
|
|
11
12
|
readonly onSelectionChanged: TypedEvent<ISelectionChangedEvent>;
|
|
13
|
+
readonly onSelectionRefresh: TypedEvent<ISelectionRefreshEvent>;
|
|
12
14
|
}
|
|
@@ -3,16 +3,18 @@ import { IDesignItem } from '../../item/IDesignItem.js';
|
|
|
3
3
|
import { ISelectionChangedEvent } from './ISelectionChangedEvent.js';
|
|
4
4
|
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
5
5
|
import { IDesignerCanvas } from '../../widgets/designerView/IDesignerCanvas.js';
|
|
6
|
+
import { ISelectionRefreshEvent } from './ISelectionRefreshEvent.js';
|
|
6
7
|
export declare class SelectionService implements ISelectionService {
|
|
7
8
|
primarySelection: IDesignItem;
|
|
8
9
|
selectedElements: IDesignItem[];
|
|
9
10
|
_designerCanvas: IDesignerCanvas;
|
|
10
11
|
_undoSelectionChanges: boolean;
|
|
11
12
|
constructor(designerCanvas: IDesignerCanvas, undoSelectionChanges: boolean);
|
|
12
|
-
setSelectedElements(designItems: IDesignItem[]): void;
|
|
13
|
+
setSelectedElements(designItems: IDesignItem[], event?: Event): void;
|
|
13
14
|
setSelectionByTextRange(positionStart: number, positionEnd: number): void;
|
|
14
|
-
_withoutUndoSetSelectedElements(designItems: IDesignItem[]): void;
|
|
15
|
+
_withoutUndoSetSelectedElements(designItems: IDesignItem[], event?: Event): void;
|
|
15
16
|
clearSelectedElements(): void;
|
|
16
17
|
isSelected(designItem: IDesignItem): boolean;
|
|
17
18
|
readonly onSelectionChanged: TypedEvent<ISelectionChangedEvent>;
|
|
19
|
+
readonly onSelectionRefresh: TypedEvent<ISelectionRefreshEvent>;
|
|
18
20
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
2
2
|
import { SelectionChangedAction } from '../undoService/transactionItems/SelectionChangedAction.js';
|
|
3
|
+
import { arraysEqual } from '../../helper/Helper.js';
|
|
3
4
|
function findDesignItem(designItem, position) {
|
|
4
5
|
let usedItem = null;
|
|
5
6
|
if (designItem.hasChildren) {
|
|
@@ -25,14 +26,18 @@ export class SelectionService {
|
|
|
25
26
|
this._designerCanvas = designerCanvas;
|
|
26
27
|
this._undoSelectionChanges = undoSelectionChanges;
|
|
27
28
|
}
|
|
28
|
-
setSelectedElements(designItems) {
|
|
29
|
+
setSelectedElements(designItems, event) {
|
|
29
30
|
if (this.selectedElements != designItems && !(this.selectedElements.length === 0 && (designItems == null || designItems.length === 0))) {
|
|
31
|
+
if (arraysEqual(designItems, this.selectedElements)) {
|
|
32
|
+
this.onSelectionRefresh.emit({ selectedElements: this.selectedElements, event });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
30
35
|
if (this._undoSelectionChanges) {
|
|
31
36
|
const action = new SelectionChangedAction(this.selectedElements, designItems, this);
|
|
32
37
|
this._designerCanvas.instanceServiceContainer.undoService.execute(action);
|
|
33
38
|
}
|
|
34
39
|
else {
|
|
35
|
-
this._withoutUndoSetSelectedElements(designItems);
|
|
40
|
+
this._withoutUndoSetSelectedElements(designItems, event);
|
|
36
41
|
}
|
|
37
42
|
}
|
|
38
43
|
}
|
|
@@ -43,7 +48,7 @@ export class SelectionService {
|
|
|
43
48
|
this.setSelectedElements([item]);
|
|
44
49
|
}
|
|
45
50
|
}
|
|
46
|
-
_withoutUndoSetSelectedElements(designItems) {
|
|
51
|
+
_withoutUndoSetSelectedElements(designItems, event) {
|
|
47
52
|
let oldSelectedElements = this.selectedElements;
|
|
48
53
|
if (!designItems) {
|
|
49
54
|
this.selectedElements = [];
|
|
@@ -61,7 +66,7 @@ export class SelectionService {
|
|
|
61
66
|
else
|
|
62
67
|
this.primarySelection = null;
|
|
63
68
|
}
|
|
64
|
-
this.onSelectionChanged.emit({ selectedElements: this.selectedElements, oldSelectedElements: oldSelectedElements });
|
|
69
|
+
this.onSelectionChanged.emit({ selectedElements: this.selectedElements, oldSelectedElements: oldSelectedElements, event });
|
|
65
70
|
}
|
|
66
71
|
clearSelectedElements() {
|
|
67
72
|
this.setSelectedElements([]);
|
|
@@ -70,4 +75,5 @@ export class SelectionService {
|
|
|
70
75
|
return this.selectedElements.indexOf(designItem) >= 0;
|
|
71
76
|
}
|
|
72
77
|
onSelectionChanged = new TypedEvent();
|
|
78
|
+
onSelectionRefresh = new TypedEvent();
|
|
73
79
|
}
|
|
@@ -3,6 +3,12 @@ import { IDesignerCanvas } from '../IDesignerCanvas.js';
|
|
|
3
3
|
import { IDesignerExtension } from './IDesignerExtension.js';
|
|
4
4
|
import { IExtensionManager } from './IExtensionManger.js';
|
|
5
5
|
import { AbstractExtensionBase } from "./AbstractExtensionBase.js";
|
|
6
|
+
import { OverlayLayer } from './OverlayLayer.js';
|
|
7
|
+
import { IPoint } from '../../../../interfaces/IPoint.js';
|
|
8
|
+
export type toolbarObject = SVGForeignObjectElement & {
|
|
9
|
+
updatePosition: (position: IPoint) => void;
|
|
10
|
+
getById: <T>(id: string) => T;
|
|
11
|
+
};
|
|
6
12
|
export declare abstract class AbstractExtension extends AbstractExtensionBase implements IDesignerExtension {
|
|
7
13
|
protected extendedItem: IDesignItem;
|
|
8
14
|
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
@@ -10,4 +16,5 @@ export declare abstract class AbstractExtension extends AbstractExtensionBase im
|
|
|
10
16
|
abstract refresh(cache: Record<string | symbol, any>, event?: Event): any;
|
|
11
17
|
abstract dispose(): any;
|
|
12
18
|
remove(): void;
|
|
19
|
+
createToolbar(template: HTMLTemplateElement, width: number, height: number, overlayLayer?: OverlayLayer): toolbarObject;
|
|
13
20
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AbstractExtensionBase } from "./AbstractExtensionBase.js";
|
|
2
|
+
import { OverlayLayer } from './OverlayLayer.js';
|
|
2
3
|
export class AbstractExtension extends AbstractExtensionBase {
|
|
3
4
|
extendedItem;
|
|
4
5
|
constructor(extensionManager, designerView, extendedItem) {
|
|
@@ -8,4 +9,24 @@ export class AbstractExtension extends AbstractExtensionBase {
|
|
|
8
9
|
remove() {
|
|
9
10
|
this.extensionManager.removeExtensionInstance(this.extendedItem, this);
|
|
10
11
|
}
|
|
12
|
+
createToolbar(template, width, height, overlayLayer = OverlayLayer.Foreground) {
|
|
13
|
+
const element = template.content.cloneNode(true);
|
|
14
|
+
element.querySelectorAll('*').forEach(x => x.onpointerdown = (e) => {
|
|
15
|
+
this.designerCanvas.ignoreEvent(e);
|
|
16
|
+
});
|
|
17
|
+
const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
18
|
+
foreignObject.classList.add('svg-toolbar-container');
|
|
19
|
+
foreignObject.setAttribute('width', '' + width);
|
|
20
|
+
foreignObject.setAttribute('height', '' + height);
|
|
21
|
+
foreignObject.appendChild(element);
|
|
22
|
+
this._addOverlay(foreignObject, overlayLayer);
|
|
23
|
+
foreignObject.updatePosition = (position) => {
|
|
24
|
+
foreignObject.setAttribute('x', '' + position.x);
|
|
25
|
+
foreignObject.setAttribute('y', '' + position.y);
|
|
26
|
+
};
|
|
27
|
+
foreignObject.getById = (id) => {
|
|
28
|
+
return foreignObject.querySelector('#' + id);
|
|
29
|
+
};
|
|
30
|
+
return foreignObject;
|
|
31
|
+
}
|
|
11
32
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AbstractExtension } from "./AbstractExtension.js";
|
|
2
|
+
import { IPoint } from "../../../../interfaces/IPoint.js";
|
|
3
|
+
export declare abstract class AbstractToolbarExtension extends AbstractExtension {
|
|
4
|
+
abstract template: HTMLTemplateElement;
|
|
5
|
+
protected _toolbarContainer: SVGForeignObjectElement;
|
|
6
|
+
extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
|
|
7
|
+
refresh(cache: Record<string | symbol, any>, event?: MouseEvent): void;
|
|
8
|
+
protected updateToolbarPosition(position: IPoint): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { OverlayLayer } from "../OverlayLayer.js";
|
|
2
|
+
import { AbstractExtension } from "./AbstractExtension.js";
|
|
3
|
+
export class AbstractToolbarExtension extends AbstractExtension {
|
|
4
|
+
_toolbarContainer;
|
|
5
|
+
extend(cache, event) {
|
|
6
|
+
const element = this.template.content.cloneNode(true);
|
|
7
|
+
element.querySelectorAll('*').forEach(x => x.onpointerdown = (e) => {
|
|
8
|
+
this.designerCanvas.ignoreEvent(e);
|
|
9
|
+
});
|
|
10
|
+
const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
11
|
+
this._toolbarContainer = foreignObject;
|
|
12
|
+
foreignObject.classList.add('svg-toolbar-container');
|
|
13
|
+
foreignObject.setAttribute('width', '1');
|
|
14
|
+
foreignObject.setAttribute('height', '1');
|
|
15
|
+
foreignObject.appendChild(element);
|
|
16
|
+
this.refresh(cache, event);
|
|
17
|
+
this._addOverlay(foreignObject, OverlayLayer.Foreground);
|
|
18
|
+
}
|
|
19
|
+
refresh(cache, event) {
|
|
20
|
+
if (event) {
|
|
21
|
+
const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
|
|
22
|
+
this._toolbarContainer.setAttribute('x', '' + (pos.x - 16));
|
|
23
|
+
this._toolbarContainer.setAttribute('y', '' + (pos.y - 36));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
updateToolbarPosition(position) {
|
|
27
|
+
this._toolbarContainer.setAttribute('x', '' + position.x);
|
|
28
|
+
this._toolbarContainer.setAttribute('y', '' + position.y);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IDesignerExtensionProvider } from './IDesignerExtensionProvider.js';
|
|
2
|
+
import { IDesignItem } from '../../../item/IDesignItem.js';
|
|
3
|
+
import { IDesignerCanvas } from '../IDesignerCanvas.js';
|
|
4
|
+
import { IDesignerExtension } from './IDesignerExtension.js';
|
|
5
|
+
import { IExtensionManager } from './IExtensionManger.js';
|
|
6
|
+
export declare class ConditionExtensionProvider implements IDesignerExtensionProvider {
|
|
7
|
+
constructor(extensionProvider: IDesignerExtensionProvider, condition: (designItem: IDesignItem) => boolean);
|
|
8
|
+
extensionProvider: IDesignerExtensionProvider;
|
|
9
|
+
condition: (designItem: IDesignItem) => boolean;
|
|
10
|
+
style: CSSStyleSheet;
|
|
11
|
+
shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
|
|
12
|
+
getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class ConditionExtensionProvider {
|
|
2
|
+
constructor(extensionProvider, condition) {
|
|
3
|
+
this.extensionProvider = extensionProvider;
|
|
4
|
+
this.condition = condition;
|
|
5
|
+
this.style = extensionProvider.style;
|
|
6
|
+
}
|
|
7
|
+
extensionProvider;
|
|
8
|
+
condition;
|
|
9
|
+
style;
|
|
10
|
+
shouldExtend(extensionManager, designerView, designItem) {
|
|
11
|
+
if (!this.condition(designItem))
|
|
12
|
+
return false;
|
|
13
|
+
return this.extensionProvider.shouldExtend(extensionManager, designerView, designItem);
|
|
14
|
+
}
|
|
15
|
+
getExtension(extensionManager, designerView, designItem) {
|
|
16
|
+
return this.extensionProvider.getExtension(extensionManager, designerView, designItem);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -9,6 +9,7 @@ export declare class EditTextExtension extends AbstractExtension implements hand
|
|
|
9
9
|
private static template;
|
|
10
10
|
private _foreignObject;
|
|
11
11
|
private _path;
|
|
12
|
+
private _toolbar;
|
|
12
13
|
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
13
14
|
extend(): void;
|
|
14
15
|
refresh(): void;
|
|
@@ -6,7 +6,7 @@ import { shadowrootGetSelection, wrapSelectionInSpans } from "../../../../helper
|
|
|
6
6
|
import { FontPropertyEditor } from "../../../../services/propertiesService/propertyEditors/FontPropertyEditor.js";
|
|
7
7
|
export class EditTextExtension extends AbstractExtension {
|
|
8
8
|
static template = html `
|
|
9
|
-
<div style="height:
|
|
9
|
+
<div style="height: 100%; display: flex; gap: 2px; width: 100%;">
|
|
10
10
|
<button data-command="font-weight" data-command-parameter="800" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
|
|
11
11
|
<button data-command="font-style" data-command-parameter="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
|
|
12
12
|
<button data-command="text-decoration" data-command-parameter="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
|
|
@@ -34,6 +34,7 @@ export class EditTextExtension extends AbstractExtension {
|
|
|
34
34
|
`;
|
|
35
35
|
_foreignObject;
|
|
36
36
|
_path;
|
|
37
|
+
_toolbar;
|
|
37
38
|
constructor(extensionManager, designerView, extendedItem) {
|
|
38
39
|
super(extensionManager, designerView, extendedItem);
|
|
39
40
|
}
|
|
@@ -45,23 +46,13 @@ export class EditTextExtension extends AbstractExtension {
|
|
|
45
46
|
this.extendedItem.element.setAttribute('contenteditable', '');
|
|
46
47
|
this.extendedItem.element.focus();
|
|
47
48
|
let itemRect = this.extendedItem.element.getBoundingClientRect();
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
this._toolbar = this.createToolbar(EditTextExtension.template, 300, 24);
|
|
50
|
+
this._toolbar.updatePosition({ x: (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, y: ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 36) });
|
|
51
|
+
FontPropertyEditor.addFontsToSelect(this._toolbar.getById('fontFamily'));
|
|
52
|
+
this._toolbar.querySelectorAll('button').forEach(x => x.onpointerdown = (e) => {
|
|
52
53
|
this._formatSelection(x.dataset['command'], x.dataset['commandParameter']);
|
|
53
54
|
});
|
|
54
|
-
|
|
55
|
-
elements.querySelectorAll('select').forEach(x => x.onchange = () => this._formatSelection(x.dataset['command'], x.value));
|
|
56
|
-
//Button overlay
|
|
57
|
-
const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
58
|
-
this._foreignObject = foreignObject;
|
|
59
|
-
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
|
|
60
|
-
foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
|
|
61
|
-
foreignObject.setAttribute('width', '300');
|
|
62
|
-
foreignObject.setAttribute('height', '24');
|
|
63
|
-
foreignObject.appendChild(elements);
|
|
64
|
-
this._addOverlay(foreignObject, OverlayLayer.Foreground);
|
|
55
|
+
this._toolbar.querySelectorAll('select').forEach(x => x.onchange = () => this._formatSelection(x.dataset['command'], x.value));
|
|
65
56
|
//TODO - nice way to disable click overlay
|
|
66
57
|
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
67
58
|
//overlay to detect click outside
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { IDesignItem } from '../../../../item/IDesignItem.js';
|
|
2
|
+
import { IDesignerCanvas } from '../../IDesignerCanvas.js';
|
|
3
|
+
import { AbstractExtension } from "../AbstractExtension.js";
|
|
4
|
+
import { IExtensionManager } from '../IExtensionManger.js';
|
|
5
|
+
export type handlesPointerEvent = {
|
|
6
|
+
handlesPointerEvent(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare class EditTextExtension extends AbstractExtension implements handlesPointerEvent {
|
|
9
|
+
private static template;
|
|
10
|
+
private _foreignObject;
|
|
11
|
+
private _path;
|
|
12
|
+
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
13
|
+
extend(): void;
|
|
14
|
+
refresh(): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
handlesPointerEvent(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): boolean;
|
|
17
|
+
_formatSelection(type: string, value?: string): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { html } from "@node-projects/base-custom-webcomponent";
|
|
2
|
+
import { AbstractExtension } from "../AbstractExtension.js";
|
|
3
|
+
import { OverlayLayer } from "../OverlayLayer.js";
|
|
4
|
+
import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from "../../../../helper/TransformHelper.js";
|
|
5
|
+
import { shadowrootGetSelection, wrapSelectionInSpans } from "../../../../helper/SelectionHelper.js";
|
|
6
|
+
import { FontPropertyEditor } from "../../../../services/propertiesService/propertyEditors/FontPropertyEditor.js";
|
|
7
|
+
export class EditTextExtension extends AbstractExtension {
|
|
8
|
+
static template = html `
|
|
9
|
+
<div style="height: 24px; display: flex; gap: 2px;">
|
|
10
|
+
<button data-command="font-weight" data-command-parameter="800" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
|
|
11
|
+
<button data-command="font-style" data-command-parameter="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
|
|
12
|
+
<button data-command="text-decoration" data-command-parameter="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
|
|
13
|
+
<button data-command="text-decoration" data-command-parameter="line-through" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
|
|
14
|
+
<button data-command="text-decoration" data-command-parameter="overline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><span style="text-decoration: overline">o</span></button>
|
|
15
|
+
<select data-command="fontSize" style="pointer-events: all; height: 24px; width: 60px; padding: 0;">
|
|
16
|
+
<option>8px</option>
|
|
17
|
+
<option>9px</option>
|
|
18
|
+
<option>10px</option>
|
|
19
|
+
<option>11px</option>
|
|
20
|
+
<option>12px</option>
|
|
21
|
+
<option>14px</option>
|
|
22
|
+
<option>16px</option>
|
|
23
|
+
<option>18px</option>
|
|
24
|
+
<option>20px</option>
|
|
25
|
+
<option>24px</option>
|
|
26
|
+
<option>28px</option>
|
|
27
|
+
<option>32px</option>
|
|
28
|
+
<option>36px</option>
|
|
29
|
+
</select>
|
|
30
|
+
<select id="fontFamily" data-command="font-family" style="pointer-events: all; height: 24px; width: 90px; padding: 0;">
|
|
31
|
+
|
|
32
|
+
</select>
|
|
33
|
+
</div>
|
|
34
|
+
`;
|
|
35
|
+
_foreignObject;
|
|
36
|
+
_path;
|
|
37
|
+
constructor(extensionManager, designerView, extendedItem) {
|
|
38
|
+
super(extensionManager, designerView, extendedItem);
|
|
39
|
+
}
|
|
40
|
+
extend() {
|
|
41
|
+
//TODO: -> check what to do with extensions, do not loose edit on mouse click,...
|
|
42
|
+
//maybe use a html edit framework
|
|
43
|
+
this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
|
|
44
|
+
this.extendedItem.removeDesignerAttributesAndStylesFromChildren();
|
|
45
|
+
this.extendedItem.element.setAttribute('contenteditable', '');
|
|
46
|
+
this.extendedItem.element.focus();
|
|
47
|
+
let itemRect = this.extendedItem.element.getBoundingClientRect();
|
|
48
|
+
const elements = EditTextExtension.template.content.cloneNode(true);
|
|
49
|
+
FontPropertyEditor.addFontsToSelect(elements.querySelector('#fontFamily'));
|
|
50
|
+
elements.querySelectorAll('button').forEach(x => x.onpointerdown = (e) => {
|
|
51
|
+
this.designerCanvas.ignoreEvent(e);
|
|
52
|
+
this._formatSelection(x.dataset['command'], x.dataset['commandParameter']);
|
|
53
|
+
});
|
|
54
|
+
elements.querySelectorAll('select').forEach(x => x.onpointerdown = (e) => this.designerCanvas.ignoreEvent(e));
|
|
55
|
+
elements.querySelectorAll('select').forEach(x => x.onchange = () => this._formatSelection(x.dataset['command'], x.value));
|
|
56
|
+
//Button overlay
|
|
57
|
+
const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
58
|
+
this._foreignObject = foreignObject;
|
|
59
|
+
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
|
|
60
|
+
foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
|
|
61
|
+
foreignObject.setAttribute('width', '300');
|
|
62
|
+
foreignObject.setAttribute('height', '24');
|
|
63
|
+
foreignObject.appendChild(elements);
|
|
64
|
+
this._addOverlay(foreignObject, OverlayLayer.Foreground);
|
|
65
|
+
//TODO - nice way to disable click overlay
|
|
66
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
67
|
+
//overlay to detect click outside
|
|
68
|
+
this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
69
|
+
this._path.setAttribute('class', 'svg-edit-text-clickoutside');
|
|
70
|
+
this._path.setAttribute('fill-rule', 'evenodd');
|
|
71
|
+
this._path.style.pointerEvents = 'auto';
|
|
72
|
+
this._path.onpointerdown = (e) => {
|
|
73
|
+
this.extensionManager.removeExtensionInstance(this.extendedItem, this);
|
|
74
|
+
};
|
|
75
|
+
this._addOverlay(this._path, OverlayLayer.Background);
|
|
76
|
+
let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
|
|
77
|
+
let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
|
|
78
|
+
let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
|
|
79
|
+
data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
|
|
80
|
+
this._path.setAttribute("d", data);
|
|
81
|
+
}
|
|
82
|
+
refresh() {
|
|
83
|
+
let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
|
|
84
|
+
let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
|
|
85
|
+
let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
|
|
86
|
+
data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
|
|
87
|
+
this._path.setAttribute("d", data);
|
|
88
|
+
}
|
|
89
|
+
dispose() {
|
|
90
|
+
this._removeAllOverlays();
|
|
91
|
+
this.extendedItem.element.removeAttribute('contenteditable');
|
|
92
|
+
this.extendedItem.updateChildrenFromNodesChildren();
|
|
93
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
|
|
94
|
+
}
|
|
95
|
+
handlesPointerEvent(designerCanvas, event, currentElement) {
|
|
96
|
+
const p = event.composedPath();
|
|
97
|
+
const stylo = this._foreignObject.querySelector('stylo-editor');
|
|
98
|
+
return p.indexOf(stylo) >= 0;
|
|
99
|
+
}
|
|
100
|
+
_formatSelection(type, value) {
|
|
101
|
+
const selection = shadowrootGetSelection(this.designerCanvas.rootDesignItem.element.shadowRoot);
|
|
102
|
+
const spans = wrapSelectionInSpans(selection);
|
|
103
|
+
for (const span of spans)
|
|
104
|
+
span.style[type] = value;
|
|
105
|
+
this.extendedItem.element.focus();
|
|
106
|
+
}
|
|
107
|
+
}
|