private _handlePointerEvent()

in packages/core/gsi/src/polaris/PolarisGSI.ts [375:439]


	private _handlePointerEvent(
		/**
		 * The canvas px coords, origin is on top left
		 */
		canvasCoords: CoordV2,
		/**
		 * The layer event name that should be triggered
		 */
		triggerEventName: 'pick' | 'hover'
	) {
		// Collect pick results
		const result = this._raycastLayers(canvasCoords, {
			deepPicking: this.getProp('deepPicking') ?? false,
		})

		// trigger non-picked layer with eventName & no arguments
		if (!result) {
			this.traverseVisible((obj) => {
				// @note pickable only exits on StandardLayer
				// @note do not bypass type check using props manager
				const layer = obj as StandardLayer
				if (layer.isStandardLayer && layer.getProp('pickable')) {
					layer.dispatchEvent({ type: triggerEventName })
				}
			})
			return
		}

		if (Array.isArray(result)) {
			const resultArr = result
			const pickedLayers = resultArr.map((e) => e.layer)
			this.traverseVisible((obj) => {
				// @note pickable only exits on StandardLayer
				// @note do not bypass type check using props manager
				const layer = obj as StandardLayer
				const index = pickedLayers.indexOf(layer)
				// if (layer.isStandardLayer && layer.getProp('pickable')) {
				if (index >= 0) {
					// trigger picked layer with eventName & result argument
					layer.dispatchEvent({ type: triggerEventName, result: resultArr[index] })
				} else {
					// trigger non-picked layer with eventName & no arguments
					layer.dispatchEvent({ type: triggerEventName })
				}
				// }
			})
		} else {
			const resultEvent = result
			const pickedLayer = resultEvent.layer
			this.traverseVisible((obj) => {
				// @note pickable only exits on StandardLayer
				// @note do not bypass type check using props manager
				const layer = obj as StandardLayer
				// if (layer.isStandardLayer && layer.getProp('pickable')) {
				if (layer === pickedLayer) {
					// trigger picked layer with eventName & result argument
					layer.dispatchEvent({ type: triggerEventName, result: resultEvent })
				} else {
					// trigger non-picked layer with eventName & no arguments
					layer.dispatchEvent({ type: triggerEventName })
				}
				// }
			})
		}
	}