it works again
This commit is contained in:
+36
-20
@@ -19,17 +19,19 @@ import {
|
|||||||
|
|
||||||
export type ListItem = { label: string; isActive: boolean };
|
export type ListItem = { label: string; isActive: boolean };
|
||||||
|
|
||||||
export type ItemHandler = (list: Array<ListItem>, index: number) => void;
|
export type ItemsRef = Array<{ item: ListItem; index: number }>;
|
||||||
|
|
||||||
|
export type ItemHandler = (items: ItemsRef) => void;
|
||||||
|
|
||||||
export type Direction = "default" | "asc" | "desc";
|
export type Direction = "default" | "asc" | "desc";
|
||||||
|
|
||||||
export function mapActiveItem(
|
function mapActiveItem(items: ItemsRef, index: number): ItemsRef {
|
||||||
items: Array<ListItem>,
|
return items.map((ref, idx) => ({
|
||||||
index: number,
|
item: {
|
||||||
): Array<ListItem> {
|
...ref.item,
|
||||||
return items.map((item, idx) => ({
|
|
||||||
...item,
|
|
||||||
isActive: idx === index,
|
isActive: idx === index,
|
||||||
|
},
|
||||||
|
index: ref.index,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,31 +67,44 @@ function useDirection(
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createItemsRef(items: Array<ListItem>): ItemsRef {
|
||||||
|
return items.map((item, index) => ({
|
||||||
|
item,
|
||||||
|
index,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
export const ItemList: Component<{
|
export const ItemList: Component<{
|
||||||
name: string;
|
name: string;
|
||||||
items: Accessor<Array<ListItem>>;
|
items: Accessor<string[]>;
|
||||||
handler: ItemHandler;
|
handler: ItemHandler;
|
||||||
}> = (props) => {
|
}> = (props) => {
|
||||||
const [showList, setShowList] = createSignal(true);
|
const [showList, setShowList] = createSignal(true);
|
||||||
const [items, setItems] = createSignal([...props.items()]);
|
const [items, setItems] = createSignal(
|
||||||
|
createItemsRef(props.items().map((i) => ({ label: i, isActive: false }))),
|
||||||
|
);
|
||||||
const [direction, toggleDirection] = useDirection(
|
const [direction, toggleDirection] = useDirection(
|
||||||
createSignal<Direction>("default"),
|
createSignal<Direction>("default"),
|
||||||
);
|
);
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
sortItems(props.items(), direction());
|
sortItems(
|
||||||
|
createItemsRef(props.items().map((i) => ({ label: i, isActive: false }))),
|
||||||
|
direction(),
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
const sortItems = (items: Array<ListItem>, direction: Direction) => {
|
const sortItems = (items: ItemsRef, direction: Direction) => {
|
||||||
|
const newItems = [...items];
|
||||||
if (direction === "default") {
|
if (direction === "default") {
|
||||||
setItems([...props.items()]);
|
newItems.sort((a, b) => a.index - b.index);
|
||||||
|
setItems(newItems);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const newItems = [...items];
|
|
||||||
newItems.sort((a, b) => {
|
newItems.sort((a, b) => {
|
||||||
const labelA = a.label.toLocaleLowerCase();
|
const labelA = a.item.label.toLocaleLowerCase();
|
||||||
const labelB = b.label.toLocaleLowerCase();
|
const labelB = b.item.label.toLocaleLowerCase();
|
||||||
|
|
||||||
if (labelA < labelB) {
|
if (labelA < labelB) {
|
||||||
return direction === "asc" ? -1 : 1;
|
return direction === "asc" ? -1 : 1;
|
||||||
@@ -101,7 +116,6 @@ export const ItemList: Component<{
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
setItems(newItems);
|
setItems(newItems);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -140,17 +154,19 @@ export const ItemList: Component<{
|
|||||||
<Show when={showList()}>
|
<Show when={showList()}>
|
||||||
<ul>
|
<ul>
|
||||||
<For each={items()}>
|
<For each={items()}>
|
||||||
{(item, index) => {
|
{(ref, index) => {
|
||||||
return (
|
return (
|
||||||
<li
|
<li
|
||||||
classList={{
|
classList={{
|
||||||
active: item.isActive,
|
active: ref.item.isActive,
|
||||||
}}
|
}}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
props.handler(items(), index());
|
const newItems = mapActiveItem(items(), index());
|
||||||
|
setItems(newItems);
|
||||||
|
props.handler(newItems);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{item.label}
|
{ref.item.label}
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
|||||||
+20
-47
@@ -3,7 +3,7 @@ import { type Component, createSignal, onMount } from "solid-js";
|
|||||||
import { render } from "solid-js/web";
|
import { render } from "solid-js/web";
|
||||||
import { InputField } from "#/dev/controls/InputField.tsx";
|
import { InputField } from "#/dev/controls/InputField.tsx";
|
||||||
import { RangeSlider } from "#/dev/controls/RangeSlider.tsx";
|
import { RangeSlider } from "#/dev/controls/RangeSlider.tsx";
|
||||||
import { ItemList, type ListItem, mapActiveItem } from "#/dev/ItemList.tsx";
|
import { ItemList, type ItemsRef } from "#/dev/ItemList.tsx";
|
||||||
import {
|
import {
|
||||||
ArrowAutofitHeightIcon,
|
ArrowAutofitHeightIcon,
|
||||||
ArrowAutofitWidthIcon,
|
ArrowAutofitWidthIcon,
|
||||||
@@ -13,27 +13,15 @@ import {
|
|||||||
import { currentScene, loadScene, type SceneData } from "#/engine/Scene.ts";
|
import { currentScene, loadScene, type SceneData } from "#/engine/Scene.ts";
|
||||||
import { setScale, viewport } from "#/engine/Viewport.ts";
|
import { setScale, viewport } from "#/engine/Viewport.ts";
|
||||||
|
|
||||||
async function fetchScenes(): Promise<Array<ListItem>> {
|
async function fetchScenes(): Promise<string[]> {
|
||||||
const indexRef: string[] = await (await fetch(`/api/scenes`)).json();
|
const indexRef: string[] = await (await fetch(`/api/scenes`)).json();
|
||||||
const items = indexRef.filter((value) => value.includes("index"));
|
const items = indexRef.filter((value) => value.includes("index"));
|
||||||
|
|
||||||
return items.map((value) => {
|
return items.map((i) => i.substring(1).split("/")[0]);
|
||||||
const [label] = value.substring(1).split("/");
|
|
||||||
return { label, isActive: false };
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function mapSceneEntities(sceneData: SceneData): Array<ListItem> {
|
function mapSceneEntities(sceneData: SceneData): string[] {
|
||||||
const sets: Record<string, number> = {};
|
return sceneData.entities.map((entity) => entity.name);
|
||||||
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 {
|
function adjustGameContainer(gameContainer: HTMLElement, width: number): void {
|
||||||
@@ -65,45 +53,30 @@ const DevTools: Component<{ gameContainer: HTMLElement }> = ({
|
|||||||
|
|
||||||
adjustGameContainer(gameContainer, width());
|
adjustGameContainer(gameContainer, width());
|
||||||
|
|
||||||
const [scenes, setScenes] = createSignal(
|
const [scenes] = createSignal(scenesRaw);
|
||||||
scenesRaw.map((scene) => ({
|
|
||||||
...scene,
|
|
||||||
isActive: scene.label === currentScene.data.name,
|
|
||||||
})),
|
|
||||||
);
|
|
||||||
const [entities, setEntities] = createSignal(
|
const [entities, setEntities] = createSignal(
|
||||||
mapSceneEntities(currentScene.data),
|
mapSceneEntities(currentScene.data),
|
||||||
);
|
);
|
||||||
|
|
||||||
const setCurrentScene = async (
|
const setCurrentScene = async (items: ItemsRef): Promise<void> => {
|
||||||
items: Array<ListItem>,
|
const name = items.find((ref) => ref.item.isActive)!.item.label;
|
||||||
index: number,
|
await loadScene(name);
|
||||||
): Promise<void> => {
|
|
||||||
setScenes(mapActiveItem(items, index));
|
|
||||||
|
|
||||||
await loadScene(items[index].label);
|
|
||||||
setEntities(mapSceneEntities(currentScene.data));
|
setEntities(mapSceneEntities(currentScene.data));
|
||||||
};
|
};
|
||||||
|
|
||||||
const setActiveEntity = (items: Array<ListItem>, index: number): void => {
|
const setActiveEntity = (items: ItemsRef): void => {
|
||||||
const entities = mapActiveItem(items, index);
|
const activeRef = items.find((ref) => ref.item.isActive)!;
|
||||||
setEntities(entities);
|
const instances = currentScene.entityInstanceMap.get(
|
||||||
|
activeRef.item.label,
|
||||||
|
)!.instances;
|
||||||
|
|
||||||
const entityName = items[index].label;
|
const entityRefs = items.filter(
|
||||||
const instances = currentScene.entityInstanceMap.get(entityName)!.instances;
|
(ref) => ref.item.label === activeRef.item.label,
|
||||||
|
);
|
||||||
|
const instance =
|
||||||
|
instances[entityRefs.findIndex((ref) => ref.item.isActive)];
|
||||||
|
|
||||||
let instanceIndex = 0;
|
console.log(instance.position);
|
||||||
let indexCount = 0;
|
|
||||||
for (const item of entities) {
|
|
||||||
if (item.label === entityName) {
|
|
||||||
if (item.isActive) {
|
|
||||||
instanceIndex = indexCount;
|
|
||||||
}
|
|
||||||
indexCount += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(instances[instanceIndex].position);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user