three.cad/src/react/reducer.js

217 lines
5.5 KiB
JavaScript
Raw Normal View History

2021-03-26 13:38:49 +08:00
2021-03-29 10:23:24 +08:00
2021-04-17 13:58:54 +08:00
import { DepTree } from './depTree'
2021-04-07 12:21:09 +08:00
import update from 'immutability-helper'
2021-04-15 16:36:54 +08:00
import { combineReducers } from 'redux';
2021-04-26 14:04:24 +08:00
const defaultTreeState = {
2021-04-15 16:36:54 +08:00
byId: {},
allIds: [],
tree: {},
order: {},
visible: {},
2021-04-07 12:21:09 +08:00
}
2021-04-06 12:52:19 +08:00
2021-04-17 17:09:35 +08:00
let cache
2021-04-17 13:58:54 +08:00
2021-04-26 14:04:24 +08:00
export function treeEntries(state = defaultTreeState, action) {
2021-03-29 10:23:24 +08:00
switch (action.type) {
2021-03-29 18:27:34 +08:00
case 'rx-sketch':
2021-04-06 12:52:19 +08:00
return update(state, {
2021-04-15 16:36:54 +08:00
byId: { [action.obj.obj3d.name]: { $set: action.obj } },
allIds: { $push: [action.obj.obj3d.name] },
tree: { [action.obj.obj3d.name]: { $set: {} } },
order: { [action.obj.obj3d.name]: { $set: state.allIds.length } },
visible: { [action.obj.obj3d.name]: { $set: true } },
2021-04-06 12:52:19 +08:00
})
2021-04-11 15:57:39 +08:00
case 'set-entry-visibility': {
return update(state, {
2021-04-15 16:36:54 +08:00
visible: { $merge: action.obj },
2021-04-11 15:57:39 +08:00
})
}
2021-03-30 13:13:13 +08:00
case 'set-active-sketch':
2021-04-19 11:53:02 +08:00
cache = JSON.stringify(action.sketch)
2021-04-06 12:52:19 +08:00
return update(state, {
2021-04-19 11:53:02 +08:00
visible: { [action.sketch.obj3d.name]: { $set: true } },
2021-04-06 12:52:19 +08:00
})
2021-04-17 13:58:54 +08:00
case 'finish-sketch':
return update(state, {
2021-04-24 04:13:49 +08:00
visible: { [sce.activeSketch.obj3d.name]: { $set: false } },
2021-04-17 13:58:54 +08:00
})
2021-04-17 21:32:14 +08:00
case 'restore-sketch':
2021-04-17 13:58:54 +08:00
2021-04-24 04:13:49 +08:00
const sketch = sce.loadSketch(cache)
2021-04-17 13:58:54 +08:00
2021-04-24 04:13:49 +08:00
const deletedObj = sce.obj3d.children.splice(state.order[sce.activeSketch.obj3d.name] + 1, 1,
2021-04-17 13:58:54 +08:00
sketch.obj3d
)[0]
deletedObj.traverse((obj) => {
if (obj.geometry) obj.geometry.dispose()
if (obj.material) obj.material.dispose()
})
2021-04-24 04:13:49 +08:00
sce.activeSketch = sketch
2021-04-17 18:25:43 +08:00
2021-04-11 15:57:39 +08:00
return update(state, {
2021-04-24 04:13:49 +08:00
byId: { [sce.activeSketch.obj3d.name]: { $set: sketch } },
2021-04-11 15:57:39 +08:00
})
2021-03-29 18:27:34 +08:00
case 'rx-extrusion':
2021-04-06 12:52:19 +08:00
return update(state, {
2021-04-15 16:36:54 +08:00
byId: {
[action.mesh.name]: { $set: action.mesh }
},
allIds: { $push: [action.mesh.name] },
tree: {
2021-04-17 07:03:30 +08:00
[action.sketchId]: { [action.mesh.name]: { $set: true } },
2021-04-15 16:36:54 +08:00
[action.mesh.name]: { $set: {} }
},
order: { [action.mesh.name]: { $set: state.allIds.length } },
visible: {
[action.mesh.name]: { $set: true }
2021-03-29 18:27:34 +08:00
}
2021-04-06 12:52:19 +08:00
})
2021-04-06 13:40:47 +08:00
case 'rx-boolean':
2021-04-06 12:52:19 +08:00
2021-04-06 13:40:47 +08:00
return update(state, {
2021-04-15 16:36:54 +08:00
byId: {
[action.mesh.name]: { $set: action.mesh }
},
allIds: { $push: [action.mesh.name] },
tree: {
[action.deps[0]]: { [action.mesh.name]: { $set: true } },
[action.deps[1]]: { [action.mesh.name]: { $set: true } },
[action.mesh.name]: { $set: {} }
},
order: { [action.mesh.name]: { $set: state.allIds.length } }
2021-04-06 13:40:47 +08:00
})
2021-04-06 12:52:19 +08:00
case 'delete-node':
2021-04-15 16:36:54 +08:00
const depTree = new DepTree(state)
2021-04-06 12:52:19 +08:00
const obj = depTree.deleteNode(action.id)
2021-04-15 16:36:54 +08:00
return update(state, { $merge: obj })
2021-04-01 06:03:35 +08:00
case 'restore-state':
return action.state
2021-04-19 06:05:33 +08:00
case 'new-part':
2021-04-26 14:04:24 +08:00
return defaultTreeState
2021-03-29 10:23:24 +08:00
default:
return state
}
}
2021-04-26 14:04:24 +08:00
const defaultUIState = {
dialog: {},
fileHandle: null,
fileName: 'Untitled',
selectedList: [],
selectedSet: {},
2021-04-29 18:42:52 +08:00
help: false
2021-04-26 14:04:24 +08:00
}
export function ui(state = defaultUIState, action) {
2021-04-17 11:54:01 +08:00
switch (action.type) {
2021-04-19 11:53:02 +08:00
case 'set-active-sketch':
case 'rx-sketch':
return update(state, {
sketchActive: { $set: true },
})
case 'finish-sketch':
return update(state, {
sketchActive: { $set: false },
})
2021-04-17 11:54:01 +08:00
case 'set-dialog':
return update(state, {
dialog: { $set: { target: action.target, action: action.action } },
2021-04-26 14:04:24 +08:00
mode: { $set: "" } // we clear the existing mode when entering dialog
2021-04-17 11:54:01 +08:00
})
case 'clear-dialog':
return update(state, {
dialog: { $set: {} },
2021-04-26 14:04:24 +08:00
mode: { $set: "" }
2021-04-17 11:54:01 +08:00
})
2021-04-19 03:14:01 +08:00
case 'set-file-handle':
return update(state, {
fileHandle: { $set: action.fileHandle },
modified: { $set: false },
})
2021-04-19 06:05:33 +08:00
case 'new-part':
2021-04-26 14:04:24 +08:00
return defaultUIState
2021-04-19 11:53:02 +08:00
case 'set-modified':
return update(state, {
modified: { $set: action.status },
})
case 'delete-node':
case 'rx-extrusion':
return update(state, {
modified: { $set: true },
})
2021-04-26 14:04:24 +08:00
case 'restore-state':
return update(state, {
fileName: { $set: action.fileName },
})
case 'on-pick':
const idx = state.selectedList.indexOf(action.obj)
const setNeedsUpdate = action.obj.userData.type == 'mesh' || action.obj.userData.type == 'sketch'
if (idx == -1) {
return update(state, {
selectedList: { $push: [action.obj] },
// selectedSet: { [action.obj.name]: { $set: true } }
selectedSet: (curr) => setNeedsUpdate ? { ...curr, [action.obj.name]: true } : curr
})
} else {
if (action.obj.userData.type != 'selpoint') {
return update(state, {
selectedList: { $splice: [[idx, 1]] },
// selectedSet: { [action.obj.name]: { $set: false } }
selectedSet: (curr) => setNeedsUpdate ? { ...curr, [action.obj.name]: false } : curr
})
} else {
return state
}
}
case 'clear-selection':
if (state.selectedList.length) {
return update(state, {
selectedList: { $set: [] },
selectedSet: { $set: {} }
})
} else {
return state
}
case 'set-mode':
return update(state, {
mode: { $set: action.mode }
})
2021-04-29 18:42:52 +08:00
case 'set-help':
return update(state, {
help: { $set: action.status }
})
2021-04-30 11:29:02 +08:00
case 'toggle-help':
return update(state, {
help: { $set: !state.help }
})
2021-04-29 18:42:52 +08:00
2021-04-17 11:54:01 +08:00
default:
return state
}
}
2021-03-29 18:27:34 +08:00
2021-04-15 16:36:54 +08:00
export const reducer = combineReducers({
2021-04-17 11:54:01 +08:00
ui,
2021-04-15 16:36:54 +08:00
treeEntries
})