@@ -144,6 +144,8 @@ class Drag implements IDisposable {
144
144
this . proposedAction = options . proposedAction || 'copy' ;
145
145
this . supportedActions = options . supportedActions || 'all' ;
146
146
this . source = options . source || null ;
147
+ this . _dragAdjustX = options . dragAdjustX || 0 ;
148
+ this . _dragAdjustY = options . dragAdjustY || 0 ;
147
149
}
148
150
149
151
/**
@@ -233,6 +235,9 @@ class Drag implements IDisposable {
233
235
return this . _promise ;
234
236
}
235
237
238
+ this . _dragOffsetX = ( this . _dragAdjustX ) ? this . _dragAdjustX - clientX : 0 ;
239
+ this . _dragOffsetY = ( this . _dragAdjustY ) ? this . _dragAdjustY - clientY : 0 ;
240
+
236
241
// Install the document listeners for the drag object.
237
242
this . _addListeners ( ) ;
238
243
@@ -291,8 +296,8 @@ class Drag implements IDisposable {
291
296
return ;
292
297
}
293
298
let style = this . dragImage . style ;
294
- style . top = `${ clientY } px` ;
295
- style . left = `${ clientX } px` ;
299
+ style . top = `${ clientY + this . dragOffsetY } px` ;
300
+ style . left = `${ clientX + this . dragOffsetX } px` ;
296
301
}
297
302
298
303
/**
@@ -311,7 +316,7 @@ class Drag implements IDisposable {
311
316
312
317
// Move the drag image to the specified client position. This is
313
318
// performed *after* dispatching to prevent unnecessary reflows.
314
- this . moveDragImage ( event . clientX , event . clientY ) ;
319
+ this . moveDragImage ( event . clientX + this . dragOffsetX , event . clientY + this . dragOffsetY ) ;
315
320
}
316
321
317
322
/**
@@ -405,7 +410,7 @@ class Drag implements IDisposable {
405
410
*/
406
411
private _updateDragScroll ( event : MouseEvent ) : void {
407
412
// Find the scroll target under the mouse.
408
- let target = Private . findScrollTarget ( event ) ;
413
+ let target = Private . findScrollTarget ( event , this . dragOffsetX , this . dragOffsetY ) ;
409
414
410
415
// Bail if there is nothing to scroll.
411
416
if ( ! this . _scrollTarget && ! target ) {
@@ -601,6 +606,14 @@ class Drag implements IDisposable {
601
606
requestAnimationFrame ( this . _onScrollFrame ) ;
602
607
} ;
603
608
609
+ get dragOffsetX ( ) : number {
610
+ return this . _dragOffsetX ;
611
+ }
612
+
613
+ get dragOffsetY ( ) : number {
614
+ return this . _dragOffsetY ;
615
+ }
616
+
604
617
private _disposed = false ;
605
618
private _dropAction : DropAction = 'none' ;
606
619
private _override : IDisposable | null = null ;
@@ -609,6 +622,10 @@ class Drag implements IDisposable {
609
622
private _promise : Promise < DropAction > | null = null ;
610
623
private _scrollTarget : Private . IScrollTarget | null = null ;
611
624
private _resolve : ( ( value : DropAction ) => void ) | null = null ;
625
+ private _dragAdjustX : number ;
626
+ private _dragAdjustY : number ;
627
+ private _dragOffsetX : number ;
628
+ private _dragOffsetY : number ;
612
629
}
613
630
614
631
@@ -681,6 +698,20 @@ namespace Drag {
681
698
* The default value is `null`.
682
699
*/
683
700
source ?: any ;
701
+
702
+ /**
703
+ * How many pixels to offset the drag/image in the x direction.
704
+ *
705
+ * The default value is 0.
706
+ */
707
+ dragAdjustX ?: number ;
708
+
709
+ /**
710
+ * How many pixels to offset the drag/image in the y direction.
711
+ *
712
+ * The default value is 0.
713
+ */
714
+ dragAdjustY ?: number ;
684
715
}
685
716
686
717
/**
@@ -797,19 +828,26 @@ namespace Private {
797
828
798
829
/**
799
830
* Find the drag scroll target under the mouse, if any.
831
+ *
832
+ * @param event - The mouse event related to the action.
833
+ *
834
+ * @param dragOffsetX - the number of pixels to offset the drag in the x direction.
835
+ *
836
+ * @param dragOffsetY - the number of pixels to offset the drag in the y direction.
800
837
*/
801
838
export
802
- function findScrollTarget ( event : MouseEvent ) : IScrollTarget | null {
839
+ function findScrollTarget ( event : MouseEvent , dragOffsetX ?: number , dragOffsetY ?: number ) : IScrollTarget | null {
803
840
// Look up the client mouse position.
804
- let x = event . clientX ;
805
- let y = event . clientY ;
841
+ const x = event . clientX + ( dragOffsetX !== undefined ? dragOffsetX : 0 ) ;
842
+ const y = event . clientY + ( dragOffsetY !== undefined ? dragOffsetY : 0 ) ;
806
843
807
844
// Get the element under the mouse.
808
845
let element : Element | null = document . elementFromPoint ( x , y ) ;
809
846
810
847
// Search for a scrollable target based on the mouse position.
811
848
// The null assert in third clause of for-loop is required due to:
812
849
// https://github.com/Microsoft/TypeScript/issues/14143
850
+
813
851
for ( ; element ; element = element ! . parentElement ) {
814
852
// Ignore elements which are not marked as scrollable.
815
853
let scrollable = element . hasAttribute ( 'data-lm-dragscroll' ) ;
@@ -1174,8 +1212,8 @@ namespace Private {
1174
1212
// Initialize the mouse event data.
1175
1213
dragEvent . initMouseEvent (
1176
1214
type , true , true , window , 0 ,
1177
- event . screenX , event . screenY ,
1178
- event . clientX , event . clientY ,
1215
+ event . screenX + drag . dragOffsetX , event . screenY + drag . dragOffsetY ,
1216
+ event . clientX + drag . dragOffsetX , event . clientY + drag . dragOffsetY ,
1179
1217
event . ctrlKey , event . altKey ,
1180
1218
event . shiftKey , event . metaKey ,
1181
1219
event . button , related
0 commit comments