fun PackageSearchModulesTree()

in plugin/src/main/kotlin/com/jetbrains/packagesearch/plugin/ui/panels/tree/PackageSearchModulesTree.kt [47:106]


fun PackageSearchModulesTree(
    modifier: Modifier,
    onSelectionChanged: (Set<PackageSearchModule.Identity>) -> Unit,
) = Column(modifier) {
    val viewModel: TreeViewModel = viewModel()
    val knownNodes = remember { mutableSetOf<PackageSearchModule.Identity>() }

    val tree by viewModel.treeStateFlow.collectAsState()
    val isOnline by viewModel.isOnline.collectAsState()
    TreeActionToolbar(
        isOnline = isOnline,
        onExpandAll = viewModel::expandAll,
        onCollapseAll = {
            val rootIds = tree.roots.map { it.id }.toSet()
            viewModel.treeState.selectedKeys = viewModel.treeState.selectedKeys intersect rootIds
            viewModel.collapseAll()
        },
    )
    Divider(Orientation.Horizontal)
    remember(tree, viewModel.treeState.openNodes) {
        val newNodes = tree.walkBreadthFirst()
            .filterIsInstance<Tree.Element.Node<TreeItemModel>>()
            .map { it.data.id }
            .toSet() - knownNodes

        knownNodes += newNodes

        viewModel.treeState.openNodes += newNodes

        if (viewModel.treeState.selectedKeys.isEmpty()) {
            viewModel.treeState.selectedKeys = tree.walkBreadthFirst()
                .take(1)
                .map { it.data.id }
                .toSet()
        }
    }
    Box {
        LazyTree(
            modifier = Modifier.padding(top = 4.dp, end = PackageSearchMetrics.scrollbarWidth),
            tree = tree,
            treeState = viewModel.treeState,
            onSelectionChange = {
                onSelectionChanged(
                    it.map { it.id }
                        .filterIsInstance<PackageSearchModule.Identity>()
                        .toSet()
                )
            },
        ) { item ->
            TreeItem(item)
        }
        VerticalScrollbar(
            modifier = Modifier.fillMaxHeight().align(Alignment.CenterEnd),
            scrollState = viewModel.lazyListState,
        )

    }


}