@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
78 lines (75 loc) • 2.28 kB
text/typescript
import {stringMatchMask} from '../../core/String';
import {NamedFunction5} from './_Base';
export enum KeyModifierRequirement {
OPTIONAL = 'optional',
PRESSED = 'pressed',
NOT_PRESSED = 'not pressed',
}
export const KEY_MODIFIER_REQUIREMENTS: KeyModifierRequirement[] = [
KeyModifierRequirement.OPTIONAL,
KeyModifierRequirement.PRESSED,
KeyModifierRequirement.NOT_PRESSED,
];
function modifierMatchesRequirement(modifier: boolean, requirement: KeyModifierRequirement): boolean {
if (requirement == KeyModifierRequirement.OPTIONAL) {
return true;
}
if (requirement == KeyModifierRequirement.PRESSED && modifier == true) {
return true;
}
if (requirement == KeyModifierRequirement.NOT_PRESSED && modifier == false) {
return true;
}
return false;
}
export class keyboardEventMatchesConfig extends NamedFunction5<[string, number, number, number, number]> {
static override type() {
return 'keyboardEventMatchesConfig';
}
func(keyCodes: string, _ctrlKey: number, _shiftKey: number, _altKey: number, _metaKey: number): boolean {
const events = this.scene.eventsDispatcher.keyboardEventsController.currentEvents();
if (events.length == 0) {
return false;
}
const eventMatchesAtLeastOneModifier = () => {
const ctrlKey = KEY_MODIFIER_REQUIREMENTS[_ctrlKey];
for (let event of events) {
if (modifierMatchesRequirement(event.ctrlKey, ctrlKey)) {
return true;
}
}
const shiftKey = KEY_MODIFIER_REQUIREMENTS[_shiftKey];
for (let event of events) {
if (modifierMatchesRequirement(event.shiftKey, shiftKey)) {
return true;
}
}
const altKey = KEY_MODIFIER_REQUIREMENTS[_altKey];
for (let event of events) {
if (modifierMatchesRequirement(event.altKey, altKey)) {
return true;
}
}
const metaKey = KEY_MODIFIER_REQUIREMENTS[_metaKey];
for (let event of events) {
if (modifierMatchesRequirement(event.metaKey, metaKey)) {
return true;
}
}
};
const eventMatchesAtLeastOneKeyCode = () => {
for (let event of events) {
if (keyCodes == '' || stringMatchMask(event.code, keyCodes)) {
return true;
}
}
};
if (!eventMatchesAtLeastOneModifier()) {
return false;
}
if (!eventMatchesAtLeastOneKeyCode()) {
return false;
}
return true;
}
}