src/component/keyboard/KeyZoomHandler.ts (55 lines of code) (raw):

import { withLatestFrom } from "rxjs/operators"; import { Subscription } from "rxjs"; import { Transform } from "../../geo/Transform"; import { ViewportCoords } from "../../geo/ViewportCoords"; import { RenderCamera } from "../../render/RenderCamera"; import { Container } from "../../viewer/Container"; import { Navigator } from "../../viewer/Navigator"; import { Component } from "../Component"; import { KeyboardConfiguration } from "../interfaces/KeyboardConfiguration"; import { HandlerBase } from "../util/HandlerBase"; /** * The `KeyZoomHandler` allows the user to zoom in and out using the * following key commands: * * `+`: Zoom in. * `-`: Zoom out. * * @example * ```js * var keyboardComponent = viewer.getComponent("keyboard"); * * keyboardComponent.keyZoom.disable(); * keyboardComponent.keyZoom.enable(); * * var isEnabled = keyboardComponent.keyZoom.isEnabled; * ``` */ export class KeyZoomHandler extends HandlerBase<KeyboardConfiguration> { private _keyDownSubscription: Subscription; private _viewportCoords: ViewportCoords; /** @ignore */ constructor( component: Component<KeyboardConfiguration>, container: Container, navigator: Navigator, viewportCoords: ViewportCoords) { super(component, container, navigator); this._viewportCoords = viewportCoords; } protected _enable(): void { this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe( withLatestFrom( this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$)) .subscribe( ([event, render, transform]: [KeyboardEvent, RenderCamera, Transform]): void => { if (event.altKey || event.ctrlKey || event.metaKey) { return; } let delta: number = 0; switch (event.key) { case "+": delta = 1; break; case "-": delta = -1; break; default: return; } event.preventDefault(); const unprojected: THREE.Vector3 = this._viewportCoords.unprojectFromViewport(0, 0, render.perspective); const reference: number[] = transform.projectBasic(unprojected.toArray()); this._navigator.stateService.zoomIn(delta, reference); }); } protected _disable(): void { this._keyDownSubscription.unsubscribe(); } protected _getConfiguration(enable: boolean): KeyboardConfiguration { return { keyZoom: enable }; } }