UNPKG

@eyea/plugin-mind

Version:
208 lines (188 loc) 7.9 kB
import { Graph, Node } from '@antv/x6'; import { traverseTree } from './utils'; class HotAreas { #graph: Graph; constructor(graph: Graph) { this.#graph = graph; } /*setHotArea() { let hotAreas = [] const roots = this.#graph.getRootNodes() const postFix = 'placeholder' //const showHotArea = this.get('showHotArea') // 设置根节点热区 const root = roots[0] const rootBox = root.getBBox() const rootDx = 90 const rootDy = 60 hotAreas.push({ minX: rootBox.x - rootDx, minY: rootBox.minY - rootDy, maxX: (rootBox.minX + rootBox.maxX) / 2, maxY: rootBox.maxY + rootDy, parent: root, current: root, id: root.id + 'left' + postFix, nth: root.children?.length || 0, side: 'left', color: 'orange' }) hotAreas.push({ minX: (rootBox.x + rootBox.width), minY: rootBox.y - rootBox.height + 20, maxX: (rootBox.x + rootBox.width), maxY: rootBox.y + rootBox.height - 20, parent: root, current: root, id: root.id + 'right' + postFix, nth: root.children?.length || 0, side: 'right', color: 'pink' }) function getNext(initNextIndex: number, child: Node, parent: Node) { const children = parent.children || [] // 所在节点 let nextIndex = initNextIndex if (!parent.parent) { while (children[nextIndex] && children[nextIndex].side !== child.side) { nextIndex++ } } while (children[nextIndex] && children[nextIndex].isPlaceholder) { nextIndex++ } if (children[nextIndex] && children[nextIndex].side === child.side) { return children[nextIndex] } } function getLast(initNextIndex, child, parent) { const children = parent.children // 所在节点 let lastIndex = initNextIndex if (!parent.parent) { while (children[lastIndex] && children[lastIndex].side !== child.side) { lastIndex-- } } while (children[lastIndex] && children[lastIndex].isPlaceholder) { lastIndex-- } if (children[lastIndex] && children[lastIndex].side === child.side) { return children[lastIndex] } } // 设置子节点热区 traverseTree<Node>(root, (child: Node<Node.Properties>, parent: Node<Node.Properties>, index: number) => { const data = if (child.isPlaceholder || !child.isVisible()) { return } const next = getNext(index + 1, child, parent) const last = getLast(index - 1, child, parent) const childBox = child.getBBox() const children = parent.children // 所在节点 const firstSubDx = 90 const dy = 16 const isFirstRight = child.hierarchy === 2 && child.side === 'right' const isFirstLeft = child.hierarchy === 2 && child.side === 'left' if (!last) { hotAreas.push({ minX: isFirstRight ? childBox.minX - firstSubDx : childBox.minX, minY: function () { let minY = last ? childBox.minY : childBox.minY - dy if (children[index - 1] && children[index - 1].isPlaceholder && children[index - 1].side === child.side) { const placeholderBox = graph.find(children[index - 1].id).getBBox() minY = placeholderBox.minY } return minY }(), maxX: isFirstLeft ? childBox.maxX + firstSubDx : childBox.maxX, maxY: (childBox.minY + childBox.maxY) / 2, parent: parent, id: (last ? last.id : undefined) + child.id + parent.id + postFix, side: child.side, color: 'yellow', nth: index }) } if (next) { const nextBox = graph.find(next.id).getBBox() hotAreas.push({ minX: function () { if (child.side === 'left') { return Math.max(childBox.minX, nextBox.minX) } return isFirstRight ? childBox.minX - firstSubDx : childBox.minX }(), minY: (childBox.minY + childBox.maxY) / 2, maxX: function () { if (child.side === 'right') { return Math.min(childBox.maxX, nextBox.maxX) } return isFirstLeft ? childBox.maxX + firstSubDx : childBox.maxX }(), maxY: (nextBox.minY + nextBox.maxY) / 2, parent: parent, id: child.id + (next ? next.id : undefined) + parent.id + postFix, side: child.side, color: 'blue', nth: index + 1 }); } else { hotAreas.push({ minX: isFirstRight ? childBox.minX - firstSubDx : childBox.minX, minY: (childBox.minY + childBox.maxY) / 2, maxX: isFirstLeft ? childBox.maxX + firstSubDx : childBox.maxX, maxY: function () { let maxY = childBox.maxY + dy if (children[index + 1] && children[index + 1].isPlaceholder && children[index + 1].side === child.side) { const placeholderBox = graph.find(children[index + 1].id).getBBox() maxY = placeholderBox.maxY } return maxY }(), parent: parent, id: child.id + undefined + parent.id + postFix, color: 'red', nth: index + 1, addOrder: 'push', side: child.side }) } if (!child.children || child.children.length === 0 || child.children.length === 1 && child.children[0].isPlaceholder) { const dx = 100 const _dy = 0 let box if (child.x > parent.x) { box = { minX: childBox.maxX, minY: childBox.minY - _dy, maxX: childBox.maxX + dx, maxY: childBox.maxY + _dy } } else { box = { minX: childBox.minX - dx, minY: childBox.minY - _dy, maxX: childBox.minX, maxY: childBox.maxY + _dy } } hotAreas.push({ ...box, parent: child, id: undefined + undefined + child.id + postFix, nth: 0, color: 'green', side: child.side, addOrder: 'push' }) } }, parent => { return parent.children }) this.set('hotAreas', hotAreas) showHotArea && this._drawHotAreaShape() }*/ }