@pooder/kit 6.0.0 → 6.1.0
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/.test-dist/src/extensions/background/BackgroundTool.js +524 -0
- package/.test-dist/src/extensions/background/index.js +17 -0
- package/.test-dist/src/extensions/background.js +1 -1
- package/.test-dist/src/extensions/dieline/DielineTool.js +748 -0
- package/.test-dist/src/extensions/dieline/commands.js +127 -0
- package/.test-dist/src/extensions/dieline/config.js +107 -0
- package/.test-dist/src/extensions/dieline/index.js +21 -0
- package/.test-dist/src/extensions/dieline/model.js +2 -0
- package/.test-dist/src/extensions/dieline/renderer.js +2 -0
- package/.test-dist/src/extensions/dieline.js +4 -0
- package/.test-dist/src/extensions/feature/FeatureTool.js +914 -0
- package/.test-dist/src/extensions/feature/index.js +17 -0
- package/.test-dist/src/extensions/film/FilmTool.js +207 -0
- package/.test-dist/src/extensions/film/index.js +17 -0
- package/.test-dist/src/extensions/image/ImageTool.js +1499 -0
- package/.test-dist/src/extensions/image/commands.js +162 -0
- package/.test-dist/src/extensions/image/config.js +129 -0
- package/.test-dist/src/extensions/image/index.js +21 -0
- package/.test-dist/src/extensions/image/model.js +2 -0
- package/.test-dist/src/extensions/image/renderer.js +5 -0
- package/.test-dist/src/extensions/image.js +182 -7
- package/.test-dist/src/extensions/mirror/MirrorTool.js +104 -0
- package/.test-dist/src/extensions/mirror/index.js +17 -0
- package/.test-dist/src/extensions/ruler/RulerTool.js +442 -0
- package/.test-dist/src/extensions/ruler/index.js +17 -0
- package/.test-dist/src/extensions/sceneLayout.js +2 -93
- package/.test-dist/src/extensions/sceneLayoutModel.js +15 -200
- package/.test-dist/src/extensions/size/SizeTool.js +332 -0
- package/.test-dist/src/extensions/size/index.js +17 -0
- package/.test-dist/src/extensions/white-ink/WhiteInkTool.js +1003 -0
- package/.test-dist/src/extensions/white-ink/commands.js +148 -0
- package/.test-dist/src/extensions/white-ink/config.js +31 -0
- package/.test-dist/src/extensions/white-ink/index.js +21 -0
- package/.test-dist/src/extensions/white-ink/model.js +2 -0
- package/.test-dist/src/extensions/white-ink/renderer.js +5 -0
- package/.test-dist/src/services/CanvasService.js +34 -13
- package/.test-dist/src/services/SceneLayoutService.js +96 -0
- package/.test-dist/src/services/index.js +1 -0
- package/.test-dist/src/services/visibility.js +3 -0
- package/.test-dist/src/shared/constants/layers.js +25 -0
- package/.test-dist/src/shared/imaging/sourceSizeCache.js +82 -0
- package/.test-dist/src/shared/index.js +22 -0
- package/.test-dist/src/shared/runtime/sessionState.js +74 -0
- package/.test-dist/src/shared/runtime/subscriptions.js +30 -0
- package/.test-dist/src/shared/scene/frame.js +34 -0
- package/.test-dist/src/shared/scene/sceneLayoutModel.js +202 -0
- package/.test-dist/tests/run.js +118 -0
- package/CHANGELOG.md +12 -0
- package/dist/index.d.mts +403 -366
- package/dist/index.d.ts +403 -366
- package/dist/index.js +5172 -4752
- package/dist/index.mjs +1410 -2027
- package/dist/tracer-PO7CRBYY.mjs +1016 -0
- package/package.json +1 -1
- package/src/extensions/{background.ts → background/BackgroundTool.ts} +33 -50
- package/src/extensions/background/index.ts +1 -0
- package/src/extensions/{dieline.ts → dieline/DielineTool.ts} +18 -218
- package/src/extensions/dieline/commands.ts +109 -0
- package/src/extensions/dieline/config.ts +106 -0
- package/src/extensions/dieline/index.ts +5 -0
- package/src/extensions/dieline/model.ts +1 -0
- package/src/extensions/dieline/renderer.ts +1 -0
- package/src/extensions/{feature.ts → feature/FeatureTool.ts} +27 -21
- package/src/extensions/feature/index.ts +1 -0
- package/src/extensions/{film.ts → film/FilmTool.ts} +36 -48
- package/src/extensions/film/index.ts +1 -0
- package/src/extensions/{image.ts → image/ImageTool.ts} +289 -335
- package/src/extensions/image/commands.ts +176 -0
- package/src/extensions/image/config.ts +128 -0
- package/src/extensions/image/index.ts +5 -0
- package/src/extensions/image/model.ts +1 -0
- package/src/extensions/image/renderer.ts +1 -0
- package/src/extensions/{mirror.ts → mirror/MirrorTool.ts} +1 -1
- package/src/extensions/mirror/index.ts +1 -0
- package/src/extensions/{ruler.ts → ruler/RulerTool.ts} +4 -5
- package/src/extensions/ruler/index.ts +1 -0
- package/src/extensions/sceneLayout.ts +1 -140
- package/src/extensions/sceneLayoutModel.ts +1 -364
- package/src/extensions/{size.ts → size/SizeTool.ts} +7 -6
- package/src/extensions/size/index.ts +1 -0
- package/src/extensions/{white-ink.ts → white-ink/WhiteInkTool.ts} +130 -317
- package/src/extensions/white-ink/commands.ts +157 -0
- package/src/extensions/white-ink/config.ts +30 -0
- package/src/extensions/white-ink/index.ts +5 -0
- package/src/extensions/white-ink/model.ts +1 -0
- package/src/extensions/white-ink/renderer.ts +1 -0
- package/src/services/CanvasService.ts +43 -12
- package/src/services/SceneLayoutService.ts +139 -0
- package/src/services/index.ts +1 -0
- package/src/services/renderSpec.ts +2 -0
- package/src/services/visibility.ts +5 -0
- package/src/shared/constants/layers.ts +23 -0
- package/src/shared/imaging/sourceSizeCache.ts +103 -0
- package/src/shared/index.ts +6 -0
- package/src/shared/runtime/sessionState.ts +105 -0
- package/src/shared/runtime/subscriptions.ts +45 -0
- package/src/shared/scene/frame.ts +46 -0
- package/src/shared/scene/sceneLayoutModel.ts +367 -0
- package/tests/run.ts +151 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { CommandContribution } from "@pooder/core";
|
|
2
|
+
|
|
3
|
+
export function createImageCommands(tool: any): CommandContribution[] {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
command: "addImage",
|
|
7
|
+
id: "addImage",
|
|
8
|
+
title: "Add Image",
|
|
9
|
+
handler: async (url: string, options?: Record<string, any>) => {
|
|
10
|
+
const result = await tool.upsertImageEntry(url, {
|
|
11
|
+
mode: "add",
|
|
12
|
+
addOptions: options,
|
|
13
|
+
});
|
|
14
|
+
return result.id;
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
command: "upsertImage",
|
|
19
|
+
id: "upsertImage",
|
|
20
|
+
title: "Upsert Image",
|
|
21
|
+
handler: async (url: string, options: Record<string, any> = {}) => {
|
|
22
|
+
return await tool.upsertImageEntry(url, options);
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
command: "getWorkingImages",
|
|
27
|
+
id: "getWorkingImages",
|
|
28
|
+
title: "Get Working Images",
|
|
29
|
+
handler: () => {
|
|
30
|
+
return tool.cloneItems(tool.workingItems);
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
command: "setWorkingImage",
|
|
35
|
+
id: "setWorkingImage",
|
|
36
|
+
title: "Set Working Image",
|
|
37
|
+
handler: (id: string, updates: Record<string, any>) => {
|
|
38
|
+
tool.updateImageInWorking(id, updates);
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
command: "resetWorkingImages",
|
|
43
|
+
id: "resetWorkingImages",
|
|
44
|
+
title: "Reset Working Images",
|
|
45
|
+
handler: () => {
|
|
46
|
+
tool.workingItems = tool.cloneItems(tool.items);
|
|
47
|
+
tool.hasWorkingChanges = false;
|
|
48
|
+
tool.updateImages();
|
|
49
|
+
tool.emitWorkingChange();
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
command: "completeImages",
|
|
54
|
+
id: "completeImages",
|
|
55
|
+
title: "Complete Images",
|
|
56
|
+
handler: async () => {
|
|
57
|
+
return await tool.commitWorkingImagesAsCropped();
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
command: "exportUserCroppedImage",
|
|
62
|
+
id: "exportUserCroppedImage",
|
|
63
|
+
title: "Export User Cropped Image",
|
|
64
|
+
handler: async (options: Record<string, any> = {}) => {
|
|
65
|
+
return await tool.exportUserCroppedImage(options);
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
command: "fitImageToArea",
|
|
70
|
+
id: "fitImageToArea",
|
|
71
|
+
title: "Fit Image to Area",
|
|
72
|
+
handler: async (
|
|
73
|
+
id: string,
|
|
74
|
+
area: {
|
|
75
|
+
width: number;
|
|
76
|
+
height: number;
|
|
77
|
+
left?: number;
|
|
78
|
+
top?: number;
|
|
79
|
+
},
|
|
80
|
+
) => {
|
|
81
|
+
await tool.fitImageToArea(id, area);
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
command: "fitImageToDefaultArea",
|
|
86
|
+
id: "fitImageToDefaultArea",
|
|
87
|
+
title: "Fit Image to Default Area",
|
|
88
|
+
handler: async (id: string) => {
|
|
89
|
+
await tool.fitImageToDefaultArea(id);
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
command: "focusImage",
|
|
94
|
+
id: "focusImage",
|
|
95
|
+
title: "Focus Image",
|
|
96
|
+
handler: (
|
|
97
|
+
id: string | null,
|
|
98
|
+
options: { syncCanvasSelection?: boolean } = {},
|
|
99
|
+
) => {
|
|
100
|
+
return tool.setImageFocus(id, options);
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
command: "removeImage",
|
|
105
|
+
id: "removeImage",
|
|
106
|
+
title: "Remove Image",
|
|
107
|
+
handler: (id: string) => {
|
|
108
|
+
const removed = tool.items.find((item: any) => item.id === id);
|
|
109
|
+
const next = tool.items.filter((item: any) => item.id !== id);
|
|
110
|
+
if (next.length !== tool.items.length) {
|
|
111
|
+
tool.purgeSourceSizeCacheForItem(removed);
|
|
112
|
+
if (tool.focusedImageId === id) {
|
|
113
|
+
tool.setImageFocus(null, {
|
|
114
|
+
syncCanvasSelection: true,
|
|
115
|
+
skipRender: true,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
tool.updateConfig(next);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
command: "updateImage",
|
|
124
|
+
id: "updateImage",
|
|
125
|
+
title: "Update Image",
|
|
126
|
+
handler: async (
|
|
127
|
+
id: string,
|
|
128
|
+
updates: Record<string, any>,
|
|
129
|
+
options: Record<string, any> = {},
|
|
130
|
+
) => {
|
|
131
|
+
await tool.updateImage(id, updates, options);
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
command: "clearImages",
|
|
136
|
+
id: "clearImages",
|
|
137
|
+
title: "Clear Images",
|
|
138
|
+
handler: () => {
|
|
139
|
+
tool.sourceSizeCache.clear();
|
|
140
|
+
tool.setImageFocus(null, {
|
|
141
|
+
syncCanvasSelection: true,
|
|
142
|
+
skipRender: true,
|
|
143
|
+
});
|
|
144
|
+
tool.updateConfig([]);
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
command: "bringToFront",
|
|
149
|
+
id: "bringToFront",
|
|
150
|
+
title: "Bring Image to Front",
|
|
151
|
+
handler: (id: string) => {
|
|
152
|
+
const index = tool.items.findIndex((item: any) => item.id === id);
|
|
153
|
+
if (index !== -1 && index < tool.items.length - 1) {
|
|
154
|
+
const next = [...tool.items];
|
|
155
|
+
const [item] = next.splice(index, 1);
|
|
156
|
+
next.push(item);
|
|
157
|
+
tool.updateConfig(next);
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
command: "sendToBack",
|
|
163
|
+
id: "sendToBack",
|
|
164
|
+
title: "Send Image to Back",
|
|
165
|
+
handler: (id: string) => {
|
|
166
|
+
const index = tool.items.findIndex((item: any) => item.id === id);
|
|
167
|
+
if (index > 0) {
|
|
168
|
+
const next = [...tool.items];
|
|
169
|
+
const [item] = next.splice(index, 1);
|
|
170
|
+
next.unshift(item);
|
|
171
|
+
tool.updateConfig(next);
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
];
|
|
176
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { ConfigurationContribution } from "@pooder/core";
|
|
2
|
+
|
|
3
|
+
export function createImageConfigurations(): ConfigurationContribution[] {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
id: "image.items",
|
|
7
|
+
type: "array",
|
|
8
|
+
label: "Images",
|
|
9
|
+
default: [],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: "image.debug",
|
|
13
|
+
type: "boolean",
|
|
14
|
+
label: "Image Debug Log",
|
|
15
|
+
default: false,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "image.control.cornerSize",
|
|
19
|
+
type: "number",
|
|
20
|
+
label: "Image Control Corner Size",
|
|
21
|
+
min: 4,
|
|
22
|
+
max: 64,
|
|
23
|
+
step: 1,
|
|
24
|
+
default: 14,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "image.control.touchCornerSize",
|
|
28
|
+
type: "number",
|
|
29
|
+
label: "Image Control Touch Corner Size",
|
|
30
|
+
min: 8,
|
|
31
|
+
max: 96,
|
|
32
|
+
step: 1,
|
|
33
|
+
default: 24,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "image.control.cornerStyle",
|
|
37
|
+
type: "select",
|
|
38
|
+
label: "Image Control Corner Style",
|
|
39
|
+
options: ["circle", "rect"],
|
|
40
|
+
default: "circle",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "image.control.cornerColor",
|
|
44
|
+
type: "color",
|
|
45
|
+
label: "Image Control Corner Color",
|
|
46
|
+
default: "#ffffff",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: "image.control.cornerStrokeColor",
|
|
50
|
+
type: "color",
|
|
51
|
+
label: "Image Control Corner Stroke Color",
|
|
52
|
+
default: "#1677ff",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "image.control.transparentCorners",
|
|
56
|
+
type: "boolean",
|
|
57
|
+
label: "Image Control Transparent Corners",
|
|
58
|
+
default: false,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "image.control.borderColor",
|
|
62
|
+
type: "color",
|
|
63
|
+
label: "Image Control Border Color",
|
|
64
|
+
default: "#1677ff",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: "image.control.borderScaleFactor",
|
|
68
|
+
type: "number",
|
|
69
|
+
label: "Image Control Border Width",
|
|
70
|
+
min: 0.5,
|
|
71
|
+
max: 8,
|
|
72
|
+
step: 0.1,
|
|
73
|
+
default: 1.5,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: "image.control.padding",
|
|
77
|
+
type: "number",
|
|
78
|
+
label: "Image Control Padding",
|
|
79
|
+
min: 0,
|
|
80
|
+
max: 64,
|
|
81
|
+
step: 1,
|
|
82
|
+
default: 0,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "image.frame.strokeColor",
|
|
86
|
+
type: "color",
|
|
87
|
+
label: "Image Frame Stroke Color",
|
|
88
|
+
default: "#808080",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
id: "image.frame.strokeWidth",
|
|
92
|
+
type: "number",
|
|
93
|
+
label: "Image Frame Stroke Width",
|
|
94
|
+
min: 0,
|
|
95
|
+
max: 20,
|
|
96
|
+
step: 0.5,
|
|
97
|
+
default: 2,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: "image.frame.strokeStyle",
|
|
101
|
+
type: "select",
|
|
102
|
+
label: "Image Frame Stroke Style",
|
|
103
|
+
options: ["solid", "dashed", "hidden"],
|
|
104
|
+
default: "dashed",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: "image.frame.dashLength",
|
|
108
|
+
type: "number",
|
|
109
|
+
label: "Image Frame Dash Length",
|
|
110
|
+
min: 1,
|
|
111
|
+
max: 40,
|
|
112
|
+
step: 1,
|
|
113
|
+
default: 8,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: "image.frame.innerBackground",
|
|
117
|
+
type: "color",
|
|
118
|
+
label: "Image Frame Inner Background",
|
|
119
|
+
default: "rgba(0,0,0,0)",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: "image.frame.outerBackground",
|
|
123
|
+
type: "color",
|
|
124
|
+
label: "Image Frame Outer Background",
|
|
125
|
+
default: "#f5f5f5",
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { ImageItem } from "./ImageTool";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getCoverScale as computeImageCoverScale } from "../../shared/imaging/sourceSizeCache";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./MirrorTool";
|
|
@@ -6,16 +6,15 @@ import {
|
|
|
6
6
|
ConfigurationContribution,
|
|
7
7
|
ConfigurationService,
|
|
8
8
|
} from "@pooder/core";
|
|
9
|
-
import { CanvasService, RenderObjectSpec } from "
|
|
9
|
+
import { CanvasService, RenderObjectSpec } from "../../services";
|
|
10
10
|
import {
|
|
11
11
|
buildSceneGeometry,
|
|
12
12
|
computeSceneLayout,
|
|
13
13
|
fromMm,
|
|
14
14
|
readSizeState,
|
|
15
|
-
} from "
|
|
16
|
-
import type { Unit } from "
|
|
17
|
-
|
|
18
|
-
const RULER_LAYER_ID = "ruler-overlay";
|
|
15
|
+
} from "../../shared/scene/sceneLayoutModel";
|
|
16
|
+
import type { Unit } from "../../coordinate";
|
|
17
|
+
import { RULER_LAYER_ID } from "../../shared/constants/layers";
|
|
19
18
|
const EXTENSION_LINE_LENGTH = 5;
|
|
20
19
|
const MIN_ARROW_SIZE = 4;
|
|
21
20
|
const THICKNESS_TO_STROKE_WIDTH_RATIO = 20;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./RulerTool";
|
|
@@ -1,140 +1 @@
|
|
|
1
|
-
|
|
2
|
-
COMMAND_SERVICE,
|
|
3
|
-
CONFIGURATION_SERVICE,
|
|
4
|
-
CommandService,
|
|
5
|
-
ConfigurationService,
|
|
6
|
-
Service,
|
|
7
|
-
ServiceContext,
|
|
8
|
-
} from "@pooder/core";
|
|
9
|
-
import { CanvasService } from "../services";
|
|
10
|
-
import {
|
|
11
|
-
buildSceneGeometry,
|
|
12
|
-
computeSceneLayout,
|
|
13
|
-
readSizeState,
|
|
14
|
-
type SceneGeometrySnapshot,
|
|
15
|
-
type SceneLayoutSnapshot,
|
|
16
|
-
} from "./sceneLayoutModel";
|
|
17
|
-
|
|
18
|
-
interface ConfigChangeEvent {
|
|
19
|
-
key: string;
|
|
20
|
-
value: unknown;
|
|
21
|
-
oldValue: unknown;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const CONFIG_WATCH_PREFIXES = ["size.", "dieline."] as const;
|
|
25
|
-
const CANVAS_SERVICE_ID = "CanvasService";
|
|
26
|
-
const GET_SCENE_LAYOUT_COMMAND = "getSceneLayout";
|
|
27
|
-
const GET_SCENE_GEOMETRY_COMMAND = "getSceneGeometry";
|
|
28
|
-
|
|
29
|
-
export class SceneLayoutService implements Service {
|
|
30
|
-
private context?: ServiceContext;
|
|
31
|
-
private canvasService?: CanvasService;
|
|
32
|
-
private configService?: ConfigurationService;
|
|
33
|
-
private lastLayout: SceneLayoutSnapshot | null = null;
|
|
34
|
-
private lastGeometry: SceneGeometrySnapshot | null = null;
|
|
35
|
-
private onConfigChange?: { dispose(): void };
|
|
36
|
-
private commandDisposables: Array<{ dispose(): void }> = [];
|
|
37
|
-
|
|
38
|
-
init(context: ServiceContext) {
|
|
39
|
-
if (this.context) {
|
|
40
|
-
this.dispose(this.context);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const canvasService =
|
|
44
|
-
context.get<CanvasService>(CANVAS_SERVICE_ID);
|
|
45
|
-
const configService =
|
|
46
|
-
context.get<ConfigurationService>(CONFIGURATION_SERVICE);
|
|
47
|
-
const commandService = context.get<CommandService>(COMMAND_SERVICE);
|
|
48
|
-
|
|
49
|
-
if (!canvasService || !configService || !commandService) {
|
|
50
|
-
throw new Error(
|
|
51
|
-
"[SceneLayoutService] CanvasService, ConfigurationService and CommandService are required.",
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
this.context = context;
|
|
56
|
-
this.canvasService = canvasService;
|
|
57
|
-
this.configService = configService;
|
|
58
|
-
|
|
59
|
-
this.commandDisposables.push(
|
|
60
|
-
commandService.registerCommand(GET_SCENE_LAYOUT_COMMAND, () =>
|
|
61
|
-
this.getLayout(),
|
|
62
|
-
),
|
|
63
|
-
commandService.registerCommand(GET_SCENE_GEOMETRY_COMMAND, () =>
|
|
64
|
-
this.getGeometry(),
|
|
65
|
-
),
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
this.onConfigChange = configService.onAnyChange(this.onConfigChanged);
|
|
69
|
-
context.eventBus.on("canvas:resized", this.onCanvasResized);
|
|
70
|
-
this.refresh();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
dispose(context: ServiceContext) {
|
|
74
|
-
const activeContext = this.context ?? context;
|
|
75
|
-
activeContext.eventBus.off("canvas:resized", this.onCanvasResized);
|
|
76
|
-
this.onConfigChange?.dispose();
|
|
77
|
-
this.onConfigChange = undefined;
|
|
78
|
-
this.commandDisposables.forEach((item) => item.dispose());
|
|
79
|
-
this.commandDisposables = [];
|
|
80
|
-
this.context = undefined;
|
|
81
|
-
this.canvasService = undefined;
|
|
82
|
-
this.configService = undefined;
|
|
83
|
-
this.lastLayout = null;
|
|
84
|
-
this.lastGeometry = null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
private onCanvasResized = () => {
|
|
88
|
-
this.refresh();
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
private onConfigChanged = (e: ConfigChangeEvent) => {
|
|
92
|
-
if (CONFIG_WATCH_PREFIXES.some((prefix) => e.key.startsWith(prefix))) {
|
|
93
|
-
this.refresh();
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
private refresh() {
|
|
98
|
-
const layout = this.getLayout(true);
|
|
99
|
-
if (!layout) {
|
|
100
|
-
this.lastGeometry = null;
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
this.context?.eventBus.emit("scene:layout:change", layout);
|
|
105
|
-
|
|
106
|
-
const geometry = this.getGeometry(true);
|
|
107
|
-
if (geometry) {
|
|
108
|
-
this.context?.eventBus.emit("scene:geometry:change", geometry);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
getLayout(forceRefresh = false): SceneLayoutSnapshot | null {
|
|
113
|
-
if (!this.canvasService || !this.configService) return null;
|
|
114
|
-
if (!forceRefresh && this.lastLayout) return this.lastLayout;
|
|
115
|
-
|
|
116
|
-
const state = readSizeState(this.configService);
|
|
117
|
-
const layout = computeSceneLayout(this.canvasService, state);
|
|
118
|
-
if (!layout) {
|
|
119
|
-
this.lastLayout = null;
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
this.lastLayout = layout;
|
|
124
|
-
return layout;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
getGeometry(forceRefresh = false): SceneGeometrySnapshot | null {
|
|
128
|
-
if (!this.configService) return null;
|
|
129
|
-
const layout = this.getLayout(forceRefresh);
|
|
130
|
-
if (!layout) {
|
|
131
|
-
this.lastGeometry = null;
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
if (!forceRefresh && this.lastGeometry) return this.lastGeometry;
|
|
135
|
-
|
|
136
|
-
const geometry = buildSceneGeometry(this.configService, layout);
|
|
137
|
-
this.lastGeometry = geometry;
|
|
138
|
-
return geometry;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
1
|
+
export { SceneLayoutService } from "../services/SceneLayoutService";
|