Aby utworzyć ikonę niestandardową, musisz zaimplementować interfejs IIcon
.
Informuje to Blockly o sposobie renderowania ikony, o tym, co ma robić po jej kliknięciu itd.
Zalecamy podklasyfikowanie klasy abstrakcyjnej Icon
, ponieważ zapewnia ona już domyślne implementacje wielu metod w interfejsie 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);
}
}
Określ typ ikony
Metoda getType
zwraca wartość reprezentującą typ ikony. Służy do rejestrowania ikony na potrzeby serializacji i pobierania jej z getIcon
.
JavaScript
getType() {
return new Blockly.icons.IconType('my_icon');
}
TypeScript
getType(): Blockly.icons.IconType<MyIcon> {
return new Blockly.icons.IconType<MyIcon>('my_icon');
}
Tworzenie widoku ikony
Widok ikony odnosi się do elementów SVG, które znajdują się w bloku.
Inicjowanie widoku
Metoda initView
pozwala tworzyć elementy SVG ikony, które znajdują się w bloku. Nowe elementy powinny być elementami podrzędnymi elementu this.svgRoot
, aby zostały automatycznie wyczyszczone po zniszczeniu ikony.
Moduł Blockly.utils.dom
zapewnia przejrzysty interfejs do tworzenia instancji plików 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.
);
}
Zwróć rozmiar
Metoda getSize
zwraca rozmiar ikony, dzięki czemu mechanizm renderowania może zrobić wystarczająco szeroki blok.
Rozmiar jest podawany w przypadku dowolnych „jednostek obszaru roboczego” (które nie zmieniają się wraz ze zmianą skali obszaru roboczego).
getSize() {
return new Blockly.utils.Size(16, 16);
}
Ustaw kolejność
Kolejność ikon jest stała w obrębie bloku. Na przykład ikony wbudowanych mutatorów są zawsze wyświetlane przed ikonami komentarzy, które znajdują się przed ikonami ostrzeżeń.
Kolejność jest określana na podstawie wartości zwróconej przez metodę getWeight
. Ikony z wagą dodatnią są renderowane po ikonach z mniejszą wagą.
getWeight() {
return 10;
}
Implementowanie działania funkcji „onclick”
Wiele ikon jest interaktywnych i po kliknięciu wykonuje pewne działanie. Na przykład wbudowane ikony prezentują po kliknięciu dymek. Do tego celu możesz użyć metody onClick
.
onClick() {
// Do something when clicked.
}
Reagowanie na zmiany dotyczące blokowania
Niektóre ikony chcą też reagować na zmiany w bloku, w szczególności na zmiany w możliwości edycji i zwijaniu.
Edytowalność
Jeśli ikona powinna działać inaczej w zależności od tego, czy blok jest edytowalny (np. nie można go kliknąć, gdy nie można go edytować), zastosuj metodę updateEditable
. Ta metoda jest wywoływana automatycznie, gdy zmieni się stan bloku z możliwością edytowania.
updateEditable() {
if (this.sourceBlock.isEditable()) {
// Do editable things.
} else {
// Do non-editable things.
}
}
Zwinięcie
Niektóre ikony są wyświetlane, gdy bryła jest zwinięta, ale domyślnie nie jest. Jeśli chcesz, aby ikona była widoczna, zastąp metodę isShownWhenCollapsed
, aby zwrócić wartość true
.
isShownWhenCollapsed() {
return true;
}
Następnie zastąp metodę updateCollapsed
.
updateCollapsed() {
// By default icons are hidden when the block is collapsed. We want it to
// be shown, so do nothing.
}
Pozbywanie się ikony
Ikony powinny usuwać po usunięciu wszystkie elementy DOM i odwołania zewnętrzne. Domyślnie wszystkie dane dołączone do pliku this.svgRoot
zostają zniszczone, ale inne pliki referencyjne należy wyczyścić ręcznie. Należy to zrobić w metodzie dispose
.
dispose() {
// Always call super!
super.dispose();
this.myBubble?.dispose();
this.myOtherReference?.dispose();
}