Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix scroll interactions #2631

Closed
wants to merge 38 commits into from
Closed
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
000749a
Get info about ScrollView
m-bert Oct 6, 2023
e4b09cb
Simplify if
m-bert Oct 11, 2023
756505d
Remove touchAction
m-bert Oct 12, 2023
3298f86
Implement shouldHandlerBeCancelledBy
m-bert Oct 12, 2023
2f77ae4
add getLastSentState
m-bert Oct 12, 2023
c5a953f
remove isScrollView
m-bert Oct 12, 2023
922622d
add preventDefault to Pan
m-bert Oct 12, 2023
705014f
Remove ifs
m-bert Oct 16, 2023
ba60cf3
Remove confusing variable in IM
m-bert Oct 16, 2023
62d77ed
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Oct 16, 2023
c52da02
Prevent errors in console
m-bert Oct 16, 2023
5c26a86
Match android naming convention
m-bert Oct 17, 2023
cf5e1cc
Add missing PointerEvent types
m-bert Oct 17, 2023
7aba2e0
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Oct 17, 2023
496744b
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Oct 17, 2023
0102036
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Oct 18, 2023
9654873
Remove getLastSentState
m-bert Oct 19, 2023
72f39c1
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Oct 19, 2023
49a015b
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Oct 25, 2023
048598a
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Oct 30, 2023
43165fa
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Oct 31, 2023
0ea45f3
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Nov 6, 2023
bb5229a
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Nov 7, 2023
a7a6182
Minor changes
m-bert Nov 16, 2023
987b3a7
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Nov 20, 2023
be7809c
bring back simultaneousRelations clear
m-bert Nov 20, 2023
7fdfc57
Remove shouldBlockEvents flag
m-bert Nov 20, 2023
74436a2
Add event cancelation to other handlers
m-bert Nov 20, 2023
6bb207a
Change logic in pan
m-bert Nov 20, 2023
d854520
Add return
m-bert Nov 20, 2023
7a731c4
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Nov 21, 2023
d544643
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Nov 21, 2023
d458ad6
Change onPointerOutOfBounds
m-bert Nov 24, 2023
d337505
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Nov 24, 2023
77c4d36
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Dec 14, 2023
dd2a3d3
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Jan 2, 2024
921efa1
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Feb 20, 2024
f76457b
Merge branch 'main' into @mbert/fix-scroll-interactions
m-bert Feb 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
60 changes: 49 additions & 11 deletions src/web/handlers/GestureHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,10 @@ export default abstract class GestureHandler {
// Event actions
//

protected onPointerDown(event: AdaptedEvent): void {
protected onPointerDown(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
GestureHandlerOrchestrator.getInstance().recordHandlerIfNotPresent(this);
this.pointerType = event.pointerType;

Expand All @@ -285,29 +288,44 @@ export default abstract class GestureHandler {
}
}
// Adding another pointer to existing ones
protected onPointerAdd(event: AdaptedEvent): void {
protected onPointerAdd(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
if (this.config.needsPointerData) {
this.sendTouchEvent(event);
}
}
protected onPointerUp(event: AdaptedEvent): void {
protected onPointerUp(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
if (this.config.needsPointerData) {
this.sendTouchEvent(event);
}
}
// Removing pointer, when there is more than one pointers
protected onPointerRemove(event: AdaptedEvent): void {
protected onPointerRemove(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
if (this.config.needsPointerData) {
this.sendTouchEvent(event);
}
}
protected onPointerMove(event: AdaptedEvent): void {
protected onPointerMove(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
this.tryToSendMoveEvent(false);
if (this.config.needsPointerData) {
this.sendTouchEvent(event);
}
}
protected onPointerLeave(event: AdaptedEvent): void {
protected onPointerLeave(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
if (this.shouldCancellWhenOutside) {
switch (this.currentState) {
case State.ACTIVE:
Expand All @@ -324,31 +342,47 @@ export default abstract class GestureHandler {
this.sendTouchEvent(event);
}
}
protected onPointerEnter(event: AdaptedEvent): void {
protected onPointerEnter(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
if (this.config.needsPointerData) {
this.sendTouchEvent(event);
}
}
protected onPointerCancel(event: AdaptedEvent): void {
protected onPointerCancel(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
if (this.config.needsPointerData) {
this.sendTouchEvent(event);
}

this.cancel();
this.reset();
}
protected onPointerOutOfBounds(event: AdaptedEvent): void {
protected onPointerOutOfBounds(
event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
this.tryToSendMoveEvent(true);
if (this.config.needsPointerData) {
this.sendTouchEvent(event);
}
}
protected onPointerMoveOver(_event: AdaptedEvent): void {
protected onPointerMoveOver(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
// used only by hover gesture handler atm
}
protected onPointerMoveOut(_event: AdaptedEvent): void {
protected onPointerMoveOut(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
// used only by hover gesture handler atm
}

private tryToSendMoveEvent(out: boolean): void {
if (
this.enabled &&
Expand Down Expand Up @@ -770,6 +804,10 @@ export default abstract class GestureHandler {
return this.currentState;
}

public getLastSentState(): State | null {
return this.lastSentState;
}

public isEnabled(): boolean {
return this.enabled;
}
Expand Down
36 changes: 32 additions & 4 deletions src/web/handlers/PanGestureHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,9 +246,16 @@ export default class PanGestureHandler extends GestureHandler {
}
}

protected onPointerUp(event: AdaptedEvent): void {
protected onPointerUp(
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
): void {
super.onPointerUp(event);

if (sourceEvent?.cancelable) {
m-bert marked this conversation as resolved.
Show resolved Hide resolved
sourceEvent.preventDefault();
}

if (this.currentState === State.ACTIVE) {
this.lastX = this.tracker.getLastAvgX();
this.lastY = this.tracker.getLastAvgY();
Expand All @@ -263,7 +270,14 @@ export default class PanGestureHandler extends GestureHandler {
this.fail();
}
}
protected onPointerRemove(event: AdaptedEvent): void {
protected onPointerRemove(
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
): void {
if (sourceEvent?.cancelable) {
sourceEvent.preventDefault();
}

super.onPointerRemove(event);
this.tracker.removeFromTracker(event.pointerId);

Expand All @@ -286,7 +300,14 @@ export default class PanGestureHandler extends GestureHandler {
}
}

protected onPointerMove(event: AdaptedEvent): void {
protected onPointerMove(
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
): void {
if (sourceEvent?.cancelable) {
sourceEvent.preventDefault();
}

this.tracker.track(event);

this.lastX = this.tracker.getLastAvgX();
Expand All @@ -299,11 +320,18 @@ export default class PanGestureHandler extends GestureHandler {
super.onPointerMove(event);
}

protected onPointerOutOfBounds(event: AdaptedEvent): void {
protected onPointerOutOfBounds(
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
): void {
if (this.getShouldCancelWhenOutside()) {
return;
}

if (sourceEvent?.cancelable) {
sourceEvent.preventDefault();
}

this.tracker.track(event);

this.lastX = this.tracker.getLastAvgX();
Expand Down
130 changes: 108 additions & 22 deletions src/web/tools/EventManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,56 +19,142 @@ export default abstract class EventManager<T> {
touchEventType?: TouchEventType
): AdaptedEvent;

protected onPointerDown(_event: AdaptedEvent): void {}
protected onPointerAdd(_event: AdaptedEvent): void {}
protected onPointerUp(_event: AdaptedEvent): void {}
protected onPointerRemove(_event: AdaptedEvent): void {}
protected onPointerMove(_event: AdaptedEvent): void {}
protected onPointerLeave(_event: AdaptedEvent): void {} // called only when pointer is pressed (or touching)
protected onPointerEnter(_event: AdaptedEvent): void {} // called only when pointer is pressed (or touching)
protected onPointerCancel(_event: AdaptedEvent): void {
protected onPointerDown(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {}
protected onPointerAdd(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {}
protected onPointerUp(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {}
protected onPointerRemove(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {}
protected onPointerMove(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {}
protected onPointerLeave(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {} // called only when pointer is pressed (or touching)
protected onPointerEnter(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {} // called only when pointer is pressed (or touching)
protected onPointerCancel(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {
// When pointer cancel is triggered and there are more pointers on the view, only one pointer is cancelled
// Because we want all pointers to be cancelled by that event, we are doing it manually by reseting handler and changing activePointersCounter to 0
// Events that correspond to removing the pointer (pointerup, touchend) have condition, that they don't perform any action when activePointersCounter
// is equal to 0. This prevents counter from going to negative values, when pointers are removed from view after one of them has been cancelled
}
protected onPointerOutOfBounds(_event: AdaptedEvent): void {}
protected onPointerMoveOver(_event: AdaptedEvent): void {}
protected onPointerMoveOut(_event: AdaptedEvent): void {}
protected onPointerOutOfBounds(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {}
protected onPointerMoveOver(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {}
protected onPointerMoveOut(
_event: AdaptedEvent,
_sourceEvent?: TouchEvent | PointerEvent
): void {}

public setOnPointerDown(callback: (event: AdaptedEvent) => void): void {
public setOnPointerDown(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerDown = callback;
}
public setOnPointerAdd(callback: (event: AdaptedEvent) => void): void {
public setOnPointerAdd(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerAdd = callback;
}
public setOnPointerUp(callback: (event: AdaptedEvent) => void): void {
public setOnPointerUp(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerUp = callback;
}
public setOnPointerRemove(callback: (event: AdaptedEvent) => void): void {
public setOnPointerRemove(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerRemove = callback;
}
public setOnPointerMove(callback: (event: AdaptedEvent) => void): void {
public setOnPointerMove(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerMove = callback;
}
public setOnPointerLeave(callback: (event: AdaptedEvent) => void): void {
public setOnPointerLeave(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerLeave = callback;
}
public setOnPointerEnter(callback: (event: AdaptedEvent) => void): void {
public setOnPointerEnter(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerEnter = callback;
}
public setOnPointerCancel(callback: (event: AdaptedEvent) => void): void {
public setOnPointerCancel(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerCancel = callback;
}
public setOnPointerOutOfBounds(
callback: (event: AdaptedEvent) => void
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerOutOfBounds = callback;
}
public setOnPointerMoveOver(callback: (event: AdaptedEvent) => void): void {
public setOnPointerMoveOver(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerMoveOver = callback;
}
public setOnPointerMoveOut(callback: (event: AdaptedEvent) => void): void {
public setOnPointerMoveOut(
callback: (
event: AdaptedEvent,
sourceEvent?: TouchEvent | PointerEvent
) => void
): void {
this.onPointerMoveOut = callback;
}

Expand Down
5 changes: 1 addition & 4 deletions src/web/tools/GestureHandlerOrchestrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -287,10 +287,7 @@ export default class GestureHandlerOrchestrator {
return false;
}

if (
handler !== otherHandler &&
(handler.isAwaiting() || handler.getState() === State.ACTIVE)
) {
if (handler.isAwaiting() || handler.getState() === State.ACTIVE) {
j-piasecki marked this conversation as resolved.
Show resolved Hide resolved
// For now it always returns false
return handler.shouldBeCancelledByOther(otherHandler);
}
Expand Down
4 changes: 0 additions & 4 deletions src/web/tools/GestureHandlerWebDelegate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ export class GestureHandlerWebDelegate
this.gestureHandler = handler;
this.view = findNodeHandle(viewRef) as unknown as HTMLElement;

this.view.style['touchAction'] = 'none';
//@ts-ignore This one disables default events on Safari
this.view.style['WebkitTouchCallout'] = 'none';

const config = handler.getConfig();

if (!config.userSelect) {
Expand Down