Skip to content

Commit 11d2bfb

Browse files
Fix wheel event delta normalization to use deltaY or deltaX for common delta (DevExpress#30485)
1 parent 716cc02 commit 11d2bfb

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

packages/devextreme/js/__internal/events/core/m_wheel.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,20 @@ const EVENT_NAMESPACE = 'dxWheel';
88
const NATIVE_EVENT_NAME = 'wheel';
99

1010
const PIXEL_MODE = 0;
11-
const DELTA_MUTLIPLIER = 30;
11+
const DELTA_MULTIPLIER = 30;
12+
13+
enum DeltaMode {
14+
DOM_DELTA_PIXEL = 0,
15+
DOM_DELTA_LINE = 1,
16+
DOM_DELTA_PAGE = 2,
17+
}
18+
19+
interface WheelEvent {
20+
deltaMode: DeltaMode;
21+
deltaX: number;
22+
deltaY: number;
23+
deltaZ: number;
24+
}
1225

1326
const wheel = {
1427
setup(element) {
@@ -23,13 +36,15 @@ const wheel = {
2336
_wheelHandler(e) {
2437
const {
2538
deltaMode, deltaY, deltaX, deltaZ,
26-
} = e.originalEvent;
39+
}: WheelEvent = e.originalEvent;
40+
41+
const delta = this._getWheelDelta(deltaY, deltaX);
2742

2843
fireEvent({
2944
type: EVENT_NAME,
3045
originalEvent: e,
3146
// @ts-expect-error
32-
delta: this._normalizeDelta(deltaY, deltaMode),
47+
delta: this._normalizeDelta(delta, deltaMode),
3348
deltaX,
3449
deltaY,
3550
deltaZ,
@@ -40,13 +55,25 @@ const wheel = {
4055
e.stopPropagation();
4156
},
4257

43-
_normalizeDelta(delta, deltaMode = PIXEL_MODE) {
58+
_normalizeDelta(delta: number, deltaMode = PIXEL_MODE) {
4459
if (deltaMode === PIXEL_MODE) {
4560
return -delta;
4661
}
4762
// Use multiplier to get rough delta value in px for the LINE or PAGE mode
4863
// https://bugzilla.mozilla.org/show_bug.cgi?id=1392460
49-
return -DELTA_MUTLIPLIER * delta;
64+
return -DELTA_MULTIPLIER * delta;
65+
},
66+
67+
_getWheelDelta(deltaY: number, deltaX: number) {
68+
if (deltaY) {
69+
return deltaY;
70+
}
71+
72+
if (deltaX) {
73+
return deltaX;
74+
}
75+
76+
return 0;
5077
},
5178
};
5279

packages/devextreme/testing/tests/DevExpress.ui.events/wheel.tests.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,22 @@ QUnit.test('normalize delta for deltaMode LINE and PAGE', function(assert) {
7979
assert.strictEqual(wheelHandler.firstCall.args[0].delta, DELTA * DELTA_MULTIPLIER);
8080
assert.strictEqual(wheelHandler.lastCall.args[0].delta, DELTA * DELTA_MULTIPLIER);
8181
});
82+
83+
QUnit.test('_getWheelDelta handles different delta combinations correctly', function(assert) {
84+
const $element = $('#test');
85+
const mouse = nativePointerMock($element).start();
86+
let eventArgs;
87+
88+
$element.on(wheelEvent.name, function(e) {
89+
eventArgs = e;
90+
});
91+
92+
mouse.wheel(10, { deltaX: 5, deltaZ: 0 });
93+
assert.strictEqual(eventArgs.delta, 10, 'vertical scroll should use deltaY');
94+
95+
mouse.wheel(0, { deltaX: 5, deltaZ: 0 });
96+
assert.strictEqual(eventArgs.delta, -5, 'horizontal scroll should use deltaX when deltaY is 0');
97+
98+
mouse.wheel(0, { deltaX: 0, deltaZ: 0 });
99+
assert.strictEqual(eventArgs.delta, 0, 'should return 0 when all delta values are 0');
100+
});

0 commit comments

Comments
 (0)