smooth selection with zone and structureLayer
This commit is contained in:
@@ -20,7 +20,7 @@ const isNodeInCurrentLevel = (node: AnyNode): boolean => {
|
||||
return nodeLevelId === currentLevelId;
|
||||
};
|
||||
|
||||
type SelectableNodeType = "wall" | "item" | "building";
|
||||
type SelectableNodeType = "wall" | "item" | "building" | "zone";
|
||||
|
||||
interface SelectionStrategy {
|
||||
types: SelectableNodeType[];
|
||||
@@ -44,21 +44,35 @@ const SELECTION_STRATEGIES: Record<string, SelectionStrategy> = {
|
||||
},
|
||||
|
||||
structure: {
|
||||
types: ["wall", "item"],
|
||||
types: ["wall", "item", "zone"],
|
||||
handleSelect: (node, isShift) => {
|
||||
const { selection, setSelection } = useViewer.getState();
|
||||
if (node.type === 'zone') {
|
||||
setSelection({ zoneId: node.id });
|
||||
} else {
|
||||
const nextIds = isShift
|
||||
? selection.selectedIds.includes(node.id)
|
||||
? selection.selectedIds.filter((id) => id !== node.id)
|
||||
: [...selection.selectedIds, node.id]
|
||||
: [node.id];
|
||||
setSelection({ selectedIds: nextIds });
|
||||
}
|
||||
},
|
||||
handleDeselect: () => {
|
||||
const structureLayer = useEditor.getState().structureLayer;
|
||||
if (structureLayer === "zones") {
|
||||
useViewer.getState().setSelection({ zoneId: null });
|
||||
} else {
|
||||
useViewer.getState().setSelection({ selectedIds: [] });
|
||||
}
|
||||
},
|
||||
isValid: (node) => {
|
||||
if (!isNodeInCurrentLevel(node)) return false;
|
||||
const structureLayer = useEditor.getState().structureLayer;
|
||||
if (structureLayer === "zones") {
|
||||
if (node.type === "zone") return true;
|
||||
return false;
|
||||
} else {
|
||||
if (node.type === "wall") return true;
|
||||
if (node.type === "item") {
|
||||
return (
|
||||
@@ -67,6 +81,7 @@ const SELECTION_STRATEGIES: Record<string, SelectionStrategy> = {
|
||||
);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user