import "./main.css"; import { type Accessor, type Component, createSignal, onMount } from "solid-js"; import { render } from "solid-js/web"; import { InputField } from "#/dev/controls/InputField.tsx"; import { RangeSlider } from "#/dev/controls/RangeSlider.tsx"; import { type BrowserFolder, FileBrowser } from "#/dev/FileBrowser.tsx"; import { ArrowAutofitHeightIcon, ArrowAutofitWidthIcon, FileIcon, ZoomScanIcon, } from "#/dev/icons/index.ts"; import type { Entity } from "#/engine/Entity"; import { currentScene, loadScene, type SceneData } from "#/engine/Scene.ts"; import { setScale, viewport } from "#/engine/Viewport.ts"; import type { ListItem } from "./ItemList"; import { RemoteItemList } from "./RemoteItemList"; async function fetchBrowserData(dir: string): Promise { const indexRef: string[] = await (await fetch(`/api/${dir}`)).json(); const scenes = indexRef.reduce((root, entry) => { const [name] = entry.substring(1).split("/"); root.set(name, { path: name, isActive: false }); return root; }, new Map() as BrowserFolder); return new Map([[dir, scenes]]); } function mapSceneEntitiesOld(sceneData: SceneData): BrowserFolder { const sets: Record = {}; const entites = sceneData.entities.reduce((root, entity) => { sets[entity.name] = sets[entity.name] === undefined ? 0 : sets[entity.name] + 1; root.set(`${entity.name}:${sets[entity.name]}`, { path: `${entity.name}:${sets[entity.name]}`, isActive: false, }); return root; }, new Map() as BrowserFolder); return new Map([["entities", entites]]); } const scenesRaw = await fetchBrowserData("scenes"); function mapSceneEntities(sceneData: SceneData): Array { const sets: Record = {}; return sceneData.entities.map((entity, index) => { sets[entity.name] = sets[entity.name] === undefined ? 0 : sets[entity.name] + 1; return { label: entity.name, isActive: false, index, }; }); } function adjustGameContainer(gameContainer: HTMLElement, width: number): void { gameContainer.style = `position: relative; top: 0; left: ${width}px; width: ${document.body.offsetWidth - width}px;`; } const DevTools: Component<{ gameContainer: HTMLElement }> = ({ gameContainer, }) => { const [width, setWidth] = createSignal(320); let isResizing = false; const startResizing = (): void => { isResizing = true; }; const stopResizing = (): void => { isResizing = false; }; const handleMouseMove = (event: MouseEvent) => { if (isResizing) { setWidth(event.clientX); self.dispatchEvent(new Event("resize")); } }; adjustGameContainer(gameContainer, width()); const [entities, setEntities] = createSignal( mapSceneEntities(currentScene.data), ); const mapActive = ( root: string, path: string, accessor: Accessor, ): BrowserFolder => { return new Map([ [ root, (accessor().get(root) as BrowserFolder) .entries() .reduce((acc, [key, value]) => { acc.set(key, { // @ts-ignore: value is BrowserFile path: value.path, isActive: path === key, }); return acc; }, new Map() as BrowserFolder), ], ]); }; let activeEntity = null; const setActiveEntity = (entityItem: ListItem & { index: number }): void => { const instances = currentScene.entityInstanceMap.get( entityItem.label, )!.instances; console.log(entityItem); activeEntity = instances[entityItem.index] as Entity; // setEntities(mapActive("entities", path, entities)); console.log(activeEntity); }; // const setActiveEntity = (path: string): void => { // const [id, index] = path.split(":"); // const instances = currentScene.entityInstanceMap.get(id)!.instances; // activeEntity = instances[parseInt(index)] as Entity; // setEntities(mapActive("entities", path, entities)); // console.log(activeEntity); // }; const [scenes, setScenes] = createSignal(scenesRaw); const setCurrentScene = async (path: string) => { await loadScene(path); setScenes(mapActive("scenes", path, scenes)); setEntities(mapSceneEntities(currentScene.data)); }; onMount(() => { self.addEventListener("resize", () => { adjustGameContainer(gameContainer, width()); }); self.dispatchEvent(new Event("resize")); document.addEventListener("mousemove", handleMouseMove); document.addEventListener("mouseup", stopResizing); }); return (
{ currentScene.data.width = parseInt(value); self.dispatchEvent(new Event("resize")); }} > { currentScene.data.height = parseInt(value); self.dispatchEvent(new Event("resize")); }} >
entities()} />
); }; export function use(container: HTMLElement): void { render(() => , document.body); }