editor nav menu in sidebar
This commit is contained in:
parent
90162d47cf
commit
8ca8f894e4
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
<title>blockly3d</title>
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
.menu {
|
||||
user-select: none;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.menu-node {
|
||||
> summary {
|
||||
list-style: none;
|
||||
&::-webkit-details-marker { display: none; }
|
||||
}
|
||||
}
|
||||
|
||||
.menu-item {
|
||||
display: block;
|
||||
padding: 8px 8px;
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
|
||||
&:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
&.active {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.menu-node .menu-node > summary {
|
||||
padding-left: 12px;
|
||||
}
|
||||
|
||||
.menu-node .menu-node .menu-leaf {
|
||||
padding-left: 24px;
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
import { observer } from 'mobx-react-lite';
|
||||
import { state } from '../state';
|
||||
import './MenuView.scss';
|
||||
|
||||
export const MenuView = observer(function () {
|
||||
const objectIds = Object.keys(state.worldEditor.scene.objects);
|
||||
const selectedId = state.worldEditor.selectedObjectId;
|
||||
|
||||
return (
|
||||
<nav className="menu">
|
||||
<details open className="menu-node">
|
||||
<summary className="menu-item">Editor</summary>
|
||||
<details open className="menu-node">
|
||||
<summary
|
||||
className={`menu-item${selectedId == null ? ' active' : ''}`}
|
||||
onClick={() => state.worldEditor.resetSelectedObject()}
|
||||
>
|
||||
Objects
|
||||
</summary>
|
||||
{objectIds.map(id => (
|
||||
<div
|
||||
key={id}
|
||||
className={`menu-item menu-leaf${selectedId === id ? ' active' : ''}`}
|
||||
onClick={() => state.worldEditor.setSelectedObject(id, 'translate')}
|
||||
>
|
||||
{id}
|
||||
</div>
|
||||
))}
|
||||
</details>
|
||||
</details>
|
||||
</nav>
|
||||
);
|
||||
});
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
import { observer } from "mobx-react-lite";
|
||||
import './Panel.scss';
|
||||
import { RenderInfoView } from "./RenderInfoView";
|
||||
import { MenuView } from "./MenuView";
|
||||
import { state } from "../state";
|
||||
|
||||
export type PanelProps = {
|
||||
|
|
@ -23,6 +24,7 @@ export const Panel = observer(function ({ side = 'left' }: PanelProps) {
|
|||
|
||||
return <div className={`panel ${side}`}>
|
||||
<div className="container">
|
||||
<MenuView />
|
||||
<button onClick={handleLoadWorld}>Load</button>
|
||||
<button onClick={handleLoadMockWorld}>Load mock world</button>
|
||||
<button onClick={handleCloneTest1Object}>Clone test1</button>
|
||||
|
|
|
|||
Loading…
Reference in New Issue