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,
)
}
}