mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-22 21:48:42 +08:00

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.
112 lines
3.1 KiB
TypeScript
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()
|
|
};
|
|
}
|
|
}
|