Per creare un'icona personalizzata, è necessario implementare l'interfaccia di IIcon
.
Questo indica a Blockly come vuoi che venga visualizzata l'icona, cosa vuoi che faccia se l'utente fa clic e così via.
Ti consigliamo di creare una sottoclasse della classe astratta Icon
, in quanto 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
dell'icona. Viene utilizzata 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');
}
Crea la visualizzazione dell'icona
La visualizzazione dell'icona si riferisce agli elementi SVG presenti sul blocco.
Inizializzare la vista
Il metodo initView
consente di creare gli elementi SVG dell'icona che risiedono nel blocco. I nuovi elementi devono essere elementi secondari dell'elemento this.svgRoot
, in modo che vengano eliminati automaticamente quando l'icona viene eliminata.
Il modulo Blockly.utils.dom
fornisce un'interfaccia pulita
per la creazione di istanze delle immagini 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.
);
}
Restituisci la taglia
Il metodo getSize
restituisce le dimensioni dell'icona, in modo che il
renderer possa rendere il blocco sufficientemente largo.
Le dimensioni sono indicate in "unità dell'area di lavoro" arbitrarie (che non cambiano quando l'area 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 mutatore integrate vengono sempre mostrate davanti alle icone dei commenti, 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;
}
Implementa il comportamento del clic
Molte icone sono interattive e, facendo clic, eseguono un'azione. Ad esempio,
le icone integrate mostrano tutte una bolla quando ci fai clic sopra. Puoi
utilizzare il metodo onClick
per implementarla.
onClick() {
// Do something when clicked.
}
Rispondere alle modifiche al blocco
Alcune icone vogliono anche rispondere alle modifiche nel blocco, in particolare alle modifiche alla modificabilità e allo stato di compressione.
Modificabilità
Se l'icona deve comportarsi in modo diverso a seconda che il blocco sia modificabile o meno (ad esempio, se non è possibile fare clic quando il blocco non è modificabile), implementa il metodo updateEditable
. Questo metodo viene chiamato automaticamente quando lo stato modificabile del blocco cambia.
updateEditable() {
if (this.sourceBlock.isEditable()) {
// Do editable things.
} else {
// Do non-editable things.
}
}
Comprimi
Alcune icone vengono mostrate quando il blocco è compresso, ma non per impostazione predefinita. Se vuoi che l'icona venga visualizzata, sostituisci il metodo isShownWhenCollapsed
per restituire true
.
isShownWhenCollapsed() {
return true;
}
quindi 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.
}
Smaltire l'icona
Quando vengono eliminate, le icone devono eliminare tutti gli elementi dom o i riferimenti esterni. Per impostazione predefinita, tutto ciò che viene aggiunto a this.svgRoot
viene eliminato, ma gli altri riferimenti devono essere eliminati manualmente. Questa operazione deve essere eseguita all'interno del metodo dispose
.
dispose() {
// Always call super!
super.dispose();
this.myBubble?.dispose();
this.myOtherReference?.dispose();
}