이동 중에 긴 자식 노드들이 존재할 경우 영역 표시에 관한 오류와 간선이 그대로 남아 있어 시각적으로 불편함을 주는 문제에 대해 해결책을 모색하게 되었다.
이를 해결하기 위한 고민 끝에, 노드 이동 시 구조를 유지하는 방식으로 접근하기로 결정했다. 이 방식은 노드 이동의 복잡성을 줄이면서도, 마인드맵의 전반적인 구조와 시각적 질서를 유지할 수 있게 해준다. 구체적으로 다음과 같은 조건을 만족해야한다.
private fun moveNode(
dx: Float,
dy: Float,
) {
mindMapContainer.selectNode?.let { selectedNode ->
// ...
rightLayoutManager.arrangeNode(tree, selectedNode as RectangleNode)
}
lineView.updateTree(tree)
invalidate()
}
fun arrangeNode(tree: Tree, rootNode: Node? = null) {
// ...
if (rootNode == null) {
tree.setRootNode(newHead as CircleNode)
}
recurArrangeNode(newHead, tree)
}
이동 상태에서도 구조를 유지해야하기 때문에 arrangeNode 메서드를 통해 구조를 유지하면서 이동할 수 있도록 하였다.
fun traverseLine(
canvas: Canvas,
node: Node,
depth: Int,
) {
for (toNodeId in node.children) {
val toNode = tree.getNode(toNodeId)
drawLine(node, toNode, canvas)
traverseLine(canvas, toNode, depth + 1)
}
}
// ...
private fun drawLine(
fromNode: Node,
toNode: Node,
canvas: Canvas,
) {
val linePaint = getLinePaintForMode()
val path = createPath(fromNode, toNode)
drawPathConditionally(toNode, canvas, path, linePaint)
}
// ...
private fun drawPathConditionally(
toNode: Node,
canvas: Canvas,
path: Path,
linePaint: Paint,
) {
if (!mindMapContainer.isMoving || mindMapContainer.selectNode?.id != toNode.id) {
canvas.drawPath(path, linePaint)
}
}
부모 노드의 자식노드를 탐색하면서 선택한 노드 id와 탐색한 노드 id가 같지 않거나 움직임 상태가 아닌 경우 간선을 그려지도록 하였다.