@jsx6/nodditor
Version:
JSX6 blocky nodes code editor
90 lines (82 loc) • 2.57 kB
JavaScript
import { getAttr, setAttribute } from '@jsx6/jsx6'
import { calcPos } from './calcPos.js'
import { pairSum } from './pairUtils.js'
/**
*
* @param {import('./NodeEditor.jsx').BlockData} blockData
* @returns
*/
export function findConnector(blockData) {
let { connectorMap, el: rootNode } = blockData
let resizeSet = new Set()
resizeSet.add(rootNode)
visit(rootNode)
return { resizeSet }
/**
* @param {HTMLElement|any} el
*/
function visit(el) {
let ncId = getAttr(el, 'ncid')
if (ncId) {
let connectData = connectorMap.get(ncId)
if (!connectData) {
addResize(resizeSet, el, rootNode, blockData)
let cStyle = getComputedStyle(el)
let relPos = calcPos(el, blockData.el)
connectData = {
id: ncId,
dir: getAttr(el, 'ne-connect'),
changed: 1,
pos: [0, 0],
idFull: blockData.id + '/' + ncId,
el,
relPos,
offsetX: parseFloat(cStyle.getPropertyValue('--offset-x')) || 0,
offsetY: parseFloat(cStyle.getPropertyValue('--offset-y')) || 0,
root: blockData,
editor: this,
size: [el.offsetWidth, el.offsetHeight],
}
blockData.editor.newConnector(connectData)
connectorMap.set(ncId, connectData)
updatePos(connectData)
el.ncId = ncId
el.ncData = connectData
// it is important to diable drag action for connectors
// to allow proper interaction, so line can be made instead of moving the block
setAttribute(el, 'ne-nodrag', true)
}
}
let ch = el.firstElementChild
while (ch) {
visit(ch)
ch = ch.nextElementSibling
}
}
}
/**
*
* @param {Set<HTMLElement>} resizeSet
* @param {HTMLElement|*} el
* @param {HTMLElement} rootNode
* @param {import('./NodeEditor.jsx').BlockData} blockData
*/
export function addResize(resizeSet, el, rootNode, blockData) {
resizeSet.add(el)
el = el.parentElement
el.neBlock = blockData
if (el != rootNode) addResize(resizeSet, el, rootNode, blockData)
}
/**
* @param {import('./NodeEditor.jsx').ConnectorData} connectData
*/
export function recalcPos(connectData) {
connectData.relPos = calcPos(connectData.el, connectData.root.el)
updatePos(connectData)
}
/**
* @param {import('./NodeEditor.jsx').ConnectorData} connectData
*/
export function updatePos(connectData) {
connectData.pos = pairSum(connectData.relPos, connectData.root.pos)
}