MindMap/mind-elixir-core-master/src/utils/generateBranch.ts

81 lines
1.9 KiB
TypeScript
Raw Normal View History

import type { MindElixirInstance } from '..'
import { DirectionClass } from '../types/index'
export interface MainLineParams {
pT: number
pL: number
pW: number
pH: number
cT: number
cL: number
cW: number
cH: number
direction: DirectionClass
containerHeight: number
}
export interface SubLineParams {
pT: number
pL: number
pW: number
pH: number
cT: number
cL: number
cW: number
cH: number
direction: DirectionClass
isFirst: boolean | undefined
}
// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#path_commands
export function main({ pT, pL, pW, pH, cT, cL, cW, cH, direction, containerHeight }: MainLineParams) {
let x1 = pL + pW / 2
const y1 = pT + pH / 2
let x2
if (direction === DirectionClass.LHS) {
x2 = cL + cW
} else {
x2 = cL
}
const y2 = cT + cH / 2
const pct = Math.abs(y2 - y1) / containerHeight
const offset = (1 - pct) * 0.25 * (pW / 2)
if (direction === DirectionClass.LHS) {
x1 = x1 - pW / 10 - offset
} else {
x1 = x1 + pW / 10 + offset
}
return `M ${x1} ${y1} Q ${x1} ${y2} ${x2} ${y2}`
}
export function sub(this: MindElixirInstance, { pT, pL, pW, pH, cT, cL, cW, cH, direction, isFirst }: SubLineParams) {
const GAP = parseInt(this.container.style.getPropertyValue('--node-gap-x')) // cache?
// const GAP = 30
let y1 = 0
let end = 0
if (isFirst) {
y1 = pT + pH / 2
} else {
y1 = pT + pH
}
const y2 = cT + cH
let x1 = 0
let x2 = 0
let xMid = 0
const offset = (Math.abs(y1 - y2) / 300) * GAP
if (direction === DirectionClass.LHS) {
xMid = pL
x1 = xMid + GAP
x2 = xMid - GAP
end = cL + GAP
return `M ${x1} ${y1} C ${xMid} ${y1} ${xMid + offset} ${y2} ${x2} ${y2} H ${end}`
} else {
xMid = pL + pW
x1 = xMid - GAP
x2 = xMid + GAP
end = cL + cW - GAP
return `M ${x1} ${y1} C ${xMid} ${y1} ${xMid - offset} ${y2} ${x2} ${y2} H ${end}`
}
}