コピーと貼り付け

コピー ペースト システムは、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());