three.cad/src/react/tree.jsx

146 lines
3.5 KiB
React
Raw Normal View History

2021-04-07 12:21:09 +08:00
2021-04-11 15:57:39 +08:00
import React, { useReducer, useState } from 'react';
2021-04-07 12:21:09 +08:00
import { useDispatch, useSelector } from 'react-redux'
2021-04-11 15:57:39 +08:00
import { MdVisibilityOff, MdVisibility, MdDelete } from 'react-icons/md'
2021-04-07 12:21:09 +08:00
2021-04-10 16:45:15 +08:00
import { FaCube, FaEdit } from 'react-icons/fa'
2021-04-07 12:21:09 +08:00
export const Tree = () => {
const treeEntries = useSelector(state => state.treeEntries)
2021-04-11 07:16:08 +08:00
return <div className='sideNav flex flex-col bg-gray-800'>
2021-04-07 12:21:09 +08:00
{treeEntries.allIds.map((entId, idx) => (
<TreeEntry key={idx} entId={entId} />
))}
</div>
}
2021-04-10 16:45:15 +08:00
const treeIcons = {
'mesh': FaCube,
'sketch': FaEdit
}
2021-04-07 12:21:09 +08:00
const TreeEntry = ({ entId }) => {
const treeEntries = useSelector(state => state.treeEntries.byId)
const dispatch = useDispatch()
2021-04-11 15:57:39 +08:00
const visible = useSelector(state => state.treeEntries.visible[entId])
let obj3d, sketch;
2021-04-07 12:21:09 +08:00
2021-04-10 16:45:15 +08:00
if (treeEntries[entId].obj3d) {
2021-04-07 12:21:09 +08:00
obj3d = treeEntries[entId].obj3d
2021-04-11 15:57:39 +08:00
sketch = treeEntries[entId]
2021-04-07 12:21:09 +08:00
} else {
obj3d = treeEntries[entId]
}
2021-04-10 16:45:15 +08:00
let Icon = treeIcons[obj3d.userData.type]
2021-04-07 12:21:09 +08:00
const [_, forceUpdate] = useReducer(x => x + 1, 0);
2021-04-11 15:57:39 +08:00
2021-04-11 07:16:08 +08:00
return <div className='btn select-none flex justify-start w-full h-7 items-center text-sm'
2021-04-07 12:21:09 +08:00
2021-04-10 16:45:15 +08:00
onDoubleClick={() => {
2021-04-13 09:37:16 +08:00
if (obj3d.userData.type == 'sketch') {
2021-04-15 06:46:30 +08:00
sc.activeSketch && sc.activeSketch.deactivate()
2021-04-11 15:57:39 +08:00
sketch.activate()
sc.clearSelection()
sc.activeSketch = sketch;
2021-04-15 10:11:55 +08:00
sc.render()
2021-04-11 15:57:39 +08:00
}
}}
onPointerEnter={() => {
sc.setHover(obj3d, 1)
sc.render()
}}
onPointerLeave={() => {
2021-04-15 10:11:55 +08:00
// if (visible & obj3d.userData.type == 'sketch') return
2021-04-15 06:46:30 +08:00
if (sc.selected.includes(obj3d) || sc.activeSketch && sc.activeSketch.name == obj3d.name) return
2021-04-11 15:57:39 +08:00
sc.setHover(obj3d, 0)
sc.render()
}}
onClick={() => {
2021-04-15 06:46:30 +08:00
// if (obj3d.userData.type == 'mesh') {
2021-04-15 10:11:55 +08:00
// console.log(obj3d, sc.selected)
const idx = sc.selected.indexOf(obj3d)
if (idx == -1) {
2021-04-11 15:57:39 +08:00
sc.selected.push(
obj3d
)
2021-04-15 10:11:55 +08:00
sc.setHover(obj3d, 1)
} else {
sc.setHover(sc.selected[idx], 0)
sc.selected.splice(idx, 1)
}
// sc.selected.push(
// obj3d
// )
2021-04-15 06:46:30 +08:00
// }
2021-04-15 10:11:55 +08:00
sc.render()
2021-04-10 16:45:15 +08:00
}}
>
<Icon className='h-full w-auto p-1.5' />
2021-04-11 15:57:39 +08:00
<div className="btn pl-1">
2021-04-07 12:21:09 +08:00
{entId}
</div>
2021-04-10 16:45:15 +08:00
<div className='flex h-full ml-auto'>
2021-04-07 12:21:09 +08:00
2021-04-10 16:45:15 +08:00
<MdDelete className='btn-green h-full w-auto p-1.5'
2021-04-11 15:57:39 +08:00
onClick={(e) => {
2021-04-07 12:21:09 +08:00
dispatch({ type: 'delete-node', id: entId })
2021-04-11 15:57:39 +08:00
sc.render()
e.stopPropagation()
2021-04-07 12:21:09 +08:00
}}
2021-04-10 16:45:15 +08:00
/>
2021-04-07 12:21:09 +08:00
{
2021-04-11 15:57:39 +08:00
visible ?
2021-04-10 16:45:15 +08:00
<MdVisibility className='btn-green h-full w-auto p-1.5'
2021-04-11 15:57:39 +08:00
onClick={(e) => {
e.stopPropagation()
console.log('hide')
2021-04-15 10:11:55 +08:00
dispatch({ type: "set-entry-visibility", obj: { [entId]: false } })
2021-04-11 15:57:39 +08:00
obj3d.visible = false;
if (obj3d.userData.type == 'mesh') {
obj3d.traverse((e) => e.layers.disable(1))
}
2021-04-07 12:21:09 +08:00
sc.render()
forceUpdate()
}}
2021-04-10 16:45:15 +08:00
/>
2021-04-07 12:21:09 +08:00
:
2021-04-10 16:45:15 +08:00
<MdVisibilityOff className='btn-green h-full w-auto p-1.5'
2021-04-11 15:57:39 +08:00
onClick={(e) => {
e.stopPropagation()
console.log('show')
obj3d.visible = true;
2021-04-15 10:11:55 +08:00
dispatch({ type: "set-entry-visibility", obj: { [entId]: true } })
2021-04-11 15:57:39 +08:00
if (obj3d.userData.type == 'mesh') {
2021-04-10 18:53:44 +08:00
obj3d.traverse((e) => {
e.layers.enable(1)
})
}
2021-04-07 12:21:09 +08:00
sc.render()
forceUpdate()
}}
2021-04-10 16:45:15 +08:00
/>
2021-04-07 12:21:09 +08:00
}
</div>
</div>
}