建立新的圖示類型

如要建立自訂圖示,您需實作 IIcon 介面。 這會讓 Blockly 知道您希望圖示如何呈現,以及您希望呈現什麼內容 點擊與付費點擊等

建議您將 Icon 抽象類別設為子類別,因為該類別已存在 提供了 IIcon 中許多方法的預設實作方式 存取 API

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 方法可讓您建立 方塊上的圖示新元素應為 this.svgRoot 元素,讓其在圖示時自動清理

Blockly.utils.dom 模組提供簡潔的介面 將可擴充向量圖形執行個體化

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 方法會傳回圖示的大小,因此 「轉譯器」可以讓區塊夠寬。

大小以任意「工作區單位」為單位(不會隨工作區變更 調整比例)。

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

設定順序

圖示在區塊中具有靜態順序。例如 一律顯示在留言圖示前方 警告圖示

順序是由 getWeight 傳回的值所控制 方法。呈現正權重較多的圖示會顯示在較不合理的圖示之後 權重為正數

getWeight() {
  return 10;
}

導入 OpenGL 行為

許多圖示都是互動式圖示,點選後即會執行動作。例如: 使用者按一下內建圖示後,內建圖示都會顯示對話框。你可以 請使用 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.
}

丟棄圖示

圖示應清理任何 Pod 元素或外部參照 處理。根據預設,附加至 this.svgRoot 的任何內容都會獲得 已刪除,但其他參照需要手動清理。這應該是 是在 dispose 方法內完成。

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

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