如要建立自訂圖示,您必須實作 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
方法可讓您為圖示建立在該區塊上的 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
方法會傳回圖示的大小,讓轉譯器讓區塊的寬度夠寬。
大小為任意的「工作區單位」(不會隨工作區調整比例而變更)。
getSize() {
return new Blockly.utils.Size(16, 16);
}
設定訂單
區塊中的圖示具有靜態順序。舉例來說,內建變更器圖示一律會顯示在註解圖示的前方,而會顯示在警告圖示前方。
該順序由 getWeight
方法傳回的值控制。相對權重較高的圖示會顯示在權重較低的圖示之後。
getWeight() {
return 10;
}
實作 Click 行為
許多圖示具有互動性質,使用者按下圖示時會執行特定操作。舉例來說,使用者點選內建圖示時,全都會顯示對話框。您可以使用 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.
}
圖示處置
圖示放置時應清除任何隨機元素或外部參照。根據預設,附加至 this.svgRoot
的所有內容都會遭到刪除,但您必須手動清理其他參照。請在 dispose
方法中完成這項操作。
dispose() {
// Always call super!
super.dispose();
this.myBubble?.dispose();
this.myOtherReference?.dispose();
}