import React, { useReducer, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux' import { MdVisibilityOff, MdVisibility, MdDelete } from 'react-icons/md' import { FaCube, FaEdit } from 'react-icons/fa' export const Tree = () => { const treeEntries = useSelector(state => state.treeEntries) return
{treeEntries.allIds.map((entId, idx) => ( ))}
} const treeIcons = { 'mesh': FaCube, 'sketch': FaEdit } const TreeEntry = ({ entId }) => { const treeEntries = useSelector(state => state.treeEntries.byId) const dispatch = useDispatch() const activeSketchId = useSelector(state => state.treeEntries.activeSketchId) // const activeSketchId = treeEntries.activeSketchId const visible = useSelector(state => state.treeEntries.visible[entId]) let obj3d, sketch; if (treeEntries[entId].obj3d) { obj3d = treeEntries[entId].obj3d sketch = treeEntries[entId] } else { obj3d = treeEntries[entId] } let Icon = treeIcons[obj3d.userData.type] const [_, forceUpdate] = useReducer(x => x + 1, 0); return
{ if (obj3d.userData.type == 'sketch') { activeSketchId && treeEntries[activeSketchId].deactivate() sketch.activate() sc.clearSelection() sc.activeSketch = sketch; } }} onPointerEnter={() => { sc.setHover(obj3d, 1) sc.render() }} onPointerLeave={() => { if (visible & obj3d.userData.type == 'sketch') return if (sc.selected.includes(obj3d) || activeSketchId == obj3d.name) return sc.setHover(obj3d, 0) sc.render() }} onClick={() => { if (obj3d.userData.type == 'mesh') { sc.selected.push( obj3d ) sc.render() } }} >
{entId}
{ dispatch({ type: 'delete-node', id: entId }) sc.render() e.stopPropagation() }} /> { visible ? { e.stopPropagation() console.log('hide') dispatch({ type: "set-entry-visibility", obj: {[entId]:false} }) obj3d.visible = false; if (obj3d.userData.type == 'mesh') { obj3d.traverse((e) => e.layers.disable(1)) } sc.render() forceUpdate() }} /> : { e.stopPropagation() console.log('show') obj3d.visible = true; dispatch({ type: "set-entry-visibility", obj: {[entId]:true} }) if (obj3d.userData.type == 'mesh') { obj3d.traverse((e) => { e.layers.enable(1) }) } sc.render() forceUpdate() }} /> }
}