UNPKG

leo-mind-map

Version:

一个简单的web在线思维导图

249 lines (246 loc) 7.61 kB
import { degToRad } from '../utils/' export default { top: { renderExpandBtn({ node, btn, expandBtnSize, translateX, translateY, width, height }) { if (node.parent && node.parent.isRoot) { btn.translate( width * 0.3 - expandBtnSize / 2 - translateX, -expandBtnSize / 2 - translateY ) } else { btn.translate( width * 0.3 - expandBtnSize / 2 - translateX, height + expandBtnSize / 2 - translateY ) } }, renderLine({ node, line, top, x, lineLength, height, expandBtnSize, maxy, ctx }) { if (node.parent && node.parent.isRoot) { line.plot( ctx.transformPath( `M ${x},${top} L ${x + lineLength},${ top - Math.tan(degToRad(ctx.mindMap.opt.fishboneDeg)) * lineLength }` ) ) } else { line.plot( ctx.transformPath( `M ${x},${top + height + expandBtnSize} L ${x},${maxy}` ) ) } }, computedLeftTopValue({ layerIndex, node, ctx }) { if (layerIndex >= 1 && node.children) { // 遍历三级及以下节点的子节点 let marginY = ctx.getMarginY(layerIndex + 1) let startLeft = node.left + node.width * ctx.childIndent let totalTop = node.top + node.height + (ctx.getNodeActChildrenLength(node) > 0 ? node.expandBtnSize : 0) + marginY node.children.forEach(item => { item.left = startLeft item.top += totalTop totalTop += item.height + (ctx.getNodeActChildrenLength(item) > 0 ? item.expandBtnSize : 0) + marginY }) } }, adjustLeftTopValueBefore({ node, parent, ctx, layerIndex }) { // 调整top let len = node.children.length let marginY = ctx.getMarginY(layerIndex + 1) // 调整三级及以下节点的top if (parent && !parent.isRoot && len > 0) { let totalHeight = node.children.reduce((h, item) => { return ( h + item.height + (ctx.getNodeActChildrenLength(item) > 0 ? item.expandBtnSize : 0) + marginY ) }, 0) ctx.updateBrothersTop(node, totalHeight) } }, adjustLeftTopValueAfter({ parent, node, ctx }) { // 将二级节点的子节点移到上方 if (parent && parent.isRoot) { // 遍历二级节点的子节点 let marginY = ctx.getMarginY(node.layerIndex + 1) let totalHeight = node.expandBtnSize + marginY node.children.forEach(item => { // 调整top let nodeTotalHeight = ctx.getNodeAreaHeight(item) let _top = item.top let _left = item.left item.top = node.top - (item.top - node.top) - nodeTotalHeight + node.height // 调整left item.left = node.left + node.width * ctx.indent + (nodeTotalHeight + totalHeight) / Math.tan(degToRad(ctx.mindMap.opt.fishboneDeg)) totalHeight += nodeTotalHeight // 同步更新后代节点 ctx.updateChildrenPro(item.children, { top: item.top - _top, left: item.left - _left }) }) } } }, bottom: { renderExpandBtn({ node, btn, expandBtnSize, translateX, translateY, width, height }) { if (node.parent && node.parent.isRoot) { btn.translate( width * 0.3 - expandBtnSize / 2 - translateX, height + expandBtnSize / 2 - translateY ) } else { btn.translate( width * 0.3 - expandBtnSize / 2 - translateX, -expandBtnSize / 2 - translateY ) } }, renderLine({ node, line, top, x, lineLength, height, miny, ctx }) { if (node.parent && node.parent.isRoot) { line.plot( ctx.transformPath( `M ${x},${top + height} L ${x + lineLength},${ top + height + Math.tan(degToRad(ctx.mindMap.opt.fishboneDeg)) * lineLength }` ) ) } else { line.plot(ctx.transformPath(`M ${x},${top} L ${x},${miny}`)) } }, computedLeftTopValue({ layerIndex, node, ctx }) { let marginY = ctx.getMarginY(layerIndex + 1) if (layerIndex === 1 && node.children) { // 遍历二级节点的子节点 let startLeft = node.left + node.width * ctx.childIndent let totalTop = node.top + node.height + (ctx.getNodeActChildrenLength(node) > 0 ? node.expandBtnSize : 0) + marginY node.children.forEach(item => { item.left = startLeft item.top = totalTop + (ctx.getNodeActChildrenLength(item) > 0 ? item.expandBtnSize : 0) totalTop += item.height + (ctx.getNodeActChildrenLength(item) > 0 ? item.expandBtnSize : 0) + marginY }) } if (layerIndex > 1 && node.children) { // 遍历三级及以下节点的子节点 let startLeft = node.left + node.width * ctx.childIndent let totalTop = node.top - (ctx.getNodeActChildrenLength(node) > 0 ? node.expandBtnSize : 0) - marginY node.children.forEach(item => { item.left = startLeft item.top = totalTop - item.height totalTop -= item.height + (ctx.getNodeActChildrenLength(item) > 0 ? item.expandBtnSize : 0) + marginY }) } }, adjustLeftTopValueBefore({ node, ctx, layerIndex }) { // 调整top let marginY = ctx.getMarginY(layerIndex + 1) let len = node.children.length if (layerIndex > 2 && len > 0) { let totalHeight = node.children.reduce((h, item) => { return ( h + item.height + (ctx.getNodeActChildrenLength(item) > 0 ? item.expandBtnSize : 0) + marginY ) }, 0) ctx.updateBrothersTop(node, -totalHeight) } }, adjustLeftTopValueAfter({ parent, node, ctx }) { // 将二级节点的子节点移到上方 if (parent && parent.isRoot) { // 遍历二级节点的子节点 let marginY = ctx.getMarginY(node.layerIndex + 1) let totalHeight = 0 let totalHeight2 = node.expandBtnSize node.children.forEach(item => { // 调整top let hasChildren = ctx.getNodeActChildrenLength(item) > 0 let nodeTotalHeight = ctx.getNodeAreaHeight(item) let offset = hasChildren ? nodeTotalHeight - item.height - (hasChildren ? item.expandBtnSize : 0) : 0 offset -= hasChildren ? marginY : 0 let _top = totalHeight + offset let _left = item.left item.top += _top // 调整left item.left = node.left + node.width * ctx.indent + (nodeTotalHeight + totalHeight2) / Math.tan(degToRad(ctx.mindMap.opt.fishboneDeg)) totalHeight += offset totalHeight2 += nodeTotalHeight // 同步更新后代节点 ctx.updateChildrenPro(item.children, { top: _top, left: item.left - _left }) }) } } } }