guaishouN / android-thinkmap-treeview

Tree View; Mind map; Think map; tree map; custom view; 自定义;关系图;树状图;思维导图;组织机构图;层次图
MIT License
475 stars 66 forks source link

请问可以在compose中使用么? #35

Open XDao7 opened 10 months ago

XDao7 commented 10 months ago

如题,感谢( ̄︶ ̄)↗ 

XDao7 commented 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
            }
        }
    )
}

欢迎提供建议

XDao7 commented 10 months ago

考虑到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() }
}

欢迎提供建议