新しいアイコンタイプを作成する

カスタム アイコンを作成するには、IIcon インターフェースを実装する必要があります。 これにより、Blockly はアイコンをどのようにレンダリングし、どのようなレンダリングを行うのかを指示できます。 クリックされた場合のアクションなどです

Icon 抽象クラスはすでに存在しているため、サブクラス化することをおすすめします。 IIcon の多くのメソッドのデフォルト実装を提供します。 行うことができます。

class MyIcon extends Blockly.icons.Icon {
  // The constructor should always take in the source block so that svg elements
  // can be properly created.
  constructor(sourceBlock) {
    super(sourceBlock);
  }
}

アイコンのタイプを指定する

getType メソッドは、メッセージのタイプを表す値を返します。 アイコンをクリックします。シリアル化用のアイコンの登録に使用されます。また、 getIcon からアイコンを取得しています。

JavaScript

  getType() {
    return new Blockly.icons.IconType('my_icon');
  }

TypeScript

  getType(): Blockly.icons.IconType<MyIcon> {
    return new Blockly.icons.IconType<MyIcon>('my_icon');
  }

アイコンのビューを作成する

アイコンのビューは、ブロックに存在する SVG 要素を参照します。

ビューを初期化する

initView メソッドでは、HTML コードの SVG 要素を作成します。 アイコンが表示されます。新しい要素は this.svgRoot 要素を追加し、アイコンが変わったときに自動的にクリーンアップされるようにします。 破棄されます。

Blockly.utils.dom モジュールはクリーンなインターフェースを提供する SVG をインスタンス化できます

initView(pointerdownListener) {
  if (this.svgRoot) return;  // Already initialized.

  // This adds the pointerdownListener to the svgRoot element.
  // If you do not call `super` you must do this yourself.
  super.initView(pointerdownListener);

  Blockly.utils.dom.createSvgElement(
    Blockly.utils.Svg.CIRCLE,
    {
      'class': 'my-css-class',
      'r': '8',
      'cx': '8',
      'cy': '8',
    },
    this.svgRoot  // Append to the svgRoot.
  );
}

サイズを返す

getSize メソッドはアイコンのサイズを返すため、 renderer を使用すると、ブロックの幅を狭めることができます。

サイズは任意の「ワークスペース ユニット」単位(ワークスペースの表示や スケールが変わります)。

getSize() {
  return new Blockly.utils.Size(16, 16);
}

順序を設定する

ブロック内のアイコンの順序は固定です。たとえば 組み込みのミューテータは アイコンは常にコメント アイコンの前に表示されます。 表示されます。

順序は、getWeight が返す値によって制御されます。 メソッドを呼び出します。重みが正の大きいアイコンは、重みが小さいアイコンの後にレンダリングされる 正の重みになります。

getWeight() {
  return 10;
}

クリック動作を実装する

多くのアイコンはインタラクティブで、クリックされるとなんらかの動作をします。たとえば 組み込みのアイコンはすべて、クリックするとバブルが表示されます。Google Chat では onClick メソッドを使用してこれを実装します。

onClick() {
  // Do something when clicked.
}

ブロックの変更に対応する

一部のアイコンは、ブロックの変更(特に変更)にも反応します。 折りたたみ可能にします。

編集のしやすさ

ブロックの有無によってアイコンの動作を 編集可能かどうか(たとえば、ブロックが編集可能でないのにクリックできない 編集可能)、updateEditable メソッドを実装します。この方法は は、ブロックの編集可能なステータスが変わると、自動的に呼び出されます。

updateEditable() {
  if (this.sourceBlock.isEditable()) {
    // Do editable things.
  } else {
    // Do non-editable things.
  }
}

折りたたみ状態

ブロックを折りたたむと表示されるアイコンもありますが、デフォルトでは表示されます。 できません。アイコンを表示させるには、 isShownWhenCollapsed メソッドで true を返す。

isShownWhenCollapsed() {
  return true;
}

次に、updateCollapsed メソッドをオーバーライドします。

updateCollapsed() {
  // By default icons are hidden when the block is collapsed. We want it to
  // be shown, so do nothing.
}

アイコンを破棄

アイコンは、Dom 要素や外部参照が存在する場合にそれらをクリーンアップする必要があります。 あります。デフォルトでは、this.svgRoot に付加したものはすべて 他の参照は手動でクリーンアップする必要があります。これを dispose メソッド内で行います。

dispose() {
  // Always call super!
  super.dispose();

  this.myBubble?.dispose();
  this.myOtherReference?.dispose();
}