mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
The Display and Radio launchers, their popovers and the compact Radio transport, Enable button and volume now render from the Radio store. RadioControls owns the disclosure state; Cockpit Escape and the Display reveal read that state instead of the DOM, and the Enable toggle guards re-presses synchronously. The compact transport reuses the panel's transport state and adds only its glyph and title.
64 lines
2.2 KiB
JavaScript
64 lines
2.2 KiB
JavaScript
/** Route Cockpit keys while preserving the active disclosure and form-control owner. */
|
|
|
|
export function onKeyDown(event) {
|
|
if (this.destroyed) return false;
|
|
if (event.repeat || event.isComposing) return;
|
|
if (event.key === 'Escape' && this.active) {
|
|
// The credit lightbox owns Escape while its Close control or links hold
|
|
// focus. Its target handler closes the overlay and restores attribution
|
|
// focus; Cockpit must stay active behind it.
|
|
if (event.target?.closest?.('.cesium-credit-lightbox')) return;
|
|
// An open Display or Radio popover takes Escape itself.
|
|
if (this.isUtilityDisclosureOpen?.()) return;
|
|
if (this.context?.contains(event.target) && !this.contextCollapsed) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
this.setContextCollapsed(true);
|
|
if (
|
|
event.target === this.contextToggle ||
|
|
this.contextToggle?.contains?.(event.target)
|
|
) {
|
|
this.contextToggle?.blur?.();
|
|
} else {
|
|
this.contextToggle?.focus({ preventScroll: true });
|
|
}
|
|
return;
|
|
}
|
|
if (this.signalStream?.contains(event.target) && !this.signalCollapsed) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
this.setSignalCollapsed(true, { user: true });
|
|
if (
|
|
event.target === this.signalToggle ||
|
|
this.signalToggle?.contains?.(event.target)
|
|
) {
|
|
this.signalToggle?.blur?.();
|
|
} else {
|
|
this.signalToggle?.focus({ preventScroll: true });
|
|
}
|
|
return;
|
|
}
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
this.exit();
|
|
return;
|
|
}
|
|
if (event.target?.closest?.('input, textarea, select, [contenteditable]'))
|
|
return;
|
|
const key = event.key?.toLowerCase();
|
|
if (key === 'c' && !event.metaKey && !event.ctrlKey && !event.altKey) {
|
|
if (!this.active) {
|
|
const cockpitAttempt = !!(
|
|
this.readAircraftInfo() && this.viewer.trackedEntity?.position
|
|
);
|
|
if (!cockpitAttempt) return;
|
|
}
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
if (!this.active && !this.isEntryAllowed()) return;
|
|
if (this.active) this.exit();
|
|
else this.enter();
|
|
return;
|
|
}
|
|
}
|