UNPKG

@antv/g6

Version:

A Graph Visualization Framework in JavaScript

251 lines 10.7 kB
"use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.HTML = void 0; const g_1 = require("@antv/g"); const g_canvas_1 = require("@antv/g-canvas"); const util_1 = require("@antv/util"); const constants_1 = require("../../constants"); const base_node_1 = require("./base-node"); /** * <zh/> HTML 节点 * * <en/> HTML node * @see https://github.com/antvis/G/blob/next/packages/g/src/plugins/EventPlugin.ts */ class HTML extends base_node_1.BaseNode { constructor(options) { super(Object.assign(Object.assign({}, options), { style: Object.assign({}, HTML.defaultStyleProps, options.style) })); this.rootPointerEvent = new g_1.FederatedPointerEvent(null); this.forwardEvents = (nativeEvent) => { const canvas = this.context.canvas; const iCanvas = canvas.context.renderingContext.root.ownerDocument.defaultView; const normalizedEvents = this.normalizeToPointerEvent(nativeEvent, iCanvas); normalizedEvents.forEach((normalizedEvent) => { const event = this.bootstrapEvent(this.rootPointerEvent, normalizedEvent, iCanvas, nativeEvent); // 当点击到 html 元素时,避免触发 pointerupoutside 事件 // When clicking on the html element, avoid triggering the pointerupoutside event (0, util_1.set)(canvas.context.eventService, 'mappingTable.pointerupoutside', []); canvas.context.eventService.mapEvent(event); }); }; } get eventService() { return this.context.canvas.context.eventService; } get events() { return [ constants_1.CommonEvent.CLICK, constants_1.CommonEvent.POINTER_DOWN, constants_1.CommonEvent.POINTER_MOVE, constants_1.CommonEvent.POINTER_UP, constants_1.CommonEvent.POINTER_OVER, constants_1.CommonEvent.POINTER_LEAVE, ]; } getDomElement() { return this.getShape('key').getDomElement(); } /** * @override */ render(attributes = this.parsedAttributes, container = this) { this.drawKeyShape(attributes, container); this.drawPortShapes(attributes, container); } getKeyStyle(attributes) { const _a = (0, util_1.pick)(attributes, ['dx', 'dy', 'innerHTML', 'pointerEvents', 'cursor']), { dx = 0, dy = 0 } = _a, style = __rest(_a, ["dx", "dy"]); const [width, height] = this.getSize(attributes); return Object.assign(Object.assign({ x: dx, y: dy }, style), { width, height }); } drawKeyShape(attributes, container) { const style = this.getKeyStyle(attributes); const { x, y, width = 0, height = 0 } = style; const bounds = this.upsert('key-container', g_1.Rect, { x, y, width, height, opacity: 0 }, container); return this.upsert('key', g_1.HTML, style, bounds); } connectedCallback() { // only enable in canvas renderer const renderer = this.context.canvas.getRenderer('main'); const isCanvasRenderer = renderer instanceof g_canvas_1.Renderer; if (!isCanvasRenderer) return; const element = this.getDomElement(); this.events.forEach((eventName) => { // @ts-expect-error assert event is PointerEvent element.addEventListener(eventName, this.forwardEvents); }); } attributeChangedCallback(name, oldValue, newValue) { if (name === 'zIndex' && oldValue !== newValue) { this.getDomElement().style.zIndex = newValue; } } destroy() { const element = this.getDomElement(); this.events.forEach((eventName) => { // @ts-expect-error assert event is PointerEvent element.removeEventListener(eventName, this.forwardEvents); }); super.destroy(); } normalizeToPointerEvent(event, canvas) { const normalizedEvents = []; if (canvas.isTouchEvent(event)) { for (let i = 0; i < event.changedTouches.length; i++) { const touch = event.changedTouches[i]; // use changedTouches instead of touches since touchend has no touches // @see https://stackoverflow.com/a/10079076 if ((0, util_1.isUndefined)(touch.button)) touch.button = 0; if ((0, util_1.isUndefined)(touch.buttons)) touch.buttons = 1; if ((0, util_1.isUndefined)(touch.isPrimary)) { touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart'; } if ((0, util_1.isUndefined)(touch.width)) touch.width = touch.radiusX || 1; if ((0, util_1.isUndefined)(touch.height)) touch.height = touch.radiusY || 1; if ((0, util_1.isUndefined)(touch.tiltX)) touch.tiltX = 0; if ((0, util_1.isUndefined)(touch.tiltY)) touch.tiltY = 0; if ((0, util_1.isUndefined)(touch.pointerType)) touch.pointerType = 'touch'; // @see https://developer.mozilla.org/zh-CN/docs/Web/API/Touch/identifier if ((0, util_1.isUndefined)(touch.pointerId)) touch.pointerId = touch.identifier || 0; if ((0, util_1.isUndefined)(touch.pressure)) touch.pressure = touch.force || 0.5; if ((0, util_1.isUndefined)(touch.twist)) touch.twist = 0; if ((0, util_1.isUndefined)(touch.tangentialPressure)) touch.tangentialPressure = 0; touch.isNormalized = true; touch.type = event.type; normalizedEvents.push(touch); } } else if (canvas.isMouseEvent(event)) { const tempEvent = event; if ((0, util_1.isUndefined)(tempEvent.isPrimary)) tempEvent.isPrimary = true; if ((0, util_1.isUndefined)(tempEvent.width)) tempEvent.width = 1; if ((0, util_1.isUndefined)(tempEvent.height)) tempEvent.height = 1; if ((0, util_1.isUndefined)(tempEvent.tiltX)) tempEvent.tiltX = 0; if ((0, util_1.isUndefined)(tempEvent.tiltY)) tempEvent.tiltY = 0; if ((0, util_1.isUndefined)(tempEvent.pointerType)) tempEvent.pointerType = 'mouse'; if ((0, util_1.isUndefined)(tempEvent.pointerId)) tempEvent.pointerId = 1; if ((0, util_1.isUndefined)(tempEvent.pressure)) tempEvent.pressure = 0.5; if ((0, util_1.isUndefined)(tempEvent.twist)) tempEvent.twist = 0; if ((0, util_1.isUndefined)(tempEvent.tangentialPressure)) tempEvent.tangentialPressure = 0; tempEvent.isNormalized = true; normalizedEvents.push(tempEvent); } else { normalizedEvents.push(event); } return normalizedEvents; } transferMouseData(event, nativeEvent) { event.isTrusted = nativeEvent.isTrusted; event.srcElement = nativeEvent.srcElement; event.timeStamp = performance.now(); event.type = nativeEvent.type; event.altKey = nativeEvent.altKey; event.metaKey = nativeEvent.metaKey; event.shiftKey = nativeEvent.shiftKey; event.ctrlKey = nativeEvent.ctrlKey; event.button = nativeEvent.button; event.buttons = nativeEvent.buttons; event.client.x = nativeEvent.clientX; event.client.y = nativeEvent.clientY; event.movement.x = nativeEvent.movementX; event.movement.y = nativeEvent.movementY; event.page.x = nativeEvent.pageX; event.page.y = nativeEvent.pageY; event.screen.x = nativeEvent.screenX; event.screen.y = nativeEvent.screenY; event.relatedTarget = null; } bootstrapEvent(event, normalizedEvent, view, nativeEvent) { event.view = view; // @ts-ignore event.originalEvent = null; event.nativeEvent = nativeEvent; event.pointerId = normalizedEvent.pointerId; event.width = normalizedEvent.width; event.height = normalizedEvent.height; event.isPrimary = normalizedEvent.isPrimary; event.pointerType = normalizedEvent.pointerType; event.pressure = normalizedEvent.pressure; event.tangentialPressure = normalizedEvent.tangentialPressure; event.tiltX = normalizedEvent.tiltX; event.tiltY = normalizedEvent.tiltY; event.twist = normalizedEvent.twist; this.transferMouseData(event, normalizedEvent); const { x, y } = this.getViewportXY(normalizedEvent); event.viewport.x = x; event.viewport.y = y; const [canvasX, canvasY] = this.context.canvas.getCanvasByViewport([x, y]); event.canvas.x = canvasX; event.canvas.y = canvasY; event.global.copyFrom(event.canvas); event.offset.copyFrom(event.canvas); event.isTrusted = nativeEvent.isTrusted; if (event.type === 'pointerleave') { event.type = 'pointerout'; } return event; } getViewportXY(nativeEvent) { let x; let y; const { offsetX, offsetY, clientX, clientY } = nativeEvent; if (!(0, util_1.isNil)(offsetX) && !(0, util_1.isNil)(offsetY)) { x = offsetX; y = offsetY; } else { const point = this.eventService.client2Viewport({ x: clientX, y: clientY }); x = point.x; y = point.y; } return { x, y }; } onframe() { super.onframe(); // sync opacity const { opacity } = this.attributes; this.getDomElement().style.opacity = `${opacity}`; } } exports.HTML = HTML; HTML.defaultStyleProps = { size: [160, 80], halo: false, icon: false, label: false, pointerEvents: 'auto', }; //# sourceMappingURL=html.js.map