three.cad/src/react/dialog.jsx

145 lines
3.8 KiB
React
Raw Normal View History

2021-04-15 16:36:54 +08:00
2021-04-17 21:32:14 +08:00
import React, { useEffect, useRef } from 'react';
2021-04-15 16:36:54 +08:00
import { useDispatch, useSelector } from 'react-redux'
import { MdDone, MdClose } from 'react-icons/md'
import * as Icon from "./icons";
2021-04-17 11:54:01 +08:00
export const Dialog = () => {
const dialog = useSelector(state => state.ui.dialog)
2021-04-19 11:53:02 +08:00
const treeEntries = useSelector(state => state.treeEntries)
2021-04-15 16:36:54 +08:00
const dispatch = useDispatch()
const ref = useRef()
2021-04-17 11:54:01 +08:00
2021-04-15 16:36:54 +08:00
useEffect(() => {
2021-04-17 11:54:01 +08:00
if (!ref.current) return
2021-04-15 16:36:54 +08:00
ref.current.focus()
2021-04-17 11:54:01 +08:00
}, [dialog])
2021-04-15 16:36:54 +08:00
const extrude = () => {
2021-04-19 11:53:02 +08:00
const mesh = sc.extrude(dialog.target, ref.current.value)
dispatch({ type: 'rx-extrusion', mesh, sketchId: dialog.target.obj3d.name })
if (sc.activeSketch == dialog.target) {
dispatch({ type: 'finish-sketch' })
dialog.target.deactivate()
}
2021-04-15 16:36:54 +08:00
2021-04-17 11:54:01 +08:00
dispatch({ type: "clear-dialog" })
2021-04-19 11:53:02 +08:00
sc.render()
2021-04-17 11:54:01 +08:00
}
2021-04-15 16:36:54 +08:00
const extrudeCancel = () => {
if (sc.activeSketch == dialog.target) { // if extrude dialog launched from sketch mode we set dialog back to the sketch dialog
dispatch({ type: 'set-dialog', action: 'sketch' })
} else {
dispatch({ type: "clear-dialog" })
}
}
2021-04-17 21:32:14 +08:00
const extrudeEdit = () => {
2021-04-17 21:32:14 +08:00
dialog.target.userData.featureInfo[1] = ref.current.value
2021-04-19 11:53:02 +08:00
sc.refreshNode(dialog.target.name, treeEntries)
dispatch({ type: 'set-modified', status: true })
2021-04-17 21:32:14 +08:00
dispatch({ type: "clear-dialog" })
2021-04-19 11:53:02 +08:00
sc.render()
2021-04-17 21:32:14 +08:00
}
const extrudeEditCancel = () => dispatch({ type: "clear-dialog" })
const sketchDone = () => {
if (sc.activeSketch.hasChanged
|| sc.activeSketch.idOnActivate != id
|| sc.activeSketch.c_idOnActivate != sc.activeSketch.c_id
) {
sc.refreshNode(sc.activeSketch.obj3d.name, treeEntries)
dispatch({ type: 'set-modified', status: true })
}
dispatch({ type: 'finish-sketch' })
sc.activeSketch.deactivate()
sc.render()
dispatch({ type: "clear-dialog" })
}
const sketchCancel = () => {
if (sc.activeSketch.hasChanged
|| sc.activeSketch.idOnActivate != id
|| sc.activeSketch.c_idOnActivate != sc.activeSketch.c_id
) {
if (sc.newSketch) {
dispatch({ type: 'delete-node', id: sc.activeSketch.obj3d.name })
sc.sid -= 1
} else {
dispatch({ type: "restore-sketch" })
}
}
dispatch({ type: 'finish-sketch' })
sc.activeSketch.deactivate()
sc.render()
dispatch({ type: "clear-dialog" })
}
2021-04-15 16:36:54 +08:00
2021-04-17 11:54:01 +08:00
switch (dialog.action) {
case 'extrude':
return <>
2021-04-23 11:50:24 +08:00
<input className='w-10 border-t-0 border-l-0 border-r-0 border-b border-gray-50 text-gray-50' type="number" defaultValue="10" step="0.1" ref={ref} />
<Icon.Flip className="btn text-gray-200 w-auto h-full p-3.5"
2021-04-17 11:54:01 +08:00
onClick={() => ref.current.value *= -1}
/>
<MdDone
className="btn w-auto h-full p-3.5 text-green-500"
2021-04-17 11:54:01 +08:00
onClick={extrude}
/>
<MdClose className="btn w-auto h-full p-3.5 text-red-500"
onClick={extrudeCancel}
2021-04-17 11:54:01 +08:00
/>
</>
2021-04-17 21:32:14 +08:00
case 'extrude-edit':
return <>
<input className='w-10 border-t-0 border-l-0 border-r-0 border-b border-gray-50 text-gray-50' type="number" defaultValue={dialog.target.userData.featureInfo[1]} step="0.1" ref={ref} />
<Icon.Flip className="btn text-gray-200 w-auto h-full p-3.5"
2021-04-17 21:32:14 +08:00
onClick={() => ref.current.value *= -1}
/>
<MdDone
className="btn w-auto h-full p-3.5 text-green-500"
2021-04-17 21:32:14 +08:00
onClick={extrudeEdit}
/>
<MdClose
className="btn w-auto h-full p-3.5 text-red-500"
onClick={extrudeEditCancel}
2021-04-17 21:32:14 +08:00
/>
</>
2021-04-17 11:54:01 +08:00
case 'sketch':
return <>
<MdDone
className="btn w-auto h-full p-3.5 text-green-500"
onClick={sketchDone}
2021-04-17 11:54:01 +08:00
/>
<MdClose className="btn w-auto h-full p-3.5 text-red-500"
onClick={sketchCancel}
2021-04-17 11:54:01 +08:00
/>
</>
default:
return null
}
2021-04-15 16:36:54 +08:00
}
2021-04-17 11:54:01 +08:00