Para criar um ícone personalizado, você precisa implementar a interface IIcon
.
Isso informa ao Blockly como o ícone deve ser renderizado e o que
fazer se receber um clique etc.
Recomendamos criar subclasses da classe abstrata Icon
, porque ela já
fornece implementações padrão de vários métodos na IIcon
interface gráfica do usuário.
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);
}
}
Especificar o tipo de ícone
O método getType
retorna um valor que representa o tipo da
ícone. Ele é usado para registrar o ícone para serialização e
o ícone de getIcon
.
JavaScript
getType() {
return new Blockly.icons.IconType('my_icon');
}
TypeScript
getType(): Blockly.icons.IconType<MyIcon> {
return new Blockly.icons.IconType<MyIcon>('my_icon');
}
Criar a visualização do ícone
A visualização do ícone refere-se aos elementos SVG que residem no bloco.
Inicializar a visualização
O método initView
é onde você cria os elementos SVG do seu
ícone que reside no bloco. Os novos elementos devem ser filhos do
this.svgRoot
elemento para que sejam limpos automaticamente quando o ícone
será destruída.
O módulo Blockly.utils.dom
oferece uma interface limpa
para instanciar SVGs.
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.
);
}
Retornar o tamanho
O método getSize
retorna o tamanho do ícone, de modo que o
renderizador pode aumentar a largura do bloco o suficiente.
O tamanho é em "unidades de espaço de trabalho" arbitrárias. (que não mudam conforme o espaço de trabalho muda de escala).
getSize() {
return new Blockly.utils.Size(16, 16);
}
Definir a ordem
Os ícones têm uma ordem estática dentro do bloco. Por exemplo, o mutador integrado ícones são sempre mostrados na frente dos ícones de comentários, que são mostrados na frente dos ícones de aviso.
A ordem é controlada pelo valor retornado por getWeight
.
. Ícones com pesos mais positivos são renderizados depois de ícones com menos
pesos positivos.
getWeight() {
return 10;
}
Implementar o comportamento "onclick"
Muitos ícones são interativos e fazem algo quando são clicados. Por exemplo:
Todos os ícones integrados mostram um balão quando são clicados. Você pode
use o método onClick
para implementar isso.
onClick() {
// Do something when clicked.
}
Responder a alterações de bloqueio
Alguns ícones também querem responder a alterações no bloco, em particular alterações capacidade de edição e fechamento.
Editabilidade
Se o ícone deve se comportar de forma diferente dependendo se o bloco é
editável ou não (por exemplo, não ser clicável quando o bloco não
editável), implemente o método updateEditable
. Esse método
é chamado automaticamente quando o status editável do bloco é alterado.
updateEditable() {
if (this.sourceBlock.isEditable()) {
// Do editable things.
} else {
// Do non-editable things.
}
}
Recolhimento
Alguns ícones são mostrados quando o bloco é recolhido, mas, por padrão, são
não. Se você quiser que seu ícone seja mostrado, substitua o
isShownWhenCollapsed
para retornar true
.
isShownWhenCollapsed() {
return true;
}
Em seguida, substitua o método updateCollapsed
.
updateCollapsed() {
// By default icons are hidden when the block is collapsed. We want it to
// be shown, so do nothing.
}
Elimine o ícone
Os ícones devem limpar todos os elementos do DOM ou referências externas quando estiverem
descartados. Por padrão, tudo o que for anexado a this.svgRoot
será
destruídos, mas outras referências precisam ser limpas manualmente. Ela deve ser
feita no método dispose
.
dispose() {
// Always call super!
super.dispose();
this.myBubble?.dispose();
this.myOtherReference?.dispose();
}