feat(nodes): multi drag
This commit is contained in:
@@ -94,13 +94,16 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
|
|||||||
if (!isDraggable) {
|
if (!isDraggable) {
|
||||||
if (isSelectable) {
|
if (isSelectable) {
|
||||||
unsetNodesSelection();
|
unsetNodesSelection();
|
||||||
addSelectedElements({ id: node.id, type: node.type } as Node);
|
|
||||||
|
if (!selected) {
|
||||||
|
addSelectedElements({ id: node.id, type: node.type } as Node);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onClick?.(event, node);
|
onClick?.(event, node);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[isSelectable, isDraggable, onClick, node]
|
[isSelectable, selected, isDraggable, onClick, node]
|
||||||
);
|
);
|
||||||
|
|
||||||
const onDragStart = useCallback(
|
const onDragStart = useCallback(
|
||||||
@@ -109,16 +112,18 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
|
|||||||
|
|
||||||
if (selectNodesOnDrag && isSelectable) {
|
if (selectNodesOnDrag && isSelectable) {
|
||||||
unsetNodesSelection();
|
unsetNodesSelection();
|
||||||
addSelectedElements({ id: node.id, type: node.type } as Node);
|
|
||||||
|
if (!selected) {
|
||||||
|
addSelectedElements({ id: node.id, type: node.type } as Node);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[node, selectNodesOnDrag, isSelectable, onNodeDragStart]
|
[node, selected, selectNodesOnDrag, isSelectable, onNodeDragStart]
|
||||||
);
|
);
|
||||||
|
|
||||||
const onDrag = useCallback(
|
const onDrag = useCallback(
|
||||||
(_, data) => {
|
(_, data) => {
|
||||||
updateNodePosDiff({
|
updateNodePosDiff({
|
||||||
id,
|
|
||||||
diff: {
|
diff: {
|
||||||
x: data.deltaX,
|
x: data.deltaX,
|
||||||
y: data.deltaY,
|
y: data.deltaY,
|
||||||
@@ -143,7 +148,6 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateNodePosDiff({
|
updateNodePosDiff({
|
||||||
id,
|
|
||||||
isDragging: false,
|
isDragging: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -77,14 +77,11 @@ export default ({
|
|||||||
onSelectionDrag(event, selectedNodes);
|
onSelectionDrag(event, selectedNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedNodes?.forEach((node) => {
|
updateNodePosDiff({
|
||||||
updateNodePosDiff({
|
diff: {
|
||||||
id: node.id,
|
x: data.deltaX,
|
||||||
diff: {
|
y: data.deltaY,
|
||||||
x: data.deltaX,
|
},
|
||||||
y: data.deltaY,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[onSelectionDrag, selectedNodes, updateNodePosDiff]
|
[onSelectionDrag, selectedNodes, updateNodePosDiff]
|
||||||
@@ -92,11 +89,8 @@ export default ({
|
|||||||
|
|
||||||
const onStop = useCallback(
|
const onStop = useCallback(
|
||||||
(event: MouseEvent) => {
|
(event: MouseEvent) => {
|
||||||
selectedNodes?.forEach((node) => {
|
updateNodePosDiff({
|
||||||
updateNodePosDiff({
|
isDragging: false,
|
||||||
id: node.id,
|
|
||||||
isDragging: false,
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
onSelectionDragStop?.(event, selectedNodes);
|
onSelectionDragStop?.(event, selectedNodes);
|
||||||
|
|||||||
+5
-5
@@ -111,7 +111,7 @@ export interface StoreModel {
|
|||||||
resetSelectedElements: Action<StoreModel>;
|
resetSelectedElements: Action<StoreModel>;
|
||||||
|
|
||||||
setSelectedElements: Action<StoreModel, Elements | Node | Edge>;
|
setSelectedElements: Action<StoreModel, Elements | Node | Edge>;
|
||||||
addSelectedElements: Thunk<StoreModel, Elements | Node | Edge>;
|
addSelectedElements: Thunk<StoreModel, Elements | Node | Edge>;
|
||||||
|
|
||||||
updateTransform: Action<StoreModel, TransformXYK>;
|
updateTransform: Action<StoreModel, TransformXYK>;
|
||||||
|
|
||||||
@@ -263,9 +263,9 @@ export const storeModel: StoreModel = {
|
|||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
|
|
||||||
updateNodePosDiff: action((state, { id, diff = null, isDragging = true }) => {
|
updateNodePosDiff: action((state, { diff = null, isDragging = true }) => {
|
||||||
state.elements.forEach((n) => {
|
state.elements.forEach((n) => {
|
||||||
if (n.id === id && isNode(n)) {
|
if (isNode(n) && state.selectedElements?.find((sNode) => sNode.id === n.id)) {
|
||||||
if (diff) {
|
if (diff) {
|
||||||
n.__rf.position = {
|
n.__rf.position = {
|
||||||
x: n.__rf.position.x + diff.x,
|
x: n.__rf.position.x + diff.x,
|
||||||
@@ -363,7 +363,7 @@ export const storeModel: StoreModel = {
|
|||||||
const selectedElementsArr = Array.isArray(elements) ? elements : [elements];
|
const selectedElementsArr = Array.isArray(elements) ? elements : [elements];
|
||||||
|
|
||||||
if (multiSelectionActive) {
|
if (multiSelectionActive) {
|
||||||
const nextElements = selectedElements ? [...selectedElements, ...selectedElementsArr] : selectedElementsArr;
|
const nextElements = selectedElements ? [...selectedElements, ...selectedElementsArr] : selectedElementsArr;
|
||||||
actions.setSelectedElements(nextElements);
|
actions.setSelectedElements(nextElements);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -545,7 +545,7 @@ export const storeModel: StoreModel = {
|
|||||||
|
|
||||||
setMultiSelectionActive: action((state, isActive) => {
|
setMultiSelectionActive: action((state, isActive) => {
|
||||||
state.multiSelectionActive = isActive;
|
state.multiSelectionActive = isActive;
|
||||||
})
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
const nodeEnv: string = (typeof __ENV__ !== 'undefined' && __ENV__) as string;
|
const nodeEnv: string = (typeof __ENV__ !== 'undefined' && __ENV__) as string;
|
||||||
|
|||||||
@@ -308,7 +308,6 @@ export type NodePosUpdate = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type NodeDiffUpdate = {
|
export type NodeDiffUpdate = {
|
||||||
id: ElementId;
|
|
||||||
diff?: XYPosition;
|
diff?: XYPosition;
|
||||||
isDragging?: boolean;
|
isDragging?: boolean;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user