Skip to content

Commit 2c794d4

Browse files
committed
fix bugs
1 parent f4f749a commit 2c794d4

File tree

9 files changed

+301
-166
lines changed

9 files changed

+301
-166
lines changed

src/index.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
1-
// Components
1+
// Core Components
22
export { default as GameCanvas } from './shared/GameCanvas';
3+
4+
// Prefab Editor
35
export { default as PrefabEditor } from './tools/prefabeditor/PrefabEditor';
6+
export type { PrefabEditorRef } from './tools/prefabeditor/PrefabEditor';
47
export { default as PrefabRoot } from './tools/prefabeditor/PrefabRoot';
8+
export type { PrefabRootRef } from './tools/prefabeditor/PrefabRoot';
9+
export { registerComponent } from './tools/prefabeditor/components/ComponentRegistry';
10+
export type { Component } from './tools/prefabeditor/components/ComponentRegistry';
11+
export type { Prefab, GameObject, ComponentData } from './tools/prefabeditor/types';
12+
export * as editorStyles from './tools/prefabeditor/styles';
13+
export * from './tools/prefabeditor/utils';
14+
15+
// Asset Tools
516
export { DragDropLoader } from './tools/dragdrop/DragDropLoader';
617
export {
718
TextureListViewer,
@@ -10,16 +21,5 @@ export {
1021
SharedCanvas,
1122
} from './tools/assetviewer/page';
1223

13-
// Component Registry
14-
export { registerComponent } from './tools/prefabeditor/components/ComponentRegistry';
15-
export type { Component } from './tools/prefabeditor/components/ComponentRegistry';
16-
17-
// Editor Styles & Utils
18-
export * as editorStyles from './tools/prefabeditor/styles';
19-
export * from './tools/prefabeditor/utils';
20-
2124
// Helpers
2225
export * from './helpers';
23-
24-
// Types
25-
export type { Prefab, GameObject, ComponentData } from './tools/prefabeditor/types';
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { createContext, useContext } from "react";
2+
3+
interface EditorContextType {
4+
transformMode: "translate" | "rotate" | "scale";
5+
setTransformMode: (mode: "translate" | "rotate" | "scale") => void;
6+
snapResolution: number;
7+
setSnapResolution: (resolution: number) => void;
8+
onScreenshot?: () => void;
9+
onExportGLB?: () => void;
10+
}
11+
12+
export const EditorContext = createContext<EditorContextType | null>(null);
13+
14+
export function useEditorContext() {
15+
const context = useContext(EditorContext);
16+
if (!context) {
17+
throw new Error("useEditorContext must be used within EditorContext.Provider");
18+
}
19+
return context;
20+
}

src/tools/prefabeditor/EditorTree.tsx

Lines changed: 83 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@ import { Dispatch, SetStateAction, useState, MouseEvent } from 'react';
22
import { Prefab, GameObject } from "./types";
33
import { getComponent } from './components/ComponentRegistry';
44
import { base, tree, menu } from './styles';
5-
import { findNode, findParent, deleteNode, cloneNode, updateNodeById } from './utils';
5+
import { findNode, findParent, deleteNode, cloneNode, updateNodeById, loadJson, saveJson, regenerateIds } from './utils';
6+
import { useEditorContext } from './EditorContext';
67

78
export default function EditorTree({
89
prefabData,
910
setPrefabData,
1011
selectedId,
1112
setSelectedId,
12-
onSave,
13-
onLoad,
1413
onUndo,
1514
onRedo,
1615
canUndo,
@@ -20,8 +19,6 @@ export default function EditorTree({
2019
setPrefabData?: Dispatch<SetStateAction<Prefab>>;
2120
selectedId: string | null;
2221
setSelectedId: Dispatch<SetStateAction<string | null>>;
23-
onSave?: () => void;
24-
onLoad?: () => void;
2522
onUndo?: () => void;
2623
onRedo?: () => void;
2724
canUndo?: boolean;
@@ -212,23 +209,11 @@ export default function EditorTree({
212209
213210
</button>
214211
{fileMenuOpen && (
215-
<div
216-
style={{ ...menu.container, top: 28, right: 0 }}
217-
onClick={(e) => e.stopPropagation()}
218-
>
219-
<button
220-
style={menu.item}
221-
onClick={() => { onLoad?.(); setFileMenuOpen(false); }}
222-
>
223-
📥 Load
224-
</button>
225-
<button
226-
style={menu.item}
227-
onClick={() => { onSave?.(); setFileMenuOpen(false); }}
228-
>
229-
💾 Save
230-
</button>
231-
</div>
212+
<FileMenu
213+
prefabData={prefabData}
214+
setPrefabData={setPrefabData}
215+
onClose={() => setFileMenuOpen(false)}
216+
/>
232217
)}
233218
</div>
234219
</div>
@@ -261,3 +246,79 @@ export default function EditorTree({
261246
</>
262247
);
263248
}
249+
250+
function FileMenu({
251+
prefabData,
252+
setPrefabData,
253+
onClose
254+
}: {
255+
prefabData: Prefab;
256+
setPrefabData: Dispatch<SetStateAction<Prefab>>;
257+
onClose: () => void;
258+
}) {
259+
const { onScreenshot, onExportGLB } = useEditorContext();
260+
261+
const handleLoad = async () => {
262+
const loadedPrefab = await loadJson();
263+
if (!loadedPrefab) return;
264+
setPrefabData(loadedPrefab);
265+
onClose();
266+
};
267+
268+
const handleSave = () => {
269+
saveJson(prefabData, "prefab");
270+
onClose();
271+
};
272+
273+
const handleLoadIntoScene = async () => {
274+
const loadedPrefab = await loadJson();
275+
if (!loadedPrefab) return;
276+
277+
setPrefabData(prev => ({
278+
...prev,
279+
root: updateNodeById(prev.root, prev.root.id, root => ({
280+
...root,
281+
children: [...(root.children ?? []), regenerateIds(loadedPrefab.root)]
282+
}))
283+
}));
284+
onClose();
285+
};
286+
287+
return (
288+
<div
289+
style={{ ...menu.container, top: 28, right: 0 }}
290+
onClick={(e) => e.stopPropagation()}
291+
>
292+
<button
293+
style={menu.item}
294+
onClick={handleLoad}
295+
>
296+
📥 Load Prefab JSON
297+
</button>
298+
<button
299+
style={menu.item}
300+
onClick={handleSave}
301+
>
302+
💾 Save Prefab JSON
303+
</button>
304+
<button
305+
style={menu.item}
306+
onClick={handleLoadIntoScene}
307+
>
308+
📂 Load into Scene
309+
</button>
310+
<button
311+
style={menu.item}
312+
onClick={() => { onScreenshot?.(); onClose(); }}
313+
>
314+
📸 Screenshot
315+
</button>
316+
<button
317+
style={menu.item}
318+
onClick={() => { onExportGLB?.(); onClose(); }}
319+
>
320+
📦 Export GLB
321+
</button>
322+
</div>
323+
);
324+
}

src/tools/prefabeditor/EditorUI.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@ import EditorTree from './EditorTree';
44
import { getAllComponents } from './components/ComponentRegistry';
55
import { base, inspector } from './styles';
66
import { findNode, updateNode, deleteNode } from './utils';
7+
import { useEditorContext } from './EditorContext';
78

89
function EditorUI({
910
prefabData,
1011
setPrefabData,
1112
selectedId,
1213
setSelectedId,
13-
transformMode,
14-
setTransformMode,
1514
basePath,
16-
onSave,
17-
onLoad,
1815
onUndo,
1916
onRedo,
2017
canUndo,
@@ -24,17 +21,14 @@ function EditorUI({
2421
setPrefabData?: Dispatch<SetStateAction<Prefab>>;
2522
selectedId: string | null;
2623
setSelectedId: Dispatch<SetStateAction<string | null>>;
27-
transformMode: "translate" | "rotate" | "scale";
28-
setTransformMode: (m: "translate" | "rotate" | "scale") => void;
2924
basePath?: string;
30-
onSave?: () => void;
31-
onLoad?: () => void;
3225
onUndo?: () => void;
3326
onRedo?: () => void;
3427
canUndo?: boolean;
3528
canRedo?: boolean;
3629
}) {
3730
const [collapsed, setCollapsed] = useState(false);
31+
const { transformMode, setTransformMode } = useEditorContext();
3832

3933
const updateNodeHandler = (updater: (n: GameObjectType) => GameObjectType) => {
4034
if (!prefabData || !setPrefabData || !selectedId) return;
@@ -81,8 +75,6 @@ function EditorUI({
8175
setPrefabData={setPrefabData}
8276
selectedId={selectedId}
8377
setSelectedId={setSelectedId}
84-
onSave={onSave}
85-
onLoad={onLoad}
8678
onUndo={onUndo}
8779
onRedo={onRedo}
8880
canUndo={canUndo}

0 commit comments

Comments
 (0)