Skip to content

Commit 9a25bf8

Browse files
committed
added optional drag image offset
added drag offset to findScrollTarget made drag offset optional added optional drag offset
1 parent 52c88e6 commit 9a25bf8

File tree

1 file changed

+47
-9
lines changed

1 file changed

+47
-9
lines changed

packages/dragdrop/src/index.ts

+47-9
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ class Drag implements IDisposable {
144144
this.proposedAction = options.proposedAction || 'copy';
145145
this.supportedActions = options.supportedActions || 'all';
146146
this.source = options.source || null;
147+
this._dragAdjustX = options.dragAdjustX || 0;
148+
this._dragAdjustY = options.dragAdjustY || 0;
147149
}
148150

149151
/**
@@ -233,6 +235,9 @@ class Drag implements IDisposable {
233235
return this._promise;
234236
}
235237

238+
this._dragOffsetX = (this._dragAdjustX) ? this._dragAdjustX - clientX : 0;
239+
this._dragOffsetY = (this._dragAdjustY) ? this._dragAdjustY - clientY : 0;
240+
236241
// Install the document listeners for the drag object.
237242
this._addListeners();
238243

@@ -291,8 +296,8 @@ class Drag implements IDisposable {
291296
return;
292297
}
293298
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`;
296301
}
297302

298303
/**
@@ -311,7 +316,7 @@ class Drag implements IDisposable {
311316

312317
// Move the drag image to the specified client position. This is
313318
// 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);
315320
}
316321

317322
/**
@@ -405,7 +410,7 @@ class Drag implements IDisposable {
405410
*/
406411
private _updateDragScroll(event: MouseEvent): void {
407412
// Find the scroll target under the mouse.
408-
let target = Private.findScrollTarget(event);
413+
let target = Private.findScrollTarget(event, this.dragOffsetX, this.dragOffsetY);
409414

410415
// Bail if there is nothing to scroll.
411416
if (!this._scrollTarget && !target) {
@@ -601,6 +606,14 @@ class Drag implements IDisposable {
601606
requestAnimationFrame(this._onScrollFrame);
602607
};
603608

609+
get dragOffsetX(): number {
610+
return this._dragOffsetX;
611+
}
612+
613+
get dragOffsetY(): number {
614+
return this._dragOffsetY;
615+
}
616+
604617
private _disposed = false;
605618
private _dropAction: DropAction = 'none';
606619
private _override: IDisposable | null = null;
@@ -609,6 +622,10 @@ class Drag implements IDisposable {
609622
private _promise: Promise<DropAction> | null = null;
610623
private _scrollTarget: Private.IScrollTarget | null = null;
611624
private _resolve: ((value: DropAction) => void) | null = null;
625+
private _dragAdjustX: number;
626+
private _dragAdjustY: number;
627+
private _dragOffsetX: number;
628+
private _dragOffsetY: number;
612629
}
613630

614631

@@ -681,6 +698,20 @@ namespace Drag {
681698
* The default value is `null`.
682699
*/
683700
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;
684715
}
685716

686717
/**
@@ -797,19 +828,26 @@ namespace Private {
797828

798829
/**
799830
* 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.
800837
*/
801838
export
802-
function findScrollTarget(event: MouseEvent): IScrollTarget | null {
839+
function findScrollTarget(event: MouseEvent, dragOffsetX?: number, dragOffsetY?: number): IScrollTarget | null {
803840
// 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);
806843

807844
// Get the element under the mouse.
808845
let element: Element | null = document.elementFromPoint(x, y);
809846

810847
// Search for a scrollable target based on the mouse position.
811848
// The null assert in third clause of for-loop is required due to:
812849
// https://github.com/Microsoft/TypeScript/issues/14143
850+
813851
for (; element; element = element!.parentElement) {
814852
// Ignore elements which are not marked as scrollable.
815853
let scrollable = element.hasAttribute('data-lm-dragscroll');
@@ -1174,8 +1212,8 @@ namespace Private {
11741212
// Initialize the mouse event data.
11751213
dragEvent.initMouseEvent(
11761214
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,
11791217
event.ctrlKey, event.altKey,
11801218
event.shiftKey, event.metaKey,
11811219
event.button, related

0 commit comments

Comments
 (0)