three.cad/src/react/tree.jsx

112 lines
2.5 KiB
React
Raw Normal View History

2021-04-07 12:21:09 +08:00
import React, { useReducer } from 'react';
import { useDispatch, useSelector } from 'react-redux'
import { MdEdit, MdVisibilityOff, MdVisibility, MdDelete } from 'react-icons/md'
export const Tree = () => {
const treeEntries = useSelector(state => state.treeEntries)
return <div className='sideNav flex flex-col'>
{treeEntries.allIds.map((entId, idx) => (
<TreeEntry key={idx} entId={entId} />
))}
</div>
}
const TreeEntry = ({ entId }) => {
const treeEntries = useSelector(state => state.treeEntries.byId)
const dispatch = useDispatch()
const activeSketchId = useSelector(state => state.activeSketchId)
let obj3d, entry;
entry = treeEntries[entId]
if (entId[0] == "s") {
obj3d = treeEntries[entId].obj3d
} else {
obj3d = treeEntries[entId]
}
const [_, forceUpdate] = useReducer(x => x + 1, 0);
const vis = obj3d.visible
return <div className='bg-gray-50 flex justify-between w-full'>
2021-04-08 16:48:29 +08:00
<div className="btn-light"
2021-04-07 12:21:09 +08:00
onPointerEnter={() => {
if (entId[0] == 'm') {
// entry.material.color.set(color.hover)
sc.render()
}
}}
onPointerLeave={() => {
const obj = entry
if (entId[0] == 'm' && !sc.selected.includes(obj)) {
// obj.material.color.set(color.mesh)
sc.render()
}
}}
onPointerDown={() => {
if (entId[0] == 'm') {
sc.selected.push(
entry
)
sc.render()
}
}}
>
{entId}
</div>
<div className='flex'>
2021-04-08 16:48:29 +08:00
<div className='btn-light'
2021-04-07 12:21:09 +08:00
onClick={() => {
activeSketchId && treeEntries[activeSketchId].deactivate()
entry.activate()
sc.clearSelection()
sc.activeSketch = entry;
}}
>
<MdEdit />
</div>
2021-04-08 16:48:29 +08:00
<div className='btn-light'
2021-04-07 12:21:09 +08:00
onClick={() => {
dispatch({ type: 'delete-node', id: entId })
}}
>
<MdDelete />
</div>
{
vis ?
2021-04-08 16:48:29 +08:00
<div className='btn-light'
2021-04-07 12:21:09 +08:00
onClick={() => {
obj3d.visible = false;
sc.render()
forceUpdate()
}}
>
<MdVisibility />
</div>
:
2021-04-08 16:48:29 +08:00
<div className='btn-light'
2021-04-07 12:21:09 +08:00
onClick={() => {
obj3d.visible = true;
sc.render()
forceUpdate()
}}
>
<MdVisibilityOff />
</div>
}
</div>
</div>
}