Open XDao7 opened 10 months ago
经过测试,是可以在compose当中正常使用的,下面是我目前封装的
@Composable
fun <T> ThinkMapView(
treeViewAdapter: TreeViewAdapter<T>,
treeViewLayoutManager: TreeLayoutManager,
treeModel: TreeModel<T>,
modifier: Modifier,
treeViewControlListener: TreeViewControlListener? = null,
//请在外部保存此高阶函数提供的TreeViewEditor对象,用于对树形图做编辑
onEditorCreate: (TreeViewEditor) -> Unit = { _ -> }
) {
val adapter by remember(treeViewAdapter) {
mutableStateOf(treeViewAdapter)
}
AndroidView(
modifier = modifier,
factory = {
GysoTreeView(it).apply {
this.adapter = adapter
this.setTreeLayoutManager(treeViewLayoutManager)
treeViewControlListener?.let { listener ->
this.setTreeViewControlListener(listener)
}
onEditorCreate(editor)
}
},
update = {
//如果不需要动态更新,则可以在factory中设置treeModel
//但是一定要在给GysoTreeView设置adapter之后设置,否则不显示
if (adapter.treeModel != treeModel) {
adapter.treeModel = treeModel
}
}
)
}
欢迎提供建议
考虑到onEditorCreate: (TreeViewEditor) -> Unit = { _ -> }这种方式不太符合compose使用习惯,所以额外封装了一层ThinkMapEditor:
/**
* TreeViewEditor当中方法很多,但是绝大部分没有具体实现
* 此类仅覆盖已经实现的方法
*/
class ThinkMapEditor {
private var editor: TreeViewEditor? = null
fun setEditor(editor: TreeViewEditor) {
this.editor = editor
}
fun focusMidLocation() {
editor?.focusMidLocation()
}
fun requestMoveNodeByDragging(wantEdit: Boolean) {
editor?.requestMoveNodeByDragging(wantEdit)
}
fun addChildNodes(parent: NodeModel<*>, vararg children: NodeModel<*>) {
editor?.addChildNodes(parent, *children)
}
fun removeNode(nodeToRemove: NodeModel<*>) {
editor?.removeNode(nodeToRemove)
}
fun removeNodeChildren(parentNode: NodeModel<*>) {
editor?.removeNodeChildren(parentNode)
}
}
@Composable
fun <T> ThinkMapView(
thinkMapAdapter: TreeViewAdapter<T>,
thinkMapLayoutManager: TreeLayoutManager,
treeModel: TreeModel<T>,
modifier: Modifier,
thinkMapControlListener: TreeViewControlListener? = null,
//可在外部调用rememberThinkMapEditor(),保存并传入自己的ThinkMapEditor,用于编辑
thinkMapEditor: ThinkMapEditor = rememberThinkMapEditor()
) {
AndroidView(
modifier = modifier,
factory = {
GysoTreeView(it).apply {
adapter = thinkMapAdapter
setTreeLayoutManager(thinkMapLayoutManager)
thinkMapControlListener?.let { listener ->
setTreeViewControlListener(listener)
}
thinkMapEditor.setEditor(editor)
}
},
update = {
//如果不需要动态更新,则可以在factory中设置treeModel
//但是一定要在给GysoTreeView设置adapter之后设置,否则不显示
if (thinkMapAdapter.treeModel != treeModel) {
thinkMapAdapter.treeModel = treeModel
}
}
)
}
@Composable
fun rememberThinkMapEditor(): ThinkMapEditor {
return remember { ThinkMapEditor() }
}
欢迎提供建议
如题,感谢( ̄︶ ̄)↗