feat(nodes): multi drag

This commit is contained in:
moklick
2020-11-05 14:32:10 +01:00
parent 7d4a6d7c36
commit 0774d35846
4 changed files with 22 additions and 25 deletions
+10 -6
View File
@@ -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,
}); });
+7 -13
View File
@@ -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
View File
@@ -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;
-1
View File
@@ -308,7 +308,6 @@ export type NodePosUpdate = {
}; };
export type NodeDiffUpdate = { export type NodeDiffUpdate = {
id: ElementId;
diff?: XYPosition; diff?: XYPosition;
isDragging?: boolean; isDragging?: boolean;
}; };