{"version":3,"file":"bespunky-angular-cdk-navigables-camera-reactive.mjs","sources":["../../../../libs/angular-cdk/navigables/camera/reactive/src/core/keyboard-modifier-factors.ts","../../../../libs/angular-cdk/navigables/camera/reactive/src/rxjs/operators/accelerate-with-keyboard.ts","../../../../libs/angular-cdk/navigables/camera/reactive/src/core/reactive-camera.ts","../../../../libs/angular-cdk/navigables/camera/reactive/src/bespunky-angular-cdk-navigables-camera-reactive.ts"],"sourcesContent":["export interface KeyboardModifierFactors\n{\n    alt  : number;\n    ctrl : number;\n    shift: number;\n}\n\nexport const DefaultKeyboardModifierFactors: KeyboardModifierFactors = {\n    alt  : 0.7,\n    ctrl : 1.2,\n    shift: 1.5\n};","import { Observable, pipe    } from 'rxjs';\nimport { map, withLatestFrom } from 'rxjs/operators';\n\nimport { EventWithModifiers      } from '@bespunky/angular-cdk/reactive-input/shared';\nimport { KeyboardModifierFactors } from '../../core/keyboard-modifier-factors';\n\nexport type EventWithModifierFactors<TEvent extends EventWithModifiers> = [TEvent, KeyboardModifierFactors];\nexport type AcceleratedEvent        <TEvent extends EventWithModifiers> = [number, TEvent];\n\nexport function accelerateWithKeyboard<T extends EventWithModifiers>(getAmount: (event: T) => number, modifierFactors: Observable<KeyboardModifierFactors>)\n{\n    return pipe(\n        withLatestFrom(modifierFactors),\n        map<EventWithModifierFactors<T>, AcceleratedEvent<T>>(([event, factors]) =>\n        {\n            let amount = getAmount(event);\n\n            if (event.altKey  ) amount *= factors.alt;\n            if (event.ctrlKey ) amount *= factors.ctrl;\n            if (event.shiftKey) amount *= factors.shift;\n            \n            return [amount, event];\n        })\n    );\n}","import { Key                                                                                                } from 'ts-key-enum';\nimport { animationFrames, BehaviorSubject, merge, Observable                                                } from 'rxjs';\nimport { first, map, mergeMap, pairwise, pluck, startWith, switchMap, takeUntil, takeWhile , withLatestFrom } from 'rxjs/operators';\nimport { ElementRef, Injectable                                                                             } from '@angular/core';\nimport { mergeToggled, toggled, useActivationSwitch                                                         } from '@bespunky/rxjs';\nimport { DocumentRef                                                                                        } from '@bespunky/angular-zen/core';\n\nimport { EventWithModifiers, KeyboardModifiers                                                       } from '@bespunky/angular-cdk/reactive-input/shared';\nimport { ReactiveMouseService                                                                        } from '@bespunky/angular-cdk/reactive-input/mouse';\nimport { ReactiveKeyboardService                                                                     } from '@bespunky/angular-cdk/reactive-input/keyboard';\nimport { ReactiveTouchService                                                                        } from '@bespunky/angular-cdk/reactive-input/touch';\nimport { Camera                                                                                      } from '@bespunky/angular-cdk/navigables/camera';\nimport { accelerateWithKeyboard                                                                      } from '../rxjs/operators/accelerate-with-keyboard';\nimport { DefaultKeyboardModifierFactors, KeyboardModifierFactors                                     } from './keyboard-modifier-factors';\nimport { ActivationSwitch, ZoomConfig, PositionExtractor, PanDirection, AmountExtractor, FlickConfig } from './_util-types';\n\n@Injectable()\nexport abstract class ReactiveCamera<TItem> extends Camera<TItem>\n{\n    // Control Switchs\n    public readonly zoomOnWheel   : BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n    public readonly zoomOnKeyboard: BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n    public readonly zoomOnPinch   : BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n    public readonly panOnDrag     : BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n    public readonly panOnWheel    : BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n    public readonly panOnKeyboard : BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n    public readonly panOnTouch    : BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n    public readonly flickX        : BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n    public readonly flickY        : BehaviorSubject<boolean> = new BehaviorSubject(true as boolean);\n\n    // Factors\n    public readonly wheelPanSpeedFactor       : BehaviorSubject<number>                  = new BehaviorSubject(1);\n    public readonly keyboardPanSpeed          : BehaviorSubject<number>                  = new BehaviorSubject(30);\n    public readonly keyboardModifierFactors   : BehaviorSubject<KeyboardModifierFactors> = new BehaviorSubject(DefaultKeyboardModifierFactors);\n    public readonly swipeFlickFactor          : BehaviorSubject<number>                  = new BehaviorSubject(0.4);\n    public readonly flickDecelerationPerSecond: BehaviorSubject<number>                  = new BehaviorSubject(30);\n    public readonly flickSpeedFactor          : BehaviorSubject<number>                  = new BehaviorSubject(0.8);\n    \n    constructor(private document: DocumentRef, private mouse: ReactiveMouseService, private keyboard: ReactiveKeyboardService, private touch: ReactiveTouchService, element: ElementRef)\n    {\n        super(element);\n        \n        this.hookZoomOnWheel();\n        this.hookZoomOnKeyboard();\n        this.hookZoomOnPinch();\n        this.hookPanOnDrag();\n        this.hookPanOnWheel();\n        this.hookPanOnKeyboard();\n        this.hookPanOnTouch();\n    }\n\n    public switchOn    (switchName: ActivationSwitch<TItem>): void { this[switchName].next(true);                    }\n    public switchOff   (switchName: ActivationSwitch<TItem>): void { this[switchName].next(false);                   }\n    public toggleSwitch(switchName: ActivationSwitch<TItem>): void { this[switchName].next(!this[switchName].value); }\n\n    private hookZoomOnWheel(): void\n    {\n        const vWheel = this.mouse.wheel(this.element, { activationSwitch: this.zoomOnWheel, direction: 'deltaY' });\n        \n        this.hookStandardZoom({\n            eventFeed   : vWheel,\n            // Calculate the mouse position relative to the drawing (not the viewport).\n            getPositionX: (e, viewBounds) => viewBounds.left + e.clientX,\n            getPositionY: (e, viewBounds) => viewBounds.top  + e.clientY,\n            // Reverse deltaY so zooming in is positive and out is negative.\n            getAmount   : e               => -Math.sign(e.deltaY)\n        });\n    }\n\n    private hookZoomOnKeyboard(): void\n    {\n        const zoomIn  = this.keyboard.keydown(this.element, { activationSwitch: this.zoomOnKeyboard, key: Key.ArrowUp  , modifiers: { shiftKey: true } });\n        const zoomOut = this.keyboard.keydown(this.element, { activationSwitch: this.zoomOnKeyboard, key: Key.ArrowDown, modifiers: { shiftKey: true } });\n\n        // There is no mouse point or anything so zoom around the center of the view.\n        // As keyboard zoom is activated using the shift modifier, which is also used for keyboard acceleration, the camera behaved\n        // in an unexpected manner. Hence the hooking without keyboard acceleration here.\n        this.hookStandardZoom({ eventFeed: zoomIn , getPositionX: (_, viewBounds) => viewBounds.viewCenterX, getPositionY: (_, viewBounds) => viewBounds.viewCenterY, getAmount: () =>  1 });\n        this.hookStandardZoom({ eventFeed: zoomOut, getPositionX: (_, viewBounds) => viewBounds.viewCenterX, getPositionY: (_, viewBounds) => viewBounds.viewCenterY, getAmount: () => -1 });\n    }\n\n    private hookZoomOnPinch(): void\n    {\n        const pinchmove   = this.touch.pinch(this.element, 'pinchmove'  , { activationSwitch: this.zoomOnPinch, enable: true, threshold: 0.05 });\n        const pinchStart  = this.touch.pinch(this.element, 'pinchstart' , { activationSwitch: this.zoomOnPinch, enable: true });\n        const pinchEnd    = this.touch.pinch(this.element, 'pinchend'   , { activationSwitch: this.zoomOnPinch, enable: true });\n        const pinchCancel = this.touch.pinch(this.element, 'pinchcancel', { activationSwitch: this.zoomOnPinch, enable: true });\n        // Pinching sometimes gets stuck. Seems like it happens when a finger leaves the element or the screen.\n        // These compensate and abort pinching\n        const pinchEndDoc    = this.touch.pinch(this.document, 'pinchend'   , { activationSwitch: this.zoomOnPinch, enable: true });\n        const pinchCancelDoc = this.touch.pinch(this.document, 'pinchcancel', { activationSwitch: this.zoomOnPinch, enable: true });\n        const panStartDoc    = this.touch.pan  (this.document, 'panstart'   , { activationSwitch: this.zoomOnPinch });\n        \n        const abortZoom = merge(pinchEnd, pinchCancel, pinchEndDoc, pinchCancelDoc, panStartDoc);\n        const zoom      = mergeToggled(pinchmove, { on: pinchStart, off: abortZoom }).pipe(\n            startWith({ scale: 0 }),\n            pairwise(),\n            map(([lastE, e]) => [Math.sign(e.scale - lastE.scale), e])\n        ) as Observable<[number, HammerInput]>;\n\n        this.hookZoom(\n            zoom,\n            (e, viewBounds) => viewBounds.left + e.center.x,\n            (e, viewBounds) => viewBounds.top  + e.center.y\n        );\n    }\n\n    private hookStandardZoom<TEvent>({ eventFeed, getPositionX, getPositionY, getAmount }: ZoomConfig<TEvent>): void\n    {\n        const zoomAmount = eventFeed.pipe(map(e => [getAmount(e), e] as [number, TEvent]));\n\n        this.hookZoom(zoomAmount, getPositionX, getPositionY);\n    }\n\n    private hookZoom<TEvent>(eventFeed: Observable<[amount: number, event: TEvent]>, getPositionX: PositionExtractor<TEvent>, getPositionY: PositionExtractor<TEvent>): void\n    {\n        const zoom = eventFeed.pipe(\n            withLatestFrom(this.viewBounds),\n            map(([[amount, e], viewBounds]) =>\n                [\n                    getPositionX(e, viewBounds),\n                    getPositionY(e, viewBounds),\n                    amount\n                ]\n            )\n        );\n\n        this.subscribe(zoom, ([positionX, positionY, amount]) => this.zoomOn(positionX, positionY, amount));\n    }\n    \n    private hookPanOnDrag(): void\n    {\n        // Mouse pan and up are registered with the document to allow detection when the mouse leaves the element and goes into another\n        const dragStart = this.mouse.button(this.element , 'mousedown', { activationSwitch: this.panOnDrag, button: 'main' });\n        const dragging  = this.mouse.button(this.document, 'mousemove', { activationSwitch: this.panOnDrag, button: 'main' });\n        const dragEnd   = this.mouse.button(this.document, 'mouseup'  , { activationSwitch: this.panOnDrag, button: 'main' });\n        \n        // Listen for drag events, but only between drag start and drag end\n        const pan = mergeToggled(dragging, { on: dragStart, off: dragEnd });\n\n        // Reverse movement to match mouse pan and hook\n        this.hookKeyboardAcceleratedPosition(pan, e => -e.movementX, 'horizontal');\n        this.hookKeyboardAcceleratedPosition(pan, e => -e.movementY, 'vertical'  );\n        // Finish panning with an ease out animation\n        this.hookFlickOnMouseDrag(dragStart, dragging, dragEnd);\n    }\n\n    private hookPanOnWheel(): void\n    {\n        const hWheel = this.mouse.wheel(this.element, { activationSwitch: this.zoomOnWheel, direction: 'deltaX' });\n        \n        this.hookKeyboardAcceleratedPosition(hWheel, e => e.deltaX * this.wheelPanSpeedFactor.value, 'horizontal');\n    }\n\n    private hookPanOnKeyboard(): void\n    {\n        this.hookPanOnKey(Key.ArrowRight, () =>  this.keyboardPanSpeed.value, 'horizontal');\n        this.hookPanOnKey(Key.ArrowLeft , () => -this.keyboardPanSpeed.value, 'horizontal');\n        this.hookPanOnKey(Key.ArrowDown , () =>  this.keyboardPanSpeed.value, 'vertical'  , { shiftKey: false });\n        this.hookPanOnKey(Key.ArrowUp   , () => -this.keyboardPanSpeed.value, 'vertical'  , { shiftKey: false });\n    }\n\n    private hookPanOnKey(key: Key, getAmount: AmountExtractor<KeyboardEvent>, direction: PanDirection, modifiers?: Partial<KeyboardModifiers>): void\n    {\n        const panning = this.keyboard.keydown(this.element, { activationSwitch: this.panOnKeyboard, key, modifiers });\n        const panEnd  = this.keyboard.keyup  (this.element, { activationSwitch: this.panOnKeyboard, key, modifiers });\n        \n        this.hookKeyboardAcceleratedPosition(panning, getAmount, direction);\n\n        this.hookFlick({ trigger: panEnd, abortOn: panning, getLastMoveAmount: getAmount, direction });\n    }\n\n    private hookPanOnTouch(): void\n    {\n        // Mouse pan and up are registered with the document to allow detection when the mouse leaves the element and goes into another\n        const panStart = this.touch.pan(this.element , 'panstart', { activationSwitch: this.panOnTouch, ignoreMouse: true, direction: 'all', threshold: 1, velocity: 0 });\n        const panning  = this.touch.pan(this.document, 'panmove' , { activationSwitch: this.panOnTouch, ignoreMouse: true, direction: 'all', threshold: 1, velocity: 0 });\n        const panEnd   = this.touch.pan(this.document, 'panend'  , { activationSwitch: this.panOnTouch, ignoreMouse: true, direction: 'all', threshold: 1, velocity: 0 });\n        \n        // Hammerjs provides the *total* pan amount from the position panning started as the delta value.\n        // As camera panning is done with differential amounts the delta must be calculated relatively to the last event.\n        const pan = toggled(panning, { on: panStart, off: panEnd }).pipe(\n            mergeMap(p => p.pipe(\n                // Reset the first value on each pan start to make sure the delta is always calculated\n                // relativly to the current pan session.\n                startWith({ deltaX: 0, deltaY: 0 }),\n                pairwise()\n            ))\n        );\n\n        // Reverse movement to match mouse pan and hook\n        this.hookStandardPosition(pan, ([lastE, e]) => lastE.deltaX - e.deltaX, 'horizontal');\n        this.hookStandardPosition(pan, ([lastE, e]) => lastE.deltaY - e.deltaY, 'vertical');\n        // Finish panning with an ease out animation\n        this.hookFlickOnTouchSwipe(panStart);\n    }\n\n    private choosePanMethod(direction: PanDirection): (amount: number) => void\n    {\n        const method = direction === 'horizontal' ? this.panX : this.panY;\n\n        return method.bind(this);\n    }\n\n    private choosePanFlickActivationSwitch(direction: PanDirection): Observable<boolean>\n    {\n        return direction === 'horizontal' ? this.flickX : this.flickY;\n    }\n\n    private chooseBoundsReachedNotifier(direction: PanDirection): Observable<number>\n    {\n        return direction === 'horizontal' ? this.horizontalBoundReached : this.verticalBoundReached;\n    }\n    \n    private hookStandardPosition<TEvent>(eventFeed: Observable<TEvent>, getAmount: AmountExtractor<TEvent>, direction: PanDirection): void\n    {\n        const movement = eventFeed.pipe(map(e => [getAmount(e), e] as [number, TEvent]));\n\n        this.hookPosition(movement, direction);\n    }\n\n    private hookKeyboardAcceleratedPosition<TEvent extends EventWithModifiers>(eventFeed: Observable<TEvent>, getAmount: AmountExtractor<TEvent>, direction: PanDirection): void\n    {\n        const movement = eventFeed.pipe(accelerateWithKeyboard(getAmount, this.keyboardModifierFactors));\n\n        this.hookPosition(movement, direction);\n    }\n\n    private hookPosition<TEvent>(eventFeed: Observable<[amount: number, event: TEvent]>, direction: PanDirection): void\n    {\n        const movement  = eventFeed.pipe(pluck(0)); // Extract the amount\n        const panCamera = this.choosePanMethod(direction);\n\n        this.subscribe(movement, panCamera);\n    }\n\n    private hookFlickOnMouseDrag(dragStart: Observable<MouseEvent>, dragging: Observable<MouseEvent>, dragEnd: Observable<MouseEvent>)\n    {\n        // For every drag end, emit the lastest drag event to ensure movement amount is present.\n        // * dragEnd is listened to on the entire document in order to allow releasing the mouse anywhere outside\n        // * the drag initiating element. In turn, this means that dragEnd will fire even if another element\n        // * triggeres it. To make sure flicking is triggered for the corresponding element only, dragEnd is toggled\n        // * here and only emits when the corresponding element has emitted a dragStart event.\n        const lastMovement = dragStart.pipe(\n            switchMap(() => dragEnd.pipe(first())),\n            withLatestFrom(dragging),\n            map(([, lastDragEvent]) => lastDragEvent)\n        );\n\n        this.hookFlick({ trigger: lastMovement, abortOn: dragStart, getLastMoveAmount: e => -e.movementX, direction: 'horizontal' });\n        this.hookFlick({ trigger: lastMovement, abortOn: dragStart, getLastMoveAmount: e => -e.movementY, direction: 'vertical' });\n    }\n\n    private hookFlickOnTouchSwipe(panStart: Observable<HammerInput>): void\n    {\n        const swipeX = this.touch.swipe(this.element, 'swipe', { activationSwitch: this.panOnTouch, ignoreMouse: true, direction: 'horizontal', threshold: 3.5 });\n        const swipeY = this.touch.swipe(this.element, 'swipe', { activationSwitch: this.panOnTouch, ignoreMouse: true, direction: 'vertical'  , threshold: 3.5 });\n\n        this.hookFlick({ trigger: swipeX, abortOn: panStart, getLastMoveAmount: e => -e.deltaX * this.swipeFlickFactor.value, direction: 'horizontal' });\n        this.hookFlick({ trigger: swipeY, abortOn: panStart, getLastMoveAmount: e => -e.deltaY * this.swipeFlickFactor.value, direction: 'vertical'   });\n    }\n\n    private hookFlick<TTrigger, TAbort>({ trigger, abortOn, direction, getLastMoveAmount }: FlickConfig<TTrigger, TAbort>): void\n    {\n        const flickSwitch    = this.choosePanFlickActivationSwitch(direction);\n        const panCamera      = this.choosePanMethod(direction);\n        const boundsNotifier = this.chooseBoundsReachedNotifier(direction);\n\n        const lastMovement = trigger.pipe(useActivationSwitch(flickSwitch));\n\n        // Abort flick in case the bounds are reached, and in case the user triggered an abort event (like grabbing the timeline again with the mouse)\n        const abort = merge(abortOn, boundsNotifier);\n        const easeOutAnimation = this.easeOutPanMovement(lastMovement, abort, getLastMoveAmount);\n\n        this.subscribe(easeOutAnimation, panCamera);\n    }\n\n    private easeOutPanMovement<TEvent, TAbort>(lastMovement: Observable<TEvent>, abort: Observable<TAbort>, getMovement: AmountExtractor<TEvent>): Observable<number>\n    {\n        /**\n         * The idea is to get the last mouse movement amount, then repeat the movement decreasing the amount each time\n         * until the amount exceeds zero.\n         * \n         * Calculation is based on the physics formula for velocity with acceleration (deceleration in this case):\n         * v(t) = v0 - a * t\n         * where v(t) is the velocity at time t, v0 is the initial velocity, and a is the acceleration.\n         * \n         * On each animation frame the amount is calculated relatively to the elapsed time from the moment easing out\n         * started. The amount is then applied to the pan camera.\n         */\n\n        const easeOut = (movement: number) =>\n        {\n            // The movement direction is taken into account to calculate the acceleration\n            const accelerationPerSecond = this.flickDecelerationPerSecond.value * Math.sign(movement);\n            // The movement amount is manipulated using the speed factor to increase or decrease initial speed\n            const initialSpeed          = this.flickSpeedFactor          .value * movement;\n\n            return animationFrames().pipe(\n                takeUntil(abort),\n                // Transform milliseconds to seconds\n                map(({ elapsed }) => elapsed / 1000),\n                // Calculate the velocit at the current elapsed time using the physics formula for velocity with acceleration\n                map(elapsedSeconds => initialSpeed - accelerationPerSecond * elapsedSeconds),\n                // Stop the animation when the velocity reaches zero\n                takeWhile(speed => movement > 0 ? speed > 0 : speed < 0)\n            );\n        };\n\n        return lastMovement.pipe(\n            // Extract the movement amount from the mouse event\n            map(getMovement),\n            // Cancel any animation previously launched and create a new one with the new amount\n            switchMap(easeOut)\n        );\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}