复制粘贴系统由三部分组成:ICopyable
对象、ICopyData
(表示复制的对象)和 IPaster
对象(可以将复制数据转回为可复制的对象)。每种类型的 ICopyable
都需要一个可以粘贴这些数据的关联 IPaster
。
在极少数情况下,您可能需要实现自定义可复制对象或自定义粘贴器(例如多选插件或跨标签页复制粘贴插件),因为通常可复制对象会呈现,而您无法向 Blockly 添加新的呈现对象。工作区中唯一可以存在的渲染对象是块、气泡和工作区注释。
实现可复制对象
如需创建可复制的对象,您需要实现 ICopyable
接口。
可选择
ICopyable
接口会扩展 ISelectable
接口,这意味着您还需要实现这些方法和属性。
必须可选择,因为键盘快捷键会根据所选对象来确定要复制的内容。
class MyCopyable implements ISelectable {
constructor(workspace) {
this.id = Blockly.utils.idGenerator.genUid();
this.workspace = workspace;
}
select() {
// Visually indicate this draggable is selected.
}
unselect() {
// Visually indicate this draggable is not selected.
}
}
可复制
ICopyable
接口本身只有一个 toCopyData
方法,该方法会返回可复制对象状态的可序列化 JSON 表示法,该表示法可用于重新创建可复制对象。
复制数据还必须包含 paster
属性,该属性用于存储与应粘贴此复制数据的粘贴程序关联的已注册字符串名称。如需详细了解粘贴程序,请参阅实现粘贴程序。
class MyCopyable implements ICopyable {
constructor(workspace, state) {
this.workspace = workspace;
this.myState = state;
}
toCopyData() {
return {
// This string matches the string used to register the paster.
paster: 'MY_PASTER',
state: this.myState,
};
}
}
实现粘贴程序
如需创建粘贴程序,您需要实现 IPaster
接口。它只有一个方法 paste
,用于接收要粘贴的内容的复制数据、要将内容粘贴到的 Workspace,以及一个可选的坐标(即要将内容粘贴到的位置)。
class MyPaster implements IPaster {
paste(copyData, workspace, coordinate) {
return new MyCopyable(workspace, copyData.state);
// Optionally position the copyable at the passed coordinate.
// Optionally select the copyable after it is pasted.
}
}
注册
实现粘贴器后,您需要将其注册,以便从其 paster
属性中找到与给定副本数据关联的粘贴器。
// This string matches the string assigned to the 'paster' property.
Blockly.clipboard.registry.register('MY_PASTER', new MyPaster());