拷贝积木

107 阅读1分钟

拷贝积木

突然发现openblock和scratch不一样的一个功能就是openblock有个拷贝积木,虽然这个功能在项目中不是很重要,但是可以学习一下这个源码,这个拷贝和复制不太一样,这个拷贝可以跨标签页的,比如开两个网页端或者软件,可以将第一个的积木拷贝到第二个中,实际上就是把积木转成xml文本格式写入在系统剪贴板中,然后再读取系统剪贴板,获取到复制的文本转成dom格式,scratch原本也有方法可以将dom和xml格式相互转换,参考了一些文章也有,整理了大概的流程:

(1) 设置右键鼠标拷贝积木和粘贴积木

(2) 积木拷贝可以存到系统的剪贴板,在scratch_blocks_utils.js创建方法copyCallback,先使用Blockly.Xml.blockToDom把积木转成xml格式,再使用Blockly.Xml.domToText把xml转成文本,最后使用navigator.clipboard.writeText把文本写入系统的剪贴板

(3) 粘贴的时候就使用navigator.clipboard.readText方法读取系统剪贴板,获取到复制的文本,然后调用workspace_svg.js下的paste方法使用Blockly.Xml.textToDom把文本转成dom传入

(4) 在paste方法中,会去调用到pasteBlock_和pasteWorkspaceComment_,主要是pasteBlock_方法

(5) 在pasteBlock_方法计算点击粘贴后积木的位置是需要根据鼠标进行移动的,而且积木的状态是拖拽中的,要调用startDragWithFakeEvent方法启用强制拖动开始,而不单击和拖动块本身,将复制的积木附加到鼠标指针