in modules/main/src/lib/nebula.ts [158:262]
_handleDeckGLEvent(event: Record<string, any>) {
const {
deckgl,
props: { onMapMouseEvent, selectionType, eventFilter },
} = this;
let sendMapEvent = true;
let cursor = 'auto';
if (event && deckgl && selectionType) {
if (!this._deckDrawer) this._deckDrawer = new DeckDrawer(this);
const lngLat = this.getMouseGroundPosition(event);
if (eventFilter && !eventFilter(lngLat, event)) return;
const drawerResult = this._deckDrawer.handleEvent(event, lngLat, selectionType);
if (drawerResult.redraw) this.forceUpdate();
return;
}
if (event && deckgl && (!event.buttons || event.type !== 'mousemove')) {
// TODO: sort by mouse priority
const layerIds = deckgl.props.layers
.filter(
(l: any) => l && l.props && l.props.nebulaLayer && l.props.nebulaLayer.enablePicking
)
.map((l: any) => l.id);
const pickingInfo = deckgl.pickObject({
x: event.offsetX,
y: event.offsetY,
radius: 5,
layerIds,
});
this.queryObjectEvents.emit('pick', { event, pickingInfo });
if (pickingInfo) {
sendMapEvent = false;
const { index, lngLat } = pickingInfo;
if (eventFilter && !eventFilter(lngLat, event)) return;
const { layer: deckLayer, object } = pickingInfo;
if (
deckLayer &&
deckLayer.props &&
deckLayer.props.nebulaLayer &&
deckLayer.props.nebulaLayer.eventHandler
) {
deckLayer.props.nebulaLayer.eventHandler(event, pickingInfo);
}
const original =
object.original ||
(deckLayer.props.nebulaLayer &&
deckLayer.props.nebulaLayer.deckCache &&
deckLayer.props.nebulaLayer.deckCache.originals[index]);
if (original) {
this.deckglMouseOverInfo = { originalLayer: deckLayer.props.nebulaLayer, index };
// @ts-expect-error narrow event type
const nebulaMouseEvent = new LayerMouseEvent(event, {
data: original,
metadata: object.metadata,
groundPoint: lngLat,
nebula: this,
});
deckLayer.props.nebulaLayer.emit(event.type, nebulaMouseEvent);
this.forceUpdate();
}
cursor = 'pointer';
}
}
if (document.documentElement) {
document.documentElement.style.cursor = cursor;
}
if (sendMapEvent) {
this.deckglMouseOverInfo = null;
const lngLat = this.getMouseGroundPosition(event);
if (eventFilter && !eventFilter(lngLat, event)) return;
// send to layers first
// @ts-expect-error narrow event type
const nebulaMouseEvent = new LayerMouseEvent(event, {
groundPoint: lngLat,
nebula: this,
});
this.getAllLayers()
.filter((layer) => layer && layer.usesMapEvents)
.forEach((layer) => layer.emit('mapMouseEvent', nebulaMouseEvent));
this.getAllLayers()
.filter(
(layer) =>
layer && layer.props && layer.props.nebulaLayer && layer.props.nebulaLayer.mapMouseEvent
)
.forEach((layer) => layer.props.nebulaLayer.mapMouseEvent(nebulaMouseEvent, layer));
if (onMapMouseEvent) {
onMapMouseEvent(event, lngLat);
}
}
}