コピー ペースト システムは、ICopyable
オブジェクト、コピーされたオブジェクトを表す ICopyData
オブジェクト、コピーデータをコピー可能なオブジェクトに戻すことができる IPaster
オブジェクトの 3 つで構成されています。すべてのタイプの 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
インターフェース自体には、コピー可能なオブジェクトの状態の JSON シリアル化可能な表現を返す toCopyData
というメソッドが 1 つだけあります。このメソッドは、コピー可能なオブジェクトの再作成に使用できます。
コピーデータには、このコピーデータを貼り付けるパスタに関連付けられた登録済みの文字列名を保持する 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
というメソッドは 1 つだけです。このメソッドでは、貼り付けるもののコピーデータ、貼り付け先のワークスペース、オプションの座標(ものを貼り付ける場所)を受け取ります。
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());