Untuk membuat ikon khusus, Anda harus menerapkan antarmuka IIcon
.
Ini memberi tahu Blockly bagaimana Anda ingin ikon dirender, sesuai keinginan Anda
lakukan jika diklik, dll.
Sebaiknya buat subclass untuk class abstrak Icon
, karena class tersebut sudah
menyediakan implementasi default dari banyak metode di IIcon
dalam antarmuka berbasis web
yang sederhana.
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);
}
}
Menentukan jenis ikon
Metode getType
menampilkan nilai yang mewakili jenis
ikon. Proses ini digunakan untuk mendaftarkan ikon untuk serialisasi, dan
mengambil ikon dari getIcon
.
JavaScript
getType() {
return new Blockly.icons.IconType('my_icon');
}
TypeScript
getType(): Blockly.icons.IconType<MyIcon> {
return new Blockly.icons.IconType<MyIcon>('my_icon');
}
Membuat tampilan ikon
Tampilan ikon mengacu pada elemen SVG yang ada di blok.
Melakukan inisialisasi tampilan
Metode initView
adalah tempat Anda membuat elemen SVG
ikon yang ada di blok tersebut. Elemen baru harus berupa turunan dari
Elemen this.svgRoot
sehingga akan otomatis dibersihkan saat ikon
dihancurkan.
Modul Blockly.utils.dom
menyediakan antarmuka yang rapi
untuk membuat instance 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.
);
}
Menampilkan ukuran
Metode getSize
menampilkan ukuran ikon, sehingga
renderer dapat membuat blok menjadi cukup lebar.
Ukurannya dalam "unit ruang kerja" arbitrer (yang tidak berubah sebagai ruang kerja skala perubahan).
getSize() {
return new Blockly.utils.Size(16, 16);
}
Tetapkan pesanan
Ikon memiliki urutan statis dalam blok. Misalnya, mutator bawaan ikon selalu ditampilkan di depan ikon komentar, yang ditampilkan di depan ikon peringatan.
Urutan dikontrol oleh nilai yang ditampilkan oleh getWeight
. Ikon dengan bobot yang lebih positif dirender setelah ikon dengan bobot yang lebih sedikit
dan bobot positif.
getWeight() {
return 10;
}
Mengimplementasikan perilaku onclick
Banyak ikon bersifat interaktif dan melakukan sesuatu saat diklik. Misalnya,
semua ikon bawaan menampilkan balon saat diklik. Anda dapat
gunakan metode onClick
untuk menerapkannya.
onClick() {
// Do something when clicked.
}
Merespons perubahan blok
Beberapa ikon juga perlu merespons perubahan dalam blok, khususnya perubahan ke kemampuan edit dan keterciutkan.
Kemudahan diedit
Jika ikon Anda seharusnya berperilaku berbeda bergantung pada apakah blok tersebut
dapat diedit atau tidak (misalnya, tidak dapat diklik saat blok tidak
diedit), terapkan metode updateEditable
. Metode ini
dipanggil secara otomatis ketika status blok
yang dapat diedit berubah.
updateEditable() {
if (this.sourceBlock.isEditable()) {
// Do editable things.
} else {
// Do non-editable things.
}
}
Menurun
Beberapa ikon ditampilkan saat blok diciutkan, tetapi secara default
tidak. Jika Anda ingin ikon Anda ditampilkan, ganti
Metode isShownWhenCollapsed
untuk menampilkan true
.
isShownWhenCollapsed() {
return true;
}
Kemudian, ganti metode updateCollapsed
.
updateCollapsed() {
// By default icons are hidden when the block is collapsed. We want it to
// be shown, so do nothing.
}
Membuang ikon
Ikon harus membersihkan elemen dom atau referensi eksternal ketika mereka
dibuang. Secara default, apa pun yang ditambahkan ke this.svgRoot
akan
dihancurkan, tetapi referensi lain
harus dibersihkan secara manual. Seharusnya,
dilakukan dengan metode dispose
.
dispose() {
// Always call super!
super.dispose();
this.myBubble?.dispose();
this.myOtherReference?.dispose();
}