Per creare un'icona personalizzata, devi implementare l'interfaccia IIcon.
In questo modo, Blockly saprà come vuoi che venga visualizzata l'icona, cosa vuoi che
faccia se viene selezionata e così via.
Ti consigliamo di creare una sottoclasse della classe astratta Icon, perché fornisce già implementazioni predefinite di molti metodi nell'interfaccia 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);
}
}
Specifica il tipo di icona
Il metodo getType restituisce un valore che rappresenta il tipo di icona. Viene utilizzato per registrare l'icona per la serializzazione e
recuperare l'icona da getIcon.
JavaScript
getType() {
return new Blockly.icons.IconType('my_icon');
}
TypeScript
getType(): Blockly.icons.IconType<MyIcon> {
return new Blockly.icons.IconType<MyIcon>('my_icon');
}
Creare la visualizzazione dell'icona
La visualizzazione dell'icona si riferisce agli elementi SVG presenti nel blocco.
Inizializzare la visualizzazione
Il metodo initView prevede la creazione degli elementi SVG della tua icona che si trovano sul blocco. I nuovi elementi devono essere elementi secondari
di this.svgRoot in modo che vengano puliti automaticamente quando l'icona
viene eliminata.
Il modulo Blockly.utils.dom fornisce un'interfaccia pulita
per l'istanza di 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.
);
}
Restituisce la taglia
Il metodo getSize restituisce le dimensioni dell'icona, in modo che il
renderer possa rendere il blocco abbastanza largo.
Le dimensioni sono in "unità di spazio di lavoro" arbitrarie (che non cambiano man mano che lo spazio di lavoro cambia scala).
getSize() {
return new Blockly.utils.Size(16, 16);
}
Imposta l'ordine
Le icone hanno un ordine statico all'interno del blocco. Ad esempio, le icone dei mutatori integrati vengono sempre mostrate davanti alle icone dei commenti, che vengono mostrate davanti alle icone di avviso.
L'ordine è controllato dal valore restituito dal metodo getWeight. Le icone con ponderazioni più positive vengono visualizzate dopo quelle con ponderazioni meno positive.
getWeight() {
return 10;
}
Implementare il comportamento al clic
Molte icone sono interattive e svolgono un'azione quando vengono selezionate. Ad esempio,
le icone integrate mostrano tutte una bolla quando vengono selezionate. Per implementare questa funzionalità, puoi utilizzare il metodo onClick.
onClick() {
// Do something when clicked.
}
Rispondere alle modifiche del blocco
Alcune icone vogliono anche rispondere alle modifiche apportate al blocco, in particolare quelle relative alla modificabilità e al livello di compressione.
Modificabilità
Se l'icona deve comportarsi in modo diverso a seconda che il blocco sia
modificabile o meno (ad esempio, non essere cliccabile quando il blocco non è
modificabile), implementa il metodo updateEditable. Questo metodo
viene chiamato automaticamente quando lo stato di modificabilità del blocco cambia.
updateEditable() {
if (this.sourceBlock.isEditable()) {
// Do editable things.
} else {
// Do non-editable things.
}
}
Compressione
Alcune icone vengono mostrate quando il blocco è compresso, ma per impostazione predefinita non lo sono. Se vuoi che la tua icona venga mostrata, esegui l'override del metodo
isShownWhenCollapsed per restituire true.
isShownWhenCollapsed() {
return true;
}
e poi esegui l'override del metodo updateCollapsed.
updateCollapsed() {
// By default icons are hidden when the block is collapsed. We want it to
// be shown, so do nothing.
}
Elimina l'icona
Le icone devono eliminare eventuali elementi DOM o riferimenti esterni quando vengono
eliminate. Per impostazione predefinita, tutto ciò che viene aggiunto a this.svgRoot viene
eliminato, ma gli altri riferimenti devono essere puliti manualmente. Questa operazione deve essere eseguita all'interno del metodo dispose.
dispose() {
// Always call super!
super.dispose();
this.myBubble?.dispose();
this.myOtherReference?.dispose();
}