Files
ionic-framework/src/components/menu/menu-gestures.ts
Adam Bradley 7000b1b173 refactor: improve tree shaking abilities
Internal refactor completed in order to improve tree shaking and dead
code removal. The public API, with an exception to ion-slides, has
stayed the same. However, internally many changes were required so
bundlers could better exclude modules which should not be bundled.
Ultimately most changes resorted to removing references to `window` or
`document`, or a module that referenced one of those.

BREAKING CHANGES

ion-slides was refactored to remove the external dependencies, and
rewritten in TypeScript/ES6 modules to again improve tree shaking
abilities.
2017-01-09 09:51:39 -06:00

112 lines
3.1 KiB
TypeScript

import { Menu } from './menu';
import { DomController } from '../../platform/dom-controller';
import { GestureController, GesturePriority, GESTURE_MENU_SWIPE } from '../../gestures/gesture-controller';
import { Platform } from '../../platform/platform';
import { SlideEdgeGesture } from '../../gestures/slide-edge-gesture';
import { SlideData } from '../../gestures/slide-gesture';
/**
* Gesture attached to the content which the menu is assigned to
*/
export class MenuContentGesture extends SlideEdgeGesture {
constructor(
plt: Platform,
public menu: Menu,
gestureCtrl: GestureController,
domCtrl: DomController,
) {
super(plt, plt.doc().body, {
direction: 'x',
edge: menu.side,
threshold: 5,
maxEdgeStart: menu.maxEdgeStart || 50,
zone: false,
passive: true,
domController: domCtrl,
gesture: gestureCtrl.createGesture({
name: GESTURE_MENU_SWIPE,
priority: GesturePriority.MenuSwipe,
disableScroll: true
})
});
}
canStart(ev: any): boolean {
let menu = this.menu;
if (!menu.canSwipe()) {
return false;
}
if (menu.isOpen) {
return true;
} else if (menu.getMenuController().getOpen()) {
return false;
}
return super.canStart(ev);
}
// Set CSS, then wait one frame for it to apply before sliding starts
onSlideBeforeStart(ev: any) {
console.debug('menu gesture, onSlideBeforeStart', this.menu.side);
this.menu._swipeBeforeStart();
}
onSlideStart() {
console.debug('menu gesture, onSlideStart', this.menu.side);
this.menu._swipeStart();
}
onSlide(slide: SlideData, ev: any) {
let z = (this.menu.side === 'right' ? slide.min : slide.max);
let stepValue = (slide.distance / z);
this.menu._swipeProgress(stepValue);
}
onSlideEnd(slide: SlideData, ev: any) {
let z = (this.menu.side === 'right' ? slide.min : slide.max);
let currentStepValue = (slide.distance / z);
let velocity = slide.velocity;
z = Math.abs(z * 0.5);
let shouldCompleteRight = (velocity >= 0)
&& (velocity > 0.2 || slide.delta > z);
let shouldCompleteLeft = (velocity <= 0)
&& (velocity < -0.2 || slide.delta < -z);
console.debug('menu gesture, onSlideEnd', this.menu.side,
'distance', slide.distance,
'delta', slide.delta,
'velocity', velocity,
'min', slide.min,
'max', slide.max,
'shouldCompleteLeft', shouldCompleteLeft,
'shouldCompleteRight', shouldCompleteRight,
'currentStepValue', currentStepValue);
this.menu._swipeEnd(shouldCompleteLeft, shouldCompleteRight, currentStepValue, velocity);
}
getElementStartPos(slide: SlideData, ev: any) {
if (this.menu.side === 'right') {
return this.menu.isOpen ? slide.min : slide.max;
}
// left menu
return this.menu.isOpen ? slide.max : slide.min;
}
getSlideBoundaries(): {min: number, max: number} {
if (this.menu.side === 'right') {
return {
min: -this.menu.width(),
max: 0
};
}
// left menu
return {
min: 0,
max: this.menu.width()
};
}
}