-
Notifications
You must be signed in to change notification settings - Fork 85
Expand file tree
/
Copy pathKeyZoomHandler.ts
More file actions
87 lines (75 loc) · 2.85 KB
/
KeyZoomHandler.ts
File metadata and controls
87 lines (75 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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 "+":
case "=":
delta = 1;
break;
case "-":
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 };
}
}