@@ -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" ;
1013import { directionCondition } from "../groupUtils" ;
1114import { isUndefined , IObject } from "@daybrush/utils" ;
1215import {
@@ -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}
261282export 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 ,
0 commit comments