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>
|
|
|
|
|
|
|
|
}
|