Skip to content

Commit 8819639

Browse files
committed
feat: add snap partial props #119
1 parent a69c58d commit 8819639

File tree

3 files changed

+56
-16
lines changed

3 files changed

+56
-16
lines changed

packages/react-moveable/src/react-moveable/ables/Snappable.tsx

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import {
66
SnapInfo, BoundInfo,
77
ScalableProps, ResizableProps,
88
} from "../types";
9-
import { prefix, caculatePoses, getRect, getAbsolutePosesByState, getAbsolutePoses, throttle, round } from "../utils";
9+
import {
10+
prefix, caculatePoses, getRect,
11+
getAbsolutePosesByState, getAbsolutePoses, round, selectValue
12+
} from "../utils";
1013
import { directionCondition } from "../groupUtils";
1114
import { isUndefined, IObject } from "@daybrush/utils";
1215
import {
@@ -163,8 +166,10 @@ function checkSnap(
163166
guidelines: Guideline[],
164167
targetType: "horizontal" | "vertical",
165168
targetPoses: number[],
166-
isSnapCenter: boolean | undefined,
167169
snapThreshold: number,
170+
snapCenter: boolean,
171+
snapDirection: boolean,
172+
snapElement: boolean,
168173
): SnapInfo {
169174
if (!guidelines) {
170175
return {
@@ -183,9 +188,14 @@ function checkSnap(
183188

184189
const snapPoses = targetPoses.filter(targetPos => {
185190
return guidelines.filter(guideline => {
186-
const { type, pos, center } = guideline;
187-
188-
if ((!isSnapCenter && center) || type !== targetType) {
191+
const { type, pos, center, element } = guideline;
192+
193+
if (
194+
(!snapElement && element)
195+
|| (!snapDirection && !element)
196+
|| (!snapCenter && center)
197+
|| type !== targetType
198+
) {
189199
return false;
190200
}
191201
const offset = targetPos - pos[posType];
@@ -243,19 +253,30 @@ export function checkSnapPoses(
243253
moveable: MoveableManager<SnappableProps, SnappableState>,
244254
posesX: number[],
245255
posesY: number[],
246-
isSnapCenter?: boolean,
256+
snapCenter?: boolean,
247257
customSnapThreshold?: number,
248258
) {
249259
const guidelines = moveable.state.guidelines;
250-
const snapThreshold = !isUndefined(customSnapThreshold)
251-
? customSnapThreshold
252-
: !isUndefined(moveable.props.snapThreshold)
253-
? moveable.props.snapThreshold
254-
: 5;
255-
260+
const props = moveable.props;
261+
const snapThreshold = selectValue<number>(customSnapThreshold, props.snapThreshold, 5);
262+
const {
263+
snapElement = true,
264+
snapHorizontal = true,
265+
snapVertical = true,
266+
} = props;
256267
return {
257-
vertical: checkSnap(guidelines, "vertical", posesX, isSnapCenter, snapThreshold),
258-
horizontal: checkSnap(guidelines, "horizontal", posesY, isSnapCenter, snapThreshold),
268+
vertical: checkSnap(
269+
guidelines, "vertical", posesX, snapThreshold,
270+
snapCenter!,
271+
snapVertical,
272+
snapElement,
273+
),
274+
horizontal: checkSnap(
275+
guidelines, "horizontal", posesY, snapThreshold,
276+
snapCenter!,
277+
snapHorizontal,
278+
snapElement,
279+
),
259280
};
260281
}
261282
export function checkSnaps(
@@ -370,7 +391,7 @@ function getFixedPoses(
370391
return getAbsolutePoses(nextPoses, minus(fixedPos, nextPos));
371392
}
372393

373-
function checkBoundOneWayPos(
394+
function checkSnapOneWayPos(
374395
moveable: MoveableManager<any, any>,
375396
pos: number[],
376397
reversePos: number[],
@@ -461,7 +482,7 @@ export function checkOneWayPos(
461482
}
462483
} else {
463484
poses.some((pos, i) => {
464-
const nextDist = checkBoundOneWayPos(moveable, pos, reversePoses[i], isDirectionVertical, datas);
485+
const nextDist = checkSnapOneWayPos(moveable, pos, reversePoses[i], isDirectionVertical, datas);
465486

466487
if (isNaN(nextDist)) {
467488
return false;
@@ -859,6 +880,9 @@ export default {
859880
props: {
860881
snappable: [Boolean, Array],
861882
snapCenter: Boolean,
883+
snapHorizontal: Boolean,
884+
snapVertical: Boolean,
885+
snapElement: Boolean,
862886
snapThreshold: Number,
863887
horizontalGuidelines: Array,
864888
verticalGuidelines: Array,

packages/react-moveable/src/react-moveable/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,9 @@ export interface GroupableProps extends
785785
export interface SnappableProps {
786786
snappable?: boolean | string[];
787787
snapCenter?: boolean;
788+
snapHorizontal?: boolean;
789+
snapVertical?: boolean;
790+
snapElement?: boolean;
788791
snapThreshold?: number;
789792
horizontalGuidelines?: number[];
790793
verticalGuidelines?: number[];

packages/react-moveable/src/react-moveable/utils.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,3 +857,16 @@ export function equals(a1: any, a2: any) {
857857
return false;
858858
}
859859
}
860+
861+
export function selectValue<T = any>(...values: any[]): T {
862+
const length = values.length - 1;
863+
for (let i = 0; i < length; ++i) {
864+
const value = values[i];
865+
866+
if (!isUndefined(value)) {
867+
return value;
868+
}
869+
}
870+
871+
return values[length];
872+
}

0 commit comments

Comments
 (0)