From 621df3a7306dd0225bfa51af305e84280782e533 Mon Sep 17 00:00:00 2001 From: Philipp Fromme Date: Tue, 31 Mar 2020 12:02:23 +0200 Subject: [PATCH] feat(snapping): lanes only snap to themselves --- lib/features/snapping/BpmnResizeSnapping.js | 55 +++++++++++++++++++++ lib/features/snapping/index.js | 4 +- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 lib/features/snapping/BpmnResizeSnapping.js diff --git a/lib/features/snapping/BpmnResizeSnapping.js b/lib/features/snapping/BpmnResizeSnapping.js new file mode 100644 index 00000000..f79f4414 --- /dev/null +++ b/lib/features/snapping/BpmnResizeSnapping.js @@ -0,0 +1,55 @@ +import inherits from 'inherits'; + +import ResizeSnapping from 'diagram-js/lib/features/snapping/ResizeSnapping'; + +import { is } from '../../util/ModelUtil'; + +import { + bottomLeft, + bottomRight, + topLeft, + topRight +} from 'diagram-js/lib/features/snapping/SnapUtil'; + + +export default function BpmnResizeSnapping(injector) { + injector.invoke(ResizeSnapping, this); +} + +inherits(BpmnResizeSnapping, ResizeSnapping); + +BpmnResizeSnapping.$inject = [ 'injector' ]; + +BpmnResizeSnapping.prototype.addSnapTargetPoints = function(snapPoints, shape, target, direction) { + if (is(shape, 'bpmn:Lane')) { + return addLaneSnapPoints(shape, direction, snapPoints); + } + + return ResizeSnapping.prototype.addSnapTargetPoints.call(this, snapPoints, shape, target, direction); +}; + + +// helpers ////////// + +/** + * Add snap points when resizing lane. Lanes only snap to themselves. + * + * @param {djs.model.shape} lane + * @param {string} direction + * @param {Object} snapPoints + * + * @returns {Object} + */ +function addLaneSnapPoints(lane, direction, snapPoints) { + if (direction === 'nw' || direction === 'n' || direction === 'w') { + snapPoints.add('corner', topLeft(lane)); + } else if (direction === 'se' || direction === 's' || direction === 'e') { + snapPoints.add('corner', bottomRight(lane)); + } else if (direction === 'ne') { + snapPoints.add('corner', topRight(lane)); + } else if (direction === 'sw') { + snapPoints.add('corner', bottomLeft(lane)); + } + + return snapPoints; +} \ No newline at end of file diff --git a/lib/features/snapping/index.js b/lib/features/snapping/index.js index 88acf993..ce000628 100644 --- a/lib/features/snapping/index.js +++ b/lib/features/snapping/index.js @@ -1,5 +1,6 @@ import BpmnConnectSnapping from './BpmnConnectSnapping'; import BpmnCreateMoveSnapping from './BpmnCreateMoveSnapping'; +import BpmnResizeSnapping from './BpmnResizeSnapping'; import SnappingModule from 'diagram-js/lib/features/snapping'; export default { @@ -9,5 +10,6 @@ export default { 'createMoveSnapping' ], connectSnapping: [ 'type', BpmnConnectSnapping ], - createMoveSnapping: [ 'type', BpmnCreateMoveSnapping ] + createMoveSnapping: [ 'type', BpmnCreateMoveSnapping ], + resizeSnapping: [ 'type', BpmnResizeSnapping ] }; \ No newline at end of file