webstudio/ui/src/features/scene_manager/presentation/scene_manager.tsx

174 lines
5.7 KiB
TypeScript
Raw Normal View History

2024-01-23 17:26:59 +03:00
import * as React from "react";
import { SceneMangerStore } from "./scene_manager_store";
import { observer } from "mobx-react-lite";
import { StaticAssetModelView } from "./components/static_asset_item_view";
import { useParams } from "react-router-dom";
import { SceneManagerView, SceneMode } from "../model/scene_view";
import { Button } from "antd";
import { Form, Input, ResetButton, SubmitButton } from "formik-antd";
import { Formik } from "formik";
import { CameraViewModel } from "../model/scene_assets";
export const SceneManagerPath = "/scene/manager/";
export const SceneManger = observer(() => {
const canvasRef = React.useRef<HTMLCanvasElement>(null);
2024-02-16 14:16:35 +03:00
const [store] = React.useState(() => new SceneMangerStore());
2024-01-23 17:26:59 +03:00
const id = useParams().id as string;
React.useEffect(() => {
2024-02-16 14:16:35 +03:00
store.init();
store.loadScene(canvasRef.current!);
2024-01-23 17:26:59 +03:00
document.body.style.overflow = "hidden";
return () => {
document.body.style.overflow = "scroll";
2024-02-16 14:16:35 +03:00
store.dispose();
2024-01-23 17:26:59 +03:00
};
2024-02-16 14:16:35 +03:00
}, [id, store]);
2024-01-23 17:26:59 +03:00
2024-02-16 14:16:35 +03:00
const sceneIcons: SceneManagerView[] = Object.values(SceneMode)
.filter((el) => el !== SceneMode.EMPTY)
.map((el) => {
return { name: el, clickHandel: () => store.setSceneMode(el as SceneMode) };
});
2024-01-23 17:26:59 +03:00
return (
<div>
<canvas ref={canvasRef} style={{ position: "absolute", overflow: "hidden" }} />
<div
style={{
display: "flex",
flexDirection: "row",
alignContent: "center",
justifyContent: "space-between",
position: "absolute",
width: "100vw",
}}
>
<div>
{sceneIcons.map((el) => {
return (
<div
style={{
2024-02-16 14:16:35 +03:00
backgroundColor: store.sceneMode === el.name ? "aqua" : "ActiveBorder",
2024-01-23 17:26:59 +03:00
}}
onClick={() => {
el.clickHandel();
}}
>
{el.name}
</div>
);
})}
<div
style={{
marginTop: "10px",
backgroundColor: "GrayText",
border: "solid",
borderRadius: "10px",
padding: "8px",
borderColor: "white",
}}
>
<div style={{ color: "white" }}>Scene manager</div>
2024-02-16 14:16:35 +03:00
{store.isVisibleSaveButton ? (
2024-01-23 17:26:59 +03:00
<>
2024-02-16 14:16:35 +03:00
<Button onClick={() => store.onTapSave()}>Save</Button>
2024-01-23 17:26:59 +03:00
</>
) : (
<></>
)}
2024-02-16 14:16:35 +03:00
{store.isLoading ? <>Loading...</> : <></>}
{store.sceneMode === SceneMode.ADD_CAMERA ? (
2024-01-23 17:26:59 +03:00
<div>
<Formik
initialValues={CameraViewModel.empty()}
onSubmit={async (model, actions) => {
2024-02-16 14:16:35 +03:00
store.addNewCamera(model);
2024-01-23 17:26:59 +03:00
actions.setSubmitting(false);
actions.resetForm();
}}
validate={(model) => {
2024-02-16 14:16:35 +03:00
return model.validate(store.getCameraLinkNames());
2024-01-23 17:26:59 +03:00
}}
render={() => (
<Form>
<div
style={{
background: "white",
flex: 1,
padding: 40,
width: "400px",
}}
>
<Input name="cameraLink" placeholder="Camera link" />
<Input name="topicImage" placeholder="Topic Image" />
<Input name="topicCameraInfo" placeholder="Topic Camera Info" />
<Input name="topicDepth" placeholder="Topic Depth" />
<ResetButton>Reset</ResetButton>
<SubmitButton>Submit</SubmitButton>
</div>
</Form>
)}
/>
</div>
) : (
<></>
)}
2024-02-16 14:16:35 +03:00
{store.sceneMode === SceneMode.MOVING || SceneMode.ROTATE ? (
2024-01-23 17:26:59 +03:00
<>
2024-02-16 14:16:35 +03:00
{store.robossemblerAssets?.assets.map((el) => {
2024-01-23 17:26:59 +03:00
return (
<div>
<div style={{ color: "white", marginLeft: "10px", marginRight: "10px", display: "contents" }}>
{el.name}
2024-02-16 14:16:35 +03:00
{store.isRenderedAsset(el.name) ? (
2024-01-23 17:26:59 +03:00
<></>
) : (
<Button
onClick={() => {
2024-02-16 14:16:35 +03:00
store.loadSceneRobossemblerAsset(el.name);
2024-01-23 17:26:59 +03:00
}}
>
add scene
</Button>
)}
</div>
</div>
);
})}
</>
) : (
<></>
)}
</div>
</div>
<div>
2024-02-16 14:16:35 +03:00
{store.sceneModels.map((el) => {
return <StaticAssetModelView onTap={() => store.deleteSceneItem(el)} model={el} />;
2024-01-23 17:26:59 +03:00
})}
</div>
2024-02-16 14:16:35 +03:00
{store.sceneMode === SceneMode.MAGNETISM_MARKING ? (
<>
<div style={{ backgroundColor: "white" }}>
<div>completion of objects</div>
<div>
{store.objectMagnetism ? (
<>{store.objectMagnetism}</>
) : (
<Button>Selects an object for magnetism</Button>
)}
{store.objectForMagnetism ? <>{store.objectForMagnetism}</> : <Button>Selects an object magnet</Button>}
</div>
</div>
</>
) : (
<></>
)}
2024-01-23 17:26:59 +03:00
</div>
</div>
);
});